From c5db176ca4f60234d1b751d86c87a9ecfcf8607d Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Tue, 26 Aug 2025 11:16:50 +0600 Subject: [PATCH] the component manager has been restored --- winehelper_gui.py | 81 +++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/winehelper_gui.py b/winehelper_gui.py index 7fcdbc8..1d3dda4 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -837,13 +837,8 @@ class WinetricksManagerDialog(QDialog): # 1. Проверяем, была ли отмена пользователем if self.user_cancelled: self._log("\n=== Установка прервана пользователем. ===") - self._show_message_box("Отмена", "Установки компонентов прервана пользователем.", - QMessageBox.Warning, {"buttons": {"Да": QMessageBox.AcceptRole}}) - - # Сбрасываем флаг и восстанавливаем UI - self.user_cancelled = False - self.apply_button.setEnabled(True) - self.close_button.setEnabled(True) + # Процесс завершен, теперь можно безопасно закрыть диалог. + self.close() return # 2. Обрабатываем реальную ошибку @@ -889,8 +884,10 @@ class WinetricksManagerDialog(QDialog): {"buttons": {"Да": QMessageBox.YesRole, "Нет": QMessageBox.NoRole}, "default": "Нет"}) if reply == "Да": self.user_cancelled = True + self.log_output.append("\n=== Прерывание установки... Ожидание завершения процесса... ===") self.apply_process.terminate() # Попытка мягкого завершения - event.accept() # Разрешаем закрытие + # Запрещаем закрытие. on_apply_finished обработает его после завершения процесса. + event.ignore() else: event.ignore() # Запрещаем закрытие else: @@ -2741,6 +2738,30 @@ class WineHelperGUI(QMainWindow): "Не удалось определить префикс. Выберите установленное приложение или создайте новый префикс.") return + prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) + if not os.path.isdir(prefix_path): + QMessageBox.critical(self, "Ошибка", f"Каталог префикса не найден:\n{prefix_path}") + return + + winehelper_dir = os.path.dirname(self.winehelper_path) + winetricks_path = None + try: + # Ищем файл, который начинается с 'winetricks_' + for filename in os.listdir(winehelper_dir): + if filename.startswith("winetricks_"): + winetricks_path = os.path.join(winehelper_dir, filename) + break # Нашли, выходим из цикла + except OSError as e: + QMessageBox.critical(self, "Ошибка", f"Не удалось прочитать директорию {winehelper_dir}: {e}") + return + + if not winetricks_path: + QMessageBox.critical(self, "Ошибка", f"Скрипт winetricks не найден в директории:\n{winehelper_dir}") + return + + dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self) + dialog.exec_() + def _get_wine_executable_for_prefix(self, prefix_name): """Определяет и возвращает путь к исполняемому файлу wine для указанного префикса.""" prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) @@ -2768,30 +2789,6 @@ class WineHelperGUI(QMainWindow): "Будет использована системная версия Wine.") return 'wine' # По умолчанию системный wine - prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) - if not os.path.isdir(prefix_path): - QMessageBox.critical(self, "Ошибка", f"Каталог префикса не найден:\n{prefix_path}") - return - - winehelper_dir = os.path.dirname(self.winehelper_path) - winetricks_path = None - try: - # Ищем файл, который начинается с 'winetricks_' - for filename in os.listdir(winehelper_dir): - if filename.startswith("winetricks_"): - winetricks_path = os.path.join(winehelper_dir, filename) - break # Нашли, выходим из цикла - except OSError as e: - QMessageBox.critical(self, "Ошибка", f"Не удалось прочитать директорию {winehelper_dir}: {e}") - return - - if not winetricks_path: - QMessageBox.critical(self, "Ошибка", f"Скрипт winetricks не найден в директории:\n{winehelper_dir}") - return - - dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self) - dialog.exec_() - def _run_wine_util(self, util_name, prefix_name=None): """Запускает стандартную утилиту Wine для выбранного префикса.""" if not prefix_name: @@ -3163,6 +3160,8 @@ class WineHelperGUI(QMainWindow): if not self._show_license_agreement_dialog(): return # Пользователь отклонил лицензию + self.installation_cancelled = False + # Создаем диалоговое окно установки self.install_dialog = QDialog(self) title_name = self._get_current_app_title() @@ -3389,6 +3388,14 @@ class WineHelperGUI(QMainWindow): cursor.insertText("\n") self._reset_log_state() + + if hasattr(self, 'installation_cancelled') and self.installation_cancelled: + self.append_log("\n=== Установка была прервана. ===") + self.cleanup_process() + if self.install_dialog: + self.install_dialog.close() + return + if exit_code == 0 and exit_status == QProcess.NormalExit: self.append_log("\n=== Установка успешно завершена ===") # Создаем кастомный диалог, чтобы кнопка была на русском @@ -3447,11 +3454,10 @@ class WineHelperGUI(QMainWindow): msg_box.exec_() if msg_box.clickedButton() == yes_button: - self.append_log("\n=== Пользователь прервал установку через закрытие окна ===", is_error=True) - # Завершаем процесс. Сигнал finished вызовет handle_process_finished, - # который обновит состояние кнопок. + self.append_log("\n=== Пользователь прервал установку через закрытие окна. Ожидание... ===", is_error=True) + self.installation_cancelled = True self.install_process.terminate() - event.accept() # Разрешаем закрытие окна + event.ignore() # Запрещаем закрытие, handle_process_finished обработает его else: # Пользователь нажал "Нет", поэтому игнорируем событие закрытия event.ignore() @@ -3474,7 +3480,8 @@ class WineHelperGUI(QMainWindow): msg_box.exec_() if msg_box.clickedButton() == yes_button: self.append_log("\n=== Пользователь прервал установку ===", is_error=True) - self.cleanup_process() + self.installation_cancelled = True + self.install_process.terminate() def _handle_command_output(self): """Обрабатывает вывод для диалога команды"""