added the winetricks cache deletion feature

This commit is contained in:
Sergey Palcheh
2025-10-25 15:16:09 +06:00
parent 81013bfe71
commit 4afdbaa220
4 changed files with 105 additions and 2 deletions

View File

@@ -446,6 +446,7 @@ class WinetricksManagerDialog(QDialog):
self.previous_tab_widget = None
self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "winehelper", "winetricks")
os.makedirs(self.cache_dir, exist_ok=True)
self.is_reloading_after_cache_clear = False
self.setWindowTitle(f"Менеджер компонентов для префикса: {os.path.basename(prefix_path)}")
self.setMinimumSize(800, 500)
@@ -478,8 +479,14 @@ class WinetricksManagerDialog(QDialog):
self.log_output.setText(self.INFO_TEXT)
main_layout.addWidget(self.log_output)
# Кнопки управления, выровненные по правому краю
# Кнопки управления
button_layout = QHBoxLayout()
self.clear_cache_button = QPushButton("Очистить кеш")
self.clear_cache_button.setStyleSheet("background-color: red; color: white;")
self.clear_cache_button.clicked.connect(self.clear_winetricks_cache)
button_layout.addWidget(self.clear_cache_button)
button_layout.addStretch(1)
self.apply_button = QPushButton("Применить")
@@ -736,9 +743,18 @@ class WinetricksManagerDialog(QDialog):
self._log(output)
self._log("--------------------------------------------------")
# Проверяем, были ли ошибки во время загрузки какой-либо из категорий
has_errors = any(status == 'error' for status in self.category_statuses.values())
self.loading_count -= 1
if self.loading_count == 0:
self._update_ui_state()
if self.is_reloading_after_cache_clear:
if has_errors:
self._log("\n=== Ошибка при обновлении списков. Проверьте лог выше. ===", "red")
else:
self._log("\n=== Списки успешно обновлены ===")
self.is_reloading_after_cache_clear = False # Сбрасываем флаг
def _on_item_changed(self, item):
"""Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных."""
@@ -895,6 +911,64 @@ class WinetricksManagerDialog(QDialog):
self.installation_complete.emit()
self.installation_finished = True
def clear_winetricks_cache(self):
"""Запускает очистку кэша Winetricks."""
reply = self._show_message_box(
"Очистка кэша Winetricks",
"Вы собираетесь удалить все скачанные установщики и списки компонентов Winetricks.\n\n"
"Это действие может потребоваться, если у вас возникают проблемы со скачиванием или установкой компонентов.\n\n"
"Продолжить?",
QMessageBox.Question,
{"buttons": {"Да": QMessageBox.YesRole, "Нет": QMessageBox.NoRole}, "default": "Нет"}
)
if reply != "Да":
return
# Блокируем UI на время выполнения
self.tabs.setEnabled(False)
self.clear_cache_button.setEnabled(False)
self.apply_button.setEnabled(False)
self.reinstall_button.setEnabled(False)
self.close_button.setEnabled(False)
self.log_output.clear()
self.cache_clear_process = QProcess(self)
self.cache_clear_process.setProcessChannelMode(QProcess.MergedChannels)
def handle_output():
output = self.cache_clear_process.readAll().data().decode('utf-8', 'ignore').strip()
if output:
self._log(output)
def handle_finish(exit_code, exit_status):
if exit_code == 0:
self.is_reloading_after_cache_clear = True # Устанавливаем флаг перед перезагрузкой
self.category_statuses.clear() # Очищаем статусы перед новой загрузкой
# Воссоздаем директорию кэша, так как скрипт ее полностью удалил
os.makedirs(self.cache_dir, exist_ok=True)
self._log("Обновление списков...")
self.initial_states.clear()
self.load_all_categories()
else:
self._log(f"\n=== Ошибка (код: {exit_code}) ===", "red")
# Восстанавливаем UI
self.tabs.setEnabled(True)
self.clear_cache_button.setEnabled(True)
self.close_button.setEnabled(True)
self._update_ui_state() # Обновляем состояние кнопок Применить/Переустановить
self.cache_clear_process.readyRead.connect(handle_output)
self.cache_clear_process.finished.connect(handle_finish)
winehelper_path = self.parent().winehelper_path if hasattr(self.parent(), 'winehelper_path') else Var.RUN_SCRIPT
args = ["clear-winetricks-cache", "--force"]
self._log(f"Выполнение: {shlex.quote(winehelper_path)} {' '.join(args)}\n")
self.cache_clear_process.start(winehelper_path, args)
def closeEvent(self, event):
"""Обрабатывает закрытие окна, чтобы предотвратить выход во время установки."""
# Проверяем, запущен ли процесс установки/переустановки
@@ -938,6 +1012,8 @@ class WinetricksManagerDialog(QDialog):
"""Добавляет сообщение в лог с возможностью указания цвета."""
if color:
self.log_output.append(f'<span style="color:{color};">{message}</span>')
# Сбрасываем формат, чтобы следующий текст не наследовал цвет
self.log_output.setCurrentCharFormat(QTextCharFormat())
else:
self.log_output.append(message)
self.log_output.moveCursor(QTextCursor.End)