119 lines
4.5 KiB
Python
119 lines
4.5 KiB
Python
# -*- 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()
|