From af2a3f6cc98f048771dbe0e5dacf1e012dea2f73 Mon Sep 17 00:00:00 2001 From: Nils <> Date: Thu, 8 Jul 2021 18:24:35 +0200 Subject: [PATCH] Add buttons with the same functions as session chooser context menu --- CHANGELOG | 1 + engine/api.py | 3 +- qtgui/designer/mainwindow.py | 29 ++++++++++++++++-- qtgui/designer/mainwindow.ui | 54 ++++++++++++++++++++++++++++++++-- qtgui/designer/newsession.py | 5 ++-- qtgui/sessiontreecontroller.py | 28 ++++++++++++++++++ 6 files changed, 113 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 03e6bf8..1cd1345 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ 2021-07-08 Version 0.3 Remove "Quick" mode. As it turns out "Full" mode is quick enough. Port convenience features to full mode. +Add button in session chooser for alternative access to context menu options 2021-01-15 Version 0.2.1 diff --git a/engine/api.py b/engine/api.py index bb7a830..ab78abf 100644 --- a/engine/api.py +++ b/engine/api.py @@ -28,6 +28,7 @@ import datetime #Our Modules from engine.start import PATHS +from engine.config import METADATA #includes METADATA only. No other environmental setup is executed. from .nsmservercontrol import NsmServerControl from .watcher import Watcher @@ -258,7 +259,7 @@ def getUnfilteredExecutables()->list: #No project running #There is no callback for _sessionsChanged because we poll that in the event loop. -def sessionNewTimestampe(): +def sessionNewTimestamped(): """convenience function. Create a new session without requiring a name and add suggested infrastructure clients""" nsmExecutables = getNsmExecutables() #type set, cached, very fast. diff --git a/qtgui/designer/mainwindow.py b/qtgui/designer/mainwindow.py index 4519515..119e780 100644 --- a/qtgui/designer/mainwindow.py +++ b/qtgui/designer/mainwindow.py @@ -14,7 +14,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(953, 763) + MainWindow.resize(953, 737) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) @@ -51,9 +51,29 @@ class Ui_MainWindow(object): self.button_new_session = QtWidgets.QPushButton(self.widget) self.button_new_session.setObjectName("button_new_session") self.verticalLayout_3.addWidget(self.button_new_session) + self.button_new_quick_session = QtWidgets.QPushButton(self.widget) + self.button_new_quick_session.setObjectName("button_new_quick_session") + self.verticalLayout_3.addWidget(self.button_new_quick_session) self.button_load_selected_session = QtWidgets.QPushButton(self.widget) + self.button_load_selected_session.setEnabled(False) self.button_load_selected_session.setObjectName("button_load_selected_session") self.verticalLayout_3.addWidget(self.button_load_selected_session) + self.button_rename_selected_session = QtWidgets.QPushButton(self.widget) + self.button_rename_selected_session.setEnabled(False) + self.button_rename_selected_session.setObjectName("button_rename_selected_session") + self.verticalLayout_3.addWidget(self.button_rename_selected_session) + self.button_copy_selected_session = QtWidgets.QPushButton(self.widget) + self.button_copy_selected_session.setEnabled(False) + self.button_copy_selected_session.setObjectName("button_copy_selected_session") + self.verticalLayout_3.addWidget(self.button_copy_selected_session) + self.button_delete_selected_session = QtWidgets.QPushButton(self.widget) + self.button_delete_selected_session.setEnabled(False) + self.button_delete_selected_session.setObjectName("button_delete_selected_session") + self.verticalLayout_3.addWidget(self.button_delete_selected_session) + self.button_remove_lock_selected_session = QtWidgets.QPushButton(self.widget) + self.button_remove_lock_selected_session.setEnabled(False) + self.button_remove_lock_selected_session.setObjectName("button_remove_lock_selected_session") + self.verticalLayout_3.addWidget(self.button_remove_lock_selected_session) self.checkBoxNested = QtWidgets.QCheckBox(self.widget) self.checkBoxNested.setChecked(True) self.checkBoxNested.setObjectName("checkBoxNested") @@ -256,14 +276,19 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.mainPageSwitcher.setCurrentIndex(0) self.tabbyCat.setCurrentIndex(0) - self.detailedStackedWidget.setCurrentIndex(1) + self.detailedStackedWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Agordejo")) self.button_new_session.setText(_translate("MainWindow", "New")) + self.button_new_quick_session.setText(_translate("MainWindow", "Quick New")) self.button_load_selected_session.setText(_translate("MainWindow", "Load Selected")) + self.button_rename_selected_session.setText(_translate("MainWindow", "Rename Selected")) + self.button_copy_selected_session.setText(_translate("MainWindow", "Copy Selected")) + self.button_delete_selected_session.setText(_translate("MainWindow", "Delete Selected")) + self.button_remove_lock_selected_session.setText(_translate("MainWindow", "Remove Lock")) self.checkBoxNested.setText(_translate("MainWindow", "Tree View")) self.session_programs.setTitle(_translate("MainWindow", "Double-click to load program")) self.session_loaded.setTitle(_translate("MainWindow", "In current session")) diff --git a/qtgui/designer/mainwindow.ui b/qtgui/designer/mainwindow.ui index 67b8991..3024e33 100644 --- a/qtgui/designer/mainwindow.ui +++ b/qtgui/designer/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 953 - 763 + 737 @@ -68,7 +68,7 @@ - 1 + 0 @@ -97,13 +97,63 @@ + + + + Quick New + + + + + false + Load Selected + + + + false + + + Rename Selected + + + + + + + false + + + Copy Selected + + + + + + + false + + + Delete Selected + + + + + + + false + + + Remove Lock + + + diff --git a/qtgui/designer/newsession.py b/qtgui/designer/newsession.py index dfce928..0a6abf8 100644 --- a/qtgui/designer/newsession.py +++ b/qtgui/designer/newsession.py @@ -2,9 +2,10 @@ # Form implementation generated from reading ui file 'newsession.ui' # -# Created by: PyQt5 UI code generator 5.14.1 +# Created by: PyQt5 UI code generator 5.15.4 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets diff --git a/qtgui/sessiontreecontroller.py b/qtgui/sessiontreecontroller.py index 8e12d13..02a6a99 100644 --- a/qtgui/sessiontreecontroller.py +++ b/qtgui/sessiontreecontroller.py @@ -62,6 +62,9 @@ class SessionItem(QtWidgets.QTreeWidgetItem): entry["numberOfClients"] = 3 entry["hasSymlinks"] = True entry["parents"] = [] + + Also: + entry["locked"] = True """ allItems = {} #nsmSessionName : SessionItem @@ -165,12 +168,20 @@ class SessionTreeController(object): api.callbacks.sessionLocked.append(self._reactCallback_sessionLocked) api.callbacks.sessionFileChanged.append(self._reactCallback_sessionFileChanged) + self.treeWidget.currentItemChanged.connect(self._reactSelectionChanged) #click anywhere self.treeWidget.itemDoubleClicked.connect(self._reactSignal_itemDoubleClicked) self.treeWidget.customContextMenuRequested.connect(self.contextMenu) self.treeWidget.model().layoutAboutToBeChanged.connect(self._reactSignal_rememberSorting) #self.treeWidget.model().layoutChanged.connect(self._reactSignal_restoreSorting) self.mainWindow.ui.button_new_session.clicked.connect(self._reactSignal_newSession) + self.mainWindow.ui.button_new_quick_session.clicked.connect(api.sessionNewTimestamped) + + #The next ones are only available if a session item is currently selected. The connected lambda functions do not test for this, but we only enable the buttons when such an item is selected. self.mainWindow.ui.button_load_selected_session.clicked.connect(self._reactSignal_openSelected) + self.mainWindow.ui.button_copy_selected_session.clicked.connect(lambda: self._askForCopyAndCopy(self.treeWidget.currentItem().sessionDict["nsmSessionName"])) + self.mainWindow.ui.button_rename_selected_session.clicked.connect(lambda: self._askForNameAndRenameSession(self.treeWidget.currentItem().sessionDict["nsmSessionName"])) + self.mainWindow.ui.button_delete_selected_session.clicked.connect(lambda: self.deleteSessionItem(self.treeWidget.currentItem())) + self.mainWindow.ui.button_remove_lock_selected_session.clicked.connect(lambda: api.sessionForceLiftLock(self.treeWidget.currentItem().sessionDict["nsmSessionName"])) logger.info("Full View Session Chooser ready") @@ -296,6 +307,23 @@ class SessionTreeController(object): #GUI Signals + def _reactSelectionChanged(self, item, previous): + """User clicks on an entry in the session chooser, or in the empty space. + in any case, the selection changes and we can decide if we activate/deactivate certain buttons""" + + if not item or not type(item) is SessionItem or item.sessionDict["locked"] == True: + sessionSelectedState = False + else: + sessionSelectedState = True + + print (self.treeWidget.currentItem()) + + self.mainWindow.ui.button_load_selected_session.setEnabled(sessionSelectedState) + self.mainWindow.ui.button_copy_selected_session.setEnabled(sessionSelectedState) + self.mainWindow.ui.button_rename_selected_session.setEnabled(sessionSelectedState) + self.mainWindow.ui.button_delete_selected_session.setEnabled(sessionSelectedState) + self.mainWindow.ui.button_remove_lock_selected_session.setEnabled(sessionSelectedState and item.sessionDict["locked"] == True) + def _reactSignal_itemDoubleClicked(self, item:QtWidgets.QTreeWidgetItem, column:int): if not item.isDisabled() and type(item) is SessionItem: api.sessionOpen(item.sessionDict["nsmSessionName"])