Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
17a8f3c63d | |||
|
08ef246712 | ||
|
07e220794d | ||
|
15432ace98 | ||
|
e04a59507b |
364
README.md
Normal file
@@ -0,0 +1,364 @@
|
|||||||
|
<div align="center">
|
||||||
|
<img src="image/gui/winehelper.svg" width="64">
|
||||||
|
<h1 align="center">WineHelper</h1>
|
||||||
|
<p align="center">Инструмент для упрощения установки Windows-приложений на Linux. Он использует подготовленные скрипты, портативные версии Wine и изолированные префиксы, обеспечивая максимальную идентичность на различных операционных системах основанных на Alt Linux, начиная с релиза p10 и выше.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="image/handbook/auto_install.png" alt="WineHelper GUI" width="80%">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
## Основные возможности
|
||||||
|
|
||||||
|
* **Простая установка**: Устанавливайте Windows-приложения с помощью готовых скриптов, как в автоматическом, так и в ручном режиме.
|
||||||
|
* **Изолированные окружения**: Каждое приложение устанавливается в свой собственный, изолированный префикс, что предотвращает конфликты.
|
||||||
|
* **Управление версиями Wine**: Легко переключайтесь между различными версиями Wine и Proton для достижения наилучшей совместимости.
|
||||||
|
* **Графический и консольный интерфейсы**: Используйте удобный GUI для повседневных задач или мощный CLI для автоматизации.
|
||||||
|
* **Резервное копирование**: Создавайте и восстанавливайте полные резервные копии ваших префиксов.
|
||||||
|
* **Встроенные утилиты**: Быстрый доступ к `winecfg`, `regedit`, `Winetricks` и другим инструментам для каждого префикса.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Описание установки WineHelper-->
|
||||||
|
<details>
|
||||||
|
<summary style="font-size: 35px; font-weight: bold;">Установка</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
$ su -
|
||||||
|
# apt-get update && apt-get dist-upgrade
|
||||||
|
# apt-get install winehelper
|
||||||
|
# exit
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Описание использования CLI -->
|
||||||
|
<details>
|
||||||
|
<summary style="font-size: 35px; font-weight: bold;">Использование WineHelper (CLI)</summary>
|
||||||
|
|
||||||
|
### Список приложений для установки
|
||||||
|
|
||||||
|
Вывод списка приложений, доступных к установке:
|
||||||
|
```
|
||||||
|
$ winehelper install list
|
||||||
|
```
|
||||||
|
или сокращенная команда:
|
||||||
|
```
|
||||||
|
$ winehelper -i
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск установки приложений
|
||||||
|
|
||||||
|
Скрипты установки разделены на два типа:
|
||||||
|
|
||||||
|
1. **Список программ с возможностью автоматической установки** — содержит полностью автоматизированные скрипты установок программ у которыx есть дистрибутивы (установщики) в свободном доступе.
|
||||||
|
Процесс полностью автоматизирован.
|
||||||
|
Пример:
|
||||||
|
```
|
||||||
|
$ winehelper install spravki-bk
|
||||||
|
```
|
||||||
|
или сокращенная команда:
|
||||||
|
```
|
||||||
|
$ winehelper -i spravki-bk
|
||||||
|
```
|
||||||
|
2. **Список программ с возможностью установки из существующего дистрибутива** — содержит скрипты установок для программ, которых нет в свободном доступе.
|
||||||
|
Пример:
|
||||||
|
```
|
||||||
|
$ winehelper install is-record-station "/путь/до/установочного_файла"
|
||||||
|
```
|
||||||
|
или сокращенная команда:
|
||||||
|
```
|
||||||
|
$ winehelper -i is-record-station "/путь/до/установочного_файла"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Процесс установки приложений
|
||||||
|
|
||||||
|
При первом запуске **WineHelper** проверяются и при необходимости устанавливаются дополнительные зависимости (запрашиваются права root).
|
||||||
|
|
||||||
|
Процесс установки приложений:
|
||||||
|
1. Отображаются лицензионные соглашения на сторонние компоненты. Для продолжения введите **y** и нажмите **Enter**.
|
||||||
|
2. Далее процесс проходит автоматически с подробным выводом в терминал:
|
||||||
|
- Загрузка и проверка хэш-суммы нужной версии Wine.
|
||||||
|
- Загрузка и проверка хэш-суммы базового префикса.
|
||||||
|
- Инициализация и подготовка префикса.
|
||||||
|
- Скачивание дистрибутива (установщика) программы с официального сайта (если применимо).
|
||||||
|
- Установка приложения.
|
||||||
|
- Создание .desktop-файла (ярлыка) на рабочем столе и в меню приложений.
|
||||||
|
|
||||||
|
Если устанавливаемое приложение требует дополнительных действий от пользователя (ввод лицензии, настройка), это будет явно указано в терминале.
|
||||||
|
|
||||||
|
### Удаление префикса с приложением
|
||||||
|
|
||||||
|
Для удаления префикса выполните команду:
|
||||||
|
```
|
||||||
|
$ winehelper remove-prefix [имя_префикса]
|
||||||
|
```
|
||||||
|
Если имя префикса не указано, будет выведен список существующих префиксов:
|
||||||
|
```
|
||||||
|
0 - Отмена
|
||||||
|
1 - Префикс1
|
||||||
|
2 - Префикс2
|
||||||
|
Выберите префикс (0-2):
|
||||||
|
```
|
||||||
|
Необходимо указать номер удаляемого префикса и нажать клавишу **Enter**.Далее потребуется подтвердить удаление префикса вводом **y**.
|
||||||
|
|
||||||
|
В результате будут удалены:
|
||||||
|
- сам префикс;
|
||||||
|
- установленное ПО;
|
||||||
|
- desktop-файлы (ярлыки для установленного ПО в префиксе).
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
Команда создания резервной копии префикса:
|
||||||
|
```
|
||||||
|
$ winehelper backup-prefix [имя_префикса]
|
||||||
|
```
|
||||||
|
Если имя префикса не указано, будет выведен список существующих префиксов:
|
||||||
|
```
|
||||||
|
0 - Отмена
|
||||||
|
1 - Префикс1
|
||||||
|
2 - Префикс2
|
||||||
|
Выберите префикс (0-2):
|
||||||
|
```
|
||||||
|
Необходимо указать номер удаляемого префикса и нажать клавишу **Enter**.
|
||||||
|
После выбора префикса автоматически:
|
||||||
|
- Создаётся копия префикса.
|
||||||
|
- Внутри префикса сохраняется используемая версия WINE.
|
||||||
|
- Копируются иконки для ярлыков (.desktop-файлов).
|
||||||
|
- Сохраняется информация о ярлыках (.desktop-файлах) для будущей распаковки/восстановления префикса.
|
||||||
|
- Резервная копия сохраняется на рабочем столе с именем: {{path|backup_имя_префикса_дата_создания.whpack}}
|
||||||
|
|
||||||
|
### Восстановление префикса из резервной копии
|
||||||
|
|
||||||
|
Команда восстановления префикса из резервной копии:
|
||||||
|
```
|
||||||
|
$ winehelper restore-prefix "путь/до/файла.whpack"
|
||||||
|
```
|
||||||
|
Восстановление префикса не требует подключение к интернету и происходит в автоматическом режиме:
|
||||||
|
- Распаковка префикса.
|
||||||
|
- Восстановление версии WINE.
|
||||||
|
- Восстановление ярлыков (.desktop-файdлов).
|
||||||
|
|
||||||
|
После завершения восстановления приложение будет доступно для запуска через меню или рабочий стол.
|
||||||
|
|
||||||
|
### Использование команд WINE в WineHelper
|
||||||
|
|
||||||
|
WineHelper предоставляет доступ к основным инструментам WINE:
|
||||||
|
```
|
||||||
|
winehelper winefile # запуск файлового менеджера wine
|
||||||
|
winehelper winecfg # запуск wine конфигуратора для префикса
|
||||||
|
winehelper winereg # запуск редактора реестра для префикса
|
||||||
|
winehelper wineconsole # запуск терминала wine (cmd.exe)
|
||||||
|
winehelper winetricks # запуск графического интерфейса winetricks
|
||||||
|
winehelper winetricks [компонент] # автоматическая установка дополнительного компонента в префикс
|
||||||
|
```
|
||||||
|
После выполнения любой из вышеперечисленных команд отображается список существующих префиксов:
|
||||||
|
```
|
||||||
|
0 - Отмена
|
||||||
|
1 - Префикс1
|
||||||
|
2 - Префикс2
|
||||||
|
Выберите префикс (0-2):
|
||||||
|
```
|
||||||
|
Команда выполняется в выбранном вами префиксе.
|
||||||
|
|
||||||
|
### Запуск стороннего *.exe файла в WineHelper
|
||||||
|
|
||||||
|
Есть два варианта:
|
||||||
|
1. В командной строке выполнить команду:
|
||||||
|
```
|
||||||
|
$ winehelper "путь/до/файла.exe"
|
||||||
|
0 - Отмена
|
||||||
|
1 - Префикс1
|
||||||
|
2 - Префикс2
|
||||||
|
Выберите префикс (0-2):
|
||||||
|
```
|
||||||
|
Файл будет запущен в выбранном префиксе.
|
||||||
|
|
||||||
|
2. С помощью файлового менеджера WINE:'''
|
||||||
|
```
|
||||||
|
$ winehelper winefile
|
||||||
|
0 - Отмена
|
||||||
|
1 - Префикс1
|
||||||
|
2 - Префикс2
|
||||||
|
Выберите префикс (0-2):
|
||||||
|
```
|
||||||
|
В файловом менеджере найти и запустить нужный exe-файл.
|
||||||
|
|
||||||
|
### Дополнительные команды
|
||||||
|
|
||||||
|
```
|
||||||
|
$ winehelper help
|
||||||
|
```
|
||||||
|
Вывод:
|
||||||
|
<pre>
|
||||||
|
Использование: winehelper [команда]
|
||||||
|
|
||||||
|
Команды:
|
||||||
|
install list список возможных установочных скриптов
|
||||||
|
install [скрипт] запустить скрипт установки программы
|
||||||
|
install [скрипт] --clear-pfx не использовать готовый префикс для установки ПО
|
||||||
|
|
||||||
|
install-dxvk [версия|none|list] установить, удалить или показать версии DXVK
|
||||||
|
install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D
|
||||||
|
change-wine [версия] изменить версию Wine/Proton для текущего префикса
|
||||||
|
|
||||||
|
installed список установленных программ
|
||||||
|
run [программа] запуск программы (отладка)
|
||||||
|
remove-all удалить WineHelper и все связанные данные
|
||||||
|
create-prefix создать префикс
|
||||||
|
remove-prefix [имя_префикса] удалить префикс и все связанные данные
|
||||||
|
backup-prefix [имя_префикса] создать резервную копию префикса
|
||||||
|
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
|
||||||
|
|
||||||
|
Параметры:
|
||||||
|
--help показать эту справку и выйти
|
||||||
|
--version показать информацию о пакете и его версии
|
||||||
|
--changelog показать историю изменений
|
||||||
|
--debug [команда] включить режим логирования работы WINE
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Описание использования GUI -->
|
||||||
|
<details>
|
||||||
|
<summary style="font-size: 35px; font-weight: bold;">Использование WineHelper (GUI)</summary>
|
||||||
|
|
||||||
|
### Вкладки «Автоматическая установка» и «Ручная установка»
|
||||||
|
|
||||||
|
При использовании графического интерфейса списки приложений расположены во вкладках **Автоматическая установка** и **Ручная установка**.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/auto_install.png">
|
||||||
|
<p><em>Вкладка "Автоматическая установка"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/manual_install.png">
|
||||||
|
<p><em>Вкладка "Ручная установка"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Для поиска нужной программы введите название в поле поиска.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/search.png">
|
||||||
|
<p><em>Поле поиска</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
При выборе программы из списка слева, в правой части окна отображается подробная информация о ней: описание, иконка и ссылка на официальный сайт.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/info.png">
|
||||||
|
<p><em>Информация о выбранной программе</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Для установки программы нажмите кнопку **Установить**.
|
||||||
|
|
||||||
|
Для **ручной установки** дополнительно потребуется указать путь к установочному файлу (`.exe` или `.msi`), который вы скачали самостоятельно.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/manual_install_1.png">
|
||||||
|
<p><em>Вкладка "Ручная установка" с указанием пути к дистрибутиву</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
После нажатия кнопки **Установить** появится окно с лицензионным соглашением. После его принятия начнется процесс установки, который будет подробно логироваться в отдельном окне.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/license_agreement.png">
|
||||||
|
<p><em>Окно с лицензионным соглашением</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/log.png">
|
||||||
|
<p><em>Окно установки с логом</em></м</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
После установки приложения и нажатия кнопки **Закрыть** в окне установки приложения, ярлык приложения появится в списке установленных приложений во вкладке **Установленные** а также в меню приложений и на рабочем столе если это разрешено в рабочем окружении.
|
||||||
|
|
||||||
|
### Вкладка «Установленные»
|
||||||
|
|
||||||
|
На этой вкладке отображаются все приложения, которые были установлены с помощью WineHelper.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/installed.png">
|
||||||
|
<p><em>Вкладка "Установленные"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
При выборе приложения в правой панели становятся доступны следующие действия:
|
||||||
|
* **Запустить/Остановить**: Запускает или останавливает/закрывает выбранное приложение.
|
||||||
|
* **Создать лог запуска программы**: Запускает приложение в режиме отладки. После закрытия приложения в вашем домашнем каталоге будет создан файл `winehelper.log`.
|
||||||
|
* **Создать резервную копию префикса**: Создает полный бэкап префикса приложения (включая версию Wine) в формате `.whpack` на вашем рабочем столе если это разрешено в рабочем окружении.
|
||||||
|
* **Удалить префикс**: Полностью удаляет приложение вместе с его префиксом и всеми связанными ярлыками.
|
||||||
|
|
||||||
|
Также на этой вкладке доступна кнопка **«Восстановить префикс из резервной копии»**, которая позволяет восстановить любое приложение из ранее созданного `.whpack` файла.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/election_installed.png">
|
||||||
|
<p><em>Выбранное приложение во вкладке "Установленные"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
### Вкладка «Менеджер префиксов»
|
||||||
|
|
||||||
|
Эта вкладка предоставляет мощные инструменты для управления префиксами Wine.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/prefix_manager.png">
|
||||||
|
<p><em>Вкладка "Менеджер префиксов"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### Создание нового префикса
|
||||||
|
|
||||||
|
Нажав кнопку **«Создать новый префикс»**, вы откроете диалог, где можно задать:
|
||||||
|
* **Имя префикса**.
|
||||||
|
* **Разрядность** (32-bit или 64-bit).
|
||||||
|
* **Наполнение** (чистый префикс или с рекомендуемыми библиотеками).
|
||||||
|
* **Версию Wine/Proton** из доступного списка.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/create_prefix.png">
|
||||||
|
<p><em>Диалог создания нового префикса</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### Управление существующим префиксом
|
||||||
|
|
||||||
|
Выбрав префикс из выпадающего списка, вы получаете доступ к панели управления, которая позволяет:
|
||||||
|
|
||||||
|
* **Запускать стандартные утилиты Wine**:
|
||||||
|
* `Редактор настроек (winecfg)`
|
||||||
|
* `Редактор реестра (regedit)`
|
||||||
|
* `Удаление программ (uninstaller)`
|
||||||
|
* `Командная строка (cmd)`
|
||||||
|
* `Файловый менеджер (winefile)`
|
||||||
|
* **Управлять компонентами**:
|
||||||
|
* **Менеджер компонентов (Winetricks)**: Удобный интерфейс для установки и переустановки библиотек, шрифтов и настроек.
|
||||||
|
* **Управление Wine/Proton**: Смена версии Wine или Proton для выбранного префикса.
|
||||||
|
* **Управление DXVK/VKD3D**: Установка или удаление конкретных версий DXVK и VKD3D.
|
||||||
|
* **Ассоциации файлов**: Настройка открытия определенных типов файлов (например, `.pdf`, `.docx`) нативными приложениями Linux.
|
||||||
|
* **Включать/выключать ESync и FSync**.
|
||||||
|
* **Устанавливать приложения**: Установить любой `.exe` или `.msi` файл напрямую в выбранный префикс.
|
||||||
|
* **Создавать ярлыки**: Создать ярлык для любого исполняемого файла внутри префикса.
|
||||||
|
* **Удалять префикс** или **создавать из него шаблон**.
|
||||||
|
|
||||||
|
Справа отображается подробная информация о конфигурации выбранного префикса.
|
||||||
|
|
||||||
|
### Вкладка «Справка»
|
||||||
|
|
||||||
|
Содержит полезную информацию о проекте:
|
||||||
|
* **Руководство**: Ссылка на официальную документацию.
|
||||||
|
* **Авторы**: Список разработчиков и участников проекта.
|
||||||
|
* **Лицензия**: Текст лицензии WineHelper и информация о сторонних компонентах.
|
||||||
|
* **История изменений**: Changelog пакета.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="image/handbook/help.png">
|
||||||
|
<p><em>Вкладка "Справка"</em></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
### Примечание
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Проект находится на стадии WIP (work in progress)
|
BIN
image/handbook/auto_install.png
Normal file
After Width: | Height: | Size: 184 KiB |
BIN
image/handbook/create_prefix.png
Normal file
After Width: | Height: | Size: 153 KiB |
BIN
image/handbook/election_installed.png
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
image/handbook/help.png
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
image/handbook/info.png
Normal file
After Width: | Height: | Size: 227 KiB |
BIN
image/handbook/installed.png
Normal file
After Width: | Height: | Size: 133 KiB |
BIN
image/handbook/license_agreement.png
Normal file
After Width: | Height: | Size: 236 KiB |
BIN
image/handbook/log.png
Normal file
After Width: | Height: | Size: 336 KiB |
BIN
image/handbook/manual_install.png
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
image/handbook/manual_install_1.png
Normal file
After Width: | Height: | Size: 144 KiB |
BIN
image/handbook/prefix_manager.png
Normal file
After Width: | Height: | Size: 160 KiB |
BIN
image/handbook/search.png
Normal file
After Width: | Height: | Size: 93 KiB |
@@ -126,12 +126,6 @@ WH_TESTINSTALL_DIR="$DATA_PATH/testinstall"
|
|||||||
WH_WINETRICKS="$DATA_PATH/winetricks_$WINETRICKS_VERSION"
|
WH_WINETRICKS="$DATA_PATH/winetricks_$WINETRICKS_VERSION"
|
||||||
|
|
||||||
WH_MENU_DIR="$HOME/.local/share/applications/WineHelper"
|
WH_MENU_DIR="$HOME/.local/share/applications/WineHelper"
|
||||||
|
|
||||||
# TODO: system menu directory
|
|
||||||
# /usr/share/desktop-directories/WineHelper.directory
|
|
||||||
# /etc/xdg/menus/applications-merged/WineHelper.menu
|
|
||||||
|
|
||||||
# user menu directory
|
|
||||||
WH_MENU_CATEGORY="$HOME/.local/share/desktop-directories/WineHelper.directory"
|
WH_MENU_CATEGORY="$HOME/.local/share/desktop-directories/WineHelper.directory"
|
||||||
WH_MENU_CONFIG="$HOME/.config/menus/applications-merged/WineHelper.menu"
|
WH_MENU_CONFIG="$HOME/.config/menus/applications-merged/WineHelper.menu"
|
||||||
|
|
||||||
|
@@ -1210,9 +1210,9 @@ class CreatePrefixDialog(QDialog):
|
|||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.parent_gui = parent # Сохранить ссылку на главное окно
|
self.parent_gui = parent # Store reference to main window
|
||||||
self.setWindowTitle("Создание нового префикса")
|
self.setWindowTitle("Создание нового префикса")
|
||||||
self.setMinimumSize(680, 250)
|
self.setMinimumSize(500, 250)
|
||||||
self.setModal(True)
|
self.setModal(True)
|
||||||
|
|
||||||
# Attributes to store results
|
# Attributes to store results
|
||||||
@@ -1226,22 +1226,9 @@ class CreatePrefixDialog(QDialog):
|
|||||||
form_layout = QFormLayout()
|
form_layout = QFormLayout()
|
||||||
form_layout.setSpacing(10)
|
form_layout.setSpacing(10)
|
||||||
|
|
||||||
# Создаем виджет для поля ввода и предупреждения
|
|
||||||
name_input_widget = QWidget()
|
|
||||||
name_input_layout = QVBoxLayout(name_input_widget)
|
|
||||||
name_input_layout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
name_input_layout.setSpacing(2)
|
|
||||||
|
|
||||||
self.prefix_name_edit = QLineEdit()
|
self.prefix_name_edit = QLineEdit()
|
||||||
self.prefix_name_edit.setPlaceholderText("Например: my_prefix")
|
self.prefix_name_edit.setPlaceholderText("Например: my_prefix")
|
||||||
name_input_layout.addWidget(self.prefix_name_edit)
|
form_layout.addRow("<b>Имя нового префикса:</b>", self.prefix_name_edit)
|
||||||
|
|
||||||
self.name_warning_label = QLabel("Имя может содержать только латинские буквы, цифры, тире и знаки подчеркивания.")
|
|
||||||
self.name_warning_label.setStyleSheet("color: red;")
|
|
||||||
self.name_warning_label.setVisible(False)
|
|
||||||
name_input_layout.addWidget(self.name_warning_label)
|
|
||||||
|
|
||||||
form_layout.addRow("<b>Имя нового префикса:</b>", name_input_widget)
|
|
||||||
|
|
||||||
arch_widget = QWidget()
|
arch_widget = QWidget()
|
||||||
arch_layout = QHBoxLayout(arch_widget)
|
arch_layout = QHBoxLayout(arch_widget)
|
||||||
@@ -1298,7 +1285,7 @@ class CreatePrefixDialog(QDialog):
|
|||||||
|
|
||||||
# Connect signals
|
# Connect signals
|
||||||
self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection)
|
self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection)
|
||||||
self.prefix_name_edit.textChanged.connect(self.validate_prefix_name)
|
self.prefix_name_edit.textChanged.connect(self.update_create_button_state)
|
||||||
self.wine_version_edit.textChanged.connect(self.update_create_button_state)
|
self.wine_version_edit.textChanged.connect(self.update_create_button_state)
|
||||||
|
|
||||||
def open_wine_version_dialog(self):
|
def open_wine_version_dialog(self):
|
||||||
@@ -1314,28 +1301,11 @@ class CreatePrefixDialog(QDialog):
|
|||||||
self.wine_version_edit.clear()
|
self.wine_version_edit.clear()
|
||||||
self.selected_wine_version_value = None
|
self.selected_wine_version_value = None
|
||||||
|
|
||||||
def validate_prefix_name(self, text):
|
|
||||||
"""Проверяет имя префикса в реальном времени и показывает/скрывает предупреждение."""
|
|
||||||
valid_pattern = r'^[a-zA-Z0-9_-]*$'
|
|
||||||
if re.match(valid_pattern, text):
|
|
||||||
self.name_warning_label.setVisible(False)
|
|
||||||
else:
|
|
||||||
# Удаляем недопустимые символы
|
|
||||||
cleaned_text = re.sub(r'[^a-zA-Z0-9_-]', '', text)
|
|
||||||
# Блокируем сигналы, чтобы избежать рекурсии при изменении текста
|
|
||||||
self.prefix_name_edit.blockSignals(True)
|
|
||||||
self.prefix_name_edit.setText(cleaned_text)
|
|
||||||
self.prefix_name_edit.blockSignals(False)
|
|
||||||
self.name_warning_label.setVisible(True)
|
|
||||||
|
|
||||||
self.update_create_button_state()
|
|
||||||
|
|
||||||
def update_create_button_state(self):
|
def update_create_button_state(self):
|
||||||
"""Включает или выключает кнопку 'Создать'."""
|
"""Включает или выключает кнопку 'Создать'."""
|
||||||
name_ok = bool(self.prefix_name_edit.text().strip())
|
name_ok = bool(self.prefix_name_edit.text().strip())
|
||||||
version_ok = bool(self.wine_version_edit.text().strip())
|
version_ok = bool(self.wine_version_edit.text().strip())
|
||||||
# Кнопка активна, только если имя валидно и версия выбрана
|
self.create_button.setEnabled(name_ok and version_ok)
|
||||||
self.create_button.setEnabled(name_ok and version_ok and not self.name_warning_label.isVisible())
|
|
||||||
|
|
||||||
def accept_creation(self):
|
def accept_creation(self):
|
||||||
"""Валидирует данные, сохраняет их и закрывает диалог с успехом."""
|
"""Валидирует данные, сохраняет их и закрывает диалог с успехом."""
|
||||||
@@ -1345,8 +1315,8 @@ class CreatePrefixDialog(QDialog):
|
|||||||
QMessageBox.warning(self, "Ошибка", "Имя префикса не может быть пустым.")
|
QMessageBox.warning(self, "Ошибка", "Имя префикса не может быть пустым.")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not re.match(r'^[a-zA-Z0-9_-]+$', prefix_name):
|
if not re.match(r'^[a-zA-Z0-9_.-]+$', prefix_name):
|
||||||
QMessageBox.warning(self, "Ошибка", "Имя префикса может содержать только латинские буквы, цифры, дефисы и знаки подчеркивания.")
|
QMessageBox.warning(self, "Ошибка", "Имя префикса может содержать только латинские буквы, цифры, точки, дефисы и подчеркивания.")
|
||||||
return
|
return
|
||||||
|
|
||||||
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
|
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
|
||||||
@@ -2163,7 +2133,7 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
# --- Контейнер для выбора и управления созданными префиксами ---
|
# --- Контейнер для выбора и управления созданными префиксами ---
|
||||||
self.management_container_groupbox = QGroupBox()
|
self.management_container_groupbox = QGroupBox()
|
||||||
self.management_container_groupbox.setVisible(True) # Всегда виден
|
self.management_container_groupbox.setVisible(False) # Скрыт, пока нет префиксов
|
||||||
container_layout = QVBoxLayout(self.management_container_groupbox)
|
container_layout = QVBoxLayout(self.management_container_groupbox)
|
||||||
|
|
||||||
selector_layout = QHBoxLayout()
|
selector_layout = QHBoxLayout()
|
||||||
@@ -2343,8 +2313,8 @@ class WineHelperGUI(QMainWindow):
|
|||||||
def _load_created_prefixes(self):
|
def _load_created_prefixes(self):
|
||||||
"""Загружает и обновляет список созданных префиксов в выпадающем списке."""
|
"""Загружает и обновляет список созданных префиксов в выпадающем списке."""
|
||||||
prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes")
|
prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes")
|
||||||
has_prefixes_dir = os.path.isdir(prefixes_root_path)
|
if not os.path.isdir(prefixes_root_path):
|
||||||
if not has_prefixes_dir:
|
self.management_container_groupbox.setVisible(False)
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -2363,9 +2333,12 @@ class WineHelperGUI(QMainWindow):
|
|||||||
self.created_prefix_selector.blockSignals(False)
|
self.created_prefix_selector.blockSignals(False)
|
||||||
|
|
||||||
if not prefix_names:
|
if not prefix_names:
|
||||||
|
self.management_container_groupbox.setVisible(False)
|
||||||
self.on_created_prefix_selected(-1) # Убедимся, что панель управления сброшена
|
self.on_created_prefix_selected(-1) # Убедимся, что панель управления сброшена
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.management_container_groupbox.setVisible(True)
|
||||||
|
|
||||||
def on_created_prefix_selected(self, index):
|
def on_created_prefix_selected(self, index):
|
||||||
"""Обрабатывает выбор префикса из выпадающего списка."""
|
"""Обрабатывает выбор префикса из выпадающего списка."""
|
||||||
if index == -1:
|
if index == -1:
|
||||||
@@ -3041,15 +3014,14 @@ class WineHelperGUI(QMainWindow):
|
|||||||
authors_text = QTextEdit()
|
authors_text = QTextEdit()
|
||||||
authors_text.setReadOnly(True)
|
authors_text.setReadOnly(True)
|
||||||
authors_text.setHtml("""
|
authors_text.setHtml("""
|
||||||
<div style="text-align: center; font-size: 10pt;">
|
<div style="text-align: center;">
|
||||||
<p><span style="font-size: 11pt;"><b>Разработчики</b></span><br>
|
<h2>Разработчики</h2>
|
||||||
Михаил Тергоев (fidel)<br>
|
Михаил Тергоев (fidel)<br>
|
||||||
Сергей Пальчех (minergenon)</p>
|
Сергей Пальчех (minergenon)</p>
|
||||||
<p><span style="font-size: 11pt;"><b>Помощники</b></span><br>
|
<p><b>Помощники</b><br>
|
||||||
Иван Мажукин (vanomj)</p>
|
Иван Мажукин (vanomj)</p>
|
||||||
<p><span style="font-size: 11pt;"><b>Идея и поддержка</b></span><br>
|
<p><b>Идея и поддержка:</b><br>
|
||||||
ООО "Базальт СПО"<br>
|
сообщество ALT Linux</p>
|
||||||
ALT Linux Team</p>
|
|
||||||
<br>
|
<br>
|
||||||
<p>Отдельная благодарность всем, кто вносит свой вклад в развитие проекта,<br>
|
<p>Отдельная благодарность всем, кто вносит свой вклад в развитие проекта,<br>
|
||||||
тестирует и сообщает об ошибках!</p>
|
тестирует и сообщает об ошибках!</p>
|
||||||
@@ -3227,6 +3199,9 @@ class WineHelperGUI(QMainWindow):
|
|||||||
|
|
||||||
self.created_prefix_selector.setCurrentText(prefix_name)
|
self.created_prefix_selector.setCurrentText(prefix_name)
|
||||||
|
|
||||||
|
if not self.management_container_groupbox.isVisible():
|
||||||
|
self.management_container_groupbox.setVisible(True)
|
||||||
|
|
||||||
def update_installed_apps(self):
|
def update_installed_apps(self):
|
||||||
"""Обновляет список установленных приложений в виде кнопок"""
|
"""Обновляет список установленных приложений в виде кнопок"""
|
||||||
# Если активная кнопка находится в списке удаляемых, сбрасываем ее
|
# Если активная кнопка находится в списке удаляемых, сбрасываем ее
|
||||||
|