from PySide6.QtWidgets import QTreeWidget, QTreeWidgetItem, QStackedWidget, QDialog from PySide6.QtCore import Slot as pyqtSlot, Qt from pyqtgraph.parametertree import ParameterTree from .utils import splitter, layout class PreferencesTreeItem(QTreeWidgetItem): def __init__( self, name, widget, ): super(PreferencesTreeItem, self).__init__(name) self.widget = widget class PreferencesWidget(QDialog): def __init__(self, parent, components): super(PreferencesWidget, self).__init__( parent, Qt.Window | Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint, windowTitle="Preferences", ) self.stacked = QStackedWidget(self) self.preferences_tree = QTreeWidget( self, headerHidden=True, itemsExpandable=False, rootIsDecorated=False, columnCount=1, ) self.root = self.preferences_tree.invisibleRootItem() self.add("General", parent) for v in parent.components.values(): self.add(v.name, v) self.splitter = splitter((self.preferences_tree, self.stacked), (2, 5)) layout(self, (self.splitter,), self) self.preferences_tree.currentItemChanged.connect(self.handleSelection) def add(self, name, component): if component.preferences: widget = ParameterTree() widget.setHeaderHidden(True) widget.setParameters(component.preferences, showTop=False) self.root.addChild(PreferencesTreeItem((name,), widget)) self.stacked.addWidget(widget) @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem) def handleSelection(self, item, *args): if item: self.stacked.setCurrentWidget(item.widget)