From b8abcfaf859b5c7ba76981ac5a120c409d16c705 Mon Sep 17 00:00:00 2001 From: Enrico Faulhaber Date: Thu, 8 Feb 2018 11:30:48 +0100 Subject: [PATCH] remember Widgets for modulectrl and paramctl to not recreate them when another module/param got selected Change-Id: Ic81bd8e3105f666d3a03dffb3de4e15603d99c39 Reviewed-on: https://forge.frm2.tum.de/review/17276 Tested-by: JenkinsCodeReview Reviewed-by: Enrico Faulhaber --- secop/gui/mainwindow.py | 24 +++++++++++++++++------- secop/gui/nodectrl.py | 10 +++++----- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/secop/gui/mainwindow.py b/secop/gui/mainwindow.py index cee2e2d..f584ed4 100644 --- a/secop/gui/mainwindow.py +++ b/secop/gui/mainwindow.py @@ -23,6 +23,8 @@ from __future__ import print_function +import sys + from PyQt4.QtGui import QMainWindow, QInputDialog, QTreeWidgetItem, QMessageBox from PyQt4.QtCore import pyqtSignature as qtsig, QObject, pyqtSignal @@ -32,7 +34,6 @@ from secop.gui.modulectrl import ModuleCtrl from secop.gui.paramview import ParameterView from secop.client.baseclient import Client as SECNode -import sys ITEM_TYPE_NODE = QTreeWidgetItem.UserType + 1 ITEM_TYPE_GROUP = QTreeWidgetItem.UserType + 2 @@ -80,6 +81,8 @@ class MainWindow(QMainWindow): self._nodes = {} self._nodeCtrls = {} + self._moduleCtrls = {} + self._paramCtrls = {} self._topItems = {} self._currentWidget = self.splitter.widget(1).layout().takeAt(0) @@ -127,7 +130,7 @@ class MainWindow(QMainWindow): self._displayParameter(current.parent().parent().text(0), current.parent().text(0), current.text(0)) - def _removeSubTree(self, toplevelItem): + def _removeSubTree(self, toplevel_item): #.... pass @@ -160,25 +163,32 @@ class MainWindow(QMainWindow): for param in sorted(node.getParameters(module)): paramItem = QTreeWidgetItem(moduleItem, [param], ITEM_TYPE_PARAMETER) + paramItem.setDisabled(False) self.treeWidget.addTopLevelItem(nodeItem) self._topItems[node] = nodeItem def _displayNode(self, node): - ctrl = self._nodeCtrls.get(node, None) - if ctrl is None: ctrl = self._nodeCtrls[node] = NodeCtrl(self._nodes[node]) self._replaceCtrlWidget(ctrl) def _displayModule(self, node, module): - self._replaceCtrlWidget(ModuleCtrl(self._nodes[node], module)) + ctrl = self._moduleCtrls.get((node, module), None) + if ctrl is None: + ctrl = self._moduleCtrls[(node, module)] = ModuleCtrl(self._nodes[node], module) + + self._replaceCtrlWidget(ctrl) def _displayParameter(self, node, module, parameter): - self._replaceCtrlWidget( - ParameterView(self._nodes[node], module, parameter)) + ctrl = self._paramCtrls.get((node, module, parameter), None) + if ctrl is None: + ctrl = ParameterView(self._nodes[node], module, parameter) + self._paramCtrls[(node, module, parameter)] = ctrl + + self._replaceCtrlWidget(ctrl) def _replaceCtrlWidget(self, new): old = self.splitter.widget(1).layout().takeAt(0) diff --git a/secop/gui/nodectrl.py b/secop/gui/nodectrl.py index eeb008f..63b383e 100644 --- a/secop/gui/nodectrl.py +++ b/secop/gui/nodectrl.py @@ -231,7 +231,7 @@ class ReadableWidget(QWidget): self.update_status(self._get('status', (999, '')), {}) # XXX: also connect update_status signal to LineEdit ?? - def update_status(self, status, qualifiers): + def update_status(self, status, qualifiers=None): display_string = self._status_type.subtypes[0].entries.get(status[0]) if status[1]: display_string += ':' + status[1] @@ -241,7 +241,7 @@ class ReadableWidget(QWidget): def _init_current_widgets(self): self.update_current(self._get('value', ''), {}) - def update_current(self, value, qualifiers): + def update_current(self, value, qualifiers=None): self.currentLineEdit.setText(str(value)) def _init_target_widgets(self): @@ -250,7 +250,7 @@ class ReadableWidget(QWidget): self.targetComboBox.setHidden(True) self.cmdPushButton.setHidden(True) - def update_target(self, target, qualifiers): + def update_target(self, target, qualifiers=None): pass def target_go(self, target): @@ -288,13 +288,13 @@ class DrivableWidget(ReadableWidget): else: self.update_target(target) - def update_current(self, value, qualifiers): + def update_current(self, value, qualifiers=None): if self._is_enum: self.currentLineEdit.setText(self._map[self._revmap[value]][0]) else: self.currentLineEdit.setText(str(value)) - def update_target(self, target, qualifiers): + def update_target(self, target, qualifiers=None): if self._is_enum: # update selected item if target in self._revmap: