Add recent SECNodes to Drop down menu

Fixes: #4686

Change-Id: I864e8dd407b23c8af0f0633d3be477e222df6c40
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30525
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
This commit is contained in:
Alexander Zaft 2023-02-27 12:46:32 +01:00 committed by Markus Zolliker
parent f1ea85bfa7
commit 244d84aa56
4 changed files with 60 additions and 5 deletions

View File

@ -24,7 +24,8 @@
import frappy.client import frappy.client
from frappy.gui.qt import QInputDialog, QMainWindow, QMessageBox, QObject, \ 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.gui.util import Value, Colors, loadUi
from frappy.lib import formatExtendedTraceback from frappy.lib import formatExtendedTraceback
from frappy.gui.logwindow import LogWindow from frappy.gui.logwindow import LogWindow
@ -159,11 +160,14 @@ class MainWindow(QMainWindow):
Colors._setPalette(self.palette()) Colors._setPalette(self.palette())
self.toolBar.hide() self.toolBar.hide()
self.buildRecentNodeMenu()
self.recentNodesChanged.connect(self.buildRecentNodeMenu)
# what is which? # what is which?
self.tab = TearOffTabWidget(self, self, self, self) self.tab = TearOffTabWidget(self, self, self, self)
self.tab.setTabsClosable(True) self.tab.setTabsClosable(True)
self.tab.tabCloseRequested.connect(self._handleTabClose) self.tab.tabCloseRequested.connect(self._handleTabClose)
self.shortcut = QShortcut(QKeySequence("Ctrl+W"), self, self.tab.close_current)
self.setCentralWidget(self.tab) self.setCentralWidget(self.tab)
self._nodes = {} self._nodes = {}
@ -244,6 +248,22 @@ class MainWindow(QMainWindow):
self.recentNodesChanged.emit() self.recentNodesChanged.emit()
return nodename 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): def on_actionClear_triggered(self):
"""clears recent SECNode menu""" """clears recent SECNode menu"""
settings = QSettings() settings = QSettings()

View File

@ -35,14 +35,15 @@ try:
QRectF, QPoint, QByteArray, QEvent, QMimeData, QSettings QRectF, QPoint, QByteArray, QEvent, QMimeData, QSettings
from PyQt5.QtGui import QFont, QTextCursor, QFontMetrics, QColor, QBrush, \ from PyQt5.QtGui import QFont, QTextCursor, QFontMetrics, QColor, QBrush, \
QPainter, QPolygonF, QPen, QIcon, QStandardItemModel, QStandardItem, \ 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, \ from PyQt5.QtWidgets import QLabel, QWidget, QDialog, QLineEdit, QCheckBox, \
QPushButton, QSizePolicy, QMainWindow, QMessageBox, QInputDialog, \ QPushButton, QSizePolicy, QMainWindow, QMessageBox, QInputDialog, \
QTreeWidgetItem, QApplication, QGroupBox, QSpinBox, QDoubleSpinBox, \ QTreeWidgetItem, QApplication, QGroupBox, QSpinBox, QDoubleSpinBox, \
QComboBox, QRadioButton, QVBoxLayout, QHBoxLayout, QGridLayout, \ QComboBox, QRadioButton, QVBoxLayout, QHBoxLayout, QGridLayout, \
QScrollArea, QFrame, QTreeWidget, QFileDialog, QTabBar, QAction, QMenu,\ QScrollArea, QFrame, QTreeWidget, QFileDialog, QTabBar, QAction, QMenu,\
QDialogButtonBox, QTextEdit, QSpacerItem, QTreeView, QStyle, \ QDialogButtonBox, QTextEdit, QSpacerItem, QTreeView, QStyle, \
QStyleOptionTab, QStylePainter, QTabWidget, QToolButton, QPlainTextEdit QStyleOptionTab, QStylePainter, QTabWidget, QToolButton, QShortcut, \
QPlainTextEdit
from xml.sax.saxutils import escape as toHtmlEscaped from xml.sax.saxutils import escape as toHtmlEscaped

View File

@ -469,6 +469,9 @@ class TearOffTabWidget(QTabWidget):
widget = parent widget = parent
return widget return widget
def close_current(self):
self.removeTab(self.currentIndex())
class DetachedWindow(QMainWindow): class DetachedWindow(QMainWindow):

View File

@ -29,8 +29,19 @@
<property name="title"> <property name="title">
<string>File</string> <string>File</string>
</property> </property>
<addaction name="separator"/> <widget class="QMenu" name="menuRecent_SECNodes">
<property name="enabled">
<bool>true</bool>
</property>
<property name="title">
<string>Recent SECNodes</string>
</property>
<addaction name="separator"/>
<addaction name="actionClear"/>
</widget>
<addaction name="actionAdd_SEC_node"/> <addaction name="actionAdd_SEC_node"/>
<addaction name="menuRecent_SECNodes"/>
<addaction name="separator"/>
<addaction name="actionExit"/> <addaction name="actionExit"/>
</widget> </widget>
<widget class="QMenu" name="menuHelp"> <widget class="QMenu" name="menuHelp">
@ -70,13 +81,19 @@
<normaloff>:/icons/connect</normaloff>:/icons/connect</iconset> <normaloff>:/icons/connect</normaloff>:/icons/connect</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Add SEC node</string> <string>Open SECNode</string>
</property>
<property name="shortcut">
<string>Ctrl+O</string>
</property> </property>
</action> </action>
<action name="actionExit"> <action name="actionExit">
<property name="text"> <property name="text">
<string>Exit</string> <string>Exit</string>
</property> </property>
<property name="shortcut">
<string>Ctrl+Q</string>
</property>
</action> </action>
<action name="actionAbout"> <action name="actionAbout">
<property name="text"> <property name="text">
@ -112,6 +129,20 @@
<string>Detailed View</string> <string>Detailed View</string>
</property> </property>
</action> </action>
<action name="actionClear">
<property name="icon">
<iconset resource="../../../resources/frappy-gui.qrc">
<normaloff>:/icons/trash</normaloff>:/icons/trash</iconset>
</property>
<property name="text">
<string>Clear</string>
</property>
</action>
<action name="actiondjhfs">
<property name="text">
<string>djhfs</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="../../../resources/frappy-gui.qrc"/> <include location="../../../resources/frappy-gui.qrc"/>