git.lucas.co / hou-control
git clone https://git.lucas.co/hou-control.git

commit06d931fff1f8402666f7fc7c8381d6f57a385d5d
parent91c0201d43
authorLucas Galante <[email protected]>
date2026-04-16 22:46
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)