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
-
+
+
+