Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b6fab878f | ||
|
|
10ca3b3c98 |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
@@ -190,7 +190,12 @@ ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client
|
||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||
# winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip
|
||||
|
||||
70a4cbce1b600434b4d5f241ee90dafb15f7b5f821bc1594e728493febaf017b ksamu_pfx_x64_v03.tar.xz
|
||||
f18864014fdb2fead0b45b5e70e95073072b89168df8cd6debba89081ac51a2a ksamu_pfx_x64_v01.tar.xz
|
||||
# create with wine-10.12.1-alt1-wow64 (universal user: xuser)
|
||||
# winetricks msxml6 msxml4 msxml3 riched30 msls31 riched20 msftedit richtx32 fontsmooth=gray
|
||||
# + manuall installed riched32
|
||||
|
||||
7377159d7f21537e517ecc7bdd4c09d6ccab39f1368688506e78e11cfde7dc2a ksamu_pfx_x64_v02.tar.xz
|
||||
# create with wine-10.18.1-alt1-wow64 (universal user: xuser)
|
||||
# winetricks corefonts tahoma msxml6 msxml4 msxml3 riched30 msls31 riched20 msftedit richtx32 fontsmooth=gray
|
||||
# + manuall installed riched32
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Программа «Декларация» позволяет автоматически формировать налоговые декларации по форме 3-НДФЛ. В процессе заполнения Вами данных программа автоматически проверяет их корректность, что уменьшает вероятность появления ошибки.
|
||||
# info_ru: Программа «Декларация 2024» позволяет автоматически формировать налоговые декларации по форме 3-НДФЛ. В процессе заполнения Вами данных программа автоматически проверяет их корректность, что уменьшает вероятность появления ошибки.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="declaration"
|
||||
export PROG_NAME="Декларация"
|
||||
export PROG_ICON="declarac-2"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export PROG_ICON="declarac"
|
||||
export BASE_PFX="defpfx_x86_v01"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export INSTALL_DLL="corefonts renderer=no3d"
|
||||
|
||||
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)
|
||||
@@ -23,7 +23,7 @@ if try_download "https://data.nalog.ru/files/${VER_YEAR}/${VER_MSI_SLASH}/${VER_
|
||||
wine_run_install "${AUTOINSTALL_MSI}" /q
|
||||
try_remove_file "${AUTOINSTALL_MSI}"
|
||||
|
||||
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация-2 ${YEAR}/Declaration${YEAR}.exe"
|
||||
WIN_FILE_EXEC="$DRIVE_C/АО ГНИВЦ/Декларация ${YEAR}/Decl${YEAR}.exe"
|
||||
create_desktop "$PROG_NAME $YEAR" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||
|
||||
# Удаляем ярлык предыдущей версии
|
||||
|
||||
@@ -6,7 +6,7 @@ export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WINEPREFIX="ksamu"
|
||||
export PROG_NAME="КСАМУ"
|
||||
export PROG_ICON="ksamu"
|
||||
export BASE_PFX="ksamu_pfx_x64_v03"
|
||||
export BASE_PFX="ksamu_pfx_x64_v02"
|
||||
export WINEARCH="win64"
|
||||
export INSTALL_DLL="corefonts tahoma richtx32 riched20 riched30 msls31 msftedit msxml6 msxml4 msxml3 fontsmooth=gray"
|
||||
# riched32
|
||||
@@ -14,7 +14,6 @@ export WH_WINDOWS_VER="7"
|
||||
export WH_USE_CPCSP_PROXY="1"
|
||||
export WH_MAIN_DECORATED="1"
|
||||
export WH_VIRTUAL_DESKTOP="0"
|
||||
export FREETYPE_PROPERTIES="truetype:interpreter-version=35"
|
||||
|
||||
prepair_wine
|
||||
create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON"
|
||||
@@ -2,20 +2,19 @@
|
||||
# info_ru: Программа автоматизации процесса подготовки юридическими и физическими лицами документов для представления в налоговые органы в электронной форме и на бумажном носителе.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="nalog"
|
||||
export PROG_NAME="Налогоплательщик ЮЛ"
|
||||
export PROG_ICON="npul"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export BASE_PFX="defpfx_x86_v01"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_XDG_OPEN="doc"
|
||||
export INSTALL_DLL="msxml4 msxml6 corefonts wsh57 gdiplus"
|
||||
|
||||
try_get_page "https://data.nalog.ru/rn77/program/5961229/"
|
||||
VER_MSI=$(read_page | grep -oP 'NalogUL\d+\.msi' | tail -n 1 | grep -oP '\d+')
|
||||
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 -n 1 | grep -oP '\d+')
|
||||
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"
|
||||
@@ -26,7 +25,7 @@ if try_download "https://data.nalog.ru/files/nalul/${VER_MSI_URL}/NalogUL${VER_M
|
||||
wine_run_install "${AUTOINSTALL_MSI}" /quiet INSTALLDIR="c:\npul"
|
||||
try_remove_file "${AUTOINSTALL_MSI}"
|
||||
|
||||
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "Печать НД с PDF417*.msi")"
|
||||
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "*.msi")"
|
||||
wine_run_install "${PRINT_INSTALLER}" "/q"
|
||||
|
||||
# Процедуры конвертации, индексация данных. По завершении процедур программа сама закроется. Признаком успешного завершения будет отсутствие в папке с программой файла setupmarker.ini. Если не принять процедуру, .exe файл обновления не установиться.
|
||||
@@ -39,9 +38,6 @@ if [[ -n "$VER_EXE" ]] \
|
||||
then
|
||||
wine_run_install "${AUTOINSTALL_EXE}" "/SILENT"
|
||||
try_remove_file "${AUTOINSTALL_EXE}"
|
||||
|
||||
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "Печать НД с PDF417*.msi" | tail -n 1)"
|
||||
wine_run_install "${PRINT_INSTALLER}" "/q"
|
||||
else
|
||||
print_info "Дополнительных обновлений не требуется."
|
||||
fi
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
# info_ru: Подготовка документов для государственной регистрации (ППДГР)
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="ppdgr2"
|
||||
export PROG_NAME="ППДГР-2"
|
||||
export PROG_ICON="ppdgr"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export BASE_PFX="defpfx_dn48_x86_v01"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL="dotnet48 msxml3 msxml4 msxml6 corefonts lucida wsh57 vcrun6 jet40 gdiplus"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_USE_EXTRA_FONTS="1"
|
||||
export INSTALL_DLL="dotnet48 msxml4 msxml6 corefonts lucida wsh57 vb6run"
|
||||
# var_winedlloverride_update "gdiplus,msxml3,wininet=b;msxml4=n"
|
||||
var_winedlloverride_update "gdiplus,msxml3,wininet=b;msxml4=n"
|
||||
|
||||
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)
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
# info_ru: Справочник кодов обозначения налоговых органов для целей учета налогоплательщиков
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="soun"
|
||||
export PROG_NAME="СОУН"
|
||||
export PROG_ICON="soun"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export BASE_PFX="defpfx_x86_v01"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL=""
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_USE_EXTRA_FONTS="1"
|
||||
export INSTALL_DLL="corefonts"
|
||||
|
||||
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)
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
# info_ru: Программа проверки файлов на соответствие форматам представления в электронном виде налоговых деклараций, бухгалтерской отчетности.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="nalog"
|
||||
export PROG_NAME="Тестер"
|
||||
export PROG_ICON="tester"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export INSTALL_DLL="msxml4 msxml6 corefonts wsh57 gdiplus"
|
||||
export BASE_PFX="defpfx_x86_v01"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL="msxml3 msxml4 msxml6 corefonts wsh57 vcrun6 jet40 gdiplus"
|
||||
export WH_WINDOWS_VER="10"
|
||||
|
||||
try_get_page "https://www.nalog.gov.ru/rn77/program/5961279/"
|
||||
|
||||
34
winehelper
34
winehelper
@@ -138,7 +138,7 @@ check_variables WINEFSYNC "0"
|
||||
|
||||
check_variables WINEUSERNAME "xuser"
|
||||
check_variables WINEARCH "win64" # or "win32"
|
||||
check_variables WH_WINE_USE "wine-10.18.1-alt1-wow64" # or system
|
||||
check_variables WH_WINE_USE "wine_x_tkg_10-0_amd64" # or system
|
||||
|
||||
check_variables WH_USE_CPCSP_PROXY "0"
|
||||
check_variables CPCSP_PROXY_X86_64_VER "0.6.1-alt1"
|
||||
@@ -734,7 +734,7 @@ EOF
|
||||
grep -e "info_" -e "#####" -e "PROG_URL=" -e "WINEPREFIX=" -e "INSTALL_DLL=" \
|
||||
-e "PROG_NAME=" -e "PROG_ICON=" -e "var_" -e "WH_MAIN_DECORATED" \
|
||||
-e "WH_VIRTUAL_DESKTOP" -e "WINE_TOP_WINDOW" -e "WH_FONT_SMOOTHING "\
|
||||
-e "WH_FONT_MSS_REPLACE" -e "FREETYPE_PROPERTIES" \
|
||||
-e "WH_FONT_MSS_REPLACE" \
|
||||
"$INSTALL_SCRIPT" | awk '{$1=$1;print}' >> "$exe_file".whdb
|
||||
|
||||
print_info "Создан файл настроек для $exe_file"
|
||||
@@ -1151,7 +1151,10 @@ check_prefix_var () {
|
||||
init_wineprefix () {
|
||||
check_prefix_var
|
||||
|
||||
check_variables BASE_PFX "none"
|
||||
if [[ "$WINEARCH" == "win32" ]]
|
||||
then check_variables BASE_PFX "defpfx_x86_v01"
|
||||
else check_variables BASE_PFX "defpfx_x64_v01"
|
||||
fi
|
||||
|
||||
export DRIVE_C="$WINEPREFIX/drive_c"
|
||||
export XUSER_PATH="$DRIVE_C/users/xuser"
|
||||
@@ -1195,7 +1198,7 @@ init_wineprefix () {
|
||||
|
||||
if [[ ! -d "$WINEPREFIX/dosdevices" ]] ; then
|
||||
create_new_dir "$WINEPREFIX/dosdevices"
|
||||
export REBOOT_PFX="1"
|
||||
local run_wbr="1"
|
||||
fi
|
||||
|
||||
if [[ ! -d "${WINEPREFIX}/dosdevices/c:" ]] ; then
|
||||
@@ -1208,9 +1211,10 @@ init_wineprefix () {
|
||||
try_force_link_dir "$HOME" "${WINEPREFIX}/dosdevices/h:"
|
||||
fi
|
||||
|
||||
if [[ $REBOOT_PFX == "1" ]] ; then
|
||||
if [[ $run_wbr == "1" ]] ; then
|
||||
"$WINELOADER" wineboot -r
|
||||
wait_wineserver
|
||||
unset run_wbr
|
||||
fi
|
||||
|
||||
if [[ -f "$WINEPREFIX/system.reg" ]] \
|
||||
@@ -1367,9 +1371,7 @@ init_wineprefix () {
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! grep -q "cpcsp_proxy.dll" "$WINEPREFIX/system.reg" \
|
||||
|| [[ $REBOOT_PFX == "1" ]]
|
||||
then
|
||||
if ! grep -q "cpcsp_proxy.dll" "$WINEPREFIX/system.reg" ; then
|
||||
print_info "Запускаем настройку cpcsp_proxy..."
|
||||
CPCSP_PROXY_OK="0"
|
||||
|
||||
@@ -1442,8 +1444,6 @@ init_wineprefix () {
|
||||
do
|
||||
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
|
||||
done
|
||||
|
||||
unset REBOOT_PFX
|
||||
}
|
||||
|
||||
kill_autostart () {
|
||||
@@ -1566,7 +1566,7 @@ wine_regfile () {
|
||||
wine_run () {
|
||||
local wh_add_args win_file_exec win_file_path win_file_name
|
||||
|
||||
if [[ $1 =~ (winecfg|regedit|winefile|wineconsole|control) ]] ; then
|
||||
if [[ $1 =~ (winecfg|regedit|winefile|wineconsole) ]] ; then
|
||||
win_file_exec="$1"
|
||||
win_file_name="$win_file_exec"
|
||||
win_file_path="$DRIVE_C"
|
||||
@@ -1616,9 +1616,9 @@ wine_run () {
|
||||
| grep -v "ICON" | sort | tee -a "$log_file"
|
||||
|
||||
echo -e "\n##### Лог WINE #####" | tee -a "$log_file"
|
||||
$MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" 2>&1 | tee -a "$log_file"
|
||||
$MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$log_file"
|
||||
else
|
||||
$MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@"
|
||||
$MANGOHUD_RUN "$WINELOADER" $wh_add_args "$win_file_exec" "$@" $LAUNCH_PARAMETERS
|
||||
fi
|
||||
|
||||
wait_wineserver
|
||||
@@ -2628,7 +2628,6 @@ case "$arg1" in
|
||||
winereg|regedit) prepair_wine ; wine_run "regedit" ;;
|
||||
winefile|explorer) prepair_wine ; wine_run "winefile" ;;
|
||||
wineconsole|cmd) prepair_wine ; wine_run "wineconsole" ;;
|
||||
control) prepair_wine ; wine_run "control" ;;
|
||||
winetricks) prepair_wine ; "$WH_WINETRICKS" -q "$@" ;;
|
||||
desktop) create_desktop "$@" ; exit 0 ;;
|
||||
install|-i) run_autoinstall "$@" ;;
|
||||
@@ -2663,16 +2662,15 @@ case "$arg1" in
|
||||
if [[ -n "$1" ]] && [[ -f "$1" ]] ; then
|
||||
WIN_OPEN_FILE="$("$WINELOADER" winepath -w "$1")"
|
||||
shift
|
||||
wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE"
|
||||
else
|
||||
wine_run "$WIN_FILE_EXEC" "$@"
|
||||
fi
|
||||
|
||||
wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE"
|
||||
else
|
||||
print_error "Команды $arg1 не существует."
|
||||
wh_info
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n "$WH_BG_PID" ]] ; then
|
||||
|
||||
@@ -2303,42 +2303,48 @@ class WineHelperGUI(QMainWindow):
|
||||
self.prefix_winefile_button.setToolTip("Запуск файлового менеджера Wine (winefile) для просмотра файлов внутри префикса.")
|
||||
management_layout.addWidget(self.prefix_winefile_button, 2, 1)
|
||||
|
||||
self.prefix_control_button = QPushButton("Панель управления Wine")
|
||||
self.prefix_control_button.setMinimumHeight(32)
|
||||
self.prefix_control_button.clicked.connect(lambda: self._run_wine_util('control', prefix_name=self.current_managed_prefix_name))
|
||||
self.prefix_control_button.setToolTip("Запуск панели управления Wine (control) для настройки компонентов и параметров.")
|
||||
management_layout.addWidget(self.prefix_control_button, 3, 0, 1, 2)
|
||||
|
||||
self.change_wine_version_button = QPushButton("Управление Wine/Proton")
|
||||
self.change_wine_version_button.setMinimumHeight(32)
|
||||
self.change_wine_version_button.clicked.connect(self.open_wine_version_manager)
|
||||
self.change_wine_version_button.setToolTip("Изменение версии Wine или Proton для выбранного префикса.")
|
||||
management_layout.addWidget(self.change_wine_version_button, 3, 0, 1, 2)
|
||||
management_layout.addWidget(self.change_wine_version_button, 4, 0, 1, 2)
|
||||
|
||||
self.esync_button = QPushButton("ESync")
|
||||
self.esync_button.setCheckable(True)
|
||||
self.esync_button.setToolTip("Включить/выключить Eventfd-based synchronization.")
|
||||
self.esync_button.clicked.connect(lambda: self.update_sync_option("WINEESYNC", self.esync_button.isChecked()))
|
||||
management_layout.addWidget(self.esync_button, 4, 0)
|
||||
management_layout.addWidget(self.esync_button, 5, 0)
|
||||
|
||||
self.fsync_button = QPushButton("FSync")
|
||||
self.fsync_button.setCheckable(True)
|
||||
self.fsync_button.setToolTip("Включить/выключить Futex-based synchronization.")
|
||||
self.fsync_button.clicked.connect(lambda: self.update_sync_option("WINEFSYNC", self.fsync_button.isChecked()))
|
||||
management_layout.addWidget(self.fsync_button, 4, 1)
|
||||
management_layout.addWidget(self.fsync_button, 5, 1)
|
||||
|
||||
self.dxvk_manage_button = QPushButton("Управление DXVK")
|
||||
self.dxvk_manage_button.setMinimumHeight(32)
|
||||
self.dxvk_manage_button.clicked.connect(lambda: self.open_component_version_manager('dxvk'))
|
||||
self.dxvk_manage_button.setToolTip("Установка или удаление определенной версии DXVK в префиксе.")
|
||||
management_layout.addWidget(self.dxvk_manage_button, 5, 0)
|
||||
management_layout.addWidget(self.dxvk_manage_button, 6, 0)
|
||||
|
||||
self.vkd3d_manage_button = QPushButton("Управление VKD3D")
|
||||
self.vkd3d_manage_button.setMinimumHeight(32)
|
||||
self.vkd3d_manage_button.clicked.connect(lambda: self.open_component_version_manager('vkd3d-proton'))
|
||||
self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.")
|
||||
management_layout.addWidget(self.vkd3d_manage_button, 5, 1)
|
||||
management_layout.addWidget(self.vkd3d_manage_button, 6, 1)
|
||||
|
||||
self.file_associations_button = QPushButton("Ассоциации файлов")
|
||||
self.file_associations_button.setMinimumHeight(32)
|
||||
self.file_associations_button.clicked.connect(self.open_file_associations_manager)
|
||||
self.file_associations_button.setToolTip(
|
||||
"Настройка открытия определенных типов файлов с помощью нативных приложений Linux.")
|
||||
management_layout.addWidget(self.file_associations_button, 6, 0, 1, 2)
|
||||
management_layout.addWidget(self.file_associations_button, 7, 0, 1, 2)
|
||||
|
||||
# --- Правая сторона: Информационный блок и кнопки установки ---
|
||||
right_column_widget = QWidget()
|
||||
@@ -2372,7 +2378,7 @@ class WineHelperGUI(QMainWindow):
|
||||
right_column_layout.setStretch(0, 1) # Информационное окно растягивается
|
||||
right_column_layout.setStretch(1, 0) # Группа кнопок не растягивается
|
||||
|
||||
management_layout.addWidget(right_column_widget, 0, 2, 7, 1)
|
||||
management_layout.addWidget(right_column_widget, 0, 2, 8, 1)
|
||||
|
||||
management_layout.setColumnStretch(0, 1)
|
||||
management_layout.setColumnStretch(1, 1)
|
||||
@@ -2743,36 +2749,18 @@ class WineHelperGUI(QMainWindow):
|
||||
QMessageBox.warning(self, "Ошибка", "Указан неверный путь к установочному файлу.")
|
||||
return
|
||||
|
||||
self.command_dialog = QDialog(self)
|
||||
self.command_dialog.setWindowTitle(f"Установка в префикс: {prefix_name}")
|
||||
self.command_dialog.setMinimumSize(750, 400)
|
||||
self.command_dialog.setModal(True)
|
||||
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.command_log_output = QTextEdit()
|
||||
self.command_log_output.setReadOnly(True)
|
||||
self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10))
|
||||
layout.addWidget(self.command_log_output)
|
||||
|
||||
self.command_close_button = QPushButton("Закрыть")
|
||||
self.command_close_button.setEnabled(False)
|
||||
self.command_close_button.clicked.connect(self.command_dialog.close)
|
||||
layout.addWidget(self.command_close_button)
|
||||
self.command_dialog.setLayout(layout)
|
||||
|
||||
self.command_process = QProcess(self.command_dialog)
|
||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(self._handle_prefix_install_finished)
|
||||
|
||||
# Окружение полностью настраивается скриптом winehelper
|
||||
self.command_process.setProcessEnvironment(QProcessEnvironment.systemEnvironment())
|
||||
|
||||
args = ["install-to-prefix", prefix_name, installer_path]
|
||||
self.command_log_output.append(f"Выполнение: {shlex.quote(self.winehelper_path)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
self.command_process.start(self.winehelper_path, args)
|
||||
self.command_dialog.exec_()
|
||||
dialog, process, log_output, close_button = self._create_command_dialog(
|
||||
f"Установка в префикс: {prefix_name}",
|
||||
self.winehelper_path,
|
||||
["install-to-prefix", prefix_name, installer_path],
|
||||
finished_callback=self._handle_prefix_install_finished
|
||||
)
|
||||
# Сохраняем ссылки для обратной совместимости с существующим кодом
|
||||
self.command_dialog = dialog
|
||||
self.command_process = process
|
||||
self.command_log_output = log_output
|
||||
self.command_close_button = close_button
|
||||
dialog.exec_()
|
||||
|
||||
def _get_prefix_component_version(self, prefix_name, component_key):
|
||||
"""
|
||||
@@ -3035,41 +3023,22 @@ class WineHelperGUI(QMainWindow):
|
||||
|
||||
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
|
||||
|
||||
self.command_dialog = QDialog(self)
|
||||
self.command_dialog.setWindowTitle("Обновление ассоциаций файлов")
|
||||
self.command_dialog.setMinimumSize(750, 400)
|
||||
self.command_dialog.setModal(True)
|
||||
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
def on_finished(exit_code, exit_status):
|
||||
self._handle_component_install_finished(prefix_name, exit_code, exit_status)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.command_log_output = QTextEdit()
|
||||
self.command_log_output.setReadOnly(True)
|
||||
self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10))
|
||||
layout.addWidget(self.command_log_output)
|
||||
|
||||
self.command_close_button = QPushButton("Закрыть")
|
||||
self.command_close_button.setEnabled(False)
|
||||
self.command_close_button.clicked.connect(self.command_dialog.close)
|
||||
layout.addWidget(self.command_close_button)
|
||||
self.command_dialog.setLayout(layout)
|
||||
|
||||
self.command_process = QProcess(self.command_dialog)
|
||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(
|
||||
lambda exit_code, exit_status: self._handle_component_install_finished(
|
||||
prefix_name, exit_code, exit_status))
|
||||
|
||||
env = QProcessEnvironment.systemEnvironment()
|
||||
env.insert("WINEPREFIX", prefix_path)
|
||||
# Переменная WH_XDG_OPEN теперь читается из измененного last.conf
|
||||
self.command_process.setProcessEnvironment(env)
|
||||
|
||||
# Вызываем init-prefix, который теперь прочитает правильное значение из last.conf
|
||||
args = ["init-prefix"]
|
||||
self.command_log_output.append(f"Выполнение: {shlex.quote(self.winehelper_path)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
self.command_process.start(self.winehelper_path, args)
|
||||
self.command_dialog.exec_()
|
||||
dialog, process, log_output, close_button = self._create_command_dialog(
|
||||
"Обновление ассоциаций файлов",
|
||||
self.winehelper_path,
|
||||
["init-prefix"],
|
||||
env_vars={"WINEPREFIX": prefix_path},
|
||||
finished_callback=on_finished
|
||||
)
|
||||
# Сохраняем ссылки для обратной совместимости с существующим кодом
|
||||
self.command_dialog = dialog
|
||||
self.command_process = process
|
||||
self.command_log_output = log_output
|
||||
self.command_close_button = close_button
|
||||
dialog.exec_()
|
||||
|
||||
def create_launcher_for_prefix(self):
|
||||
"""
|
||||
@@ -3111,38 +3080,19 @@ class WineHelperGUI(QMainWindow):
|
||||
return # Пользователь отменил или ввел пустое имя
|
||||
|
||||
# 3. Вызываем winehelper.sh create-desktop
|
||||
self.command_dialog = QDialog(self)
|
||||
self.command_dialog.setWindowTitle(f"Создание ярлыка для: {app_name}")
|
||||
self.command_dialog.setMinimumSize(750, 400)
|
||||
self.command_dialog.setModal(True)
|
||||
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.command_log_output = QTextEdit()
|
||||
self.command_log_output.setReadOnly(True)
|
||||
self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10))
|
||||
layout.addWidget(self.command_log_output)
|
||||
|
||||
self.command_close_button = QPushButton("Закрыть")
|
||||
self.command_close_button.setEnabled(False)
|
||||
self.command_close_button.clicked.connect(self.command_dialog.close)
|
||||
layout.addWidget(self.command_close_button)
|
||||
self.command_dialog.setLayout(layout)
|
||||
|
||||
self.command_process = QProcess(self.command_dialog)
|
||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(self._handle_launcher_creation_finished)
|
||||
|
||||
env = QProcessEnvironment.systemEnvironment()
|
||||
env.insert("WINEPREFIX", prefix_path)
|
||||
self.command_process.setProcessEnvironment(env)
|
||||
|
||||
args = ["desktop", app_name, exe_path, "auto"]
|
||||
|
||||
self.command_log_output.append(f"Выполнение: {shlex.quote(self.winehelper_path)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
self.command_process.start(self.winehelper_path, args)
|
||||
self.command_dialog.exec_()
|
||||
dialog, process, log_output, close_button = self._create_command_dialog(
|
||||
f"Создание ярлыка для: {app_name}",
|
||||
self.winehelper_path,
|
||||
["desktop", app_name, exe_path, "auto"],
|
||||
env_vars={"WINEPREFIX": prefix_path},
|
||||
finished_callback=self._handle_launcher_creation_finished
|
||||
)
|
||||
# Сохраняем ссылки для обратной совместимости с существующим кодом
|
||||
self.command_dialog = dialog
|
||||
self.command_process = process
|
||||
self.command_log_output = log_output
|
||||
self.command_close_button = close_button
|
||||
dialog.exec_()
|
||||
|
||||
def create_help_tab(self):
|
||||
"""Создает вкладку 'Справка' с подвкладками"""
|
||||
@@ -3439,16 +3389,26 @@ class WineHelperGUI(QMainWindow):
|
||||
|
||||
def _handle_prefix_install_finished(self, exit_code, exit_status):
|
||||
"""Обрабатывает завершение установки в префикс."""
|
||||
if exit_code == 0:
|
||||
self.command_log_output.append("\n=== Установка успешно завершена ===")
|
||||
self.create_launcher_button.setEnabled(True) # Активируем кнопку создания ярлыка
|
||||
else:
|
||||
self.command_log_output.append(f"\n=== Ошибка выполнения (код: {exit_code}) ===")
|
||||
# Используем старый API для обратной совместимости
|
||||
log_output = getattr(self, 'command_log_output', None)
|
||||
process = getattr(self, 'command_process', None)
|
||||
close_button = getattr(self, 'command_close_button', None)
|
||||
|
||||
if log_output:
|
||||
if exit_code == 0:
|
||||
log_output.append("\n=== Установка успешно завершена ===")
|
||||
self.create_launcher_button.setEnabled(True) # Активируем кнопку создания ярлыка
|
||||
else:
|
||||
log_output.append(f"\n=== Ошибка выполнения (код: {exit_code}) ===")
|
||||
|
||||
if process:
|
||||
process.deleteLater()
|
||||
if hasattr(self, 'command_process') and self.command_process == process:
|
||||
self.command_process = None
|
||||
|
||||
if close_button:
|
||||
close_button.setEnabled(True)
|
||||
|
||||
if self.command_process:
|
||||
self.command_process.deleteLater()
|
||||
self.command_process = None
|
||||
self.command_close_button.setEnabled(True)
|
||||
self.update_installed_apps()
|
||||
|
||||
def _set_active_button(self, button_widget):
|
||||
@@ -3609,37 +3569,29 @@ class WineHelperGUI(QMainWindow):
|
||||
|
||||
if msg_box.clickedButton() != yes_button:
|
||||
return # Отмена, если нажато "Нет" или крестик
|
||||
# Используем модальный диалог для отображения процесса резервного копирования (бэкап)
|
||||
self.command_dialog = QDialog(self)
|
||||
self.command_dialog.setWindowTitle(f"Резервное копирование: {prefix_name}")
|
||||
self.command_dialog.setMinimumSize(750, 400)
|
||||
self.command_dialog.setModal(True)
|
||||
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.command_log_output = QTextEdit()
|
||||
self.command_log_output.setReadOnly(True)
|
||||
self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10))
|
||||
layout.addWidget(self.command_log_output)
|
||||
dialog, process, log, close_btn = self._create_command_dialog(
|
||||
f"Резервное копирование: {prefix_name}",
|
||||
self.winehelper_path,
|
||||
["backup-prefix", prefix_name]
|
||||
)
|
||||
# Сохраняем ссылки для обратной совместимости с существующим кодом
|
||||
self.command_dialog = dialog
|
||||
self.command_process = process
|
||||
self.command_log_output = log
|
||||
self.command_close_button = close_btn
|
||||
|
||||
self.command_close_button = QPushButton("Закрыть")
|
||||
self.command_close_button.setEnabled(False)
|
||||
self.command_close_button.clicked.connect(self.command_dialog.close)
|
||||
layout.addWidget(self.command_close_button)
|
||||
self.command_dialog.setLayout(layout)
|
||||
# Устанавливаем родителя, чтобы избежать утечек памяти
|
||||
self.command_process = QProcess(self.command_dialog)
|
||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(self._handle_command_finished)
|
||||
self.command_process.finished.connect(self.update_open_log_dir_button_visibility)
|
||||
# Создаем callback после сохранения ссылок
|
||||
def on_finished(exit_code, exit_status):
|
||||
self._handle_command_finished(exit_code, exit_status, close_btn, process, log)
|
||||
if exit_code == 0:
|
||||
self.update_open_log_dir_button_visibility()
|
||||
|
||||
winehelper_path = self.winehelper_path
|
||||
args = ["backup-prefix", prefix_name]
|
||||
# Заменяем стандартный обработчик на наш
|
||||
process.finished.disconnect()
|
||||
process.finished.connect(on_finished)
|
||||
|
||||
self.command_log_output.append(f"Выполнение: {shlex.quote(winehelper_path)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
self.command_process.start(winehelper_path, args)
|
||||
self.command_dialog.exec_()
|
||||
dialog.exec_()
|
||||
|
||||
def restore_prefix(self):
|
||||
"""Восстанавливает префикс из резервной копии."""
|
||||
@@ -3653,36 +3605,21 @@ class WineHelperGUI(QMainWindow):
|
||||
if not backup_path:
|
||||
return
|
||||
|
||||
# Используем модальный диалог для отображения процесса восстановления из бэкапа
|
||||
self.command_dialog = QDialog(self)
|
||||
self.command_dialog.setWindowTitle(f"Восстановление из: {os.path.basename(backup_path)}")
|
||||
self.command_dialog.setMinimumSize(600, 400)
|
||||
self.command_dialog.setModal(True)
|
||||
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
def on_finished(exit_code, exit_status):
|
||||
self._handle_restore_finished(exit_code, exit_status)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
self.command_log_output = QTextEdit()
|
||||
self.command_log_output.setReadOnly(True)
|
||||
self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10))
|
||||
layout.addWidget(self.command_log_output)
|
||||
|
||||
self.command_close_button = QPushButton("Закрыть")
|
||||
self.command_close_button.setEnabled(False)
|
||||
self.command_close_button.clicked.connect(self.command_dialog.close)
|
||||
layout.addWidget(self.command_close_button)
|
||||
self.command_dialog.setLayout(layout)
|
||||
# Устанавливаем родителя, чтобы избежать утечек памяти
|
||||
self.command_process = QProcess(self.command_dialog)
|
||||
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(self._handle_restore_finished)
|
||||
|
||||
winehelper_path = self.winehelper_path
|
||||
args = ["restore-prefix", backup_path]
|
||||
|
||||
self.command_log_output.append(f"Выполнение: {shlex.quote(winehelper_path)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
self.command_process.start(winehelper_path, args)
|
||||
self.command_dialog.exec_()
|
||||
dialog, process, log_output, close_button = self._create_command_dialog(
|
||||
f"Восстановление из: {os.path.basename(backup_path)}",
|
||||
self.winehelper_path,
|
||||
["restore-prefix", backup_path],
|
||||
finished_callback=on_finished
|
||||
)
|
||||
# Сохраняем ссылки для обратной совместимости с существующим кодом
|
||||
self.command_dialog = dialog
|
||||
self.command_process = process
|
||||
self.command_log_output = log_output
|
||||
self.command_close_button = close_button
|
||||
dialog.exec_()
|
||||
|
||||
def run_installed_app_with_debug(self):
|
||||
"""Запускает выбранное установленное приложение с созданием лога"""
|
||||
@@ -4718,6 +4655,74 @@ class WineHelperGUI(QMainWindow):
|
||||
self.installation_cancelled = True
|
||||
self.install_process.terminate()
|
||||
|
||||
def _create_command_dialog(self, title, command, args, env_vars=None, finished_callback=None,
|
||||
min_width=750, min_height=400):
|
||||
"""
|
||||
Создает стандартный модальный диалог для выполнения команд winehelper.
|
||||
|
||||
Args:
|
||||
title: Заголовок диалога
|
||||
command: Путь к исполняемому файлу
|
||||
args: Список аргументов команды
|
||||
env_vars: Словарь дополнительных переменных окружения (опционально)
|
||||
finished_callback: Функция обратного вызова при завершении (exit_code, exit_status)
|
||||
min_width: Минимальная ширина диалога
|
||||
min_height: Минимальная высота диалога
|
||||
|
||||
Returns:
|
||||
Кортеж (dialog, process, log_output, close_button)
|
||||
"""
|
||||
dialog = QDialog(self)
|
||||
dialog.setWindowTitle(title)
|
||||
dialog.setMinimumSize(min_width, min_height)
|
||||
dialog.setModal(True)
|
||||
dialog.setWindowFlags(dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
log_output = QTextEdit()
|
||||
log_output.setReadOnly(True)
|
||||
log_output.setFont(QFont('DejaVu Sans Mono', 10))
|
||||
layout.addWidget(log_output)
|
||||
|
||||
close_button = QPushButton("Закрыть")
|
||||
close_button.setEnabled(False)
|
||||
close_button.clicked.connect(dialog.close)
|
||||
layout.addWidget(close_button)
|
||||
dialog.setLayout(layout)
|
||||
|
||||
process = QProcess(dialog)
|
||||
process.setProcessChannelMode(QProcess.MergedChannels)
|
||||
process.readyReadStandardOutput.connect(
|
||||
lambda: self._append_command_output(process, log_output)
|
||||
)
|
||||
|
||||
if finished_callback:
|
||||
process.finished.connect(finished_callback)
|
||||
else:
|
||||
process.finished.connect(
|
||||
lambda exit_code, exit_status: self._handle_command_finished(
|
||||
exit_code, exit_status, close_button, process, log_output)
|
||||
)
|
||||
|
||||
env = QProcessEnvironment.systemEnvironment()
|
||||
if env_vars:
|
||||
for key, value in env_vars.items():
|
||||
env.insert(key, value)
|
||||
process.setProcessEnvironment(env)
|
||||
|
||||
log_output.append(f"Выполнение: {shlex.quote(command)} {' '.join(shlex.quote(a) for a in args)}")
|
||||
process.start(command, args)
|
||||
|
||||
return dialog, process, log_output, close_button
|
||||
|
||||
def _append_command_output(self, process, log_output):
|
||||
"""Добавляет вывод процесса в лог."""
|
||||
output_bytes = process.readAll()
|
||||
output = output_bytes.data().decode('utf-8', errors='ignore').strip()
|
||||
if output:
|
||||
log_output.append(output)
|
||||
QApplication.processEvents()
|
||||
|
||||
def _handle_command_output(self):
|
||||
"""Обрабатывает вывод для общих команд в модальном диалоге."""
|
||||
if hasattr(self, 'command_process') and self.command_process:
|
||||
@@ -4735,20 +4740,34 @@ class WineHelperGUI(QMainWindow):
|
||||
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
|
||||
self.command_process.finished.connect(self._handle_command_finished)
|
||||
self.command_process.start(self.winehelper_path, [command] + (args or []))
|
||||
def _handle_command_finished(self, exit_code, exit_status):
|
||||
def _handle_command_finished(self, exit_code, exit_status, close_button=None, process=None, log_output=None):
|
||||
"""Обрабатывает завершение для диалога команды"""
|
||||
if exit_code == 0:
|
||||
self.command_log_output.append(f"\n=== Команда успешно завершена ===")
|
||||
else:
|
||||
self.command_log_output.append(f"\n=== Ошибка выполнения (код: {exit_code}) ===")
|
||||
if self.command_process:
|
||||
self.command_process.deleteLater()
|
||||
self.command_process = None
|
||||
self.command_close_button.setEnabled(True)
|
||||
self.command_log_output.ensureCursorVisible()
|
||||
# Поддержка старого API для обратной совместимости
|
||||
if close_button is None:
|
||||
close_button = getattr(self, 'command_close_button', None)
|
||||
if process is None:
|
||||
process = getattr(self, 'command_process', None)
|
||||
if log_output is None:
|
||||
log_output = getattr(self, 'command_log_output', None)
|
||||
|
||||
if log_output:
|
||||
if exit_code == 0:
|
||||
log_output.append(f"\n=== Команда успешно завершена ===")
|
||||
else:
|
||||
log_output.append(f"\n=== Ошибка выполнения (код: {exit_code}) ===")
|
||||
log_output.ensureCursorVisible()
|
||||
|
||||
if process:
|
||||
process.deleteLater()
|
||||
if hasattr(self, 'command_process') and self.command_process == process:
|
||||
self.command_process = None
|
||||
|
||||
if close_button:
|
||||
close_button.setEnabled(True)
|
||||
|
||||
def _handle_launcher_creation_finished(self, exit_code, exit_status):
|
||||
"""Обрабатывает завершение создания ярлыка."""
|
||||
# Используем старый API для обратной совместимости
|
||||
self._handle_command_finished(exit_code, exit_status)
|
||||
if exit_code == 0:
|
||||
self.update_installed_apps()
|
||||
@@ -4760,17 +4779,27 @@ class WineHelperGUI(QMainWindow):
|
||||
|
||||
def _handle_restore_finished(self, exit_code, exit_status):
|
||||
"""Обрабатывает завершение для диалога команды восстановления."""
|
||||
if exit_code == 0:
|
||||
self.command_log_output.append(f"\n=== Восстановление успешно завершено ===")
|
||||
self.update_installed_apps()
|
||||
self._load_created_prefixes()
|
||||
self.filter_installed_buttons()
|
||||
else:
|
||||
self.command_log_output.append(f"\n=== Ошибка выполнения (код: {exit_code}) ===")
|
||||
if self.command_process:
|
||||
self.command_process.deleteLater()
|
||||
self.command_process = None
|
||||
self.command_close_button.setEnabled(True)
|
||||
# Используем старый API для обратной совместимости
|
||||
log_output = getattr(self, 'command_log_output', None)
|
||||
if log_output:
|
||||
if exit_code == 0:
|
||||
log_output.append(f"\n=== Восстановление успешно завершено ===")
|
||||
self.update_installed_apps()
|
||||
self._load_created_prefixes()
|
||||
self.filter_installed_buttons()
|
||||
else:
|
||||
log_output.append(f"\n=== Ошибка выполнения (код: {exit_code}) ===")
|
||||
|
||||
close_button = getattr(self, 'command_close_button', None)
|
||||
process = getattr(self, 'command_process', None)
|
||||
|
||||
if process:
|
||||
process.deleteLater()
|
||||
if hasattr(self, 'command_process') and self.command_process == process:
|
||||
self.command_process = None
|
||||
|
||||
if close_button:
|
||||
close_button.setEnabled(True)
|
||||
|
||||
def cleanup_process(self):
|
||||
"""Очищает ресурсы процесса, принудительно завершая его, если он активен."""
|
||||
|
||||
Reference in New Issue
Block a user