110 lines
4.7 KiB
Python
110 lines
4.7 KiB
Python
# -*- 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 напрямую).
|