diff --git a/frappy/gui/mainwindow.py b/frappy/gui/mainwindow.py index ec54a69..53362ce 100644 --- a/frappy/gui/mainwindow.py +++ b/frappy/gui/mainwindow.py @@ -24,7 +24,8 @@ import frappy.client from frappy.gui.qt import QInputDialog, QMainWindow, QMessageBox, QObject, \ - QTreeWidgetItem, pyqtSignal, pyqtSlot, QWidget, QSettings + QTreeWidgetItem, pyqtSignal, pyqtSlot, QWidget, QSettings, QAction, \ + QShortcut, QKeySequence from frappy.gui.util import Value, Colors, loadUi from frappy.lib import formatExtendedTraceback from frappy.gui.logwindow import LogWindow @@ -159,11 +160,14 @@ class MainWindow(QMainWindow): Colors._setPalette(self.palette()) self.toolBar.hide() + self.buildRecentNodeMenu() + self.recentNodesChanged.connect(self.buildRecentNodeMenu) # what is which? self.tab = TearOffTabWidget(self, self, self, self) self.tab.setTabsClosable(True) self.tab.tabCloseRequested.connect(self._handleTabClose) + self.shortcut = QShortcut(QKeySequence("Ctrl+W"), self, self.tab.close_current) self.setCentralWidget(self.tab) self._nodes = {} @@ -244,6 +248,22 @@ class MainWindow(QMainWindow): self.recentNodesChanged.emit() return nodename + def buildRecentNodeMenu(self): + settings = QSettings() + recent = settings.value('recent', []) + menu = self.menuRecent_SECNodes + for action in list(menu.actions()): + if action.isSeparator(): + break + menu.removeAction(action) + # save reference so they are not deleted + self.recentNodeActions = [] + for host in recent: + a = QAction(host) + a.triggered.connect(lambda _t, h=host: self._addNode(h)) + self.recentNodeActions.append(a) + menu.insertActions(action, self.recentNodeActions) + def on_actionClear_triggered(self): """clears recent SECNode menu""" settings = QSettings() diff --git a/frappy/gui/qt.py b/frappy/gui/qt.py index a159cb3..4dc461c 100644 --- a/frappy/gui/qt.py +++ b/frappy/gui/qt.py @@ -35,14 +35,15 @@ try: QRectF, QPoint, QByteArray, QEvent, QMimeData, QSettings from PyQt5.QtGui import QFont, QTextCursor, QFontMetrics, QColor, QBrush, \ QPainter, QPolygonF, QPen, QIcon, QStandardItemModel, QStandardItem, \ - QPalette, QCursor, QDrag, QMouseEvent, QPixmap + QPalette, QCursor, QDrag, QMouseEvent, QPixmap, QKeySequence from PyQt5.QtWidgets import QLabel, QWidget, QDialog, QLineEdit, QCheckBox, \ QPushButton, QSizePolicy, QMainWindow, QMessageBox, QInputDialog, \ QTreeWidgetItem, QApplication, QGroupBox, QSpinBox, QDoubleSpinBox, \ QComboBox, QRadioButton, QVBoxLayout, QHBoxLayout, QGridLayout, \ QScrollArea, QFrame, QTreeWidget, QFileDialog, QTabBar, QAction, QMenu,\ QDialogButtonBox, QTextEdit, QSpacerItem, QTreeView, QStyle, \ - QStyleOptionTab, QStylePainter, QTabWidget, QToolButton, QPlainTextEdit + QStyleOptionTab, QStylePainter, QTabWidget, QToolButton, QShortcut, \ + QPlainTextEdit from xml.sax.saxutils import escape as toHtmlEscaped diff --git a/frappy/gui/tabwidget.py b/frappy/gui/tabwidget.py index 1e77b42..e2d2c8f 100644 --- a/frappy/gui/tabwidget.py +++ b/frappy/gui/tabwidget.py @@ -469,6 +469,9 @@ class TearOffTabWidget(QTabWidget): widget = parent return widget + def close_current(self): + self.removeTab(self.currentIndex()) + class DetachedWindow(QMainWindow): diff --git a/frappy/gui/ui/mainwin.ui b/frappy/gui/ui/mainwin.ui index fa72f95..09a340c 100644 --- a/frappy/gui/ui/mainwin.ui +++ b/frappy/gui/ui/mainwin.ui @@ -29,8 +29,19 @@ File - + + + true + + + Recent SECNodes + + + + + + @@ -70,13 +81,19 @@ :/icons/connect:/icons/connect - Add SEC node + Open SECNode + + + Ctrl+O Exit + + Ctrl+Q + @@ -112,6 +129,20 @@ Detailed View + + + + :/icons/trash:/icons/trash + + + Clear + + + + + djhfs + +