Add Dispatch_V0.1.1

This commit is contained in:
2026-04-29 08:18:54 +04:00
commit a7ede6ded4
404 changed files with 39167 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
# -*- 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 напрямую).