# -*- coding: utf-8 -*- # dispatch/main.py """Точка входа независимого приложения Dispatch. Назначение модуля: Минимальная процедура запуска отдельного приложения, которое переиспользует модуль `hub.ticket` без копирования его логики. Последовательность инициализации: 1. Подготовка диагностики и кодировок до тяжёлых импортов GUI. 2. Создание `QApplication` и применение системной темы. 3. Создание `DispatchMainWindow` и эмиссия текущей темы. 4. Запуск цикла событий `QApplication`. """ import sys from error_logger import install_interpreter_hooks, log_exception, setup_error_logging def _configure_console_encoding() -> None: """Настроить кодировку консоли для корректного вывода кириллицы.""" import os try: if sys.platform.startswith("win"): import ctypes kernel32 = ctypes.windll.kernel32 kernel32.SetConsoleOutputCP(65001) kernel32.SetConsoleCP(65001) if hasattr(sys.stdout, "reconfigure"): sys.stdout.reconfigure(encoding="utf-8") if hasattr(sys.stderr, "reconfigure"): sys.stderr.reconfigure(encoding="utf-8") os.environ["PYTHONIOENCODING"] = "utf-8" except Exception as exc: log_exception(__name__, "_configure_console_encoding", exc) def _bootstrap_runtime_diagnostics() -> None: """Включить журнал и перехват исключений до тяжёлых импортов.""" _configure_console_encoding() setup_error_logging() install_interpreter_hooks() def _setup_theme(app) -> str: """Определить системную тему и применить базовую палитру окна.""" from PySide6.QtCore import Qt from PySide6.QtGui import QColor, QPalette theme = "dark" color_scheme = Qt.ColorScheme.Unknown if hasattr(app.styleHints(), "preferredColorScheme"): color_scheme = app.styleHints().preferredColorScheme() if color_scheme == Qt.ColorScheme.Unknown: window_color = app.palette().color(QPalette.ColorRole.Window) color_scheme = ( Qt.ColorScheme.Light if window_color.lightness() >= 128 else Qt.ColorScheme.Dark ) if color_scheme == Qt.ColorScheme.Dark: theme = "dark" palette = app.palette() palette.setColor(QPalette.ColorRole.Window, QColor("#232323")) palette.setColor(QPalette.ColorRole.WindowText, Qt.GlobalColor.white) palette.setColor(QPalette.ColorRole.Base, QColor("#3C3C3C")) palette.setColor(QPalette.ColorRole.Text, Qt.GlobalColor.white) palette.setColor(QPalette.ColorRole.Button, Qt.GlobalColor.darkGray) palette.setColor(QPalette.ColorRole.ButtonText, Qt.GlobalColor.white) palette.setColor(QPalette.ColorRole.Highlight, QColor("#5B9FFF")) palette.setColor(QPalette.ColorRole.HighlightedText, Qt.GlobalColor.black) app.setPalette(palette) else: theme = "light" palette = app.palette() palette.setColor(QPalette.ColorRole.Window, QColor("#F8F9FB")) palette.setColor(QPalette.ColorRole.WindowText, QColor("#172B4D")) palette.setColor(QPalette.ColorRole.Base, QColor("#F8F9FB")) palette.setColor(QPalette.ColorRole.Text, QColor("#172B4D")) palette.setColor(QPalette.ColorRole.Button, QColor("#FFFFFF")) palette.setColor(QPalette.ColorRole.ButtonText, QColor("#172B4D")) palette.setColor(QPalette.ColorRole.Highlight, QColor("#0C66E4")) palette.setColor(QPalette.ColorRole.HighlightedText, QColor("#FFFFFF")) app.setPalette(palette) return theme def main() -> None: """Запустить независимое приложение Dispatch.""" _bootstrap_runtime_diagnostics() from PySide6.QtWidgets import QApplication from gui.theme_bus import theme_bus from window import DispatchMainWindow app = QApplication(sys.argv) app.setStyle("Fusion") app.setApplicationName("Dispatch") current_theme = _setup_theme(app) window = DispatchMainWindow() theme_bus.theme_changed.emit(current_theme) window.show() sys.exit(app.exec()) if __name__ == "__main__": main()