Compare commits

...

3 Commits

Author SHA1 Message Date
Sergey Palcheh
4afdbaa220 added the winetricks cache deletion feature 2025-10-25 15:16:09 +06:00
Sergey Palcheh
81013bfe71 fix: reset active button if it's being removed 2025-10-25 12:31:16 +06:00
Sergey Palcheh
caccc333db updating tax program scripts 2025-10-25 12:26:42 +06:00
9 changed files with 162 additions and 63 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

@@ -3,37 +3,33 @@
######################################################################## ########################################################################
export PROG_URL="https://www.nalog.gov.ru" export PROG_URL="https://www.nalog.gov.ru"
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="declaration" export WINEPREFIX="nalog"
export PROG_NAME="Декларация" export PROG_NAME="Декларация"
export PROG_ICON="declarac" export PROG_ICON="declarac"
export BASE_PFX="defpfx_x86_v01" export BASE_PFX="none"
export WINEARCH="win32" export WINEARCH="win32"
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
export WH_WINDOWS_VER="10" export WH_WINDOWS_VER="10"
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
DECL_FILE="${WH_TMP_DIR}/decl.html" try_get_page "https://www.nalog.gov.ru/rn77/program/5961249/"
curl -o "$DECL_FILE" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "https://www.nalog.gov.ru/rn77/program/5961249/" VER_YEAR=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-2)}' | head -n 1)
if [[ ! -f "$DECL_FILE" ]] \
|| grep -q "Forbidden" "$DECL_FILE"
then
fatal "The site page is unavailable or the request limit has been exceeded."
fi
VER_YEAR=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | awk -F'/' '{print $(NF-2)}' | head -n 1)
YEAR="${VER_YEAR//decl/}" YEAR="${VER_YEAR//decl/}"
VER_MSI_SLASH=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | awk -F'/' '{print $(NF-1)}' | head -n 1) VER_MSI_SLASH=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-1)}' | head -n 1)
VER_MSI=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | awk -F'/' '{print $(NF)}' | head -n 1) VER_MSI=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF)}' | head -n 1)
AUTOINSTALL_MSI="${WH_TMP_DIR}/${VER_MSI}" AUTOINSTALL_MSI="${WH_TMP_DIR}/${VER_MSI}"
prepair_wine prepair_wine
if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/$VER_MSI" "${AUTOINSTALL_MSI}" ; then if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/${VER_MSI}" "${AUTOINSTALL_MSI}" ; then
wine_run_install "${AUTOINSTALL_MSI}" "/q" wine_run_install "${AUTOINSTALL_MSI}" /q
try_remove_file "${AUTOINSTALL_MSI}" try_remove_file "${AUTOINSTALL_MSI}"
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация ${YEAR}/Decl${YEAR}.exe" WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация ${YEAR}/Decl${YEAR}.exe"
create_desktop "$PROG_NAME $YEAR" "$WIN_FILE_EXEC" "$PROG_ICON" create_desktop "$PROG_NAME $YEAR" "$WIN_FILE_EXEC" "$PROG_ICON"
remove_desktop "Декларация $((YEAR - 1))"
fi
# Удаляем ярлык предыдущей версии
remove_desktop "Декларация $((YEAR - 1))"
print_info "Программа Декларация $YEAR успешно установлена"
else
fatal "Не удалось скачать установочный файл"
fi

View File

