From caccc333db07865c01a4dd019f3a9f0dd5ed2813 Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Sat, 25 Oct 2025 12:26:42 +0600 Subject: [PATCH 1/4] updating tax program scripts --- testinstall/declaration | 36 ++++++++++++++++-------------------- testinstall/npul | 29 ++++++++++------------------- testinstall/ppdgr2 | 16 +++++++++------- testinstall/soun | 15 ++++++++------- testinstall/tester_n | 17 +++++++++-------- 5 files changed, 52 insertions(+), 61 deletions(-) diff --git a/testinstall/declaration b/testinstall/declaration index 5f4af17..e40c79e 100644 --- a/testinstall/declaration +++ b/testinstall/declaration @@ -3,37 +3,33 @@ ######################################################################## export PROG_URL="https://www.nalog.gov.ru" export WH_WINE_USE="wine_x_tkg_10-0_amd64" -export WINEPREFIX="declaration" +export WINEPREFIX="nalog" export PROG_NAME="Декларация" export PROG_ICON="declarac" -export BASE_PFX="defpfx_x86_v01" +export BASE_PFX="none" export WINEARCH="win32" -export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus" 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" -curl -o "$DECL_FILE" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "https://www.nalog.gov.ru/rn77/program/5961249/" - -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) +try_get_page "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) YEAR="${VER_YEAR//decl/}" -VER_MSI_SLASH=$(grep -oP 'href="\K[^"]*.msi[^"]*' "$DECL_FILE" | 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_SLASH=$(read_page | grep -oP 'href="\K[^"]*.msi[^"]*' | awk -F'/' '{print $(NF-1)}' | 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}" prepair_wine -if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/$VER_MSI" "${AUTOINSTALL_MSI}" ; then - wine_run_install "${AUTOINSTALL_MSI}" "/q" +if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/${VER_MSI}" "${AUTOINSTALL_MSI}" ; then + wine_run_install "${AUTOINSTALL_MSI}" /q try_remove_file "${AUTOINSTALL_MSI}" WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация ${YEAR}/Decl${YEAR}.exe" 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 diff --git a/testinstall/npul b/testinstall/npul index 898677f..c36c1ba 100644 --- a/testinstall/npul +++ b/testinstall/npul @@ -6,32 +6,24 @@ export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WINEPREFIX="nalog" export PROG_NAME="Налогоплательщик ЮЛ" export PROG_ICON="npul" -export BASE_PFX="defpfx_x86_v01" +export BASE_PFX="none" export WINEARCH="win32" -export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus" 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" -curl -o "$NPUL_FILE" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "https://www.nalog.gov.ru/rn77/program/5961229/" - -if [[ ! -f "$NPUL_FILE" ]] \ -|| grep -q "Forbidden" "$NPUL_FILE" -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) +try_get_page "https://data.nalog.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 +VER_EXE=$(read_page | grep -oP 'NalogUL\d+\.exe' | tail -1 | grep -oP '\d+') +VER_EXE_URL="${VER_EXE:0:1}.${VER_EXE:1:2}.${VER_EXE:3}" # 4924 → 4.92.4 AUTOINSTALL_MSI="${WH_TMP_DIR}/NalogUL${VER_MSI}.msi" AUTOINSTALL_EXE="${WH_TMP_DIR}/NalogUL${VER_EXE}.exe" 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" - try_remove_file "${AUTOINSTALL_MSI}" + try_remove_file "${AUTOINSTALL_MSI}" PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "*.msi")" wine_run_install "${PRINT_INSTALLER}" "/q" @@ -42,7 +34,7 @@ if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_SLASH}" "${AUTOINST fi 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 wine_run_install "${AUTOINSTALL_EXE}" "/SILENT" try_remove_file "${AUTOINSTALL_EXE}" @@ -53,4 +45,3 @@ fi touch "$DRIVE_C/npul/INPUTDOC/linux.txt" WIN_FILE_EXEC="$DRIVE_C/npul/INPUTDOC/inputdoc.exe" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" -try_remove_file "$NPUL_FILE" diff --git a/testinstall/ppdgr2 b/testinstall/ppdgr2 index 3bf87eb..dd6b5ce 100644 --- a/testinstall/ppdgr2 +++ b/testinstall/ppdgr2 @@ -2,24 +2,26 @@ # info_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 WINEPREFIX="ppdgr2" +export WINEPREFIX="nalog" export PROG_NAME="ППДГР-2" -# export PROG_VERSION="" export PROG_ICON="ppdgr" -# export ADD_MIME_TYPE="" -export BASE_PFX="defpfx_dn48_x86_v01" +export BASE_PFX="none" export WINEARCH="win32" -export INSTALL_DLL="dotnet48 msxml3 msxml4 msxml6 corefonts lucida wsh57 vcrun6 jet40 gdiplus" export WH_WINDOWS_VER="10" 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 -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 try_remove_file "${AUTOINSTALL_EXE}" WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/ППДГР-2/PPDGR2.exe" create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" fi +https://data.nalog.ru/files/ppdgr/2.7.3/SetupPPDGR2.msi diff --git a/testinstall/soun b/testinstall/soun index 8f9e182..8b62629 100644 --- a/testinstall/soun +++ b/testinstall/soun @@ -2,20 +2,21 @@ # info_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 WINEPREFIX="soun" +export WINEPREFIX="nalog" export PROG_NAME="СОУН" -# export PROG_VERSION="" export PROG_ICON="soun" -# export ADD_MIME_TYPE="" -export BASE_PFX="defpfx_x86_v01" +export BASE_PFX="none" export WINEARCH="win32" -export INSTALL_DLL="corefonts" 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 -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: Тихий режим или предупреждение wine_run_install "${AUTOINSTALL_EXE}" try_remove_file "${AUTOINSTALL_EXE}" diff --git a/testinstall/tester_n b/testinstall/tester_n index d64145e..d85cb3b 100644 --- a/testinstall/tester_n +++ b/testinstall/tester_n @@ -2,22 +2,23 @@ # info_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 WINEPREFIX="nalog" export PROG_NAME="Тестер" -# export PROG_VERSION="" export PROG_ICON="tester" -# export ADD_MIME_TYPE="" -export BASE_PFX="defpfx_x86_v01" +export BASE_PFX="none" export WINEARCH="win32" -export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus" 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 -if try_download "https://data.nalog.ru/files/tester/2.269/tester2269.exe" "${AUTOINSTALL_EXE}" ; then - wine_run_install "${AUTOINSTALL_EXE}" +if try_download "https://data.nalog.ru/files/tester/${VER_EXE_SLASH}/${VER_EXE}" "${AUTOINSTALL_EXE}" ; then + wine_run_install "${AUTOINSTALL_EXE}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP- try_remove_file "${AUTOINSTALL_EXE}" WIN_FILE_EXEC="$DRIVE_C/Tester/tester.exe" -- 2.49.1 From 81013bfe71a92767b565e9e472e648d23fa5ae32 Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Sat, 25 Oct 2025 12:31:16 +0600 Subject: [PATCH 2/4] fix: reset active button if it's being removed --- winehelper_gui.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/winehelper_gui.py b/winehelper_gui.py index d946ad3..3441a1d 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -2291,6 +2291,11 @@ class WineHelperGUI(QMainWindow): # Если нужно скрыть тестовые версии и они были добавлены 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: if btn in self.icon_animators: -- 2.49.1 From 4afdbaa2209df4e8c504a9fd35e46bdd56e97f31 Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Sat, 25 Oct 2025 15:16:09 +0600 Subject: [PATCH 3/4] added the winetricks cache deletion feature --- auto_completion/bash_completion/winehelper | 2 +- auto_completion/zsh_completion/_winehelper | 1 + winehelper | 26 ++++++++ winehelper_gui.py | 78 +++++++++++++++++++++- 4 files changed, 105 insertions(+), 2 deletions(-) diff --git a/auto_completion/bash_completion/winehelper b/auto_completion/bash_completion/winehelper index e27bf5b..a0a9a84 100644 --- a/auto_completion/bash_completion/winehelper +++ b/auto_completion/bash_completion/winehelper @@ -4,7 +4,7 @@ _winehelper_completions() { COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" 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" case "${prev}" in diff --git a/auto_completion/zsh_completion/_winehelper b/auto_completion/zsh_completion/_winehelper index 41a49df..9550545 100644 --- a/auto_completion/zsh_completion/_winehelper +++ b/auto_completion/zsh_completion/_winehelper @@ -21,6 +21,7 @@ _winehelper() { 'backup-prefix[Создать резерную копию префикса]' 'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]' 'change-wine[Изменить версию Wine/Proton для префикса]' + 'clear-winetricks-cache[Очистить кэш Winetricks]' ) wine_cmd=( diff --git a/winehelper b/winehelper index e67dbd4..a53220f 100755 --- a/winehelper +++ b/winehelper @@ -2293,6 +2293,30 @@ run_change_wine_version() { 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 () { echo "Использование: $SCRIPT_NAME [команда] @@ -2312,6 +2336,7 @@ wh_info () { remove-prefix [имя_префикса] удалить префикс и все связанные данные backup-prefix [имя_префикса] создать резервную копию префикса restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии + clear-winetricks-cache очистить кэш Winetricks Параметры: --help показать эту справку и выйти @@ -2370,6 +2395,7 @@ case "$arg1" in remove-prefix) remove_prefix "$@" ;; create-base-pfx) create_base_pfx "$@" ;; init-prefix) prepair_wine ; wait_wineserver ;; + clear-winetricks-cache) clear_winetricks_cache "$@" ;; *) if [[ -f "$arg1" ]] ; then WIN_FILE_EXEC="$(readlink -f "$arg1")" diff --git a/winehelper_gui.py b/winehelper_gui.py index 3441a1d..5d5b7d9 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -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'{message}') + # Сбрасываем формат, чтобы следующий текст не наследовал цвет + self.log_output.setCurrentCharFormat(QTextCharFormat()) else: self.log_output.append(message) self.log_output.moveCursor(QTextCursor.End) -- 2.49.1 From 3c897777922add9fcdad51f66de193e451ea99cf Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Thu, 30 Oct 2025 20:08:22 +0600 Subject: [PATCH 4/4] tflex: correcting the display of the icon and name for a desktop file --- autoinstall/t-flex-cad-edu17 | 4 ++-- autoinstall/t-flex-cad17 | 4 ++-- autoinstall/t-flex-cad17-applications | 2 +- autoinstall/t-flex-cad17-resources | 2 +- autoinstall/t-flex-cad18 | 4 ++-- autoinstall/t-flex-cad18-applications | 2 +- autoinstall/t-flex-cad18-resources | 2 +- autoinstall/t-flex-cad2d+17 | 4 ++-- autoinstall/t-flex-cad2d+18 | 4 ++-- autoinstall/t-flex-docs17 | 4 ++-- autoinstall/t-flex-viewer17 | 4 ++-- autoinstall/t-flex-viewer18 | 4 ++-- image/{tflexcad.png => tflexcad17.png} | Bin image/tflexcad18.png | Bin 0 -> 7989 bytes image/{tflexdoc.png => tflexdoc17.png} | Bin 15 files changed, 20 insertions(+), 20 deletions(-) rename image/{tflexcad.png => tflexcad17.png} (100%) create mode 100644 image/tflexcad18.png rename image/{tflexdoc.png => tflexdoc17.png} (100%) diff --git a/autoinstall/t-flex-cad-edu17 b/autoinstall/t-flex-cad-edu17 index 8f6ab8e..b2b7259 100644 --- a/autoinstall/t-flex-cad-edu17 +++ b/autoinstall/t-flex-cad-edu17 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX CAD Учебная Версия 17" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad17" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -36,5 +36,5 @@ if try_download "https://www.tflexcad.ru/download/t-flex-cad-free/files/TFCAD_ST try_remove_dir "${WH_TMP_DIR}/Стандартные элементы 17" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD Учебная Версия 17/Program/TFlexCad.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCadEDU" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCadEDU17" fi diff --git a/autoinstall/t-flex-cad17 b/autoinstall/t-flex-cad17 index e566eb4..f6dcfd0 100644 --- a/autoinstall/t-flex-cad17 +++ b/autoinstall/t-flex-cad17 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX CAD 17" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad17" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/T-FLEX%20CAD%2017.zip" "${AUTOIN try_remove_file "${AUTOINSTALL_EXE}" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 17/Program/TFlexCad.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad17" fi diff --git a/autoinstall/t-flex-cad17-applications b/autoinstall/t-flex-cad17-applications index 542b405..6dd7a66 100644 --- a/autoinstall/t-flex-cad17-applications +++ b/autoinstall/t-flex-cad17-applications @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="Приложения для T-FLEX CAD 17" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad17" export WH_WINDOWS_VER="10" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" diff --git a/autoinstall/t-flex-cad17-resources b/autoinstall/t-flex-cad17-resources index 72786ce..66ec33b 100644 --- a/autoinstall/t-flex-cad17-resources +++ b/autoinstall/t-flex-cad17-resources @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="Ресурсы для T-FLEX CAD 17" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad17" export WH_WINDOWS_VER="10" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" diff --git a/autoinstall/t-flex-cad18 b/autoinstall/t-flex-cad18 index ff5538c..d3b7328 100644 --- a/autoinstall/t-flex-cad18 +++ b/autoinstall/t-flex-cad18 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX CAD 18" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad18" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -30,5 +30,5 @@ if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AU try_remove_dir "${AUTOINSTALL_UNPACK}" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad18" fi diff --git a/autoinstall/t-flex-cad18-applications b/autoinstall/t-flex-cad18-applications index 1c5b367..a3c1195 100644 --- a/autoinstall/t-flex-cad18-applications +++ b/autoinstall/t-flex-cad18-applications @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="Приложения для T-FLEX CAD 18" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad18" export WH_WINDOWS_VER="10" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" diff --git a/autoinstall/t-flex-cad18-resources b/autoinstall/t-flex-cad18-resources index d5280ea..34145f0 100644 --- a/autoinstall/t-flex-cad18-resources +++ b/autoinstall/t-flex-cad18-resources @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="Ресурсы для T-FLEX CAD 18" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad18" export WH_WINDOWS_VER="10" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" diff --git a/autoinstall/t-flex-cad2d+17 b/autoinstall/t-flex-cad2d+17 index f0aaecd..59da204 100644 --- a/autoinstall/t-flex-cad2d+17 +++ b/autoinstall/t-flex-cad2d+17 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX CAD 2D+ 17" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad17" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/T-FLEX%20CAD%202D+%2017.zip" "${ try_remove_file "${AUTOINSTALL_EXE}" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 17/Program/TFlexCad.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D17" fi diff --git a/autoinstall/t-flex-cad2d+18 b/autoinstall/t-flex-cad2d+18 index 83cff4a..772bb35 100644 --- a/autoinstall/t-flex-cad2d+18 +++ b/autoinstall/t-flex-cad2d+18 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX CAD 2D+ 18" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad18" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -30,5 +30,5 @@ if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%202D+%2018.zip" try_remove_dir "${AUTOINSTALL_UNPACK}" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 18/Program/TFlexCad.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D18" fi diff --git a/autoinstall/t-flex-docs17 b/autoinstall/t-flex-docs17 index 268b905..8991348 100644 --- a/autoinstall/t-flex-docs17 +++ b/autoinstall/t-flex-docs17 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX DOCs 17" -export PROG_ICON="tflexdoc" +export PROG_ICON="tflexdoc17" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/DOCs/T-FLEX%20DOCs%2017%20Client try_remove_file "${AUTOINSTALL_EXE}" WIN_FILE_EXEC="$DRIVE_C/Program Files (x86)/T-FLEX DOCs 17/Program/TFlex.DOCs.Client.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlex.DOCs17" fi diff --git a/autoinstall/t-flex-viewer17 b/autoinstall/t-flex-viewer17 index 3acf1ae..a92e0f1 100644 --- a/autoinstall/t-flex-viewer17 +++ b/autoinstall/t-flex-viewer17 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX Viewer 17" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad17" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -29,5 +29,5 @@ if try_download "https://www.tflex.ru/downloads/T-FLEX%20Viewer%2017.zip" "${AUT try_remove_file "${AUTOINSTALL_EXE}" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 17/Program/TFlexViewer.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexViewer17" fi diff --git a/autoinstall/t-flex-viewer18 b/autoinstall/t-flex-viewer18 index 865bc7f..cf783d5 100644 --- a/autoinstall/t-flex-viewer18 +++ b/autoinstall/t-flex-viewer18 @@ -3,7 +3,7 @@ ######################################################################## export PROG_URL="https://www.tflexcad.ru" export PROG_NAME="T-FLEX Viewer 18" -export PROG_ICON="tflexcad" +export PROG_ICON="tflexcad18" export WH_WINE_USE="wine_wh_tflex_10-9_amd64" export BASE_PFX="tflex_pfx_x64_v03" export WINEARCH="win64" @@ -30,5 +30,5 @@ if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20Viewer%2018.zip" "$ try_remove_dir "${AUTOINSTALL_UNPACK}" WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 18/Program/TFlexViewer.exe" - create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" + create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexViewer18" fi diff --git a/image/tflexcad.png b/image/tflexcad17.png similarity index 100% rename from image/tflexcad.png rename to image/tflexcad17.png diff --git a/image/tflexcad18.png b/image/tflexcad18.png new file mode 100644 index 0000000000000000000000000000000000000000..cab99b500ddb71fc1639b244d11485f08100f8e8 GIT binary patch literal 7989 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 literal 0 HcmV?d00001 diff --git a/image/tflexdoc.png b/image/tflexdoc17.png similarity index 100% rename from image/tflexdoc.png rename to image/tflexdoc17.png -- 2.49.1