diff --git a/src/pc/gui/panels/__init__.py b/src/pc/gui/panels/__init__.py index 7988084..7b0df04 100644 --- a/src/pc/gui/panels/__init__.py +++ b/src/pc/gui/panels/__init__.py @@ -3,11 +3,15 @@ GUI パネルウィジェット群 """ +from pc.gui.panels.collapsible_group_box import ( + CollapsibleGroupBox, +) from pc.gui.panels.control_param_panel import ControlParamPanel from pc.gui.panels.image_param_panel import ImageParamPanel from pc.gui.panels.overlay_panel import OverlayPanel __all__ = [ + "CollapsibleGroupBox", "ControlParamPanel", "ImageParamPanel", "OverlayPanel", diff --git a/src/pc/gui/panels/collapsible_group_box.py b/src/pc/gui/panels/collapsible_group_box.py new file mode 100644 index 0000000..f444ad6 --- /dev/null +++ b/src/pc/gui/panels/collapsible_group_box.py @@ -0,0 +1,52 @@ +""" +collapsible_group_box +チェックボックスで折りたたみ可能な QGroupBox +""" + +from PySide6.QtWidgets import QGroupBox, QLayout, QWidget + + +class CollapsibleGroupBox(QGroupBox): + """タイトルのチェックで中身を折りたたみできる QGroupBox""" + + def __init__(self, title: str) -> None: + super().__init__(title) + self.setCheckable(True) + self.setChecked(False) + self.toggled.connect(self._toggle_content) + + def setLayout(self, layout: QLayout) -> None: + """レイアウト設定後に折りたたみ状態を反映する""" + super().setLayout(layout) + if not self.isChecked(): + _set_layout_visible(layout, False) + + def _toggle_content(self, on: bool) -> None: + """チェック状態に応じてレイアウト内の要素を表示/非表示する + + Args: + on: True で展開,False で折りたたみ + """ + layout = self.layout() + if layout is None: + return + _set_layout_visible(layout, on) + + +def _set_layout_visible( + layout: QLayout, visible: bool, +) -> None: + """レイアウト内の全ウィジェットを再帰的に表示/非表示する + + Args: + layout: 対象レイアウト + visible: True で表示,False で非表示 + """ + for i in range(layout.count()): + item = layout.itemAt(i) + widget = item.widget() + if isinstance(widget, QWidget): + widget.setVisible(visible) + sub = item.layout() + if sub is not None: + _set_layout_visible(sub, visible) diff --git a/src/pc/gui/panels/control_param_panel.py b/src/pc/gui/panels/control_param_panel.py index 864288d..133b7fa 100644 --- a/src/pc/gui/panels/control_param_panel.py +++ b/src/pc/gui/panels/control_param_panel.py @@ -8,7 +8,6 @@ QComboBox, QDoubleSpinBox, QFormLayout, - QGroupBox, QHBoxLayout, QInputDialog, QLabel, @@ -18,6 +17,10 @@ QWidget, ) +from pc.gui.panels.collapsible_group_box import ( + CollapsibleGroupBox, +) + from pc.gui.panels.image_param_panel import _create_preset_ui from pc.steering.param_store import ( PdPreset, @@ -29,7 +32,7 @@ from pc.steering.pursuit_control import PursuitParams -class ControlParamPanel(QGroupBox): +class ControlParamPanel(CollapsibleGroupBox): """PD / 2点パシュート制御パラメータ調整 UI""" # PD パラメータが変更されたときに emit する diff --git a/src/pc/gui/panels/image_param_panel.py b/src/pc/gui/panels/image_param_panel.py index 1e7a1b7..61e4175 100644 --- a/src/pc/gui/panels/image_param_panel.py +++ b/src/pc/gui/panels/image_param_panel.py @@ -8,7 +8,6 @@ QComboBox, QDoubleSpinBox, QFormLayout, - QGroupBox, QHBoxLayout, QInputDialog, QLabel, @@ -19,6 +18,10 @@ QWidget, ) +from pc.gui.panels.collapsible_group_box import ( + CollapsibleGroupBox, +) + from pc.steering.auto_params import ( load_detect_params, save_detect_params, @@ -36,7 +39,7 @@ ) -class ImageParamPanel(QGroupBox): +class ImageParamPanel(CollapsibleGroupBox): """画像処理パラメータ調整 UI""" # 画像処理パラメータが変更されたときに emit する diff --git a/src/pc/gui/panels/overlay_panel.py b/src/pc/gui/panels/overlay_panel.py index ea8aeee..4814d21 100644 --- a/src/pc/gui/panels/overlay_panel.py +++ b/src/pc/gui/panels/overlay_panel.py @@ -3,12 +3,15 @@ デバッグ表示の切替チェックボックスを提供するパネル """ -from PySide6.QtWidgets import QCheckBox, QGroupBox, QVBoxLayout +from PySide6.QtWidgets import QCheckBox, QVBoxLayout +from pc.gui.panels.collapsible_group_box import ( + CollapsibleGroupBox, +) from pc.vision.overlay import OverlayFlags -class OverlayPanel(QGroupBox): +class OverlayPanel(CollapsibleGroupBox): """デバッグ表示の切替チェックボックス群""" def __init__(self) -> None: