Compare commits

..

6 Commits
0.8.1 ... devel

Author SHA1 Message Date
Sergey Palcheh
e12b24ccbc updating the README to the current one 2025-11-20 14:57:18 +06:00
Sergey Palcheh
4d653cdd41 changed the installation of wine versions 2025-11-19 11:42:21 +06:00
Mikhail Tergoev
eea7e11c3a used wine-tflex-wow64 for all t-flex 2025-11-18 16:11:12 +03:00
Mikhail Tergoev
94ccf166c4 added wine-wow64 for tflex 2025-11-18 16:07:54 +03:00
Mikhail Tergoev
a547e12e1b droped WINE_LG, PROTON_LG and PROTON_STEAM 2025-11-18 16:02:31 +03:00
Mikhail Tergoev
50f2c3181e added native wayland support 2025-11-18 15:30:58 +03:00
29 changed files with 182 additions and 131 deletions

View File

@@ -239,6 +239,13 @@ WineHelper предоставляет доступ к основным инст
<p><em>Вкладка "Ручная установка"</em></p>
</div>
Так же на вкладке **Автоматическая установка** есть чекбокс с тестовыми версиями скриптов установки которые еще не прошли полную проверку на зависимости и совместимость, но уже можно попробовать в работе.
<div align="center">
<img src="image/handbook/auto_install_test.png">
<p><em>Тестовые версии скриптов установки</em></p>
</div>
Для поиска нужной программы введите название в поле поиска.
<div align="center">
@@ -246,7 +253,7 @@ WineHelper предоставляет доступ к основным инст
<p><em>Поле поиска</em></p>
</div>
При выборе программы из списка слева, в правой части окна отображается подробная информация о ней: описание, иконка и ссылка на официальный сайт.
При выборе программы из списка слева, в правой части окна отображается подробная информация о ней: описание и ссылка на официальный сайт.
<div align="center">
<img src="image/handbook/info.png">
@@ -271,7 +278,7 @@ WineHelper предоставляет доступ к основным инст
<div align="center">
<img src="image/handbook/log.png">
<p><em>Окно установки с логом</em></м</em></p>
<p><em>Окно установки с логом</em></p>
</div>
После установки приложения и нажатия кнопки **Закрыть** в окне установки приложения, ярлык приложения появится в списке установленных приложений во вкладке **Установленные** а также в меню приложений и на рабочем столе если это разрешено в рабочем окружении.
@@ -323,7 +330,7 @@ WineHelper предоставляет доступ к основным инст
* **Версию Wine/Proton** из доступного списка.
<div align="center">
<img src="image/handbook/create_prefix.png">
<img src="image/handbook/prefix_create.png">
<p><em>Диалог создания нового префикса</em></p>
</div>
@@ -339,9 +346,9 @@ WineHelper предоставляет доступ к основным инст
* `Файловый менеджер (winefile)`
* **Управлять компонентами**:
* **Менеджер компонентов (Winetricks)**: Удобный интерфейс для установки и переустановки библиотек, шрифтов и настроек.
* **Управление Wine/Proton**: Смена версии Wine или Proton для выбранного префикса.
* **Управление DXVK/VKD3D**: Установка или удаление конкретных версий DXVK и VKD3D.
* **Ассоциации файлов**: Настройка открытия определенных типов файлов (например, `.pdf`, `.docx`) нативными приложениями Linux.
* **Управление Wine/Proton**: Смена версии Wine или Proton для выбранного префикса. Диалог выбора позволяет как выбрать уже установленную версию, так и скачать новую из списков, сгруппированных по архитектуре.
* **Управление DXVK/VKD3D**: Установка или удаление конкретных версий DXVK и vkd3d-proton.
* **Ассоциации файлов**: Настройка открытия определенных типов файлов (например, `.pdf`, `.docx`) нативными приложениями Linux, чтобы избежать их открытия внутри Wine.
* **Включать/выключать ESync и FSync**.
* **Устанавливать приложения**: Установить любой `.exe` или `.msi` файл напрямую в выбранный префикс.
* **Создавать ярлыки**: Создать ярлык для любого исполняемого файла внутри префикса.
@@ -349,10 +356,14 @@ WineHelper предоставляет доступ к основным инст
Справа отображается подробная информация о конфигурации выбранного префикса.
В самом низу вкладки находится кнопка **«Удалить все данные WineHelper»**.
> [!CAUTION]
> Эта функция полностью и безвозвратно удаляет все префиксы, настройки, кэш и ярлыки, созданные WineHelper. Используйте с осторожностью! Программа запросит двойное подтверждение для предотвращения случайного удаления.
### Вкладка «Справка»
Содержит полезную информацию о проекте:
* **Руководство**: Ссылка на официальную документацию.
* **Общее**: Ссылка на официальную документацию.
* **Авторы**: Список разработчиков и участников проекта.
* **Лицензия**: Текст лицензии WineHelper и информация о сторонних компонентах.
* **История изменений**: Changelog пакета.

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD Учебная Версия 17"
export PROG_ICON="tflexcad17"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 17"
export PROG_ICON="tflexcad17"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="Приложения для T-FLEX CAD 17"
export PROG_ICON="tflexcad17"
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="Ресурсы для T-FLEX CAD 17"
export PROG_ICON="tflexcad17"
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 18"
export PROG_ICON="tflexcad18"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="Приложения для T-FLEX CAD 18"
export PROG_ICON="tflexcad18"
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="Ресурсы для T-FLEX CAD 18"
export PROG_ICON="tflexcad18"
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 2D+ 17"
export PROG_ICON="tflexcad17"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 2D+ 18"
export PROG_ICON="tflexcad18"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX DOCs 17"
export PROG_ICON="tflexdoc17"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX Viewer 17"
export PROG_ICON="tflexcad17"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -4,7 +4,7 @@
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX Viewer 18"
export PROG_ICON="tflexcad18"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -2,7 +2,7 @@
# info_ru: Компоненты сервисов поддержки T-FLEX 17 и 18
########################################################################
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -3,7 +3,7 @@
########################################################################
export PROG_NAME="T-FLEX CAD 17/18"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -3,7 +3,7 @@
########################################################################
export PROG_NAME="T-FLEX DOCS 17/18"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"

