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,970 @@
# -*- coding: utf-8 -*-
# gui/styles/buttons.py
"""Стили для всех видов кнопок"""
from pathlib import Path
import re
LIGHT_TEXT_PRIMARY = "#172B4D"
LIGHT_TEXT_SECONDARY = "#5E6C84"
LIGHT_TEXT_DISABLED = "#A5ADBA"
LIGHT_PANEL = "#FFFFFF"
LIGHT_BORDER = "#DFE1E6"
LIGHT_HOVER = "#EBECF0"
LIGHT_PRESSED = "#DFE1E6"
LIGHT_ACCENT_SOFT = "#DEEBFF"
LIGHT_ACCENT_BORDER = "#85B8FF"
BUTTONS = {
"BUTTON_PRIMARY": """
QPushButton {
background-color: palette(highlight);
color: #ffffff;
border: 1px solid palette(highlight);
border-radius: 0px;
padding: 8px 14px;
font-size: 14px;
font-weight: 600;
}
QPushButton:hover {
background-color: #0747A6;
border-color: #0747A6;
}
QPushButton:pressed {
background-color: #043A7D;
border-color: #043A7D;
}
QPushButton:disabled {
background-color: palette(mid);
color: #42526E;
border-color: palette(mid);
}
""",
"BUTTON_SECONDARY": """
QPushButton {
background-color: palette(button);
color: palette(button-text);
border: 1px solid palette(mid);
border-radius: 0px;
padding: 4px 8px;
font-size: 12px;
min-width: 100px;
min-height: 30px;
}
QPushButton:hover {
background-color: #EBECF0;
}
QPushButton:pressed {
background-color: #DFE1E6;
}
""",
"BUTTON_SMALL": """
QPushButton {
background-color: palette(button);
color: palette(button-text);
border: 1px solid palette(mid);
border-radius: 0px;
padding: 6px 12px;
font-size: 12px;
min-width: 80px;
min-height: 30px;
}
QPushButton:hover {
background-color: #EBECF0;
}
QPushButton:pressed {
background-color: #DFE1E6;
}
QPushButton:checked {
background-color: palette(highlight);
color: #ffffff;
border-color: palette(highlight);
}
""",
"MEASURE_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/measure_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"MEASURE_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/measure_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"MEASURE_TEXT_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 0px;
qproperty-toolButtonStyle: ToolButtonTextOnly;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"MEASURE_TEXT_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 0px;
qproperty-toolButtonStyle: ToolButtonTextOnly;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"CREATE_ZONE_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_zone_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"CREATE_ZONE_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_zone_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"DELETE_ZONE_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/delete_zone_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"DELETE_ZONE_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/delete_zone_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"SELECT_ZONE_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/select_zone_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"SELECT_ZONE_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/select_zone_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"EDIT_ZONE_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/edit_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"EDIT_ZONE_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/edit_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"CREATE_NEW_MESH_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_mesh_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"CREATE_NEW_MESH_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_mesh_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"USE_CURRENT_MESH_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/use_current_mesh_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"USE_CURRENT_MESH_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/use_current_mesh_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"START_POINT_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/start_point_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"START_POINT_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/start_point_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"CREATE_MESH_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_mesh_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"CREATE_MESH_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_mesh_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"REMEMBER_POINT_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/remember_point_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"REMEMBER_POINT_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/remember_point_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"SET_GRID_STEP_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/set_step_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"SET_GRID_STEP_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/set_step_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"CREATE_VOLUME_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_volume_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"CREATE_VOLUME_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/create_volume_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"REMEMBER_VOLUME_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/accept_wolume_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"REMEMBER_VOLUME_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 16px;
padding-left: 6px;
qproperty-icon: url("gui/components/icons/accept_wolume_white.png");
qproperty-iconSize: 18px 18px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"MODEL_TOGGLE": """
QToolButton {
background-color: transparent;
color: white;
border: 1px solid #555555;
font-size: 14px;
padding-left: 6px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:disabled {
background-color: #1f1f1f;
color: #7a7a7a;
border: 1px solid #2a2a2a;
}
QToolButton:hover { background-color: #4a4a4a; }
QToolButton:pressed { background-color: #5a5a5a; }
""",
"MODEL_TOGGLE_ACTIVE": """
QToolButton {
background-color: rgba(255, 255, 255, 0.3);
color: white;
border: 1px solid #cfcfcf;
font-size: 14px;
padding-left: 6px;
qproperty-toolButtonStyle: ToolButtonTextBesideIcon;
}
QToolButton:hover { background-color: #6a6a6a; }
QToolButton:pressed { background-color: #7a7a7a; }
""",
"STANDARD_BUTTON_DARK_THEME": """
QPushButton {
background-color: #3c3c3c;
color: white;
border: none;
font-size: 16px;
text-align: left;
border-radius: 0px;
padding-left: 10px;
}
QPushButton:hover { background-color: #4a4a4a; }
QPushButton:pressed { background-color: #5a5a5a; }
QPushButton:disabled {
background-color: #2e2e2e;
color: #606060;
border: none;
}
""",
"STANDARD_BUTTON_DARK_THEME_ACTIVE": """
QPushButton {
background-color: #5a5a5a;
color: white;
border: none;
font-size: 16px;
text-align: left;
border-radius: 0px;
padding-left: 10px;
}
QPushButton:hover { background-color: #6a6a6a; }
QPushButton:pressed { background-color: #7a7a7a; }
QPushButton:disabled {
background-color: #2e2e2e;
color: #606060;
border: none;
}
""",
"STANDARD_BUTTON_LIGHT_THEME": """
QPushButton {
background-color: #FFFFFF;
color: #172B4D;
border: 1px solid #DFE1E6;
font-size: 16px;
border-radius: 0px;
text-align: left;
padding-left: 10px;
}
QPushButton:hover {
background-color: #EBECF0;
border-color: #DFE1E6;
}
QPushButton:pressed { background-color: #DFE1E6; }
QPushButton:disabled {
background-color: #F4F5F7;
color: #B3BAC5;
border: 1px solid #EBECF0;
}
""",
"STANDARD_BUTTON_LIGHT_THEME_ACTIVE": """
QPushButton {
background-color: #FFFFFF;
color: #0C66E4;
border: 1px solid #85B8FF;
font-size: 16px;
border-radius: 0px;
font-weight: 600;
text-align: left;
padding-left: 10px;
}
QPushButton:hover { background-color: #EBECF0; }
QPushButton:pressed { background-color: #DFE1E6; }
QPushButton:disabled {
background-color: #F4F5F7;
color: #B3BAC5;
border: 1px solid #EBECF0;
font-weight: normal;
}
""",
"TAB_BUTTON_ACTIVE": """
QPushButton {
background-color: #5a5a5a;
color: white;
border: 1px solid #6A6A6A;
font-size: 16px;
font-weight: bold;
text-align: center;
border-radius: 0px;
margin 10px;
}
QPushButton:hover {
background-color: #6a6a6a;
}
QPushButton:pressed {
background-color: #7a7a7a;
}
QPushButton:disabled {
background-color: #2e2e2e;
color: #606060;
border: 1px solid #333333;
}
""",
"TAB_BUTTON_NORMAL": """
QPushButton {
background-color: #3c3c3c;
color: #DCDCDC;
border: 1px solid #3A3A3A;
font-size: 16px;
text-align: center;
border-radius: 0px;
margin 10px;
}
QPushButton:hover {
background-color: #4a4a4a;
}
QPushButton:pressed {
background-color: #5a5a5a;
}
QPushButton:disabled {
background-color: #2e2e2e;
color: #606060;
border: 1px solid #333333;
}
""",
"VISUALIZATION_BUTTON_ACTIVE": """
QPushButton {
background-color: #0078d4;
color: #ffffff;
border: 1px solid #0078d4;
border-radius: 0px;
padding: 4px 8px;
font-size: 14px;
font-weight: bold;
}
QPushButton:hover {
background-color: #106ebe;
border-color: #106ebe;
}
QPushButton:pressed {
background-color: #005a9e;
}
""",
"VISUALIZATION_BUTTON_FILL": """
QPushButton {
background-color: palette(button);
color: palette(button-text);
border: 1px solid palette(mid);
border-radius: 0px;
padding: 4px 8px;
font-size: 14px;
font-weight: 600;
}
QPushButton:hover {
border-color: palette(highlight);
}
QPushButton:pressed {
background-color: palette(light);
}
""",
"TAB_BUTTON_ACTIVE_LIGHT": """
QPushButton {
background-color: #FFFFFF;
color: #0C66E4;
border: 1px solid #85B8FF;
font-size: 16px;
font-weight: 600;
text-align: center;
border-radius: 0px;
margin 10px;
}
QPushButton:hover {
background-color: #EBECF0;
}
QPushButton:pressed {
background-color: #DFE1E6;
}
QPushButton:disabled {
background-color: #F4F5F7;
color: #B3BAC5;
border: 1px solid #EBECF0;
}
""",
"TAB_BUTTON_NORMAL_LIGHT": """
QPushButton {
background-color: #FFFFFF;
color: #172B4D;
border: 1px solid #DFE1E6;
font-size: 16px;
text-align: center;
border-radius: 0px;
margin 10px;
}
QPushButton:hover {
background-color: #EBECF0;
}
QPushButton:pressed {
background-color: #DFE1E6;
}
QPushButton:disabled {
background-color: #F4F5F7;
color: #B3BAC5;
border: 1px solid #EBECF0;
}
""",
"RACK_TAB_BUTTON_ACTIVE": """
QPushButton {
background-color: #5F738A;
color: #FFFFFF;
border: 1px solid #6F8298;
border-radius: 3px;
padding: 2px 8px;
font-size: 13px;
font-weight: 600;
text-align: center;
}
QPushButton:hover {
background-color: #6A7F97;
border-color: #7A8FA6;
}
QPushButton:pressed {
background-color: #52657A;
border-color: #62778D;
}
""",
"RACK_TAB_BUTTON_NORMAL": """
QPushButton {
background-color: #3A3F45;
color: #D9DEE3;
border: 1px solid #4A5058;
border-radius: 3px;
padding: 2px 8px;
font-size: 13px;
font-weight: 500;
text-align: center;
}
QPushButton:hover {
background-color: #434A53;
border-color: #5A616A;
}
QPushButton:pressed {
background-color: #4D5661;
border-color: #636D78;
}
""",
"RACK_TAB_BUTTON_ACTIVE_LIGHT": """
QPushButton {
background-color: #DCEBFF;
color: #0C66E4;
border: 1px solid #85B8FF;
border-radius: 3px;
padding: 2px 8px;
font-size: 13px;
font-weight: 600;
text-align: center;
}
QPushButton:hover {
background-color: #CFE1FF;
border-color: #6FA8FF;
}
QPushButton:pressed {
background-color: #BFD6FF;
border-color: #5D9BFF;
}
""",
"RACK_TAB_BUTTON_NORMAL_LIGHT": """
QPushButton {
background-color: #FFFFFF;
color: #172B4D;
border: 1px solid #DFE1E6;
border-radius: 3px;
padding: 2px 8px;
font-size: 13px;
font-weight: 500;
text-align: center;
}
QPushButton:hover {
background-color: #F4F5F7;
border-color: #CDD4DD;
}
QPushButton:pressed {
background-color: #EBECF0;
border-color: #C1C7D0;
}
""",
}
_ICONS_DIR = Path(__file__).resolve().parents[1] / "components" / "icons"
def _replace_white_icons_with_black(style_text: str) -> str:
"""Заменить *_white.png на *_black.png, только если файл чёрной иконки существует."""
pattern = re.compile(r'([a-z0-9_]+)_white\.png', re.IGNORECASE)
def _swap(match):
icon_base = match.group(1)
black_name = f"{icon_base}_black.png"
if (_ICONS_DIR / black_name).exists():
return black_name
return match.group(0)
return pattern.sub(_swap, style_text)
def _make_light_toggle_style(style_text: str, is_active: bool = False) -> str:
"""Построить читаемый вариант светлой темы для стилей QToolButton панели инструментов зон."""
result = _replace_white_icons_with_black(style_text)
replacements = [
("color: white;", f"color: {LIGHT_TEXT_PRIMARY};"),
("color: #ffffff;", f"color: {LIGHT_TEXT_PRIMARY};"),
("border: 1px solid #555555;", f"border: 1px solid {LIGHT_BORDER};"),
("QToolButton:hover { background-color: #4a4a4a; }", f"QToolButton:hover {{ background-color: {LIGHT_HOVER}; }}"),
("QToolButton:pressed { background-color: #5a5a5a; }", f"QToolButton:pressed {{ background-color: {LIGHT_PRESSED}; }}"),
("background-color: #1f1f1f;", f"background-color: {LIGHT_PANEL};"),
("color: #7a7a7a;", f"color: {LIGHT_TEXT_SECONDARY};"),
("border: 1px solid #2a2a2a;", f"border: 1px solid {LIGHT_BORDER};"),
]
for old, new in replacements:
result = result.replace(old, new)
if is_active:
result = result.replace(
"background-color: rgba(255, 255, 255, 0.3);",
f"background-color: {LIGHT_ACCENT_SOFT};",
)
result = result.replace("border: 1px solid #cfcfcf;", f"border: 1px solid {LIGHT_ACCENT_BORDER};")
result = result.replace("QToolButton:hover { background-color: #6a6a6a; }", "QToolButton:hover { background-color: #CFE1FF; }")
result = result.replace("QToolButton:pressed { background-color: #7a7a7a; }", "QToolButton:pressed { background-color: #B3D4FF; }")
else:
result = result.replace("background-color: transparent;", f"background-color: {LIGHT_PANEL};")
result = result.replace("color: #9a9a9a;", f"color: {LIGHT_TEXT_DISABLED};")
result = result.replace("color: #1a1a1a;", f"color: {LIGHT_TEXT_PRIMARY};")
return result
_ZONE_TOOL_TOGGLE_KEYS = (
"MEASURE_TEXT_TOGGLE",
"MEASURE_TEXT_TOGGLE_ACTIVE",
"CREATE_ZONE_TOGGLE",
"CREATE_ZONE_TOGGLE_ACTIVE",
"DELETE_ZONE_TOGGLE",
"DELETE_ZONE_TOGGLE_ACTIVE",
"SELECT_ZONE_TOGGLE",
"SELECT_ZONE_TOGGLE_ACTIVE",
"EDIT_ZONE_TOGGLE",
"EDIT_ZONE_TOGGLE_ACTIVE",
"CREATE_NEW_MESH_TOGGLE",
"CREATE_NEW_MESH_TOGGLE_ACTIVE",
"USE_CURRENT_MESH_TOGGLE",
"USE_CURRENT_MESH_TOGGLE_ACTIVE",
"START_POINT_TOGGLE",
"START_POINT_TOGGLE_ACTIVE",
"REMEMBER_POINT_TOGGLE",
"REMEMBER_POINT_TOGGLE_ACTIVE",
"SET_GRID_STEP_TOGGLE",
"SET_GRID_STEP_TOGGLE_ACTIVE",
"CREATE_VOLUME_TOGGLE",
"CREATE_VOLUME_TOGGLE_ACTIVE",
"REMEMBER_VOLUME_TOGGLE",
"REMEMBER_VOLUME_TOGGLE_ACTIVE",
"MODEL_TOGGLE",
"MODEL_TOGGLE_ACTIVE",
)
for _key in _ZONE_TOOL_TOGGLE_KEYS:
_style = BUTTONS.get(_key)
if _style:
BUTTONS[f"{_key}_LIGHT"] = _make_light_toggle_style(
_style,
is_active=_key.endswith("_ACTIVE"),
)
# ---------------------------------------------------------------------------
# Module workflow notes
# ---------------------------------------------------------------------------
#
# 1) Назначение модуля:
# Определение всех стилей (QSS) для кнопок приложения: primary, secondary,
# standard, tab, visualization, toggle-кнопки инструментов (measure, zone,
# mesh, volume, model и др.) в тёмной и светлой темах. Содержит автогенерацию
# светлых вариантов toggle-стилей через _make_light_toggle_style().
#
# 2) Зависимости модуля:
# Импорты: Path (pathlib), re
# Хост/базовый класс: нет (модуль-словарь)
# Внешние библиотеки: нет (стандартная библиотека)
#
# 3) Экспорт:
# Словарь BUTTONS: dict[str, str] — ключ → QSS-строка.
# Константы цветов светлой темы: LIGHT_TEXT_PRIMARY, LIGHT_TEXT_SECONDARY,
# LIGHT_TEXT_DISABLED, LIGHT_PANEL, LIGHT_BORDER, LIGHT_HOVER,
# LIGHT_PRESSED, LIGHT_ACCENT_SOFT, LIGHT_ACCENT_BORDER.
#
# 4) Состояние (поля):
# BUTTONS : dict[str, str] — основной реестр стилей кнопок.
# _ICONS_DIR : Path — путь к gui/components/icons/ (для подстановки иконок).
# _ZONE_TOOL_TOGGLE_KEYS: tuple[str] — ключи toggle-стилей для автогенерации.
#
# 5) Последовательность действий и вызовов:
# 1. Определение словаря BUTTONS с тёмными стилями.
# 2. _ICONS_DIR = Path → gui/components/icons/
# 3. _replace_white_icons_with_black(style_text) — regex-замена *_white.png
# на *_black.png, если файл существует.
# 4. _make_light_toggle_style(style_text, is_active) — построение светлого
# варианта toggle-стилей: замена цветов, бордюров, hover/pressed.
# 5. Цикл по _ZONE_TOOL_TOGGLE_KEYS: для каждого ключа создаётся
# BUTTONS["{key}_LIGHT"] через _make_light_toggle_style().
#
# 6) Побочные эффекты:
# Мутирует словарь BUTTONS при импорте модуля — добавляет *_LIGHT ключи.
# Проверяет наличие файлов иконок через Path.exists() на этапе импорта.
#
# 7) Границы ответственности:
# НЕ применяет стили к виджетам — только хранит QSS-строки.
# НЕ взаимодействует с theme_bus — переключение темы в StylableMixin.
# НЕ содержит стили для не-кнопочных виджетов.
#
# 8) Обработка ошибок:
# _replace_white_icons_with_black: если чёрная иконка не найдена —
# оригинальное имя сохраняется (fallback).
# Нет исключений при отсутствии ключей в BUTTONS.get().
#
# 9) Инварианты и контракты:
# - Каждый toggle-стиль имеет пару: KEY и KEY_ACTIVE.
# - Автогенерированные светлые стили имеют суффикс _LIGHT.
# - Все QSS-строки — валидный Qt StyleSheet синтаксис.
#
# 10) Правило сопровождения:
# Новые toggle-стили добавлять в BUTTONS + в _ZONE_TOOL_TOGGLE_KEYS
# для автогенерации светлого варианта. Иконки _white.png и _black.png
# должны существовать парами в gui/components/icons/. При добавлении
# non-toggle стилей — добавлять *_LIGHT вариант вручную.