improve performance for show/hide graphs

This commit is contained in:
Dominik Demuth 2023-09-19 16:32:54 +02:00
parent c5706084bf
commit ea62a05bd3
4 changed files with 38 additions and 25 deletions

View File

@ -84,7 +84,7 @@ class DataTree(QtWidgets.QTreeWidget):
self.update_indexes()
@QtCore.pyqtSlot(QtWidgets.QTreeWidgetItem)
def data_change(self, item: QtWidgets.QTreeWidgetItem) -> tuple[set, set]:
def data_change(self, item: QtWidgets.QTreeWidgetItem, emit: bool = True) -> tuple[set, set]:
idd = item.data(0, QtCore.Qt.UserRole)
is_selected = item.checkState(0) == QtCore.Qt.Checked
to_be_hidden = set()
@ -142,9 +142,10 @@ class DataTree(QtWidgets.QTreeWidget):
pass
else:
self.keyChanged.emit(idd, item.text(0))
if emit:
self.keyChanged.emit(idd, item.text(0))
if to_be_shown or to_be_hidden:
if (to_be_shown or to_be_hidden) and emit:
self.stateChanged.emit(list(to_be_shown), list(to_be_hidden))
return to_be_shown, to_be_hidden
@ -316,26 +317,24 @@ class DataTree(QtWidgets.QTreeWidget):
if idx.column() != 0:
continue
item = self.itemFromIndex(idx)
if item.parent() is None:
is_selected = item.checkState(0)
self.blockSignals(True)
for i in range(item.childCount()):
child = item.child(i)
from_parent.append(child)
self.blockSignals(False)
if is_selected == QtCore.Qt.Checked:
item.setCheckState(0, QtCore.Qt.Unchecked)
else:
item.setCheckState(0, QtCore.Qt.Checked)
else:
sets.append(item)
sets.append(item)
to_be_hidden = set()
to_be_shown = set()
self.blockSignals(True)
for it in sets:
if it in from_parent:
continue
it.setCheckState(0, QtCore.Qt.Unchecked if it.checkState(0) == QtCore.Qt.Checked else QtCore.Qt.Checked)
s1, s2 = self.data_change(it, emit=False)
to_be_hidden |= s2
to_be_shown |= s1
self.blockSignals(False)
self.stateChanged.emit(list(to_be_shown), list(to_be_hidden))
else:
super().keyPressEvent(evt)

View File

@ -177,9 +177,9 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow):
if isinstance(name, str):
name = [name]
plots = [plots]
toplevel = len(self.sets)
self.listWidget.blockSignals(True)
for (real_plot, imag_plot, err_plot), n in zip(plots, name):
toplevel = len(self.sets)
self.sets.append(n)
if real_plot:
@ -199,7 +199,16 @@ class QGraphWindow(QtWidgets.QGraphicsView, Ui_GraphWindow):
list_item.setCheckState(QtCore.Qt.Checked)
self.listWidget.addItem(list_item)
self.show_item(name)
toplevel += 1
self.listWidget.blockSignals(False)
if len(name) < 200:
self.show_item(name)
else:
QtWidgets.QMessageBox.warning(self, 'Display disabled',
'If more than 200 sets are added at once, they are not displayed to avoid major performance issues.\n'
'Building the data tree may still take some time, the checkmark on the left is invalid.\n'
'Please display them manually in smaller batches, thank you!')
def remove(self, name: str | list):
if isinstance(name, str):

View File

@ -385,12 +385,16 @@ class UpperManagement(QtCore.QObject):
def change_visibility(self, selected: list, deselected: list):
"""Change status of list of ids after status change in datawidget"""
for item_list, func in [(selected, 'show_item'), (deselected, 'hide_item')]:
grouping = {}
for s in item_list:
g = self.data[s].graph
if g not in grouping:
grouping[g] = []
grouping[g].append(s)
for s in selected:
self.graphs[self.data[s].graph].show_item([s])
for d in deselected:
self.graphs[self.data[d].graph].hide_item([d])
for k, v in grouping.items():
getattr(self.graphs[k], func)(v)
@QtCore.pyqtSlot(str, str)
def change_keys(self, identifier: str, name: str):

View File

@ -134,8 +134,8 @@ class HdfNode:
else:
self.parameter[key] = value
if self.parent is not None:
self.parent.set_parameter(key, value, keep=True)
# if self.parent is not None:
# self.parent.set_parameter(key, value, keep=True)
def set_title_parameter(self, child_node, params):
if params:
@ -174,7 +174,7 @@ class HdfReader(HdfNode):
self.create_node(self.file[base], parent=self)
except OSError:
self.file = None
raise IOError('Invalid file ' + filename)
raise IOError(f'Invalid file {filename}')
def __call__(self, filename, base='data_pool'):
super().clear()
@ -215,6 +215,7 @@ class HdfReader(HdfNode):
parent[name] = data
parent.num_signals += 1
# searching for attributes is performance bottleneck but necessary
for desc in attr.keys():
# looking for description_KEY in attributes
m = re.search(r'description_(?P<var>\S+)', desc)