Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
da3d5cd7af | ||
|
3ee499c758 | ||
|
6286cccbab | ||
|
e8d462b665 | ||
|
6476a84ce7 | ||
|
db7e3f5220 | ||
|
a817d1a6f5 | ||
|
e1fc25bb72 | ||
|
7c90da2088 | ||
|
108316148a | ||
|
9029f4d0e8 | ||
|
cedebe73c1 | ||
|
e04811446c | ||
|
15712f0a0a | ||
|
8eeee56ee1 | ||
|
ac4dd4f0bf | ||
|
c15d751372 | ||
|
78113b92a5 | ||
|
9e8e41e812 | ||
|
5f4d3a54b1 | ||
|
9d16883e6e | ||
|
e3cafee4f5 | ||
|
e2b2c9568c | ||
|
7113d864be | ||
|
9a1a88d01b | ||
|
ad775e4644 | ||
|
36f5c306c5 | ||
|
173a7ae41f | ||
|
32e56879f7 | ||
|
b88ea9f478 | ||
|
dd82cee5ea | ||
|
a35efc347d | ||
|
95a8d370ab |
@@ -298,6 +298,13 @@ WineHelper предоставляет доступ к основным инст
|
||||
<p><em>Выбранное приложение во вкладке "Установленные"</em></p>
|
||||
</div>
|
||||
|
||||
Расположения лога запуска программы а также резервной копии префикса можно просмотреть с помощью кнопки **«Открыть папку с логом/резервной копией префикса»** которая появляется автоматически после создания лога или резервной копии.
|
||||
|
||||
<div align="center">
|
||||
<img src="image/handbook/folder_log_backup.png">
|
||||
<p><em>Кнопка "Открыть папку с логом/резервной копией префикса"</em></p>
|
||||
</div>
|
||||
|
||||
### Вкладка «Менеджер префиксов»
|
||||
|
||||
Эта вкладка предоставляет мощные инструменты для управления префиксами Wine.
|
||||
|
17
autoinstall/ksamu
Normal file
17
autoinstall/ksamu
Normal file
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Программа “КСАМУ”.
|
||||
########################################################################
|
||||
export PROG_URL="https://docs.medicine-it.ru/"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="ksamu"
|
||||
export PROG_NAME="КСАМУ"
|
||||
export PROG_ICON="ksamu"
|
||||
export BASE_PFX="ksamu_pfx_x64_v01"
|
||||
export WINEARCH="win64"
|
||||
export INSTALL_DLL="richtx32 riched20 riched30 msls31 msftedit msxml6 msxml3 msxml4 fontsmooth=gray" #riched32
|
||||
export WH_USE_EXTRA_FONTS="1"
|
||||
export WH_WINDOWS_VER="7"
|
||||
|
||||
prepair_wine
|
||||
|
||||
create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON"
|
@@ -1,12 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций, с дополнением Apache OpenOffice. Apache OpenOffice - пакет офисного программного обеспечения для обработки текстов, электронных таблиц, презентаций, графики, баз данных и многого другого.
|
||||
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
|
||||
########################################################################
|
||||
export PROG_URL="https://scadoffice.ru"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WINEPREFIX="scadoffice"
|
||||
export PROG_NAME="SCAD Office"
|
||||
export PROG_ICON="scadoffice"
|
||||
export BASE_PFX="scadaoffice_pfx_x64_v04"
|
||||
export BASE_PFX="scadaoffice_pfx_x64_v05"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEARCH="win64"
|
||||
export INSTALL_DLL="dotnet20 dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6"
|
||||
@@ -32,7 +32,6 @@ if [[ -n $2 ]] ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $BASE_PFX == "none" ]] ; then
|
||||
print_info "Установка дополнительных компонентов..."
|
||||
|
||||
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
||||
@@ -59,12 +58,13 @@ if [[ $BASE_PFX == "none" ]] ; then
|
||||
try_remove_dir "$ADDONS_PATH"
|
||||
try_remove_file "$ADDONS_PACK"
|
||||
fi
|
||||
fi
|
||||
|
||||
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
||||
create_new_dir "$DRIVE_C/SDATA"
|
||||
create_new_dir "$DRIVE_C/SWORK"
|
||||
wine_run_install "${AUTOINSTALL_EXE}" /auto /hide
|
||||
# временно запрещаем запуск hasplms.exe, hasplmv.exe для успешного завершения установки
|
||||
tmp_winedlloverride_update "hasplms.exe,hasplmv.exe=d"
|
||||
wine_run_install "$AUTOINSTALL_EXE"
|
||||
try_remove_file "$AUTOINSTALL_EXE"
|
||||
|
||||
# Определение всех программ, значков и исполняемых файлов
|
||||
|
34
autoinstall/t-flex-cad18
Normal file
34
autoinstall/t-flex-cad18
Normal file
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD 18"
|
||||
export PROG_ICON="tflexcad"
|
||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
# используем общий whdb файл для подготовки префикса и сервисов
|
||||
# prepair_wine используется из файла настроек
|
||||
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||
|
||||
# Программа T-FLEX CAD
|
||||
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 18.zip"
|
||||
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 18"
|
||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/T-FLEX CAD 18/T-FLEX CAD 18.msi"
|
||||
|
||||
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||
|
||||
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||
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"
|
||||
fi
|
52
autoinstall/t-flex-cad18-applications
Normal file
52
autoinstall/t-flex-cad18-applications
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Приложения для T-FLEX CAD 18 (T-FLEX Анализ 18, T-FLEX Динамика 18, T-FLEX Детали машин 18, T-FLEX Раскрой 18, T-FLEX VR 18, T-FLEX Печатные платы 18)
|
||||
########################################################################
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="Приложения для T-FLEX CAD 18"
|
||||
export PROG_ICON="tflexcad"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
check_prefix_var
|
||||
if [[ ! -f "$WINEPREFIX/drive_c/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" ]]
|
||||
then fatal "Изначально установите T-FLEX CAD 18."
|
||||
fi
|
||||
|
||||
BASE_URL="https://www.tflex.ru/downloads/V18"
|
||||
FILES=(
|
||||
"T-FLEX Analysis 18.zip"
|
||||
"T-FLEX Dynamics 18.zip"
|
||||
"T-FLEX Machinery 18.zip"
|
||||
"T-FLEX Nesting 18.zip"
|
||||
"T-FLEX VR 18.zip"
|
||||
"T-FLEX Circuits 18.zip"
|
||||
)
|
||||
UNPACK_APP="${WH_TMP_DIR}/unpack_applications"
|
||||
|
||||
prepair_wine
|
||||
|
||||
# Скачивание всех файлов
|
||||
for file_name in "${FILES[@]}" ; do
|
||||
local output="${WH_TMP_DIR}/${file_name// /_}"
|
||||
|
||||
if try_download "$BASE_URL/$file_name" "$output" ; then
|
||||
unpack "$output" "${UNPACK_APP}"
|
||||
fi
|
||||
try_remove_file "$output"
|
||||
done
|
||||
|
||||
# Установка .msi файлов
|
||||
for msi_file in "${UNPACK_APP}"/*/*.msi ; do
|
||||
if [[ -f "$msi_file" ]] ; then
|
||||
wine_run_install "$msi_file" /q
|
||||
else
|
||||
fatal "Нет .msi файлов для установки в ${UNPACK_APP}/*."
|
||||
fi
|
||||
done
|
||||
|
||||
try_remove_dir "${UNPACK_APP}"
|
49
autoinstall/t-flex-cad18-resources
Normal file
49
autoinstall/t-flex-cad18-resources
Normal file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Обучающие материалы, примеры, бесплатные библиотеки для T-FLEX CAD 18 (Учебное пособие 18, Стандартные элементы 18, Примеры 18)
|
||||
########################################################################
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="Ресурсы для T-FLEX CAD 18"
|
||||
export PROG_ICON="tflexcad"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
check_prefix_var
|
||||
if [[ ! -f "$WINEPREFIX/drive_c/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" ]]
|
||||
then fatal "Изначально установите T-FLEX CAD 18."
|
||||
fi
|
||||
|
||||
BASE_URL="https://www.tflex.ru/downloads/V18"
|
||||
FILES=(
|
||||
"T-FLEX Tutorial 18.zip"
|
||||
"Standard parts 18.zip"
|
||||
"Examples 18.zip"
|
||||
)
|
||||
UNPACK_RESOURCES="${WH_TMP_DIR}/unpack_resources"
|
||||
|
||||
prepair_wine
|
||||
|
||||
# Скачивание всех файлов
|
||||
for file_name in "${FILES[@]}" ; do
|
||||
local output="${WH_TMP_DIR}/${file_name// /_}"
|
||||
|
||||
if try_download "$BASE_URL/$file_name" "$output" ; then
|
||||
unpack "$output" "$UNPACK_RESOURCES"
|
||||
fi
|
||||
try_remove_file "$output"
|
||||
done
|
||||
|
||||
# Установка .msi файлов
|
||||
for msi_file in "${UNPACK_RESOURCES}"/*/*.msi ; do
|
||||
if [[ -f "$msi_file" ]] ; then
|
||||
wine_run_install "$msi_file" /q
|
||||
else
|
||||
fatal "Нет .msi файлов для установки в ${UNPACK_RESOURCES}/unpack_dop/*."
|
||||
fi
|
||||
done
|
||||
|
||||
try_remove_dir "${UNPACK_RESOURCES}"
|
34
autoinstall/t-flex-cad2d+18
Normal file
34
autoinstall/t-flex-cad2d+18
Normal file
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD 2D+ 18"
|
||||
export PROG_ICON="tflexcad"
|
||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
# используем общий whdb файл для подготовки префикса и сервисов
|
||||
# prepair_wine используется из файла настроек
|
||||
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||
|
||||
# Программа T-FLEX CAD 2D+ 18
|
||||
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 2D+ 18.zip"
|
||||
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 2D+ 18"
|
||||
AUTOINSTALL_EXE="${AUTOINSTALL_UNPACK}/T-FLEX CAD 2D+ 18.msi"
|
||||
|
||||
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%202D+%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||
|
||||
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||
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"
|
||||
fi
|
34
autoinstall/t-flex-viewer18
Normal file
34
autoinstall/t-flex-viewer18
Normal file
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Просмотр, печать и аннотирование документов T-FLEX CAD
|
||||
########################################################################
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX Viewer 18"
|
||||
export PROG_ICON="tflexcad"
|
||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
# используем общий whdb файл для подготовки префикса и сервисов
|
||||
# prepair_wine используется из файла настроек
|
||||
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||
|
||||
# Программа T-FLEX Viewer
|
||||
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX Viewer 18.zip"
|
||||
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX Viewer 18"
|
||||
AUTOINSTALL_EXE="${AUTOINSTALL_UNPACK}/T-FLEX Viewer 18.msi"
|
||||
|
||||
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20Viewer%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||
|
||||
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||
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"
|
||||
fi
|
BIN
image/handbook/folder_log_backup.png
Normal file
BIN
image/handbook/folder_log_backup.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 111 KiB |
BIN
image/ksamu.png
Normal file
BIN
image/ksamu.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.0 KiB |
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Ручная установка дополнений для T-FLEX DOCS 17 или 18
|
||||
# info_ru: Ручная установка дополнений для T-FLEX CAD 17 или 18
|
||||
########################################################################
|
||||
export PROG_NAME="T-FLEX CAD 17/18"
|
||||
export PROG_ICON="tflexcad"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Ручная установка дополнений для T-FLEX CAD 17 или 18
|
||||
# info_ru: Ручная установка дополнений для T-FLEX DOCS 17 или 18
|
||||
########################################################################
|
||||
export PROG_NAME="T-FLEX CAD 17/18"
|
||||
export PROG_NAME="T-FLEX DOCS 17/18"
|
||||
export PROG_ICON="tflexcad"
|
||||
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
|
@@ -208,12 +208,18 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e audiorecstatio
|
||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||
# winetricks arial dotnet7 dotnetdesktop7 renderer=gdi
|
||||
|
||||
4fa93434c5c15440014357323257ddcee7d28b94ad6a56bd6f5a08b33ae4c3cb scadaoffice_pfx_x64_v04.tar.xz
|
||||
# create with wine-8.8-staging-amd64
|
||||
8c6312f2e4e846a98ca4a87fc90ee1917eb28d4caaddde040fb4d2dd05f8c0fe scadaoffice_pfx_x64_v05.tar.xz
|
||||
# create with wine_x_tkg_10-0_amd64 (universal user: xuser)
|
||||
# winetricks dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6 dotnet20
|
||||
# + addons with ODBC, SSH, *.reg
|
||||
|
||||
# addons with ODBC, SSH, *.reg
|
||||
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz
|
||||
|
||||
ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client_pfx_x86_v01.tar.xz
|
||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||
# winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip
|
||||
|
||||
f18864014fdb2fead0b45b5e70e95073072b89168df8cd6debba89081ac51a2a ksamu_pfx_x64_v01.tar.xz
|
||||
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
|
||||
# winetricks msxml6 msxml4 msxml3 riched30 msls31 riched20 msftedit richtx32 fontsmooth=gray
|
||||
# + manuall installed riched32
|
||||
|
150
winehelper
150
winehelper
@@ -101,14 +101,6 @@ else
|
||||
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
||||
fi
|
||||
|
||||
if [[ $WINEDEBUG != "-all" ]] ; then
|
||||
export LOG_FILE="$HOME/winehelper.log"
|
||||
date > "$LOG_FILE"
|
||||
print_warning "Включен режим логирования работы WINE."
|
||||
print_warning "Лог будет сохранен по пути: $LOG_FILE"
|
||||
sleep 3
|
||||
fi
|
||||
|
||||
##### WINETRICKS VERSION #####
|
||||
WINETRICKS_VERSION="20250102"
|
||||
|
||||
@@ -161,6 +153,7 @@ check_variables WH_WINDOWS_VER "10"
|
||||
# check_variables WH_USE_GSTREAMER "1"
|
||||
# check_variables WH_USE_D3D_EXTRAS "1"
|
||||
check_variables WH_USE_SHADER_CACHE "1"
|
||||
check_variables WH_USE_MESA_GL_OVERRIDE "0"
|
||||
check_variables WH_USE_WINE_DXGI "0"
|
||||
check_variables WH_DLL_INSTALL ""
|
||||
|
||||
@@ -482,6 +475,10 @@ var_winedlloverride_update () {
|
||||
fi
|
||||
}
|
||||
|
||||
tmp_winedlloverride_update () {
|
||||
var_winedlloverride_update "$1"
|
||||
}
|
||||
|
||||
var_dxvk_config_update () {
|
||||
if [[ -n "${DXVK_CONFIG}" ]]
|
||||
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
|
||||
@@ -550,8 +547,6 @@ create_desktop () {
|
||||
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
|
||||
fatal "Использование: $0 desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]"
|
||||
elif [[ ! -f "$exe_file" ]] ; then
|
||||
print_warning "Для создания ярлыка не найден исполняемый файл: $exe_file"
|
||||
|
||||
local BASENAME_EXE="$(basename "$exe_file")"
|
||||
print_info "Запускаем поиск $BASENAME_EXE"
|
||||
local FIND_PATH
|
||||
@@ -562,9 +557,11 @@ create_desktop () {
|
||||
exe_file="$(find "$FIND_PATH" -type f -not -type l \
|
||||
-not -path "*/windows/*" -not -path "*/dosdevices/*" \
|
||||
-iname "$BASENAME_EXE")"
|
||||
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]]
|
||||
then fatal "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
|
||||
else print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
|
||||
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]] ; then
|
||||
print_error "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
|
||||
return 1
|
||||
else
|
||||
print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1345,23 +1342,25 @@ kill_wine () {
|
||||
}
|
||||
|
||||
init_database () {
|
||||
WHDB_FILE="0"
|
||||
if [[ -f "$WIN_FILE_EXEC" ]] ; then
|
||||
local whdb_file="0"
|
||||
if [[ -n "$WIN_FILE_EXEC" ]] \
|
||||
&& [[ -f "$WIN_FILE_EXEC" ]]
|
||||
then
|
||||
WHDB="$(basename "$WIN_FILE_EXEC" .exe)"
|
||||
if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then
|
||||
WHDB_FILE="$WIN_FILE_EXEC".whdb
|
||||
whdb_file="$WIN_FILE_EXEC".whdb
|
||||
else
|
||||
orig_IFS="$IFS" && IFS=$'\n'
|
||||
if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then
|
||||
WHDB_FILE="$WH_FIND_DB_FILE"
|
||||
whdb_file="$WH_FIND_DB_FILE"
|
||||
fi
|
||||
IFS="$orig_IFS"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$WHDB_FILE" != "0" ]] ; then
|
||||
print_info "Используется файл настроек: $WHDB_FILE"
|
||||
. "$WHDB_FILE"
|
||||
if [[ "$whdb_file" != "0" ]] ; then
|
||||
print_info "Используется файл настроек: $whdb_file"
|
||||
. "$whdb_file"
|
||||
fi
|
||||
|
||||
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
||||
@@ -1387,23 +1386,56 @@ prepair_wine () {
|
||||
}
|
||||
|
||||
wine_run () {
|
||||
local wh_add_args win_file_exec
|
||||
|
||||
if [[ $1 =~ (winecfg|regedit|winefile|wineconsole) ]] ; then
|
||||
win_file_exec="$1"
|
||||
win_file_name="$win_file_exec"
|
||||
wh_add_args=""
|
||||
elif [[ -f "$1" ]] ; then
|
||||
local win_file_path win_file_name
|
||||
win_file_exec="$(readlink -f "$1")"
|
||||
win_file_path="$(dirname "$win_file_exec")"
|
||||
win_file_name="$(basename "$win_file_exec")"
|
||||
|
||||
case "${win_file_name,,}" in
|
||||
*.exe) wh_add_args="$WINE_WIN_START" ;;
|
||||
*.msi) wh_add_args="msiexec /i" ;;
|
||||
*.bat|*.cmd) wh_add_args="" ;;
|
||||
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
||||
esac
|
||||
|
||||
if [[ $WINEARCH == "win32" ]] \
|
||||
&& file "$WIN_FILE_EXEC" | grep -q "x86-64"
|
||||
&& file "$win_file_exec" | grep -q "x86-64"
|
||||
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
|
||||
fi
|
||||
|
||||
WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")"
|
||||
[[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH"
|
||||
|
||||
if [[ -n $LOG_FILE ]] && [[ -f "$LOG_FILE" ]] ; then
|
||||
echo "##### Основные переменные #####" | tee -a "$LOG_FILE"
|
||||
env | grep -e "WH_" -e "WINE" -e "DXVK" -e "VKD3D" | tee -a "$LOG_FILE"
|
||||
|
||||
echo "##### Лог WINE #####" | tee -a "$LOG_FILE"
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
|
||||
cd "$win_file_path"
|
||||
else
|
||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
||||
fatal "Команда введена не правильно или не найден исполняемый файл $1"
|
||||
fi
|
||||
|
||||
shift
|
||||
|
||||
if [[ $WINEDEBUG != "-all" ]] ; then
|
||||
local log_dir log_file
|
||||
log_dir="$HOME/winehelper_backup_log"
|
||||
log_file="$log_dir/${PREFIX_NAME}_${win_file_name%.*}.log"
|
||||
create_new_dir "$log_dir"
|
||||
date > "$log_file"
|
||||
|
||||
print_warning "Включен режим логирования работы WINE."
|
||||
print_warning "Лог будет сохранен по пути: $log_file"
|
||||
|
||||
echo "##### Основные переменные #####" | tee -a "$log_file"
|
||||
env | grep -e "WH_" -e "WINE" -e "DXVK" -e "VKD3D" | tee -a "$log_file"
|
||||
|
||||
echo "##### Лог WINE #####" | 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" "$@" $LAUNCH_PARAMETERS
|
||||
fi
|
||||
|
||||
wait_wineserver
|
||||
}
|
||||
|
||||
@@ -1412,14 +1444,11 @@ wine_run_install () {
|
||||
if [[ "$INSTALL_MODE" == "manual" ]]
|
||||
then print_warning "Рекомендуется не менять пути для установки приложения!"
|
||||
fi
|
||||
[[ ! -f "$1" ]] && fatal "Нет файла для установки: $1"
|
||||
case "${1,,}" in
|
||||
*.exe) wine_run $WINE_WIN_START "$@" ;;
|
||||
*.msi) wine_run msiexec /i "$@" ;;
|
||||
*.bat|*.cmd) wine_run "$@" ;;
|
||||
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
||||
esac
|
||||
wait_wineserver
|
||||
|
||||
if [[ ! -f "$1" ]] ;
|
||||
then fatal "Нет файла для установки: $1"
|
||||
else wine_run "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
run_autoinstall () {
|
||||
@@ -1773,6 +1802,7 @@ remove_winehelper () {
|
||||
echo " - Все настройки WineHelper"
|
||||
echo " - Все приложения/программы, установленные через WineHelper"
|
||||
echo " - Все ярлыки из меню и с рабочего стола, созданные с помощью WineHelper"
|
||||
echo " - Все резервные копии и логи, созданные WineHelper"
|
||||
echo "======================================================"
|
||||
if print_confirmation "Продолжить?" ; then
|
||||
echo "----------------------------------------------"
|
||||
@@ -1788,6 +1818,7 @@ remove_winehelper () {
|
||||
|
||||
# Удаление рабочих каталогов
|
||||
try_remove_dir "$USER_WORK_PATH"
|
||||
try_remove_dir "$HOME/winehelper_backup_log"
|
||||
|
||||
# Удаление файлов меню
|
||||
try_remove_dir "$WH_MENU_DIR"
|
||||
@@ -1866,7 +1897,8 @@ backup_prefix() {
|
||||
check_prefix_var
|
||||
|
||||
local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir
|
||||
backup_base_dir="$(xdg-user-dir DESKTOP)"
|
||||
backup_base_dir="$HOME/winehelper_backup_log"
|
||||
create_new_dir "$backup_base_dir"
|
||||
backup_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack"
|
||||
backup_dest_path="$backup_base_dir/$backup_archive_name"
|
||||
temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)"
|
||||
@@ -2145,20 +2177,21 @@ select_component_version() {
|
||||
}
|
||||
|
||||
run_install_to_prefix() {
|
||||
export WINEPREFIX="$1"
|
||||
local WIN_FILE_EXEC="$2"
|
||||
|
||||
if [[ -z "$WINEPREFIX" ]] || [[ -z "$WIN_FILE_EXEC" ]]; then
|
||||
if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ -f "$2" ]]; then
|
||||
fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>"
|
||||
fi
|
||||
|
||||
export WINEPREFIX="$1"
|
||||
shift
|
||||
|
||||
check_prefix_var
|
||||
prepair_wine
|
||||
wine_run_install "$WIN_FILE_EXEC"
|
||||
wine_run "$@"
|
||||
}
|
||||
|
||||
run_install_dxvk() {
|
||||
local version="$1"
|
||||
|
||||
if [[ -z "$version" ]] ; then
|
||||
version=$(select_component_version "DXVK")
|
||||
[[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return
|
||||
@@ -2166,21 +2199,27 @@ run_install_dxvk() {
|
||||
list_component_versions "DXVK"
|
||||
return
|
||||
fi
|
||||
|
||||
check_prefix_var
|
||||
init_database
|
||||
|
||||
export DXVK_VER="$version"
|
||||
|
||||
init_wine_ver
|
||||
init_wineprefix
|
||||
|
||||
if [[ "$DXVK_VER" == "none" ]]
|
||||
then print_info "Удаление DXVK..."
|
||||
else print_info "Установка DXVK: $DXVK_VER"
|
||||
fi
|
||||
|
||||
init_dxvk "$DXVK_VER"
|
||||
wait_wineserver
|
||||
}
|
||||
|
||||
run_install_vkd3d() {
|
||||
local version="$1"
|
||||
|
||||
if [[ -z "$version" ]] ; then
|
||||
version=$(select_component_version "VKD3D")
|
||||
[[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return
|
||||
@@ -2188,15 +2227,20 @@ run_install_vkd3d() {
|
||||
list_component_versions "VKD3D"
|
||||
return
|
||||
fi
|
||||
|
||||
check_prefix_var
|
||||
init_database
|
||||
|
||||
export VKD3D_VER="$version"
|
||||
|
||||
init_wine_ver
|
||||
init_wineprefix
|
||||
|
||||
if [[ "$VKD3D_VER" == "none" ]]
|
||||
then print_info "Удаление VKD3D..."
|
||||
else print_info "Установка VKD3D: $VKD3D_VER"
|
||||
fi
|
||||
|
||||
init_vkd3d "$VKD3D_VER"
|
||||
wait_wineserver
|
||||
}
|
||||
@@ -2215,9 +2259,7 @@ run_change_wine_version() {
|
||||
fi
|
||||
|
||||
init_wine_ver
|
||||
|
||||
init_wineprefix
|
||||
|
||||
wait_wineserver
|
||||
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
|
||||
}
|
||||
@@ -2303,12 +2345,14 @@ case "$arg1" in
|
||||
WIN_FILE_EXEC="$(readlink -f "$arg1")"
|
||||
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
|
||||
find_prefix "$WIN_FILE_EXEC"
|
||||
case "${WIN_FILE_NAME,,}" in
|
||||
*.exe) prepair_wine ; wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" ;;
|
||||
*.msi) prepair_wine ; wine_run msiexec /i "$WIN_FILE_EXEC" "$@" ;;
|
||||
*.bat|*.cmd) prepair_wine ; wine_run start "$WIN_FILE_EXEC" "$@" ;;
|
||||
*) fatal "Тип файла не поддерживается." ;;
|
||||
esac
|
||||
prepair_wine
|
||||
|
||||
if [[ -n "$1" ]] && [[ -f "$1" ]] ; then
|
||||
WIN_OPEN_FILE="$("$WINELOADER" winepath -w "$1")"
|
||||
shift
|
||||
fi
|
||||
|
||||
wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE"
|
||||
else
|
||||
print_error "Команды $arg1 не существует."
|
||||
wh_info
|
||||
|
@@ -13,7 +13,7 @@ from functools import partial
|
||||
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
|
||||
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
||||
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve
|
||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal
|
||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor
|
||||
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||
|
||||
@@ -428,6 +428,8 @@ class WinetricksManagerDialog(QDialog):
|
||||
"Для переустановки компонента: Выделите его в списке и нажмите кнопку «Переустановить»."
|
||||
)
|
||||
|
||||
installation_complete = pyqtSignal()
|
||||
|
||||
def __init__(self, prefix_path, winetricks_path, parent=None, wine_executable=None):
|
||||
super().__init__(parent)
|
||||
self.prefix_path = prefix_path
|
||||
@@ -617,12 +619,33 @@ class WinetricksManagerDialog(QDialog):
|
||||
self._log(f"--- Предупреждение: не удалось прочитать {log_path}: {e} ---")
|
||||
return installed_verbs
|
||||
|
||||
def _parse_winetricks_list_output(self, output, installed_verbs, list_widget):
|
||||
def _parse_winetricks_list_output(self, output, installed_verbs, list_widget, category):
|
||||
"""Парсит вывод 'winetricks list' и заполняет QListWidget."""
|
||||
# Regex, который обрабатывает строки как с префиксом статуса '[ ]', так и без него.
|
||||
# 1. `(?:\[(.)]\s+)?` - опциональная группа для статуса (напр. '[x]').
|
||||
# 2. `([^\s]+)` - имя компонента (без пробелов).
|
||||
# 3. `(.*)` - оставшаяся часть строки (описание).
|
||||
|
||||
# Определяем шаблоны для фильтрации на основе категории
|
||||
dlls_blacklist_pattern = None
|
||||
fonts_blacklist_pattern = None
|
||||
settings_blacklist_pattern = None
|
||||
|
||||
if category == 'dlls':
|
||||
# Исключаем d3d*, directx9, dont_use, dxvk*, vkd3d*, galliumnine, faudio*, Foundation
|
||||
dlls_blacklist_pattern = re.compile(
|
||||
r'^(d3d|directx9|dont_use|dxvk|vkd3d|galliumnine|faudio|foundation)', re.IGNORECASE
|
||||
)
|
||||
elif category == 'fonts':
|
||||
fonts_blacklist_pattern = re.compile(
|
||||
r'^(dont_use)', re.IGNORECASE
|
||||
)
|
||||
elif category == 'settings':
|
||||
# Исключаем vista*, alldlls, autostart_*, bad*, good*, win*, videomemory*, vd=*, isolate_home
|
||||
settings_blacklist_pattern = re.compile(
|
||||
r'^(vista|alldlls|autostart_|bad|good|win|videomemory|vd=|isolate_home)', re.IGNORECASE
|
||||
)
|
||||
|
||||
line_re = re.compile(r"^\s*(?:\[(.)]\s+)?([^\s]+)\s*(.*)")
|
||||
found_items = False
|
||||
|
||||
@@ -643,6 +666,14 @@ class WinetricksManagerDialog(QDialog):
|
||||
if '/' in name or '\\' in name or name.lower() in ('executing', 'using', 'warning:') or name.endswith(':'):
|
||||
continue
|
||||
|
||||
# Применяем фильтры для черных списков
|
||||
if dlls_blacklist_pattern and dlls_blacklist_pattern.search(name):
|
||||
continue
|
||||
if fonts_blacklist_pattern and fonts_blacklist_pattern.search(name):
|
||||
continue
|
||||
if settings_blacklist_pattern and settings_blacklist_pattern.search(name):
|
||||
continue
|
||||
|
||||
is_checked = name in installed_verbs
|
||||
item_text = f"{name.ljust(27)}{description.strip()}"
|
||||
item = QListWidgetItem(item_text)
|
||||
@@ -681,7 +712,7 @@ class WinetricksManagerDialog(QDialog):
|
||||
self._log("--------------------------------------------------", "red")
|
||||
else:
|
||||
installed_verbs = self._parse_winetricks_log()
|
||||
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget)
|
||||
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget, category)
|
||||
|
||||
if from_cache is None: # Только если мы не читали из кэша
|
||||
# Сохраняем успешный результат в кэш
|
||||
@@ -856,6 +887,7 @@ class WinetricksManagerDialog(QDialog):
|
||||
# Перезагружаем данные, чтобы обновить состояние
|
||||
self.initial_states.clear()
|
||||
self.load_all_categories()
|
||||
self.installation_complete.emit()
|
||||
self.installation_finished = True
|
||||
|
||||
def closeEvent(self, event):
|
||||
@@ -1636,8 +1668,8 @@ class WineHelperGUI(QMainWindow):
|
||||
self.main_layout.addLayout(content_layout)
|
||||
|
||||
# Фиксируем минимальные размеры
|
||||
self.stacked_widget.setMinimumWidth(520)
|
||||
self.info_panel.setMinimumWidth(415)
|
||||
self.stacked_widget.setMinimumWidth(535)
|
||||
self.info_panel.setMinimumWidth(395)
|
||||
|
||||
# Вкладки
|
||||
self.create_auto_install_tab()
|
||||
@@ -1762,6 +1794,7 @@ class WineHelperGUI(QMainWindow):
|
||||
if show_global:
|
||||
self.backup_button.setVisible(False)
|
||||
self.create_log_button.setVisible(False)
|
||||
self.open_log_dir_button.setVisible(False)
|
||||
self.uninstall_button.setVisible(False)
|
||||
self.current_selected_app = None
|
||||
|
||||
@@ -1877,6 +1910,12 @@ class WineHelperGUI(QMainWindow):
|
||||
self.backup_button.clicked.connect(self.backup_prefix_for_app)
|
||||
installed_global_layout.addWidget(self.backup_button)
|
||||
|
||||
self.open_log_dir_button = QPushButton("Открыть папку с логом/резервной копией префикса")
|
||||
self.open_log_dir_button.setIcon(QIcon.fromTheme("folder-open"))
|
||||
self.open_log_dir_button.clicked.connect(self.open_log_directory)
|
||||
self.open_log_dir_button.setVisible(False) # Скрыта по умолчанию
|
||||
installed_global_layout.addWidget(self.open_log_dir_button)
|
||||
|
||||
self.uninstall_button = QPushButton("Удалить префикс")
|
||||
self.uninstall_button.setIcon(QIcon.fromTheme("user-trash"))
|
||||
self.uninstall_button.clicked.connect(self.uninstall_app)
|
||||
@@ -2172,6 +2211,13 @@ class WineHelperGUI(QMainWindow):
|
||||
self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected)
|
||||
selector_layout.addWidget(self.created_prefix_selector, 1)
|
||||
|
||||
self.open_prefix_folder_button = QPushButton()
|
||||
self.open_prefix_folder_button.setIcon(QIcon.fromTheme("folder-open"))
|
||||
self.open_prefix_folder_button.setToolTip("Открыть папку префикса в файловом менеджере")
|
||||
self.open_prefix_folder_button.setEnabled(False)
|
||||
self.open_prefix_folder_button.clicked.connect(self.open_selected_prefix_folder)
|
||||
selector_layout.addWidget(self.open_prefix_folder_button)
|
||||
|
||||
self.create_base_pfx_button = QPushButton()
|
||||
self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export"))
|
||||
self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)")
|
||||
@@ -2316,6 +2362,24 @@ class WineHelperGUI(QMainWindow):
|
||||
management_layout.setColumnStretch(2, 2)
|
||||
|
||||
container_layout.addWidget(self.prefix_management_groupbox)
|
||||
|
||||
# --- Кнопка полного удаления ---
|
||||
# Добавляем разделитель и кнопку в основной контейнер управления
|
||||
container_layout.addSpacing(15)
|
||||
self.remove_all_button = QPushButton("Удалить все данные WineHelper")
|
||||
self.remove_all_button.setStyleSheet("""
|
||||
QPushButton:!disabled {
|
||||
background-color: #d32f2f;
|
||||
color: white;
|
||||
padding: 5px;
|
||||
}
|
||||
""")
|
||||
self.remove_all_button.setMinimumHeight(32)
|
||||
self.remove_all_button.setFont(QFont('Arial', 10, QFont.Bold))
|
||||
self.remove_all_button.setToolTip("ВНИМАНИЕ: Удаляет ВСЕ данные WineHelper, включая все префиксы, настройки и ярлыки.")
|
||||
self.remove_all_button.clicked.connect(self.remove_all_data)
|
||||
container_layout.addWidget(self.remove_all_button)
|
||||
|
||||
layout.addWidget(self.management_container_groupbox)
|
||||
layout.addStretch()
|
||||
self.add_tab(self.prefix_tab, "Менеджер префиксов")
|
||||
@@ -2357,6 +2421,7 @@ class WineHelperGUI(QMainWindow):
|
||||
prefix_names = []
|
||||
|
||||
self.created_prefix_selector.blockSignals(True)
|
||||
self.remove_all_button.setEnabled(bool(prefix_names))
|
||||
self.created_prefix_selector.clear()
|
||||
if prefix_names:
|
||||
self.created_prefix_selector.addItems(prefix_names)
|
||||
@@ -2372,7 +2437,9 @@ class WineHelperGUI(QMainWindow):
|
||||
self.current_managed_prefix_name = None
|
||||
self._setup_prefix_management_panel(None)
|
||||
self.delete_prefix_button.setEnabled(False)
|
||||
self.remove_all_button.setEnabled(False)
|
||||
self.create_base_pfx_button.setEnabled(False)
|
||||
self.open_prefix_folder_button.setEnabled(False)
|
||||
else:
|
||||
# Прокручиваем к выбранному элементу, чтобы он был виден в списке
|
||||
self.created_prefix_selector.view().scrollTo(
|
||||
@@ -2382,7 +2449,9 @@ class WineHelperGUI(QMainWindow):
|
||||
self.current_managed_prefix_name = prefix_name
|
||||
self._setup_prefix_management_panel(prefix_name)
|
||||
self.delete_prefix_button.setEnabled(True)
|
||||
self.remove_all_button.setEnabled(True)
|
||||
self.create_base_pfx_button.setEnabled(True)
|
||||
self.open_prefix_folder_button.setEnabled(True)
|
||||
|
||||
def delete_selected_prefix(self):
|
||||
"""Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'."""
|
||||
@@ -2491,6 +2560,21 @@ class WineHelperGUI(QMainWindow):
|
||||
self._run_simple_command("create-base-pfx", [prefix_name])
|
||||
self.command_dialog.exec_()
|
||||
|
||||
def open_selected_prefix_folder(self):
|
||||
"""Открывает папку выбранного префикса в системном файловом менеджере."""
|
||||
prefix_name = self.current_managed_prefix_name
|
||||
if not prefix_name:
|
||||
return
|
||||
|
||||
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
|
||||
if os.path.isdir(prefix_path):
|
||||
try:
|
||||
subprocess.Popen(['xdg-open', prefix_path])
|
||||
except Exception as e:
|
||||
QMessageBox.warning(self, "Ошибка", f"Не удалось открыть директорию:\n{prefix_path}\n\nОшибка: {e}")
|
||||
else:
|
||||
QMessageBox.warning(self, "Ошибка", f"Директория префикса не найдена:\n{prefix_path}")
|
||||
|
||||
def _setup_prefix_management_panel(self, prefix_name):
|
||||
"""Настраивает панель управления префиксом на основе текущего состояния."""
|
||||
is_prefix_selected = bool(prefix_name)
|
||||
@@ -2549,19 +2633,39 @@ class WineHelperGUI(QMainWindow):
|
||||
self.esync_button.blockSignals(False)
|
||||
self.fsync_button.blockSignals(False)
|
||||
|
||||
# --- Чтение и отображение установленных компонентов Winetricks ---
|
||||
winetricks_log_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "winetricks.log")
|
||||
installed_verbs = []
|
||||
if os.path.exists(winetricks_log_path):
|
||||
try:
|
||||
with open(winetricks_log_path, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
verb = line.split('#', 1)[0].strip()
|
||||
if verb:
|
||||
installed_verbs.append(verb)
|
||||
except IOError as e:
|
||||
print(f"Ошибка чтения winetricks.log: {e}")
|
||||
|
||||
# Фильтруем служебные компоненты, чтобы не засорять вывод
|
||||
verbs_to_ignore = {
|
||||
'isolate_home', 'winxp', 'win7', 'win10', 'win11',
|
||||
'vista', 'win2k', 'win2k3', 'win2k8', 'win8', 'win81',
|
||||
'workaround', 'internal'
|
||||
}
|
||||
display_verbs = sorted([v for v in installed_verbs if v not in verbs_to_ignore])
|
||||
|
||||
# Карта для красивого отображения известных переменных
|
||||
display_map = {
|
||||
"WINEPREFIX": ("Путь", lambda v: v),
|
||||
"WINEARCH": ("Архитектура", lambda v: "64-bit" if v == "win64" else "32-bit"),
|
||||
"WH_WINE_USE": ("Версия Wine", lambda v: "Системная" if v == "system" else v),
|
||||
"BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'),
|
||||
"DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"),
|
||||
"VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"),
|
||||
"WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"),
|
||||
"WINEFSYNC": ("FSync", lambda v: "Включен" if v == "1" else "Выключен"),
|
||||
"WH_XDG_OPEN": ("Ассоциации файлов", lambda v: v if v and v != "0" else "Не заданы"),
|
||||
}
|
||||
display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC", "WH_XDG_OPEN"]
|
||||
display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC", "WH_XDG_OPEN"]
|
||||
|
||||
html_content = f'<p style="line-height: 1.3; font-size: 9pt;">'
|
||||
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
|
||||
@@ -2583,6 +2687,15 @@ class WineHelperGUI(QMainWindow):
|
||||
html_content += "<br><b>Дополнительные параметры:</b><br>"
|
||||
html_content += other_vars_html
|
||||
|
||||
html_content += "<br><b>Компоненты (Winetricks):</b> "
|
||||
if display_verbs:
|
||||
# Используем span вместо div, чтобы избежать лишних отступов
|
||||
html_content += '<span style="max-height: 120px; overflow-y: auto;">'
|
||||
html_content += ", ".join(html.escape(v) for v in display_verbs)
|
||||
html_content += '</span>'
|
||||
else:
|
||||
html_content += "Не установлены"
|
||||
|
||||
html_content += "</p>"
|
||||
self.prefix_info_display.setHtml(html_content)
|
||||
|
||||
@@ -3139,9 +3252,6 @@ class WineHelperGUI(QMainWindow):
|
||||
"""Открывает диалог создания нового префикса."""
|
||||
dialog = CreatePrefixDialog(self)
|
||||
if dialog.exec_() == QDialog.Accepted:
|
||||
if not self._show_license_agreement_dialog():
|
||||
return
|
||||
|
||||
self.start_prefix_creation(
|
||||
prefix_name=dialog.prefix_name,
|
||||
wine_arch=dialog.wine_arch,
|
||||
@@ -3378,6 +3488,7 @@ class WineHelperGUI(QMainWindow):
|
||||
self.installed_global_action_widget.setVisible(True)
|
||||
self.backup_button.setVisible(True)
|
||||
self.create_log_button.setVisible(True)
|
||||
self.update_open_log_dir_button_visibility()
|
||||
self.uninstall_button.setVisible(True)
|
||||
self.manual_install_path_widget.setVisible(False)
|
||||
|
||||
@@ -3386,6 +3497,27 @@ class WineHelperGUI(QMainWindow):
|
||||
self.current_selected_app = None
|
||||
self.info_panel.setVisible(False)
|
||||
|
||||
def update_open_log_dir_button_visibility(self):
|
||||
"""Проверяет наличие лог-файла или бэкапов и обновляет видимость кнопки."""
|
||||
log_dir_path = os.path.join(os.path.expanduser("~"), "winehelper_backup_log")
|
||||
is_visible = False
|
||||
if os.path.isdir(log_dir_path):
|
||||
# Кнопка должна быть видна, если директория не пуста.
|
||||
if os.listdir(log_dir_path):
|
||||
is_visible = True
|
||||
self.open_log_dir_button.setVisible(is_visible)
|
||||
|
||||
def open_log_directory(self):
|
||||
"""Открывает директорию с лог-файлами."""
|
||||
log_dir_path = os.path.join(os.path.expanduser("~"), "winehelper_backup_log")
|
||||
if os.path.isdir(log_dir_path):
|
||||
try:
|
||||
subprocess.Popen(['xdg-open', log_dir_path])
|
||||
except Exception as e:
|
||||
QMessageBox.warning(self, "Ошибка", f"Не удалось открыть директорию:\n{log_dir_path}\n\nОшибка: {e}")
|
||||
else:
|
||||
QMessageBox.information(self, "Информация", f"Директория с логами не найдена:\n{log_dir_path}")
|
||||
|
||||
def _get_prefix_name_for_selected_app(self):
|
||||
"""Извлекает имя префикса для выбранного приложения."""
|
||||
if not self.current_selected_app or 'desktop_path' not in self.current_selected_app:
|
||||
@@ -3426,8 +3558,8 @@ class WineHelperGUI(QMainWindow):
|
||||
msg_box = QMessageBox(self)
|
||||
msg_box.setWindowTitle("Создание резервной копии")
|
||||
msg_box.setText(
|
||||
f"Будет создана резервная копия префикса '{prefix_name}'.\n"
|
||||
f"Файл будет сохранен на вашем Рабочем столе в формате .whpack.\n\nПродолжить?"
|
||||
f"Будет создана резервная копия префикса '{prefix_name}'.\n\n"
|
||||
f"Файл будет сохранен в домашней директории в папке winehelper_backup_log/ в формате .whpack.\n\nПродолжить?"
|
||||
)
|
||||
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
||||
msg_box.addButton(no_button, QMessageBox.NoRole)
|
||||
@@ -3460,6 +3592,7 @@ class WineHelperGUI(QMainWindow):
|
||||
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)
|
||||
|
||||
winehelper_path = self.winehelper_path
|
||||
args = ["backup-prefix", prefix_name]
|
||||
@@ -3525,9 +3658,9 @@ class WineHelperGUI(QMainWindow):
|
||||
msg_box = QMessageBox(self)
|
||||
msg_box.setWindowTitle("Создание лога")
|
||||
msg_box.setText(
|
||||
"Приложение будет запущено в режиме отладки.\n"
|
||||
"После закрытия приложения лог будет сохранен в вашем домашнем каталоге "
|
||||
"под именем 'winehelper.log'."
|
||||
"Приложение будет запущено в режиме отладки.\n\n"
|
||||
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' "
|
||||
"в вашем домашнем каталоге под именем программы (например, 'program.log')."
|
||||
)
|
||||
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
||||
msg_box.addButton(no_button, QMessageBox.NoRole)
|
||||
@@ -3569,6 +3702,7 @@ class WineHelperGUI(QMainWindow):
|
||||
|
||||
wine_executable = self._get_wine_executable_for_prefix(prefix_name)
|
||||
dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self, wine_executable=wine_executable)
|
||||
dialog.installation_complete.connect(lambda: self.update_prefix_info_display(prefix_name))
|
||||
dialog.exec_()
|
||||
|
||||
def _get_wine_executable_for_prefix(self, prefix_name):
|
||||
@@ -3793,6 +3927,7 @@ class WineHelperGUI(QMainWindow):
|
||||
# и избегания проблем с замыканием в lambda.
|
||||
process.finished.connect(partial(self._on_app_process_finished, desktop_path))
|
||||
|
||||
process.finished.connect(self.update_open_log_dir_button_visibility)
|
||||
|
||||
try:
|
||||
process.start(program, arguments)
|
||||
@@ -3811,6 +3946,55 @@ class WineHelperGUI(QMainWindow):
|
||||
QMessageBox.critical(self, "Ошибка",
|
||||
f"Не удалось обработать команду запуска:\n{command_str}\n\nОшибка: {str(e)}")
|
||||
|
||||
def remove_all_data(self):
|
||||
"""Запускает процесс полного удаления всех данных WineHelper."""
|
||||
# Первое подтверждение
|
||||
msg_box1 = QMessageBox(self)
|
||||
msg_box1.setIcon(QMessageBox.Critical)
|
||||
msg_box1.setWindowTitle('Подтверждение полного удаления')
|
||||
msg_box1.setText(
|
||||
"<h2>ВНИМАНИЕ!</h2>"
|
||||
"<p>Это действие полностью и безвозвратно удалит <b>ВСЕ</b> данные, связанные с WineHelper, включая:</p>"
|
||||
"<ul>"
|
||||
"<li>Все созданные префиксы и установленные в них программы.</li>"
|
||||
"<li>Все ярлыки в меню и на рабочем столе.</li>"
|
||||
"<li>Все настройки, кэш и резервные копии.</li>"
|
||||
"</ul>"
|
||||
"<p>Продолжить?</p>"
|
||||
)
|
||||
msg_box1.setTextFormat(Qt.RichText)
|
||||
yes_button1 = msg_box1.addButton("Да, я понимаю", QMessageBox.YesRole)
|
||||
no_button1 = msg_box1.addButton("Отмена", QMessageBox.NoRole)
|
||||
msg_box1.setDefaultButton(no_button1)
|
||||
msg_box1.exec_()
|
||||
|
||||
if msg_box1.clickedButton() != yes_button1:
|
||||
return
|
||||
|
||||
# Второе, финальное подтверждение
|
||||
msg_box2 = QMessageBox(self)
|
||||
msg_box2.setIcon(QMessageBox.Critical)
|
||||
msg_box2.setWindowTitle('Последнее предупреждение')
|
||||
msg_box2.setText("<h3>Вы уверены, что хотите удалить ВСЁ?</h3><p>Это действие необратимо.</p>")
|
||||
msg_box2.setTextFormat(Qt.RichText)
|
||||
yes_button2 = msg_box2.addButton("Да, удалить всё", QMessageBox.DestructiveRole)
|
||||
no_button2 = msg_box2.addButton("Нет, я передумал", QMessageBox.RejectRole)
|
||||
msg_box2.setDefaultButton(no_button2)
|
||||
msg_box2.exec_()
|
||||
|
||||
if msg_box2.clickedButton() != yes_button2:
|
||||
return
|
||||
|
||||
# Запускаем команду и выходим из приложения
|
||||
try:
|
||||
# Запускаем команду в фоне и не ждем ее завершения
|
||||
subprocess.Popen([self.winehelper_path, "remove-all", "--force"])
|
||||
# Сообщаем пользователю и закрываем GUI
|
||||
QMessageBox.information(self, "Удаление", "Запущена процедура удаления WineHelper. Приложение будет закрыто.")
|
||||
self.quit_application()
|
||||
except Exception as e:
|
||||
QMessageBox.critical(self, "Ошибка", f"Не удалось запустить команду удаления: {e}")
|
||||
|
||||
def quit_application(self):
|
||||
"""Инициирует процесс выхода из приложения."""
|
||||
self.is_quitting = True
|
||||
@@ -4511,6 +4695,7 @@ class WineHelperGUI(QMainWindow):
|
||||
self.command_process.deleteLater()
|
||||
self.command_process = None
|
||||
self.command_close_button.setEnabled(True)
|
||||
self.command_log_output.ensureCursorVisible()
|
||||
|
||||
def _handle_launcher_creation_finished(self, exit_code, exit_status):
|
||||
"""Обрабатывает завершение создания ярлыка."""
|
||||
|
Reference in New Issue
Block a user