# -*- coding: utf-8 -*- # gui/styles/widgets.py """Стили для контейнеров, диалогов, сплиттеров и т.д.""" WIDGETS = { "DIALOG": """ QDialog { background-color: palette(window); } """, "DIALOG_BUTTON_BOX": """ QDialogButtonBox { background-color: transparent; } QDialogButtonBox QPushButton { background-color: palette(button); color: palette(button-text); border: 1px solid palette(mid); border-radius: 0px; font-size: 14px; min-height: 32px; padding: 4px 10px; } QDialogButtonBox QPushButton:hover { border-color: palette(highlight); } QDialogButtonBox QPushButton:pressed { background-color: palette(light); } QDialogButtonBox QPushButton:disabled { color: palette(mid); border-color: palette(dark); } """, "GROUP_BOX": """ QGroupBox { font-size: 14px; font-weight: 600; color: palette(window-text); border: 1px solid palette(mid); border-radius: 0px; margin-top: 6px; background-color: palette(base); } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; background-color: palette(base); color: palette(window-text); padding: 2px 5px 2px 9px; } """, "GROUP_BOX_DARK": """ QGroupBox { font-size: 14px; font-weight: 600; color: #f2f2f2; border: 1px solid #5a5a5a; border-radius: 0px; margin-top: 6px; background-color: #2d2d2d; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; background-color: #2d2d2d; color: #f2f2f2; padding: 2px 5px 2px 9px; } """, "GROUP_BOX_LIGHT": """ QGroupBox { font-size: 14px; font-weight: 600; color: #172B4D; border: 1px solid #DFE1E6; border-radius: 0px; margin-top: 6px; background-color: #FFFFFF; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; background-color: #FFFFFF; color: #172B4D; padding: 2px 5px 2px 9px; } """, "GROUP_BOX_CENTER_TITLE": """ QGroupBox { font-size: 14px; font-weight: 600; color: palette(window-text); border: 1px solid palette(mid); border-radius: 0px; margin-top: 6px; background-color: palette(base); } QGroupBox::title { subcontrol-position: top center; background-color: transparent; color: palette(window-text); padding: 12px 5px 2px 9px; } """, "GROUP_BOX_CENTER_TITLE_DARK": """ QGroupBox { font-size: 14px; font-weight: 600; color: #f2f2f2; border: 1px solid #5a5a5a; border-radius: 0px; margin-top: 6px; background-color: #2d2d2d; } QGroupBox::title { subcontrol-position: top center; background-color: transparent; color: #f2f2f2; padding: 12px 5px 2px 9px; } """, "GROUP_BOX_CENTER_TITLE_LIGHT": """ QGroupBox { font-size: 14px; font-weight: 600; color: #172B4D; border: 1px solid #DFE1E6; border-radius: 0px; margin-top: 6px; background-color: #FFFFFF; } QGroupBox::title { subcontrol-position: top center; background-color: transparent; color: #172B4D; padding: 12px 5px 2px 9px; } """, "W": """ background-color: rgba(255, 255, 255, 0.15); border: 1px solid #ffffff; border-radius: 0px; outline: 1px solid #007bff; """, "W_FRAME": """ QWidget#main_container { background-color: rgba(255, 255, 255, 0.15); border: 1px solid #ffffff; border-radius: 0px; outline: 1px solid #007bff; } """, "B": """ background-color: rgba(0, 0, 0, 0.15); border: 1px solid #000000; border-radius: 0px; outline: 1px solid #ff8400; """, "MODEL_VIEW_PANEL": """ QWidget#model_view_panel { background-color: palette(base); border: 1px solid palette(mid); border-radius: 0px; } """, "SPLITTER": """ QSplitter::handle { background-color: palette(mid); width: 4px; } QSplitter::handle:hover { background-color: palette(highlight); } """, "STACKED_WIDGET": """ QStackedWidget { background-color: palette(window); } """, "SCROLL_CONTAINER": """ QScrollArea { background-color: transparent; border: none; } QScrollArea > QWidget > QWidget { background-color: transparent; border: none; } """, "DEFAULT": """ QWidget { background-color: transparent; border: none; border-radius: 0px; } """, "TOOLS_PANEL_CONTAINER": """ QWidget { background-color: palette(base); border: 1px solid palette(mid); } """, "TOOLS_PANEL_CONTAINER_TRANSPARENT": """ QWidget { background-color: transparent; border: 1px solid palette(mid); border-radius: 0px; } """, "TREE_WIDGET": """ QTreeWidget { background-color: palette(base); border: 1px solid palette(mid); border-radius: 0px; font-size: 14px; color: palette(text); } QTreeWidget::item { color: palette(text); } QTreeWidget::item:selected { background-color: palette(highlight); color: palette(highlighted-text); } QHeaderView::section { background-color: palette(button); color: palette(button-text); border: 1px solid palette(mid); } """, "TREE_WIDGET_TOP_FLAT": """ QTreeWidget { background-color: palette(base); border: 1px solid palette(mid); border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; font-size: 14px; color: palette(text); } QLabel#properties_body_label, QWidget#properties_body_label { background-color: palette(base); border: 1px solid palette(mid); border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; color: palette(text); font-size: 13px; font-weight: 600; } QTreeWidget::item { color: palette(text); } QTreeWidget::item:selected { background-color: palette(highlight); color: palette(highlighted-text); } QHeaderView::section { background-color: palette(button); color: palette(button-text); border: 1px solid palette(mid); } """, "TOPOLOGY_TREE_PANEL": """ background-color: palette(base); border: 1px solid palette(mid); border-radius: 0px; QTreeWidget { background-color: #3C3C3C; border: 1px solid palette(mid); border-radius: 0px; font-size: 14px; color: palette(text); } QTreeWidget::item { background-color: #3C3C3C; color: palette(text); } QTreeWidget::item:selected { background-color: palette(highlight); color: palette(highlighted-text); } QHeaderView::section { background-color: #3C3C3C; color: palette(button-text); border: 1px solid palette(mid); } """, "VIEW_IMAGE_BACKGROUND": """ background-color: palette(window); """, "VIEW_WIDGET_BACKGROUND": """ background-color: palette(base); border: 1px solid palette(mid); border-radius: 0px; """, # Стили для модуля зонирования "ZONE_PROPERTIES_GROUP": """ QGroupBox { font-weight: 600; border: 1px solid palette(mid); border-radius: 0px; margin-top: 12px; padding-top: 10px; background-color: palette(base); color: palette(window-text); } QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 5px 0 5px; color: palette(window-text); } """, "ZONE_PROPERTIES_PANEL": """ QWidget { border: 1px solid palette(mid); background-color: palette(base); } """, "ZONE_PROPERTIES_HOST": """ QWidget { border: none; background-color: palette(window); } """, "ZONE_PROPERTIES_WIDGET": """ QWidget#zone_properties_widget { background-color: palette(window); } """, "MAIN_WINDOW_DARK": """ QMainWindow { background-color: #2b2b2b; } """, "MAIN_WINDOW_LIGHT": """ QMainWindow { background-color: #F4F5F7; } """, } # --------------------------------------------------------------------------- # Module workflow notes # --------------------------------------------------------------------------- # # 1) Назначение модуля: # Определение QSS-стилей для контейнеров, диалогов, сплиттеров, # group box'ов, scroll-контейнеров, tree widget'ов, панелей свойств # зон, модели вида и прочих составных виджетов. Поддержка тем: # база (palette), _DARK, _LIGHT варианты. # # 2) Зависимости модуля: # Импорты: нет # Хост/базовый класс: нет (модуль-словарь) # Внешние библиотеки: нет # # 3) Экспорт: # Словарь WIDGETS: dict[str, str] — ключ → QSS-строка. # Ключи: DIALOG, DIALOG_BUTTON_BOX, GROUP_BOX, GROUP_BOX_DARK, # GROUP_BOX_LIGHT, GROUP_BOX_CENTER_TITLE, GROUP_BOX_CENTER_TITLE_DARK, # GROUP_BOX_CENTER_TITLE_LIGHT, W, W_FRAME, B, # MODEL_VIEW_PANEL, SPLITTER, STACKED_WIDGET, SCROLL_CONTAINER, # DEFAULT, TOOLS_PANEL_CONTAINER, TOOLS_PANEL_CONTAINER_TRANSPARENT, # TREE_WIDGET, TREE_WIDGET_TOP_FLAT, TOPOLOGY_TREE_PANEL, # VIEW_IMAGE_BACKGROUND, VIEW_WIDGET_BACKGROUND, # ZONE_PROPERTIES_GROUP, ZONE_PROPERTIES_PANEL, # ZONE_PROPERTIES_HOST, ZONE_PROPERTIES_WIDGET. # # 4) Состояние (поля): # WIDGETS: dict[str, str] — единственный экспортируемый словарь. # # 5) Последовательность действий и вызовов: # Нет вызовов; модуль декларативный. # Импортируется в gui/styles/__init__.py → APP_STYLES.update(WIDGETS). # # 6) Побочные эффекты: # Нет побочных эффектов при импорте. # # 7) Границы ответственности: # НЕ применяет стили — только хранит QSS-строки. # НЕ содержит стили для кнопок (→ buttons.py), меток (→ labels.py) # или полей ввода (→ inputs.py). # # 8) Обработка ошибок: # Нет; модуль декларативный. # # 9) Инварианты и контракты: # - Тематические варианты: KEY / KEY_DARK / KEY_LIGHT. # - W и B — debug-стили с полупрозрачным фоном и outline. # - GROUP_BOX_CENTER_TITLE — вариант с центрированным заголовком. # - Все QSS-строки — валидный Qt StyleSheet синтаксис. # # 10) Правило сопровождения: # Новые стили контейнеров/диалогов/виджетов добавлять сюда. # Соблюдать паттерн KEY / KEY_DARK / KEY_LIGHT. # Debug-стили (W, B) не использовать в production коде.