# -*- 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 вариант вручную.