View File

@@ -1,5 +1,6 @@
##### WINE WOW64 #####
e9a8b79dfe12cad1304dca573d73aefe109e3d69b6fff739c8dbb8b2d3c271c6 wine-10.12.1-alt1-wow64.tar.xz
a862761c432f8619caf8100589678a1cbb523787259120ccd4388089d81e3b17 wine-10.18.1-tflex-alt2-wow64.tar.xz
##### WINE AMD64 #####
009c95bfe2df3f9264c9c5092f3e30ea7a168dd7869046058a718a70739602d4 wine_wh_tflex_10-9_amd64.tar.xz
@@ -14,49 +15,6 @@ fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-al
6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz
6fea17fd131f57c2ebf7ca4c60d3c5a9e819afe16e5d0b77ecb750da99ae0e38 wine-7.16.1-alt1-i586.tar.xz
##### WINE_LG #####
765e52484f06169909b179f4884d04ae4b440ff868e4b5722e64fc7d7a036ad9 WINE_LG_10-10-1.tar.xz
7a5128fcebbeed652ba36c5135821fd2c82493e87d715e8bc63e3210ba7ee849 WINE_LG_10-11.tar.xz
373beeb85c1c8163e752a32a453dcf575dd7ecf971726cecb3195e330d094925 WINE_LG_10-12.tar.xz
92f3c5a47a27644fde3ec1da810afcd5e6c9c5c2bc9c1f5f76a82b55894e745b WINE_LG_10-1.tar.xz
ef8a71c269f5a2a7012aec9c16f307ab49ed09fa85a91b42d6c6b954d40401a6 WINE_LG_10-5.tar.xz
7aca95bd921a102e0a4464f4a8945095e05587bffbb924fe1603d2deb8283ba5 WINE_LG_10-7.tar.xz
503a86e8b9446a4805da524ba5ec2bde591787b354df098135d65f2ed9d66dca WINE_LG_8-18-1.tar.xz
2714260a7f1f7d6427736aad2093dc17c1c10df9641b552e5ac4ac3fc73308ee WINE_LG_9-10.tar.xz
3c2dbb33da9eaa7f3afcbe366293f6abf601257fb782a06040710ec6f1def1ec WINE_LG_9-11.tar.xz
da79f89b1fc3175f113bf5ec35fc2755550159034736cff086f2165480dd6e0f WINE_LG_9-12-2.tar.xz
34a31802e50d6d70e1f4d23520c2d0047ae70d0cb4beb3e04046ee781e136a68 WINE_LG_9-12.tar.xz
6d6fd31ff71fd43f17182b466b6d499b61652775b7dbf25a18c3eaab7eacea2d WINE_LG_9-2.tar.xz
3f0cda10a1019c6a18d832dc547709e612d88297ce332f0835c2bffeae9215c3 WINE_LG_9-5.tar.xz
51ff56e435a90eeff13ffbbac543a820d1df14d65f2e3b760ad100bc946e4bfc WINE_LG_9-7.tar.xz
09901b17a7aaa13e5c1a1f99ab82c9f0d223aa2f5c9ac94938e5a9a0088bb244 WINE_LG_9-9.tar.xz
##### PROTON_LG #####
d0f5b42096bc5ed379a26e415d99963f849129d5cec1ba9134b1ee50100b049b PROTON_LG_10-10.tar.xz
d87eb914ce7e5cab47e6b480aa400f8c7840f39a22d585bf35092a033ac09201 PROTON_LG_10-13.tar.xz
05ca56607af7cee30b4797ad6c6a111d38a52c9d5c2184d30eec2650f1585b58 PROTON_LG_10-15.tar.xz
f8bfac3029bd79e211a6dc592c0959db239fb7807c410ed2a537c34467875c74 PROTON_LG_10-4.tar.xz
83d3cf60bbae6ca9d0508c2fdeaf3887bb72830eb52afc858d4afa009d0faa78 PROTON_LG_10-8.tar.xz
f70039931d644898bb0a44daa7e3d44fcafa9dca0881e2277b1062ecd2a5357a PROTON_LG_8-25-2.tar.xz
3e9202caf11d517406f82209e9e5385a4b0b1e4e16afa8b6f4fd517401537224 PROTON_LG_9-11.tar.xz
0481da38de07c71074c245624404994af164c9a6a584942c6d1f12966db2311a PROTON_LG_9-12.tar.xz
786d6415bb884d0ec80617e02004558634ac6bd99474cd63c25e2e5fd339b112 PROTON_LG_9-15.tar.xz
8f05ee518e1861a79b1830301c57a8d4422b6a9c24dfeec07fde474d283d4152 PROTON_LG_9-16.tar.xz
8bd409e4c56472429042555c1b2102bcd8313a4d40a80fe17a2caac8f4c8d4ed PROTON_LG_9-18.tar.xz
e88e7b076ad1d85d625407468515d6f41dcb20b721a6bd699bcd8818647d136c PROTON_LG_9-19.tar.xz
bd5dfe3a5187eb3583e5bc2fbc7debe40760802539c1317211415edeeeae851e PROTON_LG_9-27.tar.xz
63fde3b768a60cf736dcf3f9922cc2ab606cb7007e4cbe59f10cd038d3bdbee8 PROTON_LG_9-2.tar.xz
e09c5da9ddffc5d390de7689df1778f279cc84a946665cc76ce77861010b2604 PROTON_LG_9-4.tar.xz
03ccc15aa4adcaa49f3eeb52bf2a9127bacd8d578478f716b390e812dab74e21 PROTON_LG_9-5-1.tar.xz
56eae794a48aa7322ce5a636c490974d7f2516528d3153991fb033b0fa5fe3cf PROTON_LG_9-5.tar.xz
82263e1d0ab16130f15d419f2661fc5a7baf29193b9eeeb7eec3f01a3e54a1b3 PROTON_LG_9-7.tar.xz
##### PROTON_STEAM #####
09e6e386a87710996d634e08650bbc733365df65d3491a4372f06cf4e815a8b2 PROTON_STEAM_6.3-8.tar.xz
2f8bdfeb75e5427886aac7d2a599a1ee8900e50d5873a0e620d5703707bf4271 PROTON_STEAM_7.0-5.tar.xz
b33aca95664067c9eff06a2b4380992d43a5d31880ff970fb340e851671be625 PROTON_STEAM_8.0-4.tar.xz
9a20af28f4213e4f1c532b79a20e6a95ef872130784fc306510637342c6f58a1 PROTON_STEAM_8.0-5.tar.xz
##### DXVK #####
d1a86ca53ab7e156e1252d3cf7eed3c66fe0651699cfc9c4ba152024261d8258 dxvk-1.10.1-967.tar.xz
98411effbc1b3611b11c4ca3af2ad29400b08e1c8c380791d6351600a06fb3c7 dxvk-1.10.3-28.tar.xz

