desktop_app/app/controllers/main_controller.py
2025-09-29 01:45:47 +03:00

80 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PySide6.QtWidgets import QStackedWidget
from PySide6.QtCore import Signal
from app.ui.views.login_view import LoginView
from app.ui.views.yobble_home_view import YobbleHomeView
from typing import Optional
from threading import Thread
import time
import asyncio
from app.core.database import get_last_login, get_session, set_last_login
class MainController(QStackedWidget):
# Сигнал для показа уведомлений из любого потока
# (message, is_error)
notification_requested = Signal(str, bool)
def __init__(self):
super().__init__()
self.login_view: Optional[LoginView] = None
self.yobble_home_view: Optional[YobbleHomeView] = None
self.init_app()
def init_app(self):
"""Проверяет наличие сессии для автологина."""
last_login = get_last_login()
if last_login:
session = get_session(last_login)
if session:
self.handle_login_success(last_login)
return
self.show_login()
def show_login(self):
self.login_view = LoginView(on_login=self.handle_login_success)
self.addWidget(self.login_view)
self.setCurrentWidget(self.login_view)
self.login_view.show()
def handle_login_success(self, username: str):
"""Обрабатывает успешный вход в систему."""
set_last_login(username)
if self.login_view:
self.login_view.close()
self.removeWidget(self.login_view)
self.login_view = None
self.yobble_home_view = YobbleHomeView(username=username)
# Подключаем сигнал к слоту в YobbleHomeView
self.notification_requested.connect(self.yobble_home_view.show_notification)
self.addWidget(self.yobble_home_view)
self.setCurrentWidget(self.yobble_home_view)
self.yobble_home_view.show()
Thread(target=self.update_data_from_server, args=(username,), daemon=True).start()
def update_data_from_server(self, username: str):
"""
В фоновом режиме обновляет данные с сервера.
"""
time.sleep(2)
print(f"[Sync] Обновляем данные для пользователя: {username}")
if self.yobble_home_view:
print("[Sync] Запускаем предзагрузку прав доступа...")
try:
# `preload_permissions` теперь возвращает кортеж (успех, данные)
# asyncio.run() выполняет async функцию и возвращает её результат
asyncio.run(self.yobble_home_view.preload_permissions())
except Exception as e:
error_message = f"Ошибка предзагрузки: {e}"
print(f"[Sync] {error_message}")
# Отправляем сигнал вместо прямого вызова
self.notification_requested.emit(error_message, True)