80 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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)
 |