This commit is contained in:
farkadi 2025-01-14 23:59:41 +07:00
parent f43bf14167
commit 2e32ffa9e8
2 changed files with 99 additions and 40 deletions

View File

@ -18,6 +18,8 @@ class LoginDialog(QDialog):
self.auth_result = None self.auth_result = None
self.signals = LoginSignals() self.signals = LoginSignals()
self.login_timeout = 5 # Таймаут в секундах self.login_timeout = 5 # Таймаут в секундах
# Кэшируем состояние UI
self._is_logging_in = False
self.setObjectName("login-dialog") self.setObjectName("login-dialog")
self.setup_ui() self.setup_ui()
@ -77,6 +79,9 @@ class LoginDialog(QDialog):
def handle_login(self): def handle_login(self):
"""Обработчик нажатия кнопки входа""" """Обработчик нажатия кнопки входа"""
if self._is_logging_in:
return
username = self.username.text().strip() username = self.username.text().strip()
password = self.password.text().strip() password = self.password.text().strip()
@ -88,7 +93,7 @@ class LoginDialog(QDialog):
) )
return return
# Отключаем кнопку на время авторизации self._is_logging_in = True
self.login_button.setEnabled(False) self.login_button.setEnabled(False)
self.login_button.setText("Вход...") self.login_button.setText("Вход...")

View File

@ -51,9 +51,11 @@ class MainWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
# Кэшируем часто используемые виджеты
self._cached_widgets = {}
# Загружаем стили # Загружаем стили
with open("assets/styles/main.qss", "r") as f: self._load_styles()
self.setStyleSheet(f.read())
# Создаем event loop для асинхронных операций # Создаем event loop для асинхронных операций
self.loop = asyncio.new_event_loop() self.loop = asyncio.new_event_loop()
@ -88,7 +90,25 @@ class MainWindow(QMainWindow):
} }
self.settings = self.load_settings() 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.setWindowTitle("WoW 3.3.5 Launcher")
self.setMinimumSize(1200, 800) self.setMinimumSize(1200, 800)
@ -114,20 +134,23 @@ class MainWindow(QMainWindow):
# Первоначальное получение статуса # Первоначальное получение статуса
self.update_server_status() self.update_server_status()
self.current_user = None # Текущий пользователь # Обновляем UI если есть сохраненная сессия
if self.current_user:
# Проверяем сохраненную авторизацию
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"]
)
self.update_ui_after_login() 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): def create_content(self):
content = Card("НОВОСТИ") content = Card("НОВОСТИ")
@ -604,20 +627,54 @@ class MainWindow(QMainWindow):
def update_ui_after_login(self): def update_ui_after_login(self):
"""Обновляет UI после успешной авторизации""" """Обновляет UI после успешной авторизации"""
if self.current_user:
# Сохраняем данные авторизации # Сохраняем данные авторизации
self.settings["auth"] = { self.settings['auth']['username'] = self.current_user.username
"username": self.current_user.username, self.settings['auth']['account_id'] = self.current_user.account_id
"account_id": self.current_user.account_id, self.save_settings()
"auto_login": True
}
self.save_settings() # Теперь этот вызов должен работать
# Обновляем кнопку # Обновляем кнопку
self.account_btn.setText(self.current_user.username) self.account_btn.setText(self.current_user.username)
self.account_btn.setProperty("class", "account-button") self.account_btn.setProperty("class", "account-button")
self.account_btn.style().unpolish(self.account_btn) self.account_btn.style().unpolish(self.account_btn)
self.account_btn.style().polish(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): def show_login_dialog(self):
"""Показывает диалог авторизации""" """Показывает диалог авторизации"""
if not self.current_user: # Если пользователь не авторизован if not self.current_user: # Если пользователь не авторизован
@ -651,17 +708,6 @@ class MainWindow(QMainWindow):
QPoint(0, self.account_btn.height()) 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: def create_nav_button(self, text: str, icon_path: str) -> QPushButton:
"""Создает навигационную кнопку""" """Создает навигационную кнопку"""
btn = QPushButton(text) btn = QPushButton(text)
@ -898,8 +944,16 @@ class SettingsDialog(QDialog):
# Реалм-лист # Реалм-лист
realmlist = game_tab.findChild(QLineEdit, "realmlist_input").text() realmlist = game_tab.findChild(QLineEdit, "realmlist_input").text()
old_realmlist = self.settings['game'].get('realmlist', '')
self.settings['game']['realmlist'] = 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() launch_options = game_tab.findChild(QLineEdit, "launch_options").text()
self.settings['game']['launch_options'] = launch_options self.settings['game']['launch_options'] = launch_options