# -*- coding: utf-8 -*- # gui/components/springs.py """Простые пружины для компоновок.""" from PySide6.QtWidgets import QWidget, QSizePolicy class VSpring(QWidget): """Вертикальная пружина.""" def __init__(self, parent=None): super().__init__(parent) self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) def set_enabled(self, enabled: bool) -> None: self.setEnabled(enabled) def set_min_width(self, width: int) -> None: self.setMinimumWidth(width) def set_min_height(self, height: int) -> None: self.setMinimumHeight(height) def set_max_width(self, width: int) -> None: self.setMaximumWidth(width) def set_max_height(self, height: int) -> None: self.setMaximumHeight(height) def set_fixed_size(self, width: int, height: int) -> None: self.setMinimumSize(width, height) self.setMaximumSize(width, height) def set_tooltip(self, text: str) -> None: self.setToolTip(text) def set_size_policy(self, horizontal, vertical) -> None: self.setSizePolicy(horizontal, vertical) class HSpring(QWidget): """Горизонтальная пружина.""" def __init__(self, parent=None): super().__init__(parent) self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) def set_enabled(self, enabled: bool) -> None: self.setEnabled(enabled) def set_min_width(self, width: int) -> None: self.setMinimumWidth(width) def set_min_height(self, height: int) -> None: self.setMinimumHeight(height) def set_max_width(self, width: int) -> None: self.setMaximumWidth(width) def set_max_height(self, height: int) -> None: self.setMaximumHeight(height) def set_fixed_size(self, width: int, height: int) -> None: self.setMinimumSize(width, height) self.setMaximumSize(width, height) def set_tooltip(self, text: str) -> None: self.setToolTip(text) def set_size_policy(self, horizontal, vertical) -> None: self.setSizePolicy(horizontal, vertical) # --------------------------------------------------------------------------- # Module workflow notes # --------------------------------------------------------------------------- # # 1) Назначение модуля: # Простые пружины (spacer-виджеты) для вертикальной и горизонтальной # компоновки: VSpring растягивается вертикально, HSpring — горизонтально. # # 2) Зависимости модуля: # Импорты: QWidget, QSizePolicy (PySide6.QtWidgets) # Хост-класс / базовый класс: QWidget (не SContainer!) # Внешние библиотеки: PySide6 (обязательна) # # 3) Экспорт: # Класс VSpring — вертикальная пружина (Minimum × Expanding). # Класс HSpring — горизонтальная пружина (Expanding × Minimum). # Оба класса предоставляют стандартный API размеров: # set_enabled(), set_min/max_width/height(), set_fixed_size(), # set_tooltip(), set_size_policy(). # # 4) Состояние (поля): # Нет собственных полей. Только наследованные от QWidget. # # 5) Последовательность действий и вызовов: # __init__(parent=None) # -> super().__init__(parent) # -> setSizePolicy(Minimum, Expanding) для VSpring # -> setSizePolicy(Expanding, Minimum) для HSpring # # 6) Побочные эффекты: # Нет — чистые пустые виджеты-распорки. # # 7) Границы ответственности: # Только распорка в layout. Не рисует, не обрабатывает события, # не подключается к theme_bus, не имеет стилей. # # 8) Обработка ошибок: # Нет обработки ошибок. Виджет пассивен. # # 9) Инварианты и контракты: # - VSpring всегда Expanding по вертикали, Minimum по горизонтали. # - HSpring всегда Expanding по горизонтали, Minimum по вертикали. # # 10) Правило сопровождения: # Не наследовать от SContainer — пружины должны быть максимально # лёгкими. Использовать для заполнения свободного пространства # в VContainer/HContainer.