forked from CastroFidel/winehelper
Compare commits
47 Commits
9029f4d0e8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fc93f4d3c | ||
|
|
5f27bfa97a | ||
|
|
151d0ffc48 | ||
|
|
ad91466475 | ||
|
|
5e4d94bb57 | ||
|
|
5b572ff540 | ||
|
|
c68bcc9abf | ||
|
|
1ad2c6cfa8 | ||
|
|
16a686dc37 | ||
|
|
c9d5619ab9 | ||
|
|
74311e9c04 | ||
|
|
eb9bef83e2 | ||
|
|
c7eddb8b53 | ||
|
|
dfc6c1c836 | ||
|
|
04187e9463 | ||
|
|
5f915ab58d | ||
|
|
0e8ee7788a | ||
|
|
49c1ac6846 | ||
|
|
971bcd0f5a | ||
|
|
5b21015aee | ||
|
|
7dee08bcfb | ||
|
|
633deaf1c1 | ||
|
|
4df9508547 | ||
|
|
989f04cdd8 | ||
|
|
95b189f5a2 | ||
|
|
371553277a | ||
|
|
dabf50103d | ||
|
|
590b37f1a3 | ||
|
|
1f9b4a9146 | ||
|
|
39f21373f1 | ||
|
|
e984ffdb8c | ||
|
|
48834dc078 | ||
|
|
b62d06ed71 | ||
|
|
9a1b78276e | ||
|
|
f788307f05 | ||
|
|
14273f723b | ||
|
|
a8e0fdce0a | ||
|
|
da3d5cd7af | ||
|
|
3ee499c758 | ||
|
|
6286cccbab | ||
|
|
e8d462b665 | ||
|
|
6476a84ce7 | ||
|
|
db7e3f5220 | ||
|
|
a817d1a6f5 | ||
|
|
e1fc25bb72 | ||
|
|
7c90da2088 | ||
|
|
108316148a |
16
CHANGELOG
16
CHANGELOG
@@ -1,5 +1,21 @@
|
|||||||
История изменений:
|
История изменений:
|
||||||
|
|
||||||
|
0.8.0
|
||||||
|
* добавлено автоопределение .reg и .dll файлов для их добавленния в реестр префикса
|
||||||
|
* во вкладку "Справка" добавлены ссылки на старницы с сертификатами
|
||||||
|
* другие небольшие улучшения и оптимизации скриптов и графического интерфейса
|
||||||
|
|
||||||
|
0.7.0
|
||||||
|
* обновлен графический режим Qt5
|
||||||
|
- добавлена кнопка открытия каталога с резервными копиями и логами
|
||||||
|
- добавлена кнопка открытия каталога с префиксом
|
||||||
|
- добавлена блокировка кнопок для установленного приложения, если оно уже запущено
|
||||||
|
- добавлено отображения процесса установки сторонних компонентов с помощью winetricks
|
||||||
|
- добавлена возможность отображения и установки тестовых скриптов (выключено по умолчанию)
|
||||||
|
* добавлены скрипты установки для t-flex версии 18
|
||||||
|
* в CLI добавлен список тестовых скриптов установки ПО
|
||||||
|
* добавлена возможность ассоциации файлов для передачи в приложения запускаемых в WineHelper
|
||||||
|
|
||||||
0.6.0
|
0.6.0
|
||||||
* обновлен графический режим Qt5
|
* обновлен графический режим Qt5
|
||||||
* добавлен иконка в трее для графического режима Qt5
|
* добавлен иконка в трее для графического режима Qt5
|
||||||
|
|||||||
7
GENERAL
Normal file
7
GENERAL
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Руководство пользователя
|
||||||
|
Подробное и актуальное руководство по использованию WineHelper смотрите на сайте: https://www.altlinux.org/Winehelper
|
||||||
|
|
||||||
|
# Совместимость ПО и сертификаты
|
||||||
|
С полным списком совместимого ПО и сертификатами можно ознакомиться по следующим ссылкам:
|
||||||
|
Для 10 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P10-view2.html
|
||||||
|
Для 11 платформы: https://www.basealt.ru/fileadmin/user_upload/compatibility/P11-view2.html
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# info_ru: Сервис обновления ПО
|
# info_ru: Сервис обновления ПО: "R-Атлас", "R-Инфо" и "R-Тариф".
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://daobit.ru"
|
export PROG_URL="https://daobit.ru"
|
||||||
export WH_WINE_USE="wine_x_tkg_10-0_i586" # wine-9.0.9-alt1-i586"
|
export WH_WINE_USE="wine_x_tkg_10-0_i586" # wine-9.0.9-alt1-i586"
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# 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_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"
|
|
||||||
export WH_XDG_OPEN="rtf"
|
|
||||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
|
|
||||||
SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
|
|
||||||
|
|
||||||
prepair_wine
|
|
||||||
|
|
||||||
DRIVE_C_SCADOFFICE="$DRIVE_C/SCAD Soft/SCADOffice/64"
|
|
||||||
|
|
||||||
if [[ -n $2 ]] ; then
|
|
||||||
if [[ ! -d "$DRIVE_C_SCADOFFICE" ]] ; then
|
|
||||||
fatal "Перезапустите скрипт без дополнительных аргументов для установки SCAD Office:
|
|
||||||
winehelper install scadoffice"
|
|
||||||
elif [[ ! -f "$2" ]] ; then
|
|
||||||
fatal "Перезапустите скрипт с правильным путем до файла лицензии SCAD Office:
|
|
||||||
winehelper install scadoffice \"/путь/до/файла.exe\""
|
|
||||||
else
|
|
||||||
print_info "Устанавливаем файл лицензии $2"
|
|
||||||
wine_run "$2"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
print_info "Установка дополнительных компонентов..."
|
|
||||||
|
|
||||||
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
|
||||||
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
|
|
||||||
|
|
||||||
ADDONS_PATH_REG="${ADDONS_PATH}/REG"
|
|
||||||
ADDONS_PATH_MDAC="${ADDONS_PATH}/mdac64"
|
|
||||||
ADDONS_PATH_OPENSSH="${ADDONS_PATH}/OpenSSH"
|
|
||||||
|
|
||||||
if try_download "$SCADOFFICE_ADDONS_URL" "${ADDONS_PACK}" ; then
|
|
||||||
create_new_dir "${ADDONS_PATH}"
|
|
||||||
unpack "${ADDONS_PACK}" "${ADDONS_PATH}"
|
|
||||||
wine_run regedit "${ADDONS_PATH_REG}"/*.reg
|
|
||||||
|
|
||||||
# Установка ODBC
|
|
||||||
rm -fR "$DRIVE_C/Program Files (x86)/Common Files/System"
|
|
||||||
cp -r "${ADDONS_PATH_MDAC}/System" "$DRIVE_C/Program Files (x86)/Common Files/System"
|
|
||||||
cp -r "${ADDONS_PATH_MDAC}"/*.* "$DRIVE_C/windows/system32/"
|
|
||||||
wine_run regedit "${ADDONS_PATH_MDAC}"/*.reg
|
|
||||||
|
|
||||||
# Установка SSH
|
|
||||||
cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/"
|
|
||||||
|
|
||||||
try_remove_dir "$ADDONS_PATH"
|
|
||||||
try_remove_file "$ADDONS_PACK"
|
|
||||||
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"
|
|
||||||
export WINE_WIN_START=""
|
|
||||||
var_winedlloverride_update "hasplms.exe,hasplmv.exe=d"
|
|
||||||
wine_run_install "$AUTOINSTALL_EXE"
|
|
||||||
try_remove_file "$AUTOINSTALL_EXE"
|
|
||||||
|
|
||||||
# Определение всех программ, значков и исполняемых файлов
|
|
||||||
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
|
||||||
|
|
||||||
declare -a PROG_ICON_ALL=("arbat" "west" "globalsettings" "decor" "rebar" "underground" "comein" "cocon" "comet" "section" "consul" "configprotection" "kristall" "cross" "kust" "magnum" "monolit" "slope" "pasternak" "ucalc" "viewprof" "scalc" "acceledit" "betaedit" "materialsedit" "tonus" "sezam" "scadx")
|
|
||||||
|
|
||||||
declare -a WIN_FILE_EXEC=("${DRIVE_C_SCADOFFICE}/Arbat.exe" "${DRIVE_C_SCADOFFICE}/West.exe" "${DRIVE_C_SCADOFFICE}/GlobalSettings.exe" "${DRIVE_C_SCADOFFICE}/Decor.exe" "${DRIVE_C_SCADOFFICE}/ReBar.exe" "${DRIVE_C_SCADOFFICE}/UnderGround.exe" "${DRIVE_C_SCADOFFICE}/ComeIn.exe" "${DRIVE_C_SCADOFFICE}/CoCon.exe" "${DRIVE_C_SCADOFFICE}/Comet2.exe" "${DRIVE_C_SCADOFFICE}/Section.exe" "${DRIVE_C_SCADOFFICE}/Consul.exe" "${DRIVE_C_SCADOFFICE}/ConfigProtection.exe" "${DRIVE_C_SCADOFFICE}/Kristall.exe" "${DRIVE_C_SCADOFFICE}/Cross.exe" "${DRIVE_C_SCADOFFICE}/Kust2.exe" "${DRIVE_C_SCADOFFICE}/Magnum.exe" "${DRIVE_C_SCADOFFICE}/Monolit.exe" "${DRIVE_C_SCADOFFICE}/Slope.exe" "${DRIVE_C_SCADOFFICE}/Pasternak.exe" "${DRIVE_C_SCADOFFICE}/UCalc.exe" "${DRIVE_C_SCADOFFICE}/ViewProf.exe" "${DRIVE_C_SCADOFFICE}/SCalc.exe" "${DRIVE_C_SCADOFFICE}/AccelEdit.exe" "${DRIVE_C_SCADOFFICE}/BetaEdit.exe" "${DRIVE_C_SCADOFFICE}/MaterialsEdit.exe" "${DRIVE_C_SCADOFFICE}/Tonus.exe" "${DRIVE_C_SCADOFFICE}/Sezam.exe" "${DRIVE_C_SCADOFFICE}/SCADX.exe")
|
|
||||||
|
|
||||||
# Цикл создания десктоп файлов для scad office
|
|
||||||
for i in "${!PROG_NAME_All[@]}"; do
|
|
||||||
create_desktop "${PROG_NAME_All[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON_ALL[i]}" "nocopy"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# info_ru: «Справки БК» — специальное программное обеспечение, предназначенное для заполнения справок о доходах, расходах, об имуществе и обязательствах имущественного характера.
|
# info_ru: «Справки БК» (Windows версия 2.5.5) от 31.01.2024 — специальное программное обеспечение, предназначенное для заполнения справок о доходах, расходах, об имуществе и обязательствах имущественного характера.
|
||||||
########################################################################
|
########################################################################
|
||||||
export PROG_URL="https://spravki-bk.ru"
|
export PROG_URL="https://spravki-bk.ru"
|
||||||
export WH_WINE_USE="wine-9.0.14-alt1-i586-spravkibk"
|
export WH_WINE_USE="wine-9.0.14-alt1-i586-spravkibk"
|
||||||
|
|||||||
@@ -17,16 +17,17 @@ export WH_USE_MESA_GL_OVERRIDE="1"
|
|||||||
source "$WH_DB_DIR/t-flex-cad.whdb"
|
source "$WH_DB_DIR/t-flex-cad.whdb"
|
||||||
|
|
||||||
# Программа T-FLEX CAD
|
# Программа T-FLEX CAD
|
||||||
export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 18.zip"
|
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 18.zip"
|
||||||
export AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
AUTOINSTALL_DIR="${WH_TMP_DIR}"
|
||||||
export AUTOINSTALL_EXE="${WH_TMP_DIR}/T-FLEX CAD 18/T-FLEX CAD 18.msi"
|
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
|
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AUTOINSTALL_ZIP}" ; then
|
||||||
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
|
||||||
try_remove_file "${AUTOINSTALL_ZIP}"
|
try_remove_file "${AUTOINSTALL_ZIP}"
|
||||||
|
|
||||||
wine_run_install "${AUTOINSTALL_EXE}" /q
|
wine_run_install "${AUTOINSTALL_EXE}" /q
|
||||||
try_remove_file "${AUTOINSTALL_EXE}"
|
try_remove_dir "${AUTOINSTALL_UNPACK}"
|
||||||
|
|
||||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe"
|
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" "TFlexCad"
|
||||||
|
|||||||
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
|
||||||
78
testinstall/scadoffice
Normal file
78
testinstall/scadoffice
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
|
||||||
|
########################################################################
|
||||||
|
export PROG_URL="https://scadoffice.ru"
|
||||||
|
export WH_WINE_USE="wine-8.8-staging-amd64"
|
||||||
|
export WINEPREFIX="scadoffice"
|
||||||
|
export PROG_NAME="SCAD Office"
|
||||||
|
export PROG_ICON="scadoffice"
|
||||||
|
export BASE_PFX="none"
|
||||||
|
export WH_WINDOWS_VER="10"
|
||||||
|
export WINEARCH="win64"
|
||||||
|
export INSTALL_DLL="dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6" #dotnet20
|
||||||
|
export WH_XDG_OPEN="rtf"
|
||||||
|
|
||||||
|
AUTOINSTALL_EXE="${WH_TMP_DIR}/SCADOffice_installer.exe"
|
||||||
|
SCADOFFICE_ADDONS_URL="https://cloud.linux-gaming.ru/portproton/scadoffice_addons_v02.tar.xz"
|
||||||
|
|
||||||
|
prepair_wine
|
||||||
|
|
||||||
|
DRIVE_C_SCADOFFICE="$DRIVE_C/SCAD Soft/SCADOffice/64"
|
||||||
|
|
||||||
|
if [[ -n $2 ]] ; then
|
||||||
|
if [[ ! -d "$DRIVE_C_SCADOFFICE" ]] ; then
|
||||||
|
fatal "Перезапустите скрипт без дополнительных аргументов для установки SCAD Office:
|
||||||
|
winehelper install scadoffice"
|
||||||
|
elif [[ ! -f "$2" ]] ; then
|
||||||
|
fatal "Перезапустите скрипт с правильным путем до файла лицензии SCAD Office:
|
||||||
|
winehelper install scadoffice \"/путь/до/файла.exe\""
|
||||||
|
else
|
||||||
|
print_info "Устанавливаем файл лицензии $2"
|
||||||
|
wine_run "$2"
|
||||||
|
exit 0
|
||||||
|
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"
|
||||||
|
# try_remove_file "$AUTOINSTALL_EXE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_info "Установка дополнительных компонентов..."
|
||||||
|
|
||||||
|
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
||||||
|
|
||||||
|
if try_download "$SCADOFFICE_ADDONS_URL" "$ADDONS_PACK" ; then
|
||||||
|
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
|
||||||
|
create_new_dir "$ADDONS_PATH"
|
||||||
|
unpack "$ADDONS_PACK" "$ADDONS_PATH"
|
||||||
|
# try_remove_file "$ADDONS_PACK"
|
||||||
|
|
||||||
|
# Установка ODBC
|
||||||
|
try_remove_dir "${DRIVE_C}/Program Files/Common Files/System"
|
||||||
|
cp -r "${ADDONS_PATH}/mdac64/System" "${DRIVE_C}/Program Files/Common Files/" || fatal
|
||||||
|
cp -r "${ADDONS_PATH}/mdac64"/*.* "${DRIVE_C}/windows/system32/" || fatal
|
||||||
|
|
||||||
|
# Установка SSH
|
||||||
|
cp -r "${ADDONS_PATH}/OpenSSH" "${DRIVE_C}/windows/system32/" || fatal
|
||||||
|
|
||||||
|
# Применение .reg файлов для изменения реестра
|
||||||
|
wine_run "${ADDONS_PATH}/mdac64"/*.reg
|
||||||
|
wine_run "${ADDONS_PATH}/REG"/*.reg
|
||||||
|
|
||||||
|
try_remove_dir "$ADDONS_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Определение всех программ, значков и исполняемых файлов
|
||||||
|
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
||||||
|
|
||||||
|
declare -a PROG_ICON_ALL=("arbat" "west" "globalsettings" "decor" "rebar" "underground" "comein" "cocon" "comet" "section" "consul" "configprotection" "kristall" "cross" "kust" "magnum" "monolit" "slope" "pasternak" "ucalc" "viewprof" "scalc" "acceledit" "betaedit" "materialsedit" "tonus" "sezam" "scadx")
|
||||||
|
|
||||||
|
declare -a WIN_FILE_EXEC=("${DRIVE_C_SCADOFFICE}/Arbat.exe" "${DRIVE_C_SCADOFFICE}/West.exe" "${DRIVE_C_SCADOFFICE}/GlobalSettings.exe" "${DRIVE_C_SCADOFFICE}/Decor.exe" "${DRIVE_C_SCADOFFICE}/ReBar.exe" "${DRIVE_C_SCADOFFICE}/UnderGround.exe" "${DRIVE_C_SCADOFFICE}/ComeIn.exe" "${DRIVE_C_SCADOFFICE}/CoCon.exe" "${DRIVE_C_SCADOFFICE}/Comet2.exe" "${DRIVE_C_SCADOFFICE}/Section.exe" "${DRIVE_C_SCADOFFICE}/Consul.exe" "${DRIVE_C_SCADOFFICE}/ConfigProtection.exe" "${DRIVE_C_SCADOFFICE}/Kristall.exe" "${DRIVE_C_SCADOFFICE}/Cross.exe" "${DRIVE_C_SCADOFFICE}/Kust2.exe" "${DRIVE_C_SCADOFFICE}/Magnum.exe" "${DRIVE_C_SCADOFFICE}/Monolit.exe" "${DRIVE_C_SCADOFFICE}/Slope.exe" "${DRIVE_C_SCADOFFICE}/Pasternak.exe" "${DRIVE_C_SCADOFFICE}/UCalc.exe" "${DRIVE_C_SCADOFFICE}/ViewProf.exe" "${DRIVE_C_SCADOFFICE}/SCalc.exe" "${DRIVE_C_SCADOFFICE}/AccelEdit.exe" "${DRIVE_C_SCADOFFICE}/BetaEdit.exe" "${DRIVE_C_SCADOFFICE}/MaterialsEdit.exe" "${DRIVE_C_SCADOFFICE}/Tonus.exe" "${DRIVE_C_SCADOFFICE}/Sezam.exe" "${DRIVE_C_SCADOFFICE}/SCADX.exe")
|
||||||
|
|
||||||
|
# Цикл создания десктоп файлов для scad office
|
||||||
|
for i in "${!PROG_NAME_All[@]}"; do
|
||||||
|
create_desktop "${PROG_NAME_All[i]}" "${WIN_FILE_EXEC[i]}" "${PROG_ICON_ALL[i]}" "nocopy"
|
||||||
|
done
|
||||||
226
winehelper
226
winehelper
@@ -7,7 +7,7 @@ if [[ $(id -u) -eq 0 ]] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
##### DEFAULT PATH #####
|
##### DEFAULT PATH #####
|
||||||
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT THIRD_PARTY_FILE
|
export SCRIPT_NAME USER_WORK_PATH RUN_SCRIPT DATA_PATH CHANGELOG_FILE WH_ICON_PATH LICENSE_FILE AGREEMENT THIRD_PARTY_FILE WH_ICON_TRAY GENERAL
|
||||||
|
|
||||||
SCRIPT_NAME="$(basename "$0")"
|
SCRIPT_NAME="$(basename "$0")"
|
||||||
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
||||||
@@ -17,10 +17,12 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
|
|||||||
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
|
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
|
||||||
DATA_PATH="/usr/share/$SCRIPT_NAME"
|
DATA_PATH="/usr/share/$SCRIPT_NAME"
|
||||||
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
|
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
|
||||||
|
WH_ICON_TRAY="/usr/share/icons/hicolor/symbolic/apps/winehelper-symbolic.svg"
|
||||||
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
|
||||||
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
|
||||||
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
|
||||||
THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY"
|
THIRD_PARTY_FILE="/usr/share/doc/winehelper-$WH_VERSION/THIRD-PARTY"
|
||||||
|
GENERAL="/usr/share/doc/winehelper-$WH_VERSION/GENERAL"
|
||||||
else
|
else
|
||||||
# переменные для тестового запуска WineHelper из репозитория
|
# переменные для тестового запуска WineHelper из репозитория
|
||||||
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
USER_WORK_PATH="$HOME/test-$SCRIPT_NAME"
|
||||||
@@ -28,9 +30,12 @@ else
|
|||||||
DATA_PATH="$(dirname "$RUN_SCRIPT")"
|
DATA_PATH="$(dirname "$RUN_SCRIPT")"
|
||||||
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
|
CHANGELOG_FILE="$DATA_PATH/CHANGELOG"
|
||||||
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
|
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper-devel.svg"
|
||||||
|
WH_ICON_TRAY="$DATA_PATH/image/gui/winehelper-symbolic.svg"
|
||||||
LICENSE_FILE="$DATA_PATH/LICENSE"
|
LICENSE_FILE="$DATA_PATH/LICENSE"
|
||||||
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
|
||||||
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
|
||||||
|
GENERAL="$DATA_PATH/GENERAL"
|
||||||
|
WH_DEVEL="1"
|
||||||
|
|
||||||
# минимальная проверка синтаксиса скриптов
|
# минимальная проверка синтаксиса скриптов
|
||||||
for self_check_script in "$RUN_SCRIPT" \
|
for self_check_script in "$RUN_SCRIPT" \
|
||||||
@@ -49,21 +54,21 @@ fi
|
|||||||
|
|
||||||
##### MESSAGES FUNCTIONS #####
|
##### MESSAGES FUNCTIONS #####
|
||||||
if [[ $WH_USE_GUI != "1" ]] ; then
|
if [[ $WH_USE_GUI != "1" ]] ; then
|
||||||
print_error () { printf "\E[31m%s Ошибка: $@ %s\e[0m\n" ;}
|
print_error () { printf "\E[31m%s Ошибка: $* %s\e[0m\n" ;}
|
||||||
print_warning () { printf "\E[33m%s Предупреждение: $@ %s\e[0m\n" ;}
|
print_warning () { printf "\E[33m%s Предупреждение: $* %s\e[0m\n" ;}
|
||||||
print_info () { printf "\E[36m%s Информация: \"$@\" %s\e[0m\n" ;}
|
print_info () { printf "\E[36m%s Информация: \"$*\" %s\e[0m\n" ;}
|
||||||
print_ok () { printf "\E[35m%s Успех: $@ %s\e[0m\n" ;}
|
print_ok () { printf "\E[35m%s Успех: $* %s\e[0m\n" ;}
|
||||||
else
|
else
|
||||||
print_error () { echo -e "Ошибка: $@" ;}
|
print_error () { echo -e "Ошибка: $*" ;}
|
||||||
print_warning () { echo -e "Предупреждение: $@" ;}
|
print_warning () { echo -e "Предупреждение: $*" ;}
|
||||||
print_info () { echo -e "Информация: \"$@\"" ;}
|
print_info () { echo -e "Информация: \"$*\"" ;}
|
||||||
print_ok () { echo -e "Успех: $@" ;}
|
print_ok () { echo -e "Успех: $*" ;}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
|
print_var () { for vp in $@ ; do echo "${vp}=${!vp}" ; done ;}
|
||||||
|
|
||||||
fatal () {
|
fatal () {
|
||||||
print_error "$@"
|
print_error "$@ Аварийное завершение работы WineHelper!"
|
||||||
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
|
[[ -n "$WINESERVER" ]] && "$WINESERVER" -w
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
@@ -101,16 +106,6 @@ else
|
|||||||
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
check_variables DXVK_NVAPI_LOG_LEVEL "none"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $WINEDEBUG != "-all" ]] ; then
|
|
||||||
log_dir="$HOME/winehelper_backup_log"
|
|
||||||
mkdir -p "$log_dir"
|
|
||||||
export LOG_FILE="$log_dir/winehelper.log"
|
|
||||||
date > "$LOG_FILE"
|
|
||||||
print_warning "Включен режим логирования работы WINE."
|
|
||||||
print_warning "Лог будет сохранен по пути: $LOG_FILE"
|
|
||||||
sleep 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
##### WINETRICKS VERSION #####
|
##### WINETRICKS VERSION #####
|
||||||
WINETRICKS_VERSION="20250102"
|
WINETRICKS_VERSION="20250102"
|
||||||
|
|
||||||
@@ -333,6 +328,7 @@ unpack () {
|
|||||||
try_get_page () {
|
try_get_page () {
|
||||||
local url_page="$1"
|
local url_page="$1"
|
||||||
export OUT_PAGE_TMP="${WH_TMP_DIR}/url_page.tmp"
|
export OUT_PAGE_TMP="${WH_TMP_DIR}/url_page.tmp"
|
||||||
|
try_remove_file "$OUT_PAGE_TMP"
|
||||||
print_info "Чтение страницы: $url_page"
|
print_info "Чтение страницы: $url_page"
|
||||||
if ! curl -o "$OUT_PAGE_TMP" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$url_page" \
|
if ! curl -o "$OUT_PAGE_TMP" -A "Mozilla/5.0 (compatible; Konqueror/2.1.1; X11)" "$url_page" \
|
||||||
|| grep -q "Forbidden" "$OUT_PAGE_TMP"
|
|| grep -q "Forbidden" "$OUT_PAGE_TMP"
|
||||||
@@ -349,7 +345,6 @@ read_page () {
|
|||||||
&& [[ -f "$OUT_PAGE_TMP" ]]
|
&& [[ -f "$OUT_PAGE_TMP" ]]
|
||||||
then
|
then
|
||||||
cat "$OUT_PAGE_TMP"
|
cat "$OUT_PAGE_TMP"
|
||||||
try_remove_file "$OUT_PAGE_TMP"
|
|
||||||
unset OUT_PAGE_TMP
|
unset OUT_PAGE_TMP
|
||||||
else
|
else
|
||||||
echo "Используй try_get_page перед read_page"
|
echo "Используй try_get_page перед read_page"
|
||||||
@@ -485,6 +480,10 @@ var_winedlloverride_update () {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmp_winedlloverride_update () {
|
||||||
|
var_winedlloverride_update "$1"
|
||||||
|
}
|
||||||
|
|
||||||
var_dxvk_config_update () {
|
var_dxvk_config_update () {
|
||||||
if [[ -n "${DXVK_CONFIG}" ]]
|
if [[ -n "${DXVK_CONFIG}" ]]
|
||||||
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
|
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
|
||||||
@@ -1287,7 +1286,8 @@ init_wineprefix () {
|
|||||||
echo "# переменные последнего использования префикса:" > "$WINEPREFIX/last.conf"
|
echo "# переменные последнего использования префикса:" > "$WINEPREFIX/last.conf"
|
||||||
for var in WH_WINE_USE BASE_PFX WINEARCH WH_WINDOWS_VER WINEESYNC WINEFSYNC \
|
for var in WH_WINE_USE BASE_PFX WINEARCH WH_WINDOWS_VER WINEESYNC WINEFSYNC \
|
||||||
STAGING_SHARED_MEMORY WINE_LARGE_ADDRESS_AWARE WH_USE_SHADER_CACHE WH_USE_WINE_DXGI \
|
STAGING_SHARED_MEMORY WINE_LARGE_ADDRESS_AWARE WH_USE_SHADER_CACHE WH_USE_WINE_DXGI \
|
||||||
WINE_CPU_TOPOLOGY DXVK_VER VKD3D_VER WH_XDG_OPEN WH_USE_MESA_GL_OVERRIDE
|
WINE_CPU_TOPOLOGY DXVK_VER VKD3D_VER WH_XDG_OPEN WH_USE_MESA_GL_OVERRIDE \
|
||||||
|
WH_USE_CPCSP_PROXY
|
||||||
do
|
do
|
||||||
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
|
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
|
||||||
done
|
done
|
||||||
@@ -1348,23 +1348,25 @@ kill_wine () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init_database () {
|
init_database () {
|
||||||
WHDB_FILE="0"
|
local whdb_file="0"
|
||||||
if [[ -f "$WIN_FILE_EXEC" ]] ; then
|
if [[ -n "$WIN_FILE_EXEC" ]] \
|
||||||
|
&& [[ -f "$WIN_FILE_EXEC" ]]
|
||||||
|
then
|
||||||
WHDB="$(basename "$WIN_FILE_EXEC" .exe)"
|
WHDB="$(basename "$WIN_FILE_EXEC" .exe)"
|
||||||
if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then
|
if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then
|
||||||
WHDB_FILE="$WIN_FILE_EXEC".whdb
|
whdb_file="$WIN_FILE_EXEC".whdb
|
||||||
else
|
else
|
||||||
orig_IFS="$IFS" && IFS=$'\n'
|
orig_IFS="$IFS" && IFS=$'\n'
|
||||||
if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then
|
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
|
fi
|
||||||
IFS="$orig_IFS"
|
IFS="$orig_IFS"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$WHDB_FILE" != "0" ]] ; then
|
if [[ "$whdb_file" != "0" ]] ; then
|
||||||
print_info "Используется файл настроек: $WHDB_FILE"
|
print_info "Используется файл настроек: $whdb_file"
|
||||||
. "$WHDB_FILE"
|
. "$whdb_file"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
|
||||||
@@ -1389,40 +1391,89 @@ prepair_wine () {
|
|||||||
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
[[ "$MANGOHUD" == 1 ]] && MANGOHUD_RUN="mangohud"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wine_regfile () {
|
||||||
|
print_info "Запускаем команду: $WINELOADER $@"
|
||||||
|
"$WINELOADER" "$@" && print_ok "Выполнено." || fatal "Не выполнено: $WINELOADER $@"
|
||||||
|
wait_wineserver
|
||||||
|
|
||||||
|
if [[ "$WINEARCH" == "win64" ]] \
|
||||||
|
&& [[ -f "${WINELOADER}64" ]]
|
||||||
|
then
|
||||||
|
print_info "Запускаем команду: ${WINELOADER}64 $@"
|
||||||
|
"${WINELOADER}64" "$@" && print_ok "Выполнено." || fatal "Не выполнено: ${WINELOADER}64 $@"
|
||||||
|
wait_wineserver
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
wine_run () {
|
wine_run () {
|
||||||
|
local wh_add_args win_file_exec win_file_path win_file_name
|
||||||
|
|
||||||
|
if [[ $1 =~ (winecfg|regedit|winefile|wineconsole) ]] ; then
|
||||||
|
win_file_exec="$1"
|
||||||
|
win_file_name="$win_file_exec"
|
||||||
|
win_file_path="$DRIVE_C"
|
||||||
|
wh_add_args=""
|
||||||
|
elif [[ $1 =~ \.dll$ ]] ; then
|
||||||
|
wine_regfile regsvr32 /s "$@"
|
||||||
|
return 0
|
||||||
|
elif [[ -f "$1" ]] ; then
|
||||||
|
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="" ;;
|
||||||
|
*.reg) wine_regfile regedit "$@" ; return 0 ;;
|
||||||
|
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
|
||||||
|
esac
|
||||||
|
|
||||||
if [[ $WINEARCH == "win32" ]] \
|
if [[ $WINEARCH == "win32" ]] \
|
||||||
&& file "$WIN_FILE_EXEC" | grep -q "x86-64"
|
&& file "$win_file_exec" | grep -q "x86-64"
|
||||||
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
|
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
|
||||||
fi
|
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"
|
|
||||||
else
|
else
|
||||||
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
|
fatal "Команда введена не правильно или не найден исполняемый файл $1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
shift
|
||||||
|
cd "$win_file_path"
|
||||||
|
|
||||||
|
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
|
wait_wineserver
|
||||||
|
cd "$DRIVE_C"
|
||||||
}
|
}
|
||||||
|
|
||||||
wine_run_install () {
|
wine_run_install () {
|
||||||
print_info "Запускаем установку: $1."
|
print_info "Запускаем установку: $1."
|
||||||
if [[ "$INSTALL_MODE" == "manual" ]]
|
case "$WH_INSTALL_MODE" in
|
||||||
then print_warning "Рекомендуется не менять пути для установки приложения!"
|
"manual") print_warning "Рекомендуется не менять пути для установки приложения!" ;;
|
||||||
fi
|
"test") print_warning "Установка приложения из списка экспериментальных скриптов." ;;
|
||||||
[[ ! -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
|
esac
|
||||||
wait_wineserver
|
|
||||||
|
if [[ ! -f "$1" ]]
|
||||||
|
then fatal "Нет файла для установки: $1"
|
||||||
|
else wine_run "$@"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
run_autoinstall () {
|
run_autoinstall () {
|
||||||
@@ -1440,24 +1491,20 @@ run_autoinstall () {
|
|||||||
elif [[ -f "$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
|
elif [[ -f "$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
|
||||||
INSTALL_SCRIPT="$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
INSTALL_SCRIPT="$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
||||||
WH_INSTALL_MODE="manual"
|
WH_INSTALL_MODE="manual"
|
||||||
elif [[ -d "$WH_TESTINSTALL_DIR" ]] \
|
elif [[ -f "$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
|
||||||
&& [[ -f "$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]]
|
|
||||||
then
|
|
||||||
INSTALL_SCRIPT="$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
INSTALL_SCRIPT="$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME"
|
||||||
WH_INSTALL_MODE="test"
|
WH_INSTALL_MODE="test"
|
||||||
else
|
else
|
||||||
INSTALL_SCRIPT="0"
|
INSTALL_SCRIPT="0"
|
||||||
fi
|
fi
|
||||||
export INSTALL_SCRIPT INSTALL_MODE
|
export INSTALL_SCRIPT WH_INSTALL_MODE
|
||||||
|
|
||||||
if [[ $INSTALL_SCRIPT_NAME == "list" ]] || [[ -z "$INSTALL_SCRIPT_NAME" ]] ; then
|
if [[ $INSTALL_SCRIPT_NAME == "list" ]] || [[ -z "$INSTALL_SCRIPT_NAME" ]] ; then
|
||||||
|
|
||||||
list_install_scripts() {
|
print_install_list () {
|
||||||
local dir="$1"
|
parse_install_scripts() {
|
||||||
local title="$2"
|
local parse_dir="$1"
|
||||||
[[ ! -d "$dir" ]] || [[ -z "$(ls -A "$dir" 2>/dev/null)" ]] && return
|
[[ ! -d "$parse_dir" ]] || [[ -z "$(ls -A "$parse_dir" 2>/dev/null)" ]] && return
|
||||||
|
|
||||||
print_info "$title"
|
|
||||||
|
|
||||||
awk '
|
awk '
|
||||||
FNR==1 {
|
FNR==1 {
|
||||||
@@ -1474,12 +1521,19 @@ run_autoinstall () {
|
|||||||
printf "\n%s - %s\n%s\n", filename, progname, info
|
printf "\n%s - %s\n%s\n", filename, progname, info
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
' "$dir"/*
|
' "$parse_dir"/*
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
print_info "Список программ с возможностью автоматической установки:"
|
||||||
|
parse_install_scripts "$WH_AUTOINSTALL_DIR"
|
||||||
|
print_info "Список программ с возможностью установки из существующего дистрибутива:"
|
||||||
|
parse_install_scripts "$WH_MANUALINSTALL_DIR"
|
||||||
|
print_warning "Программы из списка экспериментальных скриптов:"
|
||||||
|
parse_install_scripts "$WH_TESTINSTALL_DIR"
|
||||||
}
|
}
|
||||||
|
|
||||||
list_install_scripts "$WH_AUTOINSTALL_DIR" "Список программ с возможностью автоматической установки:"
|
print_install_list | less -R --use-color
|
||||||
echo
|
|
||||||
list_install_scripts "$WH_MANUALINSTALL_DIR" "Список программ с возможностью установки из существующего дистрибутива:"
|
|
||||||
elif [[ "$INSTALL_SCRIPT" != "0" ]] ; then
|
elif [[ "$INSTALL_SCRIPT" != "0" ]] ; then
|
||||||
if [[ $WH_USE_GUI == "1" ]] \
|
if [[ $WH_USE_GUI == "1" ]] \
|
||||||
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
|
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
|
||||||
@@ -1487,6 +1541,7 @@ run_autoinstall () {
|
|||||||
else print_license_agreement
|
else print_license_agreement
|
||||||
fi
|
fi
|
||||||
source "$INSTALL_SCRIPT" "$@"
|
source "$INSTALL_SCRIPT" "$@"
|
||||||
|
[[ -n $OUT_PAGE_TMP ]] && try_remove_file "$OUT_PAGE_TMP"
|
||||||
print_info "Завершена установка $INSTALL_SCRIPT_NAME"
|
print_info "Завершена установка $INSTALL_SCRIPT_NAME"
|
||||||
else
|
else
|
||||||
fatal "Скрипт автоматической установки для $INSTALL_SCRIPT_NAME не найден!"
|
fatal "Скрипт автоматической установки для $INSTALL_SCRIPT_NAME не найден!"
|
||||||
@@ -2151,20 +2206,21 @@ select_component_version() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
run_install_to_prefix() {
|
run_install_to_prefix() {
|
||||||
export WINEPREFIX="$1"
|
if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ ! -f "$2" ]] ; then
|
||||||
local WIN_FILE_EXEC="$2"
|
|
||||||
|
|
||||||
if [[ -z "$WINEPREFIX" ]] || [[ -z "$WIN_FILE_EXEC" ]]; then
|
|
||||||
fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>"
|
fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export WINEPREFIX="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
check_prefix_var
|
check_prefix_var
|
||||||
prepair_wine
|
prepair_wine
|
||||||
wine_run_install "$WIN_FILE_EXEC"
|
wine_run "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
run_install_dxvk() {
|
run_install_dxvk() {
|
||||||
local version="$1"
|
local version="$1"
|
||||||
|
|
||||||
if [[ -z "$version" ]] ; then
|
if [[ -z "$version" ]] ; then
|
||||||
version=$(select_component_version "DXVK")
|
version=$(select_component_version "DXVK")
|
||||||
[[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return
|
[[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return
|
||||||
@@ -2172,21 +2228,27 @@ run_install_dxvk() {
|
|||||||
list_component_versions "DXVK"
|
list_component_versions "DXVK"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
check_prefix_var
|
check_prefix_var
|
||||||
init_database
|
init_database
|
||||||
|
|
||||||
export DXVK_VER="$version"
|
export DXVK_VER="$version"
|
||||||
|
|
||||||
init_wine_ver
|
init_wine_ver
|
||||||
init_wineprefix
|
init_wineprefix
|
||||||
|
|
||||||
if [[ "$DXVK_VER" == "none" ]]
|
if [[ "$DXVK_VER" == "none" ]]
|
||||||
then print_info "Удаление DXVK..."
|
then print_info "Удаление DXVK..."
|
||||||
else print_info "Установка DXVK: $DXVK_VER"
|
else print_info "Установка DXVK: $DXVK_VER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
init_dxvk "$DXVK_VER"
|
init_dxvk "$DXVK_VER"
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
}
|
}
|
||||||
|
|
||||||
run_install_vkd3d() {
|
run_install_vkd3d() {
|
||||||
local version="$1"
|
local version="$1"
|
||||||
|
|
||||||
if [[ -z "$version" ]] ; then
|
if [[ -z "$version" ]] ; then
|
||||||
version=$(select_component_version "VKD3D")
|
version=$(select_component_version "VKD3D")
|
||||||
[[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return
|
[[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return
|
||||||
@@ -2194,15 +2256,20 @@ run_install_vkd3d() {
|
|||||||
list_component_versions "VKD3D"
|
list_component_versions "VKD3D"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
check_prefix_var
|
check_prefix_var
|
||||||
init_database
|
init_database
|
||||||
|
|
||||||
export VKD3D_VER="$version"
|
export VKD3D_VER="$version"
|
||||||
|
|
||||||
init_wine_ver
|
init_wine_ver
|
||||||
init_wineprefix
|
init_wineprefix
|
||||||
|
|
||||||
if [[ "$VKD3D_VER" == "none" ]]
|
if [[ "$VKD3D_VER" == "none" ]]
|
||||||
then print_info "Удаление VKD3D..."
|
then print_info "Удаление VKD3D..."
|
||||||
else print_info "Установка VKD3D: $VKD3D_VER"
|
else print_info "Установка VKD3D: $VKD3D_VER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
init_vkd3d "$VKD3D_VER"
|
init_vkd3d "$VKD3D_VER"
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
}
|
}
|
||||||
@@ -2221,9 +2288,7 @@ run_change_wine_version() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
init_wine_ver
|
init_wine_ver
|
||||||
|
|
||||||
init_wineprefix
|
init_wineprefix
|
||||||
|
|
||||||
wait_wineserver
|
wait_wineserver
|
||||||
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
|
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
|
||||||
}
|
}
|
||||||
@@ -2263,7 +2328,8 @@ create_new_dir "$WH_DIST_DIR"
|
|||||||
create_new_dir "$WH_PREFIXES_DIR"
|
create_new_dir "$WH_PREFIXES_DIR"
|
||||||
create_new_dir "$WH_VULKAN_LIBDIR"
|
create_new_dir "$WH_VULKAN_LIBDIR"
|
||||||
|
|
||||||
if [[ -d "$HOME/.local/share/$SCRIPT_NAME" ]] \
|
if [[ $WH_DEVEL != "1" ]] \
|
||||||
|
&& [[ -d "$HOME/.local/share/$SCRIPT_NAME" ]] \
|
||||||
&& [[ ! -L "$HOME/.winehelper" ]]
|
&& [[ ! -L "$HOME/.winehelper" ]]
|
||||||
then try_force_link_dir "$HOME/.local/share/$SCRIPT_NAME" "$HOME/.winehelper"
|
then try_force_link_dir "$HOME/.local/share/$SCRIPT_NAME" "$HOME/.winehelper"
|
||||||
fi
|
fi
|
||||||
@@ -2309,12 +2375,14 @@ case "$arg1" in
|
|||||||
WIN_FILE_EXEC="$(readlink -f "$arg1")"
|
WIN_FILE_EXEC="$(readlink -f "$arg1")"
|
||||||
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
|
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
|
||||||
find_prefix "$WIN_FILE_EXEC"
|
find_prefix "$WIN_FILE_EXEC"
|
||||||
case "${WIN_FILE_NAME,,}" in
|
prepair_wine
|
||||||
*.exe) prepair_wine ; wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" ;;
|
|
||||||
*.msi) prepair_wine ; wine_run msiexec /i "$WIN_FILE_EXEC" "$@" ;;
|
if [[ -n "$1" ]] && [[ -f "$1" ]] ; then
|
||||||
*.bat|*.cmd) prepair_wine ; wine_run start "$WIN_FILE_EXEC" "$@" ;;
|
WIN_OPEN_FILE="$("$WINELOADER" winepath -w "$1")"
|
||||||
*) fatal "Тип файла не поддерживается." ;;
|
shift
|
||||||
esac
|
fi
|
||||||
|
|
||||||
|
wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE"
|
||||||
else
|
else
|
||||||
print_error "Команды $arg1 не существует."
|
print_error "Команды $arg1 не существует."
|
||||||
wh_info
|
wh_info
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ from functools import partial
|
|||||||
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
|
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
|
||||||
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
|
||||||
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
|
||||||
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal
|
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal, QRect
|
||||||
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor
|
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor, QTextCharFormat, QColor, QPalette
|
||||||
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
|
||||||
|
|
||||||
|
|
||||||
@@ -26,9 +26,11 @@ class Var:
|
|||||||
DATA_PATH = os.environ.get("DATA_PATH")
|
DATA_PATH = os.environ.get("DATA_PATH")
|
||||||
CHANGELOG_FILE = os.environ.get("CHANGELOG_FILE")
|
CHANGELOG_FILE = os.environ.get("CHANGELOG_FILE")
|
||||||
WH_ICON_PATH = os.environ.get("WH_ICON_PATH")
|
WH_ICON_PATH = os.environ.get("WH_ICON_PATH")
|
||||||
|
WH_ICON_TRAY = os.environ.get("WH_ICON_TRAY")
|
||||||
LICENSE_FILE = os.environ.get("LICENSE_FILE")
|
LICENSE_FILE = os.environ.get("LICENSE_FILE")
|
||||||
LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT")
|
LICENSE_AGREEMENT_FILE = os.environ.get("AGREEMENT")
|
||||||
THIRD_PARTY_FILE = os.environ.get("THIRD_PARTY_FILE")
|
THIRD_PARTY_FILE = os.environ.get("THIRD_PARTY_FILE")
|
||||||
|
GENERAL = os.environ.get("GENERAL")
|
||||||
|
|
||||||
class DependencyManager:
|
class DependencyManager:
|
||||||
"""Класс для управления проверкой и установкой системных зависимостей."""
|
"""Класс для управления проверкой и установкой системных зависимостей."""
|
||||||
@@ -870,6 +872,9 @@ class WinetricksManagerDialog(QDialog):
|
|||||||
"Подробности смотрите в логе.",
|
"Подробности смотрите в логе.",
|
||||||
QMessageBox.Warning,
|
QMessageBox.Warning,
|
||||||
{"buttons": {"OK": QMessageBox.AcceptRole}})
|
{"buttons": {"OK": QMessageBox.AcceptRole}})
|
||||||
|
# Сбрасываем формат символов к значению по умолчанию.
|
||||||
|
# Это гарантирует, что следующий вызов append() не унаследует красный цвет.
|
||||||
|
self.log_output.setCurrentCharFormat(QTextCharFormat())
|
||||||
self.apply_button.setEnabled(True)
|
self.apply_button.setEnabled(True)
|
||||||
self.close_button.setEnabled(True)
|
self.close_button.setEnabled(True)
|
||||||
return
|
return
|
||||||
@@ -1622,10 +1627,34 @@ class WineHelperGUI(QMainWindow):
|
|||||||
"padding-left: 10px;", "padding-left: 15px;"
|
"padding-left: 10px;", "padding-left: 15px;"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Стиль для кнопок тестовых программ
|
||||||
|
self.TEST_BUTTON_LIST_STYLE = """
|
||||||
|
QPushButton {
|
||||||
|
background-color: #ffdc64; /* Более темный желтый фон */
|
||||||
|
color: black; /* Черный цвет текста для контраста */
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
height: 42px; min-height: 42px; max-height: 42px;
|
||||||
|
}
|
||||||
|
QPushButton::icon { padding-left: 10px; }
|
||||||
|
"""
|
||||||
|
|
||||||
# Стили для оберток кнопок (для рамки выделения)
|
# Стили для оберток кнопок (для рамки выделения)
|
||||||
self.FRAME_STYLE_DEFAULT = "QFrame { border: 2px solid transparent; border-radius: 8px; padding: 0px; }"
|
self.FRAME_STYLE_DEFAULT = "QFrame { border: 2px solid transparent; border-radius: 8px; padding: 0px; }"
|
||||||
self.FRAME_STYLE_SELECTED = "QFrame { border: 2px solid #0078d7; border-radius: 8px; padding: 0px; }"
|
self.FRAME_STYLE_SELECTED = "QFrame { border: 2px solid #0078d7; border-radius: 8px; padding: 0px; }"
|
||||||
|
|
||||||
|
# Стили для кнопок Запустить/Остановить
|
||||||
|
self.RUN_BUTTON_STYLE = """
|
||||||
|
QPushButton {
|
||||||
|
background-color: #4CAF50; color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
self.STOP_BUTTON_STYLE = """
|
||||||
|
QPushButton { background-color: #d32f2f; color: white; font-weight: bold; }
|
||||||
|
"""
|
||||||
|
|
||||||
# Основные переменные
|
# Основные переменные
|
||||||
self.winehelper_path = Var.RUN_SCRIPT
|
self.winehelper_path = Var.RUN_SCRIPT
|
||||||
self.process = None
|
self.process = None
|
||||||
@@ -1668,8 +1697,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.main_layout.addLayout(content_layout)
|
self.main_layout.addLayout(content_layout)
|
||||||
|
|
||||||
# Фиксируем минимальные размеры
|
# Фиксируем минимальные размеры
|
||||||
self.stacked_widget.setMinimumWidth(520)
|
self.stacked_widget.setMinimumWidth(535)
|
||||||
self.info_panel.setMinimumWidth(415)
|
self.info_panel.setMinimumWidth(395)
|
||||||
|
|
||||||
# Вкладки
|
# Вкладки
|
||||||
self.create_auto_install_tab()
|
self.create_auto_install_tab()
|
||||||
@@ -1710,6 +1739,18 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.raise_()
|
self.raise_()
|
||||||
self.activateWindow()
|
self.activateWindow()
|
||||||
|
|
||||||
|
def create_colorized_icon(self, icon_path, color):
|
||||||
|
"""Загружает иконку (SVG) и применяет к ней указанный цвет."""
|
||||||
|
target_pixmap = QPixmap(icon_path)
|
||||||
|
if target_pixmap.isNull():
|
||||||
|
return QIcon()
|
||||||
|
|
||||||
|
painter = QPainter(target_pixmap)
|
||||||
|
painter.setCompositionMode(QPainter.CompositionMode_SourceIn)
|
||||||
|
painter.fillRect(target_pixmap.rect(), QColor(color))
|
||||||
|
painter.end()
|
||||||
|
return QIcon(target_pixmap)
|
||||||
|
|
||||||
def create_tray_icon(self):
|
def create_tray_icon(self):
|
||||||
"""Создает и настраивает иконку в системном трее."""
|
"""Создает и настраивает иконку в системном трее."""
|
||||||
if not QSystemTrayIcon.isSystemTrayAvailable():
|
if not QSystemTrayIcon.isSystemTrayAvailable():
|
||||||
@@ -1718,11 +1759,23 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
self.tray_icon = QSystemTrayIcon(self)
|
self.tray_icon = QSystemTrayIcon(self)
|
||||||
|
|
||||||
icon_path = Var.WH_ICON_PATH
|
# --- Определение цвета иконки в зависимости от темы ---
|
||||||
if icon_path and os.path.exists(icon_path):
|
if Var.WH_ICON_TRAY and os.path.exists(Var.WH_ICON_TRAY):
|
||||||
pixmap = QPixmap(icon_path)
|
# Получаем цвет текста окна из палитры приложения.
|
||||||
if not pixmap.isNull():
|
# Это хороший индикатор для определения контрастного цвета.
|
||||||
self.tray_icon.setIcon(QIcon(pixmap))
|
window_text_color = self.palette().color(QPalette.WindowText)
|
||||||
|
|
||||||
|
# Если цвет текста светлый (высокая яркость), значит, тема темная.
|
||||||
|
# И наоборот: если цвет текста темный, тема светлая.
|
||||||
|
# Яркость > 127 обычно указывает на светлый цвет.
|
||||||
|
is_dark_theme = window_text_color.lightness() > 127
|
||||||
|
|
||||||
|
if is_dark_theme:
|
||||||
|
# Для темных тем используем белую иконку
|
||||||
|
self.tray_icon.setIcon(self.create_colorized_icon(Var.WH_ICON_TRAY, Qt.white))
|
||||||
|
else:
|
||||||
|
# Для светлых тем используем черную иконку
|
||||||
|
self.tray_icon.setIcon(self.create_colorized_icon(Var.WH_ICON_TRAY, Qt.black))
|
||||||
|
|
||||||
# Создаем и сохраняем меню как атрибут класса, чтобы оно не удалялось
|
# Создаем и сохраняем меню как атрибут класса, чтобы оно не удалялось
|
||||||
self.tray_menu = QMenu(self)
|
self.tray_menu = QMenu(self)
|
||||||
@@ -1764,8 +1817,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if tab_name == "Автоматическая установка":
|
if tab_name == "Автоматическая установка":
|
||||||
title = "Автоматическая установка"
|
title = "Автоматическая установка"
|
||||||
html_content = ("<h3>Автоматическая установка</h3>"
|
html_content = ("<h3>Автоматическая установка</h3>"
|
||||||
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас.</p>"
|
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас. Просто выберите программу и нажмите «Установить».</p>"
|
||||||
"<p>Просто выберите программу и нажмите «Установить».</p>")
|
"<p>Для доступа к экспериментальным скриптам установки отметьте опцию <b>«Показать тестовые версии»</b> внизу списка.</p>")
|
||||||
show_global = False
|
show_global = False
|
||||||
elif tab_name == "Ручная установка":
|
elif tab_name == "Ручная установка":
|
||||||
title = "Ручная установка"
|
title = "Ручная установка"
|
||||||
@@ -1889,6 +1942,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
# --- Верхний ряд кнопок ---
|
# --- Верхний ряд кнопок ---
|
||||||
top_buttons_layout = QHBoxLayout()
|
top_buttons_layout = QHBoxLayout()
|
||||||
self.run_button = QPushButton("Запустить")
|
self.run_button = QPushButton("Запустить")
|
||||||
|
self.run_button.setStyleSheet(self.RUN_BUTTON_STYLE)
|
||||||
self.run_button.clicked.connect(self.toggle_run_stop_app)
|
self.run_button.clicked.connect(self.toggle_run_stop_app)
|
||||||
top_buttons_layout.addWidget(self.run_button)
|
top_buttons_layout.addWidget(self.run_button)
|
||||||
installed_action_layout.addLayout(top_buttons_layout)
|
installed_action_layout.addLayout(top_buttons_layout)
|
||||||
@@ -2052,14 +2106,14 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
return btn
|
return btn
|
||||||
|
|
||||||
def _populate_install_grid(self, grid_layout, scripts_list, script_folder, button_list):
|
def _populate_install_grid(self, grid_layout, scripts_list, script_folder, button_list, start_index=None):
|
||||||
"""
|
"""
|
||||||
Заполняет QGridLayout кнопками установщиков.
|
Заполняет QGridLayout кнопками установщиков.
|
||||||
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
|
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
|
||||||
|
|
||||||
:param grid_layout: QGridLayout для заполнения.
|
:param grid_layout: QGridLayout для заполнения.
|
||||||
:param scripts_list: Список имен скриптов.
|
:param scripts_list: Список имен скриптов.
|
||||||
:param script_folder: Имя папки со скриптами ('autoinstall' или 'manualinstall').
|
:param script_folder: Имя папки со скриптами ('autoinstall', 'manualinstall' или 'testinstall').
|
||||||
:param button_list: Список для хранения созданных кнопок.
|
:param button_list: Список для хранения созданных кнопок.
|
||||||
"""
|
"""
|
||||||
button_index = 0
|
button_index = 0
|
||||||
@@ -2073,7 +2127,13 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
icon_names = ScriptParser.extract_icons_from_script(script_path)
|
icon_names = ScriptParser.extract_icons_from_script(script_path)
|
||||||
icon_paths = [os.path.join(Var.DATA_PATH, "image", f"{name}.png") for name in icon_names]
|
icon_paths = [os.path.join(Var.DATA_PATH, "image", f"{name}.png") for name in icon_names]
|
||||||
btn = self._create_app_button(prog_name, icon_paths, self.BUTTON_LIST_STYLE)
|
|
||||||
|
# Выбираем стиль в зависимости от папки
|
||||||
|
if script_folder == 'testinstall':
|
||||||
|
style_sheet = self.TEST_BUTTON_LIST_STYLE
|
||||||
|
else:
|
||||||
|
style_sheet = self.BUTTON_LIST_STYLE
|
||||||
|
btn = self._create_app_button(prog_name, icon_paths, style_sheet)
|
||||||
|
|
||||||
# Обертка для рамки выделения
|
# Обертка для рамки выделения
|
||||||
frame = QFrame()
|
frame = QFrame()
|
||||||
@@ -2083,12 +2143,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
layout.addWidget(btn)
|
layout.addWidget(btn)
|
||||||
|
|
||||||
btn.clicked.connect(lambda _, s=script, b=btn: self.show_script_info(s, b))
|
btn.clicked.connect(lambda _, s=script, b=btn: self.show_script_info(s, b))
|
||||||
row, column = divmod(button_index, 2)
|
row, column = divmod(len(button_list), 2)
|
||||||
grid_layout.addWidget(frame, row, column)
|
grid_layout.addWidget(frame, row, column)
|
||||||
button_list.append(btn)
|
button_list.append(btn)
|
||||||
button_index += 1
|
button_index += 1
|
||||||
|
|
||||||
def _create_searchable_grid_tab(self, placeholder_text, filter_slot):
|
def _create_searchable_grid_tab(self, placeholder_text, filter_slot, add_stretch=True):
|
||||||
"""
|
"""
|
||||||
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
|
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
|
||||||
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
|
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
|
||||||
@@ -2122,11 +2182,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
grid_layout.setColumnStretch(1, 1)
|
grid_layout.setColumnStretch(1, 1)
|
||||||
|
|
||||||
v_scroll_layout.addLayout(grid_layout)
|
v_scroll_layout.addLayout(grid_layout)
|
||||||
|
if add_stretch:
|
||||||
v_scroll_layout.addStretch(1)
|
v_scroll_layout.addStretch(1)
|
||||||
|
|
||||||
return tab_widget, grid_layout, search_edit, scroll_area
|
return tab_widget, grid_layout, search_edit, scroll_area
|
||||||
|
|
||||||
def _create_and_populate_install_tab(self, tab_title, script_folder, search_placeholder, filter_slot):
|
def _create_and_populate_install_tab(self, tab_title, script_folders, search_placeholder, filter_slot):
|
||||||
"""
|
"""
|
||||||
Создает и заполняет вкладку для установки (автоматической или ручной).
|
Создает и заполняет вкладку для установки (автоматической или ручной).
|
||||||
Возвращает кортеж со скриптами, кнопками и виджетами.
|
Возвращает кортеж со скриптами, кнопками и виджетами.
|
||||||
@@ -2136,16 +2197,17 @@ class WineHelperGUI(QMainWindow):
|
|||||||
)
|
)
|
||||||
|
|
||||||
scripts = []
|
scripts = []
|
||||||
script_path = os.path.join(Var.DATA_PATH, script_folder)
|
buttons_list = []
|
||||||
|
for folder in script_folders:
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, folder)
|
||||||
if os.path.isdir(script_path):
|
if os.path.isdir(script_path):
|
||||||
try:
|
try:
|
||||||
scripts = sorted(os.listdir(script_path))
|
folder_scripts = sorted(os.listdir(script_path))
|
||||||
|
scripts.extend(folder_scripts)
|
||||||
|
self._populate_install_grid(grid_layout, folder_scripts, folder, buttons_list)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
print(f"Не удалось прочитать директорию {script_path}: {e}")
|
||||||
|
|
||||||
buttons_list = []
|
|
||||||
self._populate_install_grid(grid_layout, scripts, script_folder, buttons_list)
|
|
||||||
|
|
||||||
self.add_tab(tab_widget, tab_title)
|
self.add_tab(tab_widget, tab_title)
|
||||||
|
|
||||||
return scripts, buttons_list, grid_layout, search_edit, scroll_area
|
return scripts, buttons_list, grid_layout, search_edit, scroll_area
|
||||||
@@ -2156,12 +2218,28 @@ class WineHelperGUI(QMainWindow):
|
|||||||
scripts, buttons, layout,
|
scripts, buttons, layout,
|
||||||
search_edit, scroll_area
|
search_edit, scroll_area
|
||||||
) = self._create_and_populate_install_tab(
|
) = self._create_and_populate_install_tab(
|
||||||
"Автоматическая установка", "autoinstall", "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
|
"Автоматическая установка", ["autoinstall"], "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
|
||||||
)
|
)
|
||||||
self.autoinstall_scripts = scripts
|
self.autoinstall_scripts = scripts
|
||||||
self.install_tabs_data['auto'] = {
|
self.install_tabs_data['auto'] = {
|
||||||
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
||||||
}
|
}
|
||||||
|
self.install_tabs_data['auto']['test_buttons'] = []
|
||||||
|
|
||||||
|
# Добавляем чекбокс для тестовых версий
|
||||||
|
test_checkbox = QCheckBox("Показать тестовые версии")
|
||||||
|
test_checkbox.setToolTip("Показать/скрыть экспериментальные скрипты установки")
|
||||||
|
|
||||||
|
# Находим layout вкладки, чтобы добавить чекбокс
|
||||||
|
tab_widget = self.stacked_widget.widget(self.stacked_widget.count() - 1)
|
||||||
|
if tab_widget and tab_widget.layout():
|
||||||
|
tab_widget.layout().addWidget(test_checkbox)
|
||||||
|
|
||||||
|
# Подключаем сигнал к слоту обновления
|
||||||
|
test_checkbox.stateChanged.connect(self.update_auto_install_list)
|
||||||
|
|
||||||
|
# Сохраняем чекбокс для доступа в будущем
|
||||||
|
self.install_tabs_data['auto']['test_checkbox'] = test_checkbox
|
||||||
|
|
||||||
def create_manual_install_tab(self):
|
def create_manual_install_tab(self):
|
||||||
"""Создает вкладку для ручной установки программ"""
|
"""Создает вкладку для ручной установки программ"""
|
||||||
@@ -2169,17 +2247,81 @@ class WineHelperGUI(QMainWindow):
|
|||||||
scripts, buttons, layout,
|
scripts, buttons, layout,
|
||||||
search_edit, scroll_area
|
search_edit, scroll_area
|
||||||
) = self._create_and_populate_install_tab(
|
) = self._create_and_populate_install_tab(
|
||||||
"Ручная установка", "manualinstall", "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
|
"Ручная установка", ["manualinstall"], "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
|
||||||
)
|
)
|
||||||
self.manualinstall_scripts = scripts
|
self.manualinstall_scripts = scripts
|
||||||
self.install_tabs_data['manual'] = {
|
self.install_tabs_data['manual'] = {
|
||||||
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def update_auto_install_list(self):
|
||||||
|
"""Обновляет список на вкладке 'Автоматическая установка' при изменении чекбокса."""
|
||||||
|
data = self.install_tabs_data.get('auto')
|
||||||
|
if not data:
|
||||||
|
return
|
||||||
|
|
||||||
|
is_checked = data['test_checkbox'].isChecked()
|
||||||
|
test_buttons = data.get('test_buttons', [])
|
||||||
|
|
||||||
|
# Если нужно показать тестовые версии и они еще не добавлены
|
||||||
|
if is_checked and not test_buttons:
|
||||||
|
test_script_folder = "testinstall"
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, test_script_folder)
|
||||||
|
if os.path.isdir(script_path):
|
||||||
|
try:
|
||||||
|
folder_scripts = sorted(os.listdir(script_path))
|
||||||
|
# Запоминаем, какие кнопки являются тестовыми
|
||||||
|
new_test_buttons = []
|
||||||
|
self._populate_install_grid(data['layout'], folder_scripts, test_script_folder, new_test_buttons)
|
||||||
|
data['test_buttons'] = new_test_buttons
|
||||||
|
data['buttons'].extend(new_test_buttons)
|
||||||
|
self.autoinstall_scripts.extend(folder_scripts)
|
||||||
|
|
||||||
|
# Применяем фильтр и прокручиваем к первому новому элементу
|
||||||
|
self.filter_buttons('auto')
|
||||||
|
if new_test_buttons:
|
||||||
|
first_new_button = new_test_buttons[0]
|
||||||
|
frame = first_new_button.parent()
|
||||||
|
if isinstance(frame, QFrame):
|
||||||
|
# Даем время на отрисовку перед прокруткой
|
||||||
|
QTimer.singleShot(100, lambda: data['scroll_area'].ensureWidgetVisible(frame, 50, 50))
|
||||||
|
|
||||||
|
except OSError as e:
|
||||||
|
print(f"Не удалось прочитать директорию {test_script_folder}: {e}")
|
||||||
|
|
||||||
|
# Если нужно скрыть тестовые версии и они были добавлены
|
||||||
|
elif not is_checked and test_buttons:
|
||||||
|
# Останавливаем анимацию и удаляем виджеты тестовых кнопок
|
||||||
|
for btn in test_buttons:
|
||||||
|
if btn in self.icon_animators:
|
||||||
|
anim_data = self.icon_animators.pop(btn)
|
||||||
|
if 'main_timer' in anim_data:
|
||||||
|
anim_data['main_timer'].stop()
|
||||||
|
if 'animation' in anim_data and anim_data['animation']:
|
||||||
|
anim_data['animation'].stop()
|
||||||
|
|
||||||
|
# Удаляем кнопку из основного списка
|
||||||
|
if btn in data['buttons']:
|
||||||
|
data['buttons'].remove(btn)
|
||||||
|
|
||||||
|
# Удаляем фрейм кнопки из layout
|
||||||
|
frame = btn.parent()
|
||||||
|
if frame:
|
||||||
|
frame.deleteLater()
|
||||||
|
|
||||||
|
# Очищаем список тестовых кнопок
|
||||||
|
data['test_buttons'].clear()
|
||||||
|
# Обновляем список скриптов
|
||||||
|
self.autoinstall_scripts = [s for s in self.autoinstall_scripts if not os.path.exists(os.path.join(Var.DATA_PATH, "testinstall", s))]
|
||||||
|
|
||||||
|
# В любом случае применяем фильтр, чтобы скрыть/показать кнопки в соответствии с поиском
|
||||||
|
if data['test_checkbox'].isChecked():
|
||||||
|
self.filter_buttons('auto')
|
||||||
|
|
||||||
def create_installed_tab(self):
|
def create_installed_tab(self):
|
||||||
"""Создает вкладку для отображения установленных программ в виде кнопок"""
|
"""Создает вкладку для отображения установленных программ в виде кнопок"""
|
||||||
installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
|
installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
|
||||||
"Поиск установленной программы...", self.filter_installed_buttons
|
"Поиск установленной программы...", self.filter_installed_buttons, add_stretch=True
|
||||||
)
|
)
|
||||||
self.add_tab(installed_tab, "Установленные")
|
self.add_tab(installed_tab, "Установленные")
|
||||||
|
|
||||||
@@ -2421,7 +2563,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
prefix_names = []
|
prefix_names = []
|
||||||
|
|
||||||
self.created_prefix_selector.blockSignals(True)
|
self.created_prefix_selector.blockSignals(True)
|
||||||
self.remove_all_button.setEnabled(bool(prefix_names))
|
self.remove_all_button.setEnabled(True)
|
||||||
self.created_prefix_selector.clear()
|
self.created_prefix_selector.clear()
|
||||||
if prefix_names:
|
if prefix_names:
|
||||||
self.created_prefix_selector.addItems(prefix_names)
|
self.created_prefix_selector.addItems(prefix_names)
|
||||||
@@ -2437,7 +2579,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_managed_prefix_name = None
|
self.current_managed_prefix_name = None
|
||||||
self._setup_prefix_management_panel(None)
|
self._setup_prefix_management_panel(None)
|
||||||
self.delete_prefix_button.setEnabled(False)
|
self.delete_prefix_button.setEnabled(False)
|
||||||
self.remove_all_button.setEnabled(False)
|
self.remove_all_button.setEnabled(True)
|
||||||
self.create_base_pfx_button.setEnabled(False)
|
self.create_base_pfx_button.setEnabled(False)
|
||||||
self.open_prefix_folder_button.setEnabled(False)
|
self.open_prefix_folder_button.setEnabled(False)
|
||||||
else:
|
else:
|
||||||
@@ -3136,17 +3278,44 @@ class WineHelperGUI(QMainWindow):
|
|||||||
help_subtabs = QTabWidget()
|
help_subtabs = QTabWidget()
|
||||||
help_layout.addWidget(help_subtabs)
|
help_layout.addWidget(help_subtabs)
|
||||||
|
|
||||||
# Подвкладка "Руководство"
|
# Подвкладка "Общее"
|
||||||
guide_tab = QWidget()
|
general_tab = QWidget()
|
||||||
guide_layout = QVBoxLayout(guide_tab)
|
general_layout = QVBoxLayout(general_tab)
|
||||||
guide_text = QTextBrowser()
|
general_text = QTextBrowser()
|
||||||
guide_text.setOpenExternalLinks(True)
|
general_text.setOpenExternalLinks(True)
|
||||||
guide_text.setHtml("""
|
|
||||||
<h2>Руководство пользователя</h2>
|
try:
|
||||||
<p>Подробное и актуальное руководство по использованию WineHelper смотрите на <a href="https://www.altlinux.org/Winehelper">https://www.altlinux.org/Winehelper</a></p>
|
if not Var.GENERAL or not os.path.exists(Var.GENERAL):
|
||||||
""")
|
raise FileNotFoundError
|
||||||
guide_layout.addWidget(guide_text)
|
|
||||||
help_subtabs.addTab(guide_tab, "Руководство")
|
with open(Var.GENERAL, 'r', encoding='utf-8') as f:
|
||||||
|
general_content = f.read()
|
||||||
|
|
||||||
|
html_content = ""
|
||||||
|
url_re = re.compile(r'(https?://[^\s]+)')
|
||||||
|
|
||||||
|
for line in general_content.splitlines():
|
||||||
|
line = line.strip()
|
||||||
|
if not line:
|
||||||
|
html_content += "<br>"
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = html.escape(line)
|
||||||
|
line = url_re.sub(r'<a href="\1">\1</a>', line)
|
||||||
|
|
||||||
|
if line.startswith('# '):
|
||||||
|
html_content += f'<h2>{line[2:]}</h2>'
|
||||||
|
elif line.startswith('Для '):
|
||||||
|
html_content += f'<p style="margin-left: 10px;">• {line}</p>'
|
||||||
|
else:
|
||||||
|
html_content += f'<p>{line}</p>'
|
||||||
|
|
||||||
|
general_text.setHtml(html_content)
|
||||||
|
except (FileNotFoundError, TypeError):
|
||||||
|
general_text.setHtml(f'<h2>Ошибка</h2><p>Не удалось загрузить файл с общей информацией по пути:<br>{Var.GENERAL}</p>')
|
||||||
|
|
||||||
|
general_layout.addWidget(general_text)
|
||||||
|
help_subtabs.addTab(general_tab, "Общее")
|
||||||
|
|
||||||
# Подвкладка "Авторы"
|
# Подвкладка "Авторы"
|
||||||
authors_tab = QWidget()
|
authors_tab = QWidget()
|
||||||
@@ -3468,11 +3637,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.current_selected_app['name'] = name
|
self.current_selected_app['name'] = name
|
||||||
self.current_selected_app['exec'] = exec_cmd
|
self.current_selected_app['exec'] = exec_cmd
|
||||||
|
|
||||||
# Состояния кнопки
|
self._set_run_button_state(desktop_path in self.running_apps)
|
||||||
if desktop_path in self.running_apps:
|
|
||||||
self.run_button.setText("Остановить")
|
|
||||||
else:
|
|
||||||
self.run_button.setText("Запустить")
|
|
||||||
|
|
||||||
# Показываем панель информации
|
# Показываем панель информации
|
||||||
self.info_panel.setVisible(True)
|
self.info_panel.setVisible(True)
|
||||||
@@ -3660,7 +3825,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
msg_box.setText(
|
msg_box.setText(
|
||||||
"Приложение будет запущено в режиме отладки.\n\n"
|
"Приложение будет запущено в режиме отладки.\n\n"
|
||||||
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' "
|
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' "
|
||||||
"в вашем домашнем каталоге под именем 'winehelper.log'."
|
"в вашем домашнем каталоге под именем (пример: prefix_program.log).\n\n"
|
||||||
|
"Продолжить?"
|
||||||
)
|
)
|
||||||
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
msg_box.addButton(yes_button, QMessageBox.YesRole)
|
||||||
msg_box.addButton(no_button, QMessageBox.NoRole)
|
msg_box.addButton(no_button, QMessageBox.NoRole)
|
||||||
@@ -3865,10 +4031,27 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
# Если текущее выбранное приложение - то, что только что завершилось, обновляем кнопку
|
# Если текущее выбранное приложение - то, что только что завершилось, обновляем кнопку
|
||||||
if self.current_selected_app and self.current_selected_app.get('desktop_path') == desktop_path:
|
if self.current_selected_app and self.current_selected_app.get('desktop_path') == desktop_path:
|
||||||
self.run_button.setText("Запустить")
|
self._set_run_button_state(False)
|
||||||
else:
|
else:
|
||||||
print(f"Предупреждение: получен сигнал finished для неизвестного процесса {desktop_path}")
|
print(f"Предупреждение: получен сигнал finished для неизвестного процесса {desktop_path}")
|
||||||
|
|
||||||
|
def _set_run_button_state(self, is_running):
|
||||||
|
"""Устанавливает текст и стиль для кнопки Запустить/Остановить."""
|
||||||
|
if is_running:
|
||||||
|
self.run_button.setText("Остановить")
|
||||||
|
self.run_button.setStyleSheet(self.STOP_BUTTON_STYLE)
|
||||||
|
self.create_log_button.setEnabled(False)
|
||||||
|
self.backup_button.setEnabled(False)
|
||||||
|
self.uninstall_button.setEnabled(False)
|
||||||
|
self.restore_prefix_button_panel.setEnabled(False)
|
||||||
|
else:
|
||||||
|
self.run_button.setText("Запустить")
|
||||||
|
self.run_button.setStyleSheet(self.RUN_BUTTON_STYLE)
|
||||||
|
self.create_log_button.setEnabled(True)
|
||||||
|
self.backup_button.setEnabled(True)
|
||||||
|
self.uninstall_button.setEnabled(True)
|
||||||
|
self.restore_prefix_button_panel.setEnabled(True)
|
||||||
|
|
||||||
def _run_app_launcher(self, debug=False):
|
def _run_app_launcher(self, debug=False):
|
||||||
"""Внутренний метод для запуска приложения (с отладкой или без) с использованием QProcess."""
|
"""Внутренний метод для запуска приложения (с отладкой или без) с использованием QProcess."""
|
||||||
if not self.current_selected_app or 'exec' not in self.current_selected_app:
|
if not self.current_selected_app or 'exec' not in self.current_selected_app:
|
||||||
@@ -3935,7 +4118,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
raise RuntimeError(f"Не удалось запустить процесс: {process.errorString()}")
|
raise RuntimeError(f"Не удалось запустить процесс: {process.errorString()}")
|
||||||
|
|
||||||
self.running_apps[desktop_path] = process
|
self.running_apps[desktop_path] = process
|
||||||
self.run_button.setText("Остановить")
|
self._set_run_button_state(True)
|
||||||
print(f"Запущено: {program} {' '.join(arguments)}")
|
print(f"Запущено: {program} {' '.join(arguments)}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
QMessageBox.critical(self, "Ошибка запуска",
|
QMessageBox.critical(self, "Ошибка запуска",
|
||||||
@@ -4213,6 +4396,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
if script_name in self.autoinstall_scripts:
|
if script_name in self.autoinstall_scripts:
|
||||||
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
|
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
|
||||||
tab_type = 'auto'
|
tab_type = 'auto'
|
||||||
|
if not os.path.exists(script_path): # Проверяем в testinstall, если не нашли в autoinstall
|
||||||
|
script_path = os.path.join(Var.DATA_PATH, "testinstall", script_name)
|
||||||
self.manual_install_path_widget.setVisible(False)
|
self.manual_install_path_widget.setVisible(False)
|
||||||
else:
|
else:
|
||||||
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
|
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
|
||||||
@@ -4378,7 +4563,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
winehelper_path = self.winehelper_path
|
winehelper_path = self.winehelper_path
|
||||||
script_path = os.path.join(Var.DATA_PATH,
|
script_path = os.path.join(Var.DATA_PATH,
|
||||||
"autoinstall" if self.current_script in self.autoinstall_scripts else "manualinstall",
|
"autoinstall" if os.path.exists(os.path.join(Var.DATA_PATH, "autoinstall", self.current_script))
|
||||||
|
else "testinstall" if os.path.exists(os.path.join(Var.DATA_PATH, "testinstall", self.current_script))
|
||||||
|
else "manualinstall",
|
||||||
self.current_script)
|
self.current_script)
|
||||||
|
|
||||||
if not os.path.exists(winehelper_path):
|
if not os.path.exists(winehelper_path):
|
||||||
@@ -4787,7 +4974,7 @@ def main():
|
|||||||
window.server = server
|
window.server = server
|
||||||
window.show()
|
window.show()
|
||||||
# Создаем иконку в системном трее после создания окна
|
# Создаем иконку в системном трее после создания окна
|
||||||
window.create_tray_icon()
|
# window.create_tray_icon() # Временно отключено
|
||||||
return app.exec_()
|
return app.exec_()
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
Reference in New Issue
Block a user