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"])