# -*- coding: utf-8 -*- # gui/components/radio_group.py """Контейнеризированная обёртка над QButtonGroup.""" from __future__ import annotations from PySide6.QtWidgets import QButtonGroup from gui.containers.s_container import SContainer class RadioGroup(SContainer): """Логическая группа RadioButton с взаимоисключающим выбором. Оборачивает ``QButtonGroup`` в ``SContainer``-совместимый компонент, исключая прямое использование Qt-классов в прикладном коде. Визуально компонент невидим (zero-size), используется только для логической привязки RadioButton друг к другу. """ def __init__( self, exclusive: bool = True, parent=None, ): super().__init__( width_percent=None, height_percent=None, margin=0, parent=parent, ) self.setFixedSize(0, 0) self._group = QButtonGroup(self) self._group.setExclusive(exclusive) # ── Публичный API ───────────────────────────────────────────── def add_button(self, radio_button) -> None: """Добавить ``RadioButton`` в группу.""" radio_button.add_to_group(self._group) def set_exclusive(self, exclusive: bool) -> None: self._group.setExclusive(exclusive) def is_exclusive(self) -> bool: return self._group.exclusive() @property def button_clicked(self): """Сигнал ``QButtonGroup.buttonClicked``.""" return self._group.buttonClicked @property def button_toggled(self): """Сигнал ``QButtonGroup.buttonToggled``.""" return self._group.buttonToggled # --------------------------------------------------------------------------- # Module workflow notes # --------------------------------------------------------------------------- # # 1) Назначение модуля: # Логическая группа RadioButton с взаимоисключающим выбором, # оборачивающая QButtonGroup в SContainer-совместимый компонент. # Визуально невидим (fixedSize 0×0), используется только для # логической привязки. # # 2) Зависимости модуля: # Импорты: QButtonGroup (PySide6.QtWidgets), # SContainer (gui.containers.s_container) # Хост-класс / базовый класс: SContainer # Внешние библиотеки: PySide6 (обязательна) # # 3) Экспорт: # Класс RadioGroup — публичный компонент логической группировки. # Методы: add_button(RadioButton), set_exclusive(bool), is_exclusive(). # Свойства: button_clicked, button_toggled (сигналы QButtonGroup). # # 4) Состояние (поля): # _group: QButtonGroup — внутренняя группа кнопок # # 5) Последовательность действий и вызовов: # __init__(exclusive=True, parent=None) # -> super().__init__(...) -> setFixedSize(0, 0) # -> QButtonGroup(self) -> setExclusive(exclusive) # add_button(radio_button) # -> radio_button.add_to_group(_group) # (делегирует RadioButton → group.addButton) # # 6) Побочные эффекты: # - Модифицирует QButtonGroup (добавление кнопок, смена exclusive). # - Размер виджета зафиксирован 0×0 — невидимый. # # 7) Границы ответственности: # Модуль НЕ управляет визуальным представлением кнопок. # НЕ применяет стили. НЕ подключается к theme_bus. # # 8) Обработка ошибок: # Нет явной обработки. Ожидает корректный RadioButton на входе. # # 9) Инварианты и контракты: # - По умолчанию exclusive=True — только одна кнопка может быть выбрана. # - FixedSize(0, 0) — виджет не занимает место в layout. # # 10) Правило сопровождения: # Не добавлять визуальные элементы. Не менять размер с 0×0. # add_button() принимает только RadioButton (не QRadioButton напрямую).