Files
Dispatch/Dispatch_V0.1.1/gui/components/radio_group.py
2026-04-29 08:18:54 +04:00

110 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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 напрямую).