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