the component manager has been restored

This commit is contained in:
Sergey Palcheh
2025-08-26 11:16:50 +06:00
parent d73c0a47ab
commit c5db176ca4

View File

@@ -837,13 +837,8 @@ class WinetricksManagerDialog(QDialog):
# 1. Проверяем, была ли отмена пользователем # 1. Проверяем, была ли отмена пользователем
if self.user_cancelled: if self.user_cancelled:
self._log("\n=== Установка прервана пользователем. ===") self._log("\n=== Установка прервана пользователем. ===")
self._show_message_box("Отмена", "Установки компонентов прервана пользователем.", # Процесс завершен, теперь можно безопасно закрыть диалог.
QMessageBox.Warning, {"buttons": {"Да": QMessageBox.AcceptRole}}) self.close()
# Сбрасываем флаг и восстанавливаем UI
self.user_cancelled = False
self.apply_button.setEnabled(True)
self.close_button.setEnabled(True)
return return
# 2. Обрабатываем реальную ошибку # 2. Обрабатываем реальную ошибку
@@ -889,8 +884,10 @@ class WinetricksManagerDialog(QDialog):
{"buttons": {"Да": QMessageBox.YesRole, "Нет": QMessageBox.NoRole}, "default": "Нет"}) {"buttons": {"Да": QMessageBox.YesRole, "Нет": QMessageBox.NoRole}, "default": "Нет"})
if reply == "Да": if reply == "Да":
self.user_cancelled = True self.user_cancelled = True
self.log_output.append("\n=== Прерывание установки... Ожидание завершения процесса... ===")
self.apply_process.terminate() # Попытка мягкого завершения self.apply_process.terminate() # Попытка мягкого завершения
event.accept() # Разрешаем закрытие # Запрещаем закрытие. on_apply_finished обработает его после завершения процесса.
event.ignore()
else: else:
event.ignore() # Запрещаем закрытие event.ignore() # Запрещаем закрытие
else: else:
@@ -2741,6 +2738,30 @@ class WineHelperGUI(QMainWindow):
"Не удалось определить префикс. Выберите установленное приложение или создайте новый префикс.") "Не удалось определить префикс. Выберите установленное приложение или создайте новый префикс.")
return 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): def _get_wine_executable_for_prefix(self, prefix_name):
"""Определяет и возвращает путь к исполняемому файлу wine для указанного префикса.""" """Определяет и возвращает путь к исполняемому файлу wine для указанного префикса."""
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
@@ -2768,30 +2789,6 @@ class WineHelperGUI(QMainWindow):
"Будет использована системная версия Wine.") "Будет использована системная версия Wine.")
return 'wine' # По умолчанию системный 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): def _run_wine_util(self, util_name, prefix_name=None):
"""Запускает стандартную утилиту Wine для выбранного префикса.""" """Запускает стандартную утилиту Wine для выбранного префикса."""
if not prefix_name: if not prefix_name:
@@ -3163,6 +3160,8 @@ class WineHelperGUI(QMainWindow):
if not self._show_license_agreement_dialog(): if not self._show_license_agreement_dialog():
return # Пользователь отклонил лицензию return # Пользователь отклонил лицензию
self.installation_cancelled = False
# Создаем диалоговое окно установки # Создаем диалоговое окно установки
self.install_dialog = QDialog(self) self.install_dialog = QDialog(self)
title_name = self._get_current_app_title() title_name = self._get_current_app_title()
@@ -3389,6 +3388,14 @@ class WineHelperGUI(QMainWindow):
cursor.insertText("\n") cursor.insertText("\n")
self._reset_log_state() 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: if exit_code == 0 and exit_status == QProcess.NormalExit:
self.append_log("\n=== Установка успешно завершена ===") self.append_log("\n=== Установка успешно завершена ===")
# Создаем кастомный диалог, чтобы кнопка была на русском # Создаем кастомный диалог, чтобы кнопка была на русском
@@ -3447,11 +3454,10 @@ class WineHelperGUI(QMainWindow):
msg_box.exec_() msg_box.exec_()
if msg_box.clickedButton() == yes_button: if msg_box.clickedButton() == yes_button:
self.append_log("\n=== Пользователь прервал установку через закрытие окна ===", is_error=True) self.append_log("\n=== Пользователь прервал установку через закрытие окна. Ожидание... ===", is_error=True)
# Завершаем процесс. Сигнал finished вызовет handle_process_finished, self.installation_cancelled = True
# который обновит состояние кнопок.
self.install_process.terminate() self.install_process.terminate()
event.accept() # Разрешаем закрытие окна event.ignore() # Запрещаем закрытие, handle_process_finished обработает его
else: else:
# Пользователь нажал "Нет", поэтому игнорируем событие закрытия # Пользователь нажал "Нет", поэтому игнорируем событие закрытия
event.ignore() event.ignore()
@@ -3474,7 +3480,8 @@ class WineHelperGUI(QMainWindow):
msg_box.exec_() msg_box.exec_()
if msg_box.clickedButton() == yes_button: if msg_box.clickedButton() == yes_button:
self.append_log("\n=== Пользователь прервал установку ===", is_error=True) self.append_log("\n=== Пользователь прервал установку ===", is_error=True)
self.cleanup_process() self.installation_cancelled = True
self.install_process.terminate()
def _handle_command_output(self): def _handle_command_output(self):
"""Обрабатывает вывод для диалога команды""" """Обрабатывает вывод для диалога команды"""