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

423 lines
13 KiB
Python
Raw 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/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 коде.