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

@@ -4,7 +4,7 @@ _winehelper_completions() {
COMPREPLY=() COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}" cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}" prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog change-wine" opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog change-wine clear-winetricks-cache"
wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run" wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run"
case "${prev}" in case "${prev}" in

View File

@@ -21,6 +21,7 @@ _winehelper() {
'backup-prefix[Создать резерную копию префикса]' 'backup-prefix[Создать резерную копию префикса]'
'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]' 'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]'
'change-wine[Изменить версию Wine/Proton для префикса]' 'change-wine[Изменить версию Wine/Proton для префикса]'
'clear-winetricks-cache[Очистить кэш Winetricks]'
) )
wine_cmd=( wine_cmd=(

View File

@@ -2293,6 +2293,30 @@ run_change_wine_version() {
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE." print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
} }
clear_winetricks_cache() {
local winetricks_cache_dir="$HOME/.cache/winetricks"
local winehelper_wt_cache_dir="$HOME/.cache/winehelper/winetricks"
if [[ ! -d "$winetricks_cache_dir" ]] && [[ ! -d "$winehelper_wt_cache_dir" ]]; then
print_info "Кэш Winetricks не найден. Очистка не требуется."
return 0
fi
if [[ ! $1 =~ --force|-y ]] ; then
print_warning "Вы собираетесь очистить кэш Winetricks."
echo "Будут удалены все скачанные установщики Winetricks и списки компонентов."
if ! print_confirmation "Продолжить?"
then
print_info "Операция отменена."
exit 1
fi
fi
print_info "Очистка кэша Winetricks..."
try_remove_dir "$winetricks_cache_dir"
try_remove_dir "$winehelper_wt_cache_dir"
print_ok "Кэш Winetricks успешно очищен."
}
wh_info () { wh_info () {
echo "Использование: $SCRIPT_NAME [команда] echo "Использование: $SCRIPT_NAME [команда]
@@ -2312,6 +2336,7 @@ wh_info () {
remove-prefix [имя_префикса] удалить префикс и все связанные данные remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резервную копию префикса backup-prefix [имя_префикса] создать резервную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
clear-winetricks-cache очистить кэш Winetricks
Параметры: Параметры:
--help показать эту справку и выйти --help показать эту справку и выйти
@@ -2370,6 +2395,7 @@ case "$arg1" in
remove-prefix) remove_prefix "$@" ;; remove-prefix) remove_prefix "$@" ;;
create-base-pfx) create_base_pfx "$@" ;; create-base-pfx) create_base_pfx "$@" ;;
init-prefix) prepair_wine ; wait_wineserver ;; init-prefix) prepair_wine ; wait_wineserver ;;
clear-winetricks-cache) clear_winetricks_cache "$@" ;;
*) *)
if [[ -f "$arg1" ]] ; then if [[ -f "$arg1" ]] ; then
WIN_FILE_EXEC="$(readlink -f "$arg1")" WIN_FILE_EXEC="$(readlink -f "$arg1")"

View File

@@ -446,6 +446,7 @@ class WinetricksManagerDialog(QDialog):
self.previous_tab_widget = None self.previous_tab_widget = None
self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "winehelper", "winetricks") self.cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "winehelper", "winetricks")
os.makedirs(self.cache_dir, exist_ok=True) os.makedirs(self.cache_dir, exist_ok=True)
self.is_reloading_after_cache_clear = False
self.setWindowTitle(f"Менеджер компонентов для префикса: {os.path.basename(prefix_path)}") self.setWindowTitle(f"Менеджер компонентов для префикса: {os.path.basename(prefix_path)}")
self.setMinimumSize(800, 500) self.setMinimumSize(800, 500)
@@ -478,8 +479,14 @@ class WinetricksManagerDialog(QDialog):
self.log_output.setText(self.INFO_TEXT) self.log_output.setText(self.INFO_TEXT)
main_layout.addWidget(self.log_output) main_layout.addWidget(self.log_output)
# Кнопки управления, выровненные по правому краю # Кнопки управления
button_layout = QHBoxLayout() 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) button_layout.addStretch(1)
self.apply_button = QPushButton("Применить") self.apply_button = QPushButton("Применить")
@@ -736,9 +743,18 @@ class WinetricksManagerDialog(QDialog):
self._log(output) self._log(output)
self._log("--------------------------------------------------") self._log("--------------------------------------------------")
# Проверяем, были ли ошибки во время загрузки какой-либо из категорий
has_errors = any(status == 'error' for status in self.category_statuses.values())
self.loading_count -= 1 self.loading_count -= 1
if self.loading_count == 0: if self.loading_count == 0:
self._update_ui_state() 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): def _on_item_changed(self, item):
"""Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных.""" """Обрабатывает изменение состояния чекбокса, предотвращая снятие галочки с установленных."""
@@ -895,6 +911,64 @@ class WinetricksManagerDialog(QDialog):
self.installation_complete.emit() self.installation_complete.emit()
self.installation_finished = True 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): def closeEvent(self, event):
"""Обрабатывает закрытие окна, чтобы предотвратить выход во время установки.""" """Обрабатывает закрытие окна, чтобы предотвратить выход во время установки."""
# Проверяем, запущен ли процесс установки/переустановки # Проверяем, запущен ли процесс установки/переустановки
@@ -938,6 +1012,8 @@ class WinetricksManagerDialog(QDialog):
"""Добавляет сообщение в лог с возможностью указания цвета.""" """Добавляет сообщение в лог с возможностью указания цвета."""
if color: if color:
self.log_output.append(f'<span style="color:{color};">{message}</span>') self.log_output.append(f'<span style="color:{color};">{message}</span>')
# Сбрасываем формат, чтобы следующий текст не наследовал цвет
self.log_output.setCurrentCharFormat(QTextCharFormat())
else: else:
self.log_output.append(message) self.log_output.append(message)
self.log_output.moveCursor(QTextCursor.End) self.log_output.moveCursor(QTextCursor.End)