View File

@@ -526,6 +526,10 @@ var_ld_library_path_update () {
return 0
}
check_wayland_session () {
[[ $XDG_SESSION_TYPE =~ "wayland" ]] && return 0 || return 1
}
find_prefix () {
# Автоматическое определение префикса, если он не задан
if [[ -z "$WINEPREFIX" ]] && [[ "$1" == "$WH_PREFIXES_DIR"* ]]; then
@@ -1190,9 +1194,30 @@ init_wineprefix () {
fi
if [[ $WH_USE_MESA_GL_OVERRIDE == "1" ]] \
&& ! lspci | grep -i nvidia > /dev/null ; then
&& ! lspci | grep -i nvidia > /dev/null
then
export MESA_GL_VERSION_OVERRIDE="3.3"
export MESA_GLSL_VERSION_OVERRIDE="330"
fi
if check_wayland_session ; then
# добаляем возможность запуска в нативном wayland если WH_USE_WAYLAND=1
if [[ $WH_USE_WAYLAND == "1" ]] ; then
export WINE_WAYLAND_HACKS="1"
var_winedlloverride_update "winex11.drv=d;winewayland.drv=b"
get_and_set_reg_file --add 'Software\Wine\Drivers' 'Graphics' 'REG_SZ' "x11,wayland" "user"
else
unset WINE_WAYLAND_HACKS
get_and_set_reg_file --delete 'Software\Wine\Drivers' 'Graphics'
fi
# исправляем некорректное отображение выпадающих окон под wayland
if [[ $DXVK_VER == "none" ]] \
|| [[ $VKD3D_VER == "none" ]]
then
check_variables WINE_D3D_CONFIG "renderer=vulkan"
fi
fi
# хак для XRDP сессии
@@ -1675,7 +1700,7 @@ select_wine_version() {
system_wine_version=$(wine --version 2>/dev/null)
[[ -n "$system_wine_version" ]] && system_wine_display_name="$system_wine_version"
fi
options+=("--- System ---")
options+=("--- SYSTEM ---")
options+=("$system_wine_display_name")
# --- Other versions from sha256sum.list ---
@@ -1693,13 +1718,13 @@ select_wine_version() {
}
while IFS= read -r line; do
if [[ "$line" =~ ^#+[[:space:]]([^#[:space:]]+)[[:space:]]#* ]]; then
if [[ "$line" =~ ^#+[[:space:]](.*[^#[:space:]])[[:space:]]#* ]] ; then
flush_group
current_group="${BASH_REMATCH[1]}"
# Отображаем только группы, которые являются сборками WINE или PROTON
case "$current_group" in
WINE|WINE_LG|PROTON_LG|PROTON_STEAM)
local pretty_key=$(echo "$current_group" | tr '_' ' ' | sed -e "s/\b\(.\)/\u\1/g")
"WINE WOW64"|"WINE AMD64"|"WINE I586")
local pretty_key="$current_group"
options+=("--- $pretty_key ---")
;;
*)

View File

@@ -1129,28 +1129,28 @@ class WineVersionSelectionDialog(QDialog):
self.search_edit.textChanged.connect(self.filter_versions)
main_layout.addWidget(self.search_edit)
self.version_tabs = QTabWidget()
main_layout.addWidget(self.version_tabs)
self.main_tabs = QTabWidget()
main_layout.addWidget(self.main_tabs)
self.load_versions()
def load_versions(self):
"""Запускает процесс получения списка версий Wine."""
self.version_tabs.clear()
self.main_tabs.clear()
loading_widget = QWidget()
loading_layout = QVBoxLayout(loading_widget)
status_label = QLabel("Загрузка, пожалуйста, подождите...")
status_label.setAlignment(Qt.AlignCenter)
loading_layout.addWidget(status_label)
self.version_tabs.addTab(loading_widget, "Загрузка...")
self.version_tabs.setEnabled(False)
self.main_tabs.addTab(loading_widget, "Загрузка...")
self.main_tabs.setEnabled(False)
QApplication.processEvents()
self._parse_sha256_list()
self.populate_ui()
self.version_tabs.setEnabled(True)
self.main_tabs.setEnabled(True)
def _parse_sha256_list(self):
"""Парсит sha256sum.list для получения списка версий."""
@@ -1170,10 +1170,10 @@ class WineVersionSelectionDialog(QDialog):
if not line:
continue
match = re.match(r'^#+\s*([^#]+?)\s*#*$', line)
match = re.match(r'^#+\s*(.*?)\s*#*$', line)
if match:
group_name = match.group(1)
allowed_groups = {"WINE", "WINE_LG", "PROTON_LG", "PROTON_STEAM"}
group_name = match.group(1).strip()
allowed_groups = {"WINE WOW64", "WINE AMD64", "WINE I586"}
# Отображаем только группы, которые являются сборками WINE или PROTON
if group_name in allowed_groups:
current_group = group_name
@@ -1194,9 +1194,59 @@ class WineVersionSelectionDialog(QDialog):
QMessageBox.warning(self, "Ошибка", f"Не удалось прочитать файл версий:\n{e}")
self.wine_versions_data = {}
def _get_installed_versions(self):
"""Возвращает список локально установленных версий Wine."""
dist_path = os.path.join(Var.USER_WORK_PATH, "dist")
if not os.path.isdir(dist_path):
return []
try:
return sorted([
name for name in os.listdir(dist_path)
if os.path.isdir(os.path.join(dist_path, name))
], reverse=True)
except OSError:
return []
def populate_ui(self):
"""Заполняет UI отфильтрованными версиями."""
self.version_tabs.clear()
self.main_tabs.clear()
# --- Вкладка "Установленные" ---
installed_tab = QWidget()
self.main_tabs.addTab(installed_tab, "Установленные")
installed_layout = QVBoxLayout(installed_tab)
installed_scroll_area = QScrollArea()
installed_scroll_area.setWidgetResizable(True)
installed_layout.addWidget(installed_scroll_area)
installed_content = QWidget()
installed_scroll_area.setWidget(installed_content)
self.installed_grid_layout = QGridLayout(installed_content)
self.installed_grid_layout.setAlignment(Qt.AlignTop)
installed_versions_for_grid = []
# Системная версия
if shutil.which('wine'):
try:
result = subprocess.run(['wine', '--version'], capture_output=True, text=True, check=True, encoding='utf-8')
self.system_wine_display_name = result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError) as e:
print(f"Не удалось получить версию системного wine: {e}")
self.system_wine_display_name = "Системная версия"
installed_versions_for_grid.append((self.system_wine_display_name, "system"))
# Локально установленные версии
local_versions = self._get_installed_versions()
installed_versions_for_grid.extend(local_versions)
self._create_grid_buttons(self.installed_grid_layout, installed_versions_for_grid)
# --- Вкладка "Скачать" ---
download_tab = QWidget()
download_layout = QVBoxLayout(download_tab)
self.version_tabs = QTabWidget() # Вложенные табы для категорий
download_layout.addWidget(self.version_tabs)
download_tab.setLayout(download_layout)
self.main_tabs.addTab(download_tab, "Скачать")
if not self.wine_versions_data:
error_widget = QWidget()
@@ -1205,55 +1255,33 @@ class WineVersionSelectionDialog(QDialog):
error_label.setAlignment(Qt.AlignCenter)
error_layout.addWidget(error_label)
self.version_tabs.addTab(error_widget, "Ошибка")
self.filter_versions()
return
# --- Фильтрация и сортировка групп в зависимости от архитектуры ---
is_win64 = self.architecture == "win64"
re_32bit = re.compile(r'i[3-6]86|x86(?!_64)')
re_64bit = re.compile(r'amd64|x86_64|wow64')
# --- System Tab ---
if shutil.which('wine'):
self.system_wine_display_name = "Системная версия"
try:
# Пытаемся получить версию системного wine
result = subprocess.run(['wine', '--version'], capture_output=True, text=True, check=True, encoding='utf-8')
version_line = result.stdout.strip()
# Вывод обычно "wine-X.Y.Z"
self.system_wine_display_name = version_line
except (FileNotFoundError, subprocess.CalledProcessError) as e:
print(f"Не удалось получить версию системного wine: {e}")
# Если wine возвращает ошибку, используем имя по умолчанию "Системная версия"
if is_win64:
allowed_groups_for_arch = {"WINE AMD64", "WINE WOW64"}
tab_order = ["WINE AMD64", "WINE WOW64"]
else: # win32
allowed_groups_for_arch = {"WINE I586","WINE AMD64", "WINE WOW64"}
tab_order = ["WINE I586","WINE AMD64", "WINE WOW64"]
self._create_version_tab("Системный", [(self.system_wine_display_name, "system")])
# Определяем желаемый порядок вкладок
tab_order = ["WINE", "WINE_LG", "PROTON_LG", "PROTON_STEAM"]
# Сортируем ключи в соответствии с заданным порядком
group_keys = sorted(self.wine_versions_data.keys(), key=lambda k: tab_order.index(k) if k in tab_order else len(tab_order))
# Получаем только те ключи, которые есть в данных и разрешены для данной архитектуры
available_keys = [key for key in self.wine_versions_data.keys() if key in allowed_groups_for_arch]
# Сортируем доступные ключи в соответствии с заданным порядком
group_keys = sorted(available_keys, key=lambda k: tab_order.index(k))
for key in group_keys:
versions = self.wine_versions_data.get(key, [])
filtered_versions = []
for name in sorted(versions, reverse=True):
if is_win64:
if re_64bit.search(name) or not re_32bit.search(name):
filtered_versions.append(name)
else:
filtered_versions.append(name)
if not filtered_versions:
if not versions:
continue
pretty_key = key.replace('_', ' ').title()
if key.endswith('_LG'):
pretty_key = pretty_key.replace(' Lg', ' LG')
self._create_version_tab(pretty_key, filtered_versions)
self._create_version_tab(key, sorted(versions, reverse=True))
self.filter_versions()
def _create_version_tab(self, title, versions_list):
def _create_version_tab(self, title, versions_list, is_download_tab=True):
"""Создает вкладку с сеткой кнопок для переданного списка версий."""
tab_page = QWidget()
tab_layout = QVBoxLayout(tab_page)
@@ -1269,6 +1297,13 @@ class WineVersionSelectionDialog(QDialog):
grid_layout = QGridLayout(scroll_content)
grid_layout.setAlignment(Qt.AlignTop)
self._create_grid_buttons(grid_layout, versions_list, is_download_tab=is_download_tab)
self.version_tabs.addTab(tab_page, title)
def _create_grid_buttons(self, grid_layout, versions_list, is_download_tab=False):
is_win64_prefix = self.architecture == "win64"
re_32bit_version = re.compile(r'i[3-6]86|i586')
num_columns = 3
row, col = 0, 0
for version_data in versions_list:
@@ -1279,36 +1314,58 @@ class WineVersionSelectionDialog(QDialog):
btn = QPushButton(display_name)
btn.clicked.connect(partial(self.on_version_selected, value_name))
# Выделяем системную версию Wine
if value_name == "system":
btn.setText(f"{display_name} (Системный)")
btn.setToolTip("Системная версия Wine, установленная в вашей ОС.")
# Отключение 32-битных версий Wine при выбранном 64-битного префикса (вкладка "Установленные")
if not is_download_tab and is_win64_prefix:
if re_32bit_version.search(value_name):
btn.setEnabled(False)
btn.setToolTip("Эта 32-битная версия Wine несовместима с 64-битным префиксом.")
grid_layout.addWidget(btn, row, col)
col += 1
if col >= num_columns:
col = 0
row += 1
self.version_tabs.addTab(tab_page, title)
def filter_versions(self):
"""Фильтрует видимость кнопок версий на основе текста поиска."""
search_text = self.search_edit.text().lower()
for i in range(self.version_tabs.count()):
tab_widget = self.version_tabs.widget(i)
# The grid layout is inside a scroll area content widget
grid_layout = tab_widget.findChild(QGridLayout)
if not grid_layout:
continue
# Фильтр для вкладки "Установленные"
if hasattr(self, 'installed_grid_layout'):
self._filter_grid(self.installed_grid_layout, search_text)
any_visible_in_tab = False
for j in range(grid_layout.count()):
btn_widget = grid_layout.itemAt(j).widget()
# Фильтр для вкладок "Скачать"
if hasattr(self, 'version_tabs'):
for i in range(self.version_tabs.count()):
tab_widget = self.version_tabs.widget(i)
grid_layout = tab_widget.findChild(QGridLayout)
if grid_layout:
any_visible = self._filter_grid(grid_layout, search_text)
self.version_tabs.setTabEnabled(i, any_visible)
def _filter_grid(self, grid_layout, search_text):
"""Helper-функция для фильтрации кнопок в одной сетке."""
any_visible_in_grid = False
if not grid_layout:
return False
for j in range(grid_layout.count()):
item = grid_layout.itemAt(j)
if item:
btn_widget = item.widget()
if isinstance(btn_widget, QPushButton):
is_match = search_text in btn_widget.text().lower()
btn_widget.setVisible(is_match)
if is_match:
any_visible_in_tab = True
any_visible_in_grid = True
# Enable/disable tab based on content
self.version_tabs.setTabEnabled(i, any_visible_in_tab)
return any_visible_in_grid
def on_version_selected(self, version_name):
"""Обрабатывает выбор версии."""