@@ -6,32 +6,24 @@ export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="nalog" export WINEPREFIX="nalog"
export PROG_NAME="Налогоплательщик ЮЛ" export PROG_NAME="Налогоплательщик ЮЛ"
export PROG_ICON="npul" export PROG_ICON="npul"
export BASE_PFX="defpfx_x86_v01" export BASE_PFX="none"
export WINEARCH="win32" export WINEARCH="win32"
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
export WH_WINDOWS_VER="10" export WH_WINDOWS_VER="10"
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
NPUL_FILE="${WH_TMP_DIR}/npul.html" try_get_page "https://data.nalog.ru/rn77/program/5961229/"
curl -o "$NPUL_FILE" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "https://www.nalog.gov.ru/rn77/program/5961229/" VER_MSI=$(read_page | grep -oP 'NalogUL\d+\.msi' | tail -1 | grep -oP '\d+')
VER_MSI_URL="${VER_MSI:0:1}.${VER_MSI:1}" # 492 → 4.92
if [[ ! -f "$NPUL_FILE" ]] \ VER_EXE=$(read_page | grep -oP 'NalogUL\d+\.exe' | tail -1 | grep -oP '\d+')
|| grep -q "Forbidden" "$NPUL_FILE" VER_EXE_URL="${VER_EXE:0:1}.${VER_EXE:1:2}.${VER_EXE:3}" # 4924 → 4.92.4
then
fatal "Страница сайта не доступна, или превышено количество запросов к странице."
fi
VER_MSI=$(grep -oP 'NalogUL\K[0-9.]+(?=\.msi)' "$NPUL_FILE" | tail -n 1)
VER_MSI_SLASH=$(grep -oP '[0-9]+\.[0-9]+/NalogUL[0-9]+\.msi' "$NPUL_FILE" | tail -n 1)
VER_EXE=$(grep -oP 'NalogUL\K[0-9.]+(?=\.exe)' "$NPUL_FILE" | tail -n 1)
VER_EXE_SLASH=$(grep -oP '[0-9]+\.[0-9]+\.[0-9]+/NalogUL[0-9]+\.exe' "$NPUL_FILE" | tail -n 1)
AUTOINSTALL_MSI="${WH_TMP_DIR}/NalogUL${VER_MSI}.msi" AUTOINSTALL_MSI="${WH_TMP_DIR}/NalogUL${VER_MSI}.msi"
AUTOINSTALL_EXE="${WH_TMP_DIR}/NalogUL${VER_EXE}.exe" AUTOINSTALL_EXE="${WH_TMP_DIR}/NalogUL${VER_EXE}.exe"
prepair_wine prepair_wine
if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_SLASH}" "${AUTOINSTALL_MSI}" ; then if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_URL}/NalogUL${VER_MSI}.msi" "${AUTOINSTALL_MSI}" ; then
wine_run_install "${AUTOINSTALL_MSI}" /quiet INSTALLDIR="c:\npul" wine_run_install "${AUTOINSTALL_MSI}" /quiet INSTALLDIR="c:\npul"
try_remove_file "${AUTOINSTALL_MSI}" try_remove_file "${AUTOINSTALL_MSI}"
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "*.msi")" PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "*.msi")"
wine_run_install "${PRINT_INSTALLER}" "/q" wine_run_install "${PRINT_INSTALLER}" "/q"
@@ -42,7 +34,7 @@ if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_SLASH}" "${AUTOINST
fi fi
if [[ -n "$VER_EXE" ]] \ if [[ -n "$VER_EXE" ]] \
&& try_download "https://data.nalog.ru/files/nalul/${VER_EXE_SLASH}" "${AUTOINSTALL_EXE}" && try_download "https://data.nalog.ru/files/nalul/${VER_EXE_URL}/NalogUL${VER_EXE}.exe" "${AUTOINSTALL_EXE}"
then then
wine_run_install "${AUTOINSTALL_EXE}" "/SILENT" wine_run_install "${AUTOINSTALL_EXE}" "/SILENT"
try_remove_file "${AUTOINSTALL_EXE}" try_remove_file "${AUTOINSTALL_EXE}"
@@ -53,4 +45,3 @@ fi
touch "$DRIVE_C/npul/INPUTDOC/linux.txt" touch "$DRIVE_C/npul/INPUTDOC/linux.txt"
WIN_FILE_EXEC="$DRIVE_C/npul/INPUTDOC/inputdoc.exe" WIN_FILE_EXEC="$DRIVE_C/npul/INPUTDOC/inputdoc.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
try_remove_file "$NPUL_FILE"

View File

@@ -2,24 +2,26 @@
# info_ru: Подготовка документов для государственной регистрации (ППДГР) # info_ru: Подготовка документов для государственной регистрации (ППДГР)
######################################################################## ########################################################################
export PROG_URL="https://www.nalog.gov.ru" export PROG_URL="https://www.nalog.gov.ru"
export AUTOINSTALL_EXE="${WH_TMP_DIR}/SetupPPDGR2.msi"
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="ppdgr2" export WINEPREFIX="nalog"
export PROG_NAME="ППДГР-2" export PROG_NAME="ППДГР-2"
# export PROG_VERSION=""
export PROG_ICON="ppdgr" export PROG_ICON="ppdgr"
# export ADD_MIME_TYPE="" export BASE_PFX="none"
export BASE_PFX="defpfx_dn48_x86_v01"
export WINEARCH="win32" export WINEARCH="win32"
export INSTALL_DLL="dotnet48 msxml3 msxml4 msxml6 corefonts lucida wsh57 vcrun6 jet40 gdiplus"
export WH_WINDOWS_VER="10" export WH_WINDOWS_VER="10"
var_winedlloverride_update "msxml4=b,wininet=b" var_winedlloverride_update "msxml4=b,wininet=b"
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
try_get_page "https://www.nalog.gov.ru/rn77/program/5961277/"
VER_MSI_SLASH=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-1)}' | head -n 1)
AUTOINSTALL_EXE="${WH_TMP_DIR}/SetupPPDGR2.msi"
prepair_wine prepair_wine
if try_download "https://data.nalog.ru/files/ppdgr/2.7.0/SetupPPDGR2.msi" "${AUTOINSTALL_EXE}" ; then if try_download "https://data.nalog.ru/files/ppdgr/${VER_MSI_SLASH}/SetupPPDGR2.msi" "${AUTOINSTALL_EXE}" ; then
wine_run_install "${AUTOINSTALL_EXE}" /q wine_run_install "${AUTOINSTALL_EXE}" /q
try_remove_file "${AUTOINSTALL_EXE}" try_remove_file "${AUTOINSTALL_EXE}"
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/ППДГР-2/PPDGR2.exe" WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/ППДГР-2/PPDGR2.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
fi fi
https://data.nalog.ru/files/ppdgr/2.7.3/SetupPPDGR2.msi

