From 2e32ffa9e88a789efc05b5d39e3b4839b635715b Mon Sep 17 00:00:00 2001 From: farkadi Date: Tue, 14 Jan 2025 23:59:41 +0700 Subject: [PATCH] Update --- src/ui/login_dialog.py | 7 ++- src/ui/main_window.py | 132 +++++++++++++++++++++++++++++------------ 2 files changed, 99 insertions(+), 40 deletions(-) diff --git a/src/ui/login_dialog.py b/src/ui/login_dialog.py index 1dd3182..d630797 100644 --- a/src/ui/login_dialog.py +++ b/src/ui/login_dialog.py @@ -18,6 +18,8 @@ class LoginDialog(QDialog): self.auth_result = None self.signals = LoginSignals() self.login_timeout = 5 # Таймаут в секундах + # Кэшируем состояние UI + self._is_logging_in = False self.setObjectName("login-dialog") self.setup_ui() @@ -77,6 +79,9 @@ class LoginDialog(QDialog): def handle_login(self): """Обработчик нажатия кнопки входа""" + if self._is_logging_in: + return + username = self.username.text().strip() password = self.password.text().strip() @@ -88,7 +93,7 @@ class LoginDialog(QDialog): ) return - # Отключаем кнопку на время авторизации + self._is_logging_in = True self.login_button.setEnabled(False) self.login_button.setText("Вход...") diff --git a/src/ui/main_window.py b/src/ui/main_window.py index 89efc9b..46a62b7 100644 --- a/src/ui/main_window.py +++ b/src/ui/main_window.py @@ -51,9 +51,11 @@ class MainWindow(QMainWindow): def __init__(self): super().__init__() + # Кэшируем часто используемые виджеты + self._cached_widgets = {} + # Загружаем стили - with open("assets/styles/main.qss", "r") as f: - self.setStyleSheet(f.read()) + self._load_styles() # Создаем event loop для асинхронных операций self.loop = asyncio.new_event_loop() @@ -88,7 +90,25 @@ class MainWindow(QMainWindow): } self.settings = self.load_settings() + self.game_launcher = GameLauncher(self.settings) + self.current_user = None + # Проверяем сохраненные данные авторизации + auth = self.settings.get('auth', {}) + if auth.get('username') and auth.get('account_id'): + self.current_user = AuthResult( + success=True, + message="Сессия восстановлена", + username=auth['username'], + account_id=auth['account_id'] + ) + # Обновляем данные в GameLauncher + self.game_launcher.set_account_info( + auth['username'], + auth['account_id'] + ) + + # Создаем UI self.setWindowTitle("WoW 3.3.5 Launcher") self.setMinimumSize(1200, 800) @@ -114,20 +134,23 @@ class MainWindow(QMainWindow): # Первоначальное получение статуса self.update_server_status() - self.current_user = None # Текущий пользователь - - # Проверяем сохраненную авторизацию - auth_settings = self.settings.get("auth", {}) - if auth_settings.get("auto_login"): - self.current_user = AuthResult( - success=True, - message="Успешная авторизация", - account_id=auth_settings["account_id"], - username=auth_settings["username"] - ) + # Обновляем UI если есть сохраненная сессия + if self.current_user: self.update_ui_after_login() - - self.game_launcher = GameLauncher(self.settings) + + def _load_styles(self): + """Загрузка стилей""" + try: + with open("assets/styles/main.qss", "r") as f: + self.setStyleSheet(f.read()) + except Exception as e: + self.logger.error(f"Error loading styles: {e}") + + def _get_widget(self, name: str): + """Получение кэшированного виджета""" + if name not in self._cached_widgets: + self._cached_widgets[name] = self.findChild(QWidget, name) + return self._cached_widgets[name] def create_content(self): content = Card("НОВОСТИ") @@ -604,19 +627,53 @@ class MainWindow(QMainWindow): def update_ui_after_login(self): """Обновляет UI после успешной авторизации""" - if self.current_user: - # Сохраняем данные авторизации - self.settings["auth"] = { - "username": self.current_user.username, - "account_id": self.current_user.account_id, - "auto_login": True - } - self.save_settings() # Теперь этот вызов должен работать - # Обновляем кнопку - self.account_btn.setText(self.current_user.username) - self.account_btn.setProperty("class", "account-button") - self.account_btn.style().unpolish(self.account_btn) - self.account_btn.style().polish(self.account_btn) + # Сохраняем данные авторизации + self.settings['auth']['username'] = self.current_user.username + self.settings['auth']['account_id'] = self.current_user.account_id + self.save_settings() + + # Обновляем кнопку + self.account_btn.setText(self.current_user.username) + self.account_btn.setProperty("class", "account-button") + self.account_btn.style().unpolish(self.account_btn) + self.account_btn.style().polish(self.account_btn) + + # Включаем кнопку запуска если путь к игре указан + if self.settings.get('game', {}).get('path'): + self.play_button.setEnabled(True) + + def create_account_menu(self): + """Создает меню аккаунта""" + menu = QMenu(self) + menu.setObjectName("account-menu") + + # Добавляем пункты меню + logout_action = QAction("Выйти", self) + logout_action.triggered.connect(self.logout) + menu.addAction(logout_action) + + # Привязываем меню к кнопке + self.account_btn.setMenu(menu) + + def logout(self): + """Выход из аккаунта""" + # Очищаем данные авторизации + self.settings['auth']['username'] = None + self.settings['auth']['account_id'] = None + self.settings['auth']['auto_login'] = False + self.settings['auth']['saved_password'] = "" + + # Сохраняем настройки + self.save_settings() + + # Обновляем UI + self.account_btn.setText("Войти") + self.account_btn.setMenu(None) + self.play_button.setEnabled(False) + self.current_user = None + + # Очищаем данные в GameLauncher + self.game_launcher.set_account_info(None, None) def show_login_dialog(self): """Показывает диалог авторизации""" @@ -651,17 +708,6 @@ class MainWindow(QMainWindow): QPoint(0, self.account_btn.height()) )) - def logout(self): - """Выход из аккаунта""" - self.current_user = None - # Очищаем данные авторизации - self.settings["auth"] = self.default_settings["auth"] - self.save_settings() - self.account_btn.setText("Войти") - self.account_btn.setProperty("class", "login-button") - self.account_btn.style().unpolish(self.account_btn) - self.account_btn.style().polish(self.account_btn) - def create_nav_button(self, text: str, icon_path: str) -> QPushButton: """Создает навигационную кнопку""" btn = QPushButton(text) @@ -898,8 +944,16 @@ class SettingsDialog(QDialog): # Реалм-лист realmlist = game_tab.findChild(QLineEdit, "realmlist_input").text() + old_realmlist = self.settings['game'].get('realmlist', '') self.settings['game']['realmlist'] = realmlist + # Если изменился реалм-лист или путь к игре, обновляем файл + if (realmlist != old_realmlist or game_path != self.settings['game'].get('path', '')) and game_path: + from src.utils.game_launcher import GameLauncher + launcher = GameLauncher(self.settings) + if not launcher.update_realmlist(game_path, realmlist): + raise Exception("Не удалось обновить realmlist.wtf") + # Параметры запуска launch_options = game_tab.findChild(QLineEdit, "launch_options").text() self.settings['game']['launch_options'] = launch_options