From dd3bc90f336d8241963a8087bd3e768ba4b32910 Mon Sep 17 00:00:00 2001 From: Glen Beane <356266+gbeane@users.noreply.github.com> Date: Thu, 18 Jun 2026 23:12:23 -0400 Subject: [PATCH 1/3] Use small Material triangle for settings expander disclosure icon --- .../ui/settings_dialog/collapsible_section.py | 20 ++++++++++++++----- tests/ui/test_settings_dialog.py | 20 ++++++++++++++++++- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/jabs/ui/settings_dialog/collapsible_section.py b/src/jabs/ui/settings_dialog/collapsible_section.py index cf5101e0..2736d390 100644 --- a/src/jabs/ui/settings_dialog/collapsible_section.py +++ b/src/jabs/ui/settings_dialog/collapsible_section.py @@ -1,6 +1,10 @@ -from PySide6.QtCore import Signal +from PySide6.QtCore import QSize, Signal from PySide6.QtGui import Qt from PySide6.QtWidgets import QFrame, QSizePolicy, QToolButton, QVBoxLayout, QWidget +from qt_material_icons import MaterialIcon + +# Pixel size of the disclosure triangle. +_INDICATOR_SIZE = 16 class CollapsibleSection(QWidget): @@ -16,10 +20,18 @@ class CollapsibleSection(QWidget): def __init__(self, title: str, content: QWidget, parent: QWidget | None = None) -> None: super().__init__(parent) self._content = content + + # Disclosure indicator: a small Material triangle that points to the side when + # collapsed and down when expanded. qt_material_icons renders in the palette + # text color, so it follows the application theme. + self._collapsed_icon = MaterialIcon("arrow_right") + self._expanded_icon = MaterialIcon("arrow_drop_down") + self._toggle_btn = QToolButton(self) self._toggle_btn.setStyleSheet("QToolButton { border: none; }") self._toggle_btn.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) - self._toggle_btn.setArrowType(Qt.ArrowType.RightArrow) + self._toggle_btn.setIconSize(QSize(_INDICATOR_SIZE, _INDICATOR_SIZE)) + self._toggle_btn.setIcon(self._collapsed_icon) self._toggle_btn.setText(title) self._toggle_btn.setCheckable(True) self._toggle_btn.setChecked(False) @@ -43,9 +55,7 @@ def __init__(self, title: str, content: QWidget, parent: QWidget | None = None) def _on_toggled(self, checked: bool) -> None: """Handle toggling the collapsible section.""" - self._toggle_btn.setArrowType( - Qt.ArrowType.DownArrow if checked else Qt.ArrowType.RightArrow - ) + self._toggle_btn.setIcon(self._expanded_icon if checked else self._collapsed_icon) self._content.setVisible(checked) self._content.updateGeometry() diff --git a/tests/ui/test_settings_dialog.py b/tests/ui/test_settings_dialog.py index 381885fa..97c9febb 100644 --- a/tests/ui/test_settings_dialog.py +++ b/tests/ui/test_settings_dialog.py @@ -7,11 +7,13 @@ from jabs.core.enums import ClassifierMode try: - from PySide6.QtWidgets import QApplication + from PySide6.QtGui import Qt + from PySide6.QtWidgets import QApplication, QLabel from jabs.ui.settings_dialog.classifier_mode_settings_group import ( ClassifierModeSettingsGroup, ) + from jabs.ui.settings_dialog.collapsible_section import CollapsibleSection from jabs.ui.settings_dialog.settings_dialog import _OverlapCheckThread SKIP_UI_TESTS = False @@ -81,3 +83,19 @@ def test_classifier_mode_group_roundtrips_enum_not_label() -> None: group.set_values({CLASSIFIER_MODE_KEY: ClassifierMode.BINARY.value}) assert group.get_values() == {CLASSIFIER_MODE_KEY: ClassifierMode.BINARY} + + +def test_collapsible_section_toggles_disclosure_icon() -> None: + """The disclosure indicator swaps between the collapsed and expanded icons.""" + section = CollapsibleSection("More info", QLabel("content")) + + # No native arrow is drawn; only the Material disclosure icon is shown. + assert section._toggle_btn.arrowType() == Qt.ArrowType.NoArrow + collapsed_key = section._toggle_btn.icon().cacheKey() + + section.set_expanded(True) + expanded_key = section._toggle_btn.icon().cacheKey() + assert expanded_key != collapsed_key + + section.set_expanded(False) + assert section._toggle_btn.icon().cacheKey() == collapsed_key From 48680de4d81e37ff50762d0bf6f9a22b89997e63 Mon Sep 17 00:00:00 2001 From: Glen Beane <356266+gbeane@users.noreply.github.com> Date: Thu, 18 Jun 2026 23:24:50 -0400 Subject: [PATCH 2/3] Import Qt from QtCore; set toolbutton arrowType to NoArrow explicitly --- src/jabs/ui/settings_dialog/collapsible_section.py | 5 +++-- tests/ui/test_settings_dialog.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/jabs/ui/settings_dialog/collapsible_section.py b/src/jabs/ui/settings_dialog/collapsible_section.py index 2736d390..ecf07dbe 100644 --- a/src/jabs/ui/settings_dialog/collapsible_section.py +++ b/src/jabs/ui/settings_dialog/collapsible_section.py @@ -1,5 +1,4 @@ -from PySide6.QtCore import QSize, Signal -from PySide6.QtGui import Qt +from PySide6.QtCore import QSize, Qt, Signal from PySide6.QtWidgets import QFrame, QSizePolicy, QToolButton, QVBoxLayout, QWidget from qt_material_icons import MaterialIcon @@ -30,6 +29,8 @@ def __init__(self, title: str, content: QWidget, parent: QWidget | None = None) self._toggle_btn = QToolButton(self) self._toggle_btn.setStyleSheet("QToolButton { border: none; }") self._toggle_btn.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) + # Only the Material disclosure icon is shown; never the style's native arrow. + self._toggle_btn.setArrowType(Qt.ArrowType.NoArrow) self._toggle_btn.setIconSize(QSize(_INDICATOR_SIZE, _INDICATOR_SIZE)) self._toggle_btn.setIcon(self._collapsed_icon) self._toggle_btn.setText(title) diff --git a/tests/ui/test_settings_dialog.py b/tests/ui/test_settings_dialog.py index 97c9febb..10522638 100644 --- a/tests/ui/test_settings_dialog.py +++ b/tests/ui/test_settings_dialog.py @@ -7,7 +7,7 @@ from jabs.core.enums import ClassifierMode try: - from PySide6.QtGui import Qt + from PySide6.QtCore import Qt from PySide6.QtWidgets import QApplication, QLabel from jabs.ui.settings_dialog.classifier_mode_settings_group import ( From 306ee747bce72104c137a494acf930365e975342 Mon Sep 17 00:00:00 2001 From: Glen Beane <356266+gbeane@users.noreply.github.com> Date: Thu, 18 Jun 2026 23:28:25 -0400 Subject: [PATCH 3/3] Increase settings expander disclosure icon to 18px --- src/jabs/ui/settings_dialog/collapsible_section.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jabs/ui/settings_dialog/collapsible_section.py b/src/jabs/ui/settings_dialog/collapsible_section.py index ecf07dbe..a1b3b36c 100644 --- a/src/jabs/ui/settings_dialog/collapsible_section.py +++ b/src/jabs/ui/settings_dialog/collapsible_section.py @@ -3,7 +3,7 @@ from qt_material_icons import MaterialIcon # Pixel size of the disclosure triangle. -_INDICATOR_SIZE = 16 +_INDICATOR_SIZE = 18 class CollapsibleSection(QWidget):