forked from CastroFidel/winehelper
the component manager has been restored
This commit is contained in:
@@ -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):
|
||||||
"""Обрабатывает вывод для диалога команды"""
|
"""Обрабатывает вывод для диалога команды"""
|
||||||
|
Reference in New Issue
Block a user