git clone https://git.lucas.co/hou-control.git
hc: reorganize settings panel into a tabbed interface
python3.11libs/hc/hcsettings.py | 60 ++++++++++++++++++++++-------------------
1 file changed, 33 insertions(+), 27 deletions(-)
diff --git a/python3.11libs/hc/hcsettings.py b/python3.11libs/hc/hcsettings.py
index c1fa9af..a6263d9 100644
--- a/python3.11libs/hc/hcsettings.py
+++ b/python3.11libs/hc/hcsettings.py
@@ -15,6 +15,7 @@ from PySide6.QtWidgets import (
QLineEdit,
QScrollArea,
QSpinBox,
+ QTabWidget,
QVBoxLayout,
QWidget,
)
@@ -92,25 +93,20 @@ class HCSettingsPanel(QDialog):
self.setObjectName(self.OBJECT_NAME)
self.setWindowTitle("HC Settings")
self.setWindowFlags(Qt.Tool)
- self.resize(720, 960)
+ self.resize(720, 600) # Adjusted height for tabbed view
self.settings = HCSettings()
# path_tuple (e.g. ("keycam","guides","axis_size")) -> (widget, original_value)
self._fields = {}
- self._content = QWidget()
- self._content_layout = QVBoxLayout(self._content)
-
- scroll = QScrollArea()
- scroll.setWidgetResizable(True)
- scroll.setWidget(self._content)
+ self.tabs = QTabWidget()
buttons = QDialogButtonBox(QDialogButtonBox.Save | QDialogButtonBox.Close)
buttons.accepted.connect(self._save)
buttons.rejected.connect(self.close)
layout = QVBoxLayout(self)
- layout.addWidget(scroll)
+ layout.addWidget(self.tabs)
layout.addWidget(QLabel("Some settings (e.g. Desktop Mode) take effect on next start."))
layout.addWidget(buttons)
@@ -141,34 +137,44 @@ class HCSettingsPanel(QDialog):
def _rebuild(self):
- # Clear existing fields and rebuild from current file state
+ # Clear existing tabs
self._fields.clear()
- while self._content_layout.count():
- item = self._content_layout.takeAt(0)
- w = item.widget()
- if w is not None:
- w.setParent(None)
+ while self.tabs.count():
+ w = self.tabs.widget(0)
+ self.tabs.removeTab(0)
+ if w:
w.deleteLater()
+
data = self.settings.prefs()
- self._addSection(data, self._content_layout, ())
- self._content_layout.addStretch()
+
+ # Separate root-level scalars and top-level dicts
+ scalars = {k: v for k, v in data.items() if not isinstance(v, dict)}
+ dicts = {k: v for k, v in data.items() if isinstance(v, dict)}
+
+ if scalars:
+ self.tabs.addTab(self._createTabPage(scalars, ()), "General")
+
+ for key, value in dicts.items():
+ self.tabs.addTab(self._createTabPage(value, (key,)), self._prettify(key))
+
+ def _createTabPage(self, data, path):
+ # Create a scrollable page for the tab
+ scroll = QScrollArea()
+ scroll.setWidgetResizable(True)
+ content = QWidget()
+ layout = QVBoxLayout(content)
+ self._addSection(data, layout, path)
+ layout.addStretch()
+ scroll.setWidget(content)
+ return scroll
def _addSection(self, data, parent_layout, path):
scalars = {k: v for k, v in data.items() if not isinstance(v, dict)}
dicts = {k: v for k, v in data.items() if isinstance(v, dict)}
if scalars:
- if not path:
- # Root-level scalars go in a "General" group box so they align
- # visually with the other top-level groups.
- group = QGroupBox("General")
- gl = QVBoxLayout(group)
- form = QFormLayout()
- gl.addLayout(form)
- parent_layout.addWidget(group)
- else:
- form = QFormLayout()
- parent_layout.addLayout(form)
+ form = QFormLayout()
+ parent_layout.addLayout(form)
for key, value in scalars.items():
sub_path = path + (key,)
widget = self._makeWidget(key, value)