View File

@@ -2,20 +2,21 @@
# info_ru: Справочник кодов обозначения налоговых органов для целей учета налогоплательщиков # info_ru: Справочник кодов обозначения налоговых органов для целей учета налогоплательщиков
######################################################################## ########################################################################
export PROG_URL="https://www.nalog.gov.ru" export PROG_URL="https://www.nalog.gov.ru"
export AUTOINSTALL_EXE="${WH_TMP_DIR}/soun_ins.exe"
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="soun" export WINEPREFIX="nalog"
export PROG_NAME="СОУН" export PROG_NAME="СОУН"
# export PROG_VERSION=""
export PROG_ICON="soun" export PROG_ICON="soun"
# export ADD_MIME_TYPE="" export BASE_PFX="none"
export BASE_PFX="defpfx_x86_v01"
export WINEARCH="win32" export WINEARCH="win32"
export INSTALL_DLL="corefonts"
export WH_WINDOWS_VER="10" export WH_WINDOWS_VER="10"
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
try_get_page "https://www.nalog.gov.ru/rn77/program/5961268/"
VER_MSI_SLASH=$(read_page | grep -oP 'href="\K[^"]*.exe[^"]*' | awk -F'/' '{print $(NF-1)}' | head -n 1)
AUTOINSTALL_EXE="${WH_TMP_DIR}/soun_ins.exe"
prepair_wine prepair_wine
if try_download "https://data.nalog.ru/files/Soun/2.6.2/soun_ins.exe" "${AUTOINSTALL_EXE}" ; then if try_download "https://data.nalog.ru/files/Soun/${VER_MSI_SLASH}/soun_ins.exe" "${AUTOINSTALL_EXE}" ; then
# TODO: Тихий режим или предупреждение # TODO: Тихий режим или предупреждение
wine_run_install "${AUTOINSTALL_EXE}" wine_run_install "${AUTOINSTALL_EXE}"
try_remove_file "${AUTOINSTALL_EXE}" try_remove_file "${AUTOINSTALL_EXE}"

View File

@@ -2,22 +2,23 @@
# info_ru: Программа проверки файлов на соответствие форматам представления в электронном виде налоговых деклараций, бухгалтерской отчетности. # info_ru: Программа проверки файлов на соответствие форматам представления в электронном виде налоговых деклараций, бухгалтерской отчетности.
######################################################################## ########################################################################
export PROG_URL="https://www.nalog.gov.ru" export PROG_URL="https://www.nalog.gov.ru"
export LAUNCH_PARAMETERS="/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-"
export AUTOINSTALL_EXE="${WH_TMP_DIR}/tester2269.exe"
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="nalog" export WINEPREFIX="nalog"
export PROG_NAME="Тестер" export PROG_NAME="Тестер"
# export PROG_VERSION=""
export PROG_ICON="tester" export PROG_ICON="tester"
# export ADD_MIME_TYPE="" export BASE_PFX="none"
export BASE_PFX="defpfx_x86_v01"
export WINEARCH="win32" export WINEARCH="win32"
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
export WH_WINDOWS_VER="10" export WH_WINDOWS_VER="10"
export INSTALL_DLL="corefonts micross tahoma lucida riched20 comctl32 msxml3 msxml4 msxml6 mdac28 wsh57 vcrun6 vb6run jet40 gdiplus vcrun2019 dotnet20sp2 dotnet40 dotnet48"
try_get_page "https://www.nalog.gov.ru/rn77/program/5961279/"
VER_EXE_SLASH=$(read_page | grep -oP 'href="\K[^"]*.exe[^"]*' | awk -F'/' '{print $(NF-1)}' | tail -n 1)
VER_EXE=$(read_page | grep -oP 'href="\K[^"]*.exe[^"]*' | awk -F'/' '{print $(NF)}' | tail -n 1)
AUTOINSTALL_EXE="${WH_TMP_DIR}/${VER_EXE}"
prepair_wine prepair_wine
if try_download "https://data.nalog.ru/files/tester/2.269/tester2269.exe" "${AUTOINSTALL_EXE}" ; then if try_download "https://data.nalog.ru/files/tester/${VER_EXE_SLASH}/${VER_EXE}" "${AUTOINSTALL_EXE}" ; then
wine_run_install "${AUTOINSTALL_EXE}" wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
try_remove_file "${AUTOINSTALL_EXE}" try_remove_file "${AUTOINSTALL_EXE}"
WIN_FILE_EXEC="$DRIVE_C/Tester/tester.exe" WIN_FILE_EXEC="$DRIVE_C/Tester/tester.exe"

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)
@@ -2291,6 +2367,11 @@ class WineHelperGUI(QMainWindow):
# Если нужно скрыть тестовые версии и они были добавлены # Если нужно скрыть тестовые версии и они были добавлены
elif not is_checked and test_buttons: elif not is_checked and test_buttons:
# Если текущая активная кнопка находится среди удаляемых, сбрасываем ее
if self.current_active_button in test_buttons:
self._reset_info_panel_to_default("Автоматическая установка")
self.current_active_button = None
# Останавливаем анимацию и удаляем виджеты тестовых кнопок # Останавливаем анимацию и удаляем виджеты тестовых кнопок
for btn in test_buttons: for btn in test_buttons:
if btn in self.icon_animators: if btn in self.icon_animators: