Compare commits

...

62 Commits

Author SHA1 Message Date
Mikhail Tergoev
7dee08bcfb updated changelog to 0.7.0 2025-10-20 15:30:47 +03:00
Mikhail Tergoev
633deaf1c1 hided abc-*, ais and commfort-* scripts 2025-10-20 15:28:21 +03:00
Mikhail Tergoev
4df9508547 Merge branch 'minergenon-devel' 2025-10-20 15:07:30 +03:00
Sergey Palcheh
989f04cdd8 added a test list to the auto-installation 2025-10-20 17:59:40 +06:00
Mikhail Tergoev
95b189f5a2 less in used for print install list 2025-10-20 14:16:54 +03:00
Mikhail Tergoev
371553277a added WH_TESTINSTALL_DIR to scripts list 2025-10-20 13:09:42 +03:00
Mikhail Tergoev
dabf50103d hided unverifed install scripts 2025-10-20 12:45:39 +03:00
Mikhail Tergoev
590b37f1a3 rename var: INSTALL_MODE -> WH_INSTALL_MODE 2025-10-20 12:43:52 +03:00
Mikhail Tergoev
1f9b4a9146 added more info for daobit-cservice 2025-10-20 12:40:31 +03:00
Mikhail Tergoev
39f21373f1 added version for spravki-bk 2025-10-20 12:39:48 +03:00
Mikhail Tergoev
e984ffdb8c fixed: always return to DRIVE_C 2025-10-20 11:43:19 +03:00
Mikhail Tergoev
48834dc078 Merge branch 'minergenon-devel' 2025-10-20 11:35:11 +03:00
Sergey Palcheh
b62d06ed71 fixed typos 2025-10-19 15:39:43 +06:00
Sergey Palcheh
9a1b78276e added button lock in the Installed tab when the Run button is pressed 2025-10-18 16:52:22 +06:00
Sergey Palcheh
f788307f05 added color for the Run button/Stop it 2025-10-18 16:39:22 +06:00
Sergey Palcheh
14273f723b the error of determining the current directory has been fixed 2025-10-18 16:24:06 +06:00
Mikhail Tergoev
a8e0fdce0a added var: WH_DEVEL 2025-10-17 15:34:29 +03:00
Mikhail Tergoev
da3d5cd7af refactored master func: wine_run 2025-10-17 13:55:55 +03:00
Mikhail Tergoev
3ee499c758 Merge branch 'minergenon-devel' 2025-10-17 11:41:20 +03:00
Mikhail Tergoev
6286cccbab fixed typos 2025-10-17 11:39:44 +03:00
Mikhail Tergoev
e8d462b665 Merge branch 'minergenon-tflex18' 2025-10-17 11:38:57 +03:00
Sergey Palcheh
6476a84ce7 increased the width of the application button panel 2025-10-17 10:52:23 +06:00
Sergey Palcheh
db7e3f5220 added autoinstall:
t-flex-cad18-applications
t-flex-cad18-resources
t-flex-cad2d+18
t-flex-viewer18
2025-10-17 10:08:09 +06:00
Mikhail Tergoev
a817d1a6f5 added UNIX path conversion 2025-10-16 21:25:58 +03:00
Mikhail Tergoev
e1fc25bb72 used tmp_winedlloverride_update in scadoffice script 2025-10-16 11:14:48 +03:00
Mikhail Tergoev
7c90da2088 added func: tmp_winedlloverride_update 2025-10-16 11:13:58 +03:00
Sergey Palcheh
108316148a added a unique name for the application startup log being created 2025-10-16 12:54:21 +06:00
Mikhail Tergoev
9029f4d0e8 added autoinstall ksamu (without CryptoPro) 2025-10-15 13:18:42 +03:00
Mikhail Tergoev
cedebe73c1 fixed long wait after installing 2025-10-15 13:17:06 +03:00
Mikhail Tergoev
e04811446c added script for T-FLEX CAD 18 2025-10-14 17:46:29 +03:00
Mikhail Tergoev
15712f0a0a disabled silent install for scadoffice 2025-10-10 13:23:20 +03:00
Mikhail Tergoev
8eeee56ee1 print_error if exe file not found for desktop 2025-10-10 13:22:06 +03:00
Mikhail Tergoev
ac4dd4f0bf fixed scadoffice scripts and updated prefix 2025-10-10 11:25:16 +03:00
Mikhail Tergoev
c15d751372 WH_USE_MESA_GL_OVERRIDE=0 by default 2025-10-10 11:24:01 +03:00
Mikhail Tergoev
78113b92a5 Merge branch 'minergenon-devel' 2025-10-10 10:50:48 +03:00
Sergey Palcheh
9e8e41e812 the license agreement window has been removed when creating a prefix 2025-10-07 15:03:08 +06:00
Sergey Palcheh
5f4d3a54b1 fixed auto-scrolling of the log to the final message when creating a prefix 2025-10-07 14:55:37 +06:00
Sergey Palcheh
9d16883e6e added display of installed Winetricks components 2025-10-07 14:28:18 +06:00
Sergey Palcheh
e3cafee4f5 added a filter for unnecessary components 2025-10-07 13:35:29 +06:00
Mikhail Tergoev
e2b2c9568c Merge branch 'minergenon-devel' 2025-10-06 13:30:06 +03:00
Sergey Palcheh
7113d864be added the Open Prefix folder button in the file manager 2025-10-03 14:23:48 +06:00
Mikhail Tergoev
9a1a88d01b fixed typos fot tflex manual 2025-10-03 10:17:26 +03:00
Sergey Palcheh
ad775e4644 added the Delete all WineHelper data button 2025-10-02 15:45:24 +06:00
Sergey Palcheh
36f5c306c5 remove-all: added removal of /home/minergenon/winehelper_backup_log 2025-10-02 14:51:37 +06:00
Sergey Palcheh
173a7ae41f README: added a description of creating a log and backup 2025-10-02 14:38:58 +06:00
Sergey Palcheh
32e56879f7 fixed the appearance of the Open folder with the prefix's log/backup button 2025-10-02 13:54:49 +06:00
Sergey Palcheh
b88ea9f478 the Open folder with the log button has been renamed to Open folder with the log/backup prefix 2025-10-02 13:41:59 +06:00
Sergey Palcheh
dd82cee5ea the backup copy of the prefix has been moved to the home directory 2025-10-02 13:22:54 +06:00
Sergey Palcheh
a35efc347d added a button to open the location of the log file 2025-10-02 12:59:07 +06:00
Sergey Palcheh
95a8d370ab winehelper.log moved to the winehelper_backup_log directory 2025-10-02 12:24:21 +06:00
Mikhail Tergoev
dd2901c85e updated changelog to 0.6.0 2025-10-01 16:36:52 +03:00
Mikhail Tergoev
9f28363ac2 updated tflex_pfx_x64_v03 2025-10-01 15:54:09 +03:00
Mikhail Tergoev
756c9e6d9e fixed PROG_NAME for t-flex-*-manual 2025-10-01 15:32:54 +03:00
Mikhail Tergoev
663cd10a5f Merge branch 'minergenon-readme' 2025-10-01 15:29:51 +03:00
Mikhail Tergoev
86beb9eaee fixed WH_ICON_PATH 2025-10-01 15:29:06 +03:00
Mikhail Tergoev
4610f6a6da updated scripts and prefix for t-flex 2025-10-01 15:25:55 +03:00
Mikhail Tergoev
4563d5641f disabled print_license_agreement to enumerate scripts 2025-10-01 13:57:49 +03:00
17a8f3c63d fixed typos of line breaks 2025-10-01 08:49:19 +00:00
Sergey Palcheh
08ef246712 fixed typos 2025-10-01 14:27:45 +06:00
Sergey Palcheh
07e220794d added a minimal GUI description 2025-10-01 11:11:36 +06:00
Sergey Palcheh
15432ace98 added the initial GUI description 2025-09-30 16:00:33 +06:00
Sergey Palcheh
e04a59507b initial README.md 2025-09-30 13:49:47 +06:00
57 changed files with 1195 additions and 214 deletions

View File

@@ -1,5 +1,33 @@
История изменений:
0.7.0
* обновлен графический режим Qt5
- добавлена кнопка открытия каталога с резервными копиями и логами
- добавлена кнопка открытия каталога с префиксом
- добавлена блокировка кнопок для установленного приложения, если оно уже запущено
- добавлено отображения процесса установки сторонних компонентов с помощью winetricks
- добавлена возможность отображения и установки тестовых скриптов (выключено по умолчанию)
* добавлены скрипты установки для t-flex версии 18
* добавлен список тестовых скриптов установки ПО
* добавлена возможность ассоциации файлов для передачи в приложения запускаемых в WineHelper
0.6.0
* обновлен графический режим Qt5
* добавлен иконка в трее для графического режима Qt5
* обновлены скрипты установки для t-flex-*
* обновлен скрипт установки для scadoffice
* добавлена ручная установка NetTest (демо версия)
* добавлены скрипты установки ARM-KT:
winehelper install arm-kt-att - "АРМ КТ ПРОФ АТТЕСТАТ"
winehelper install arm-kt-dpp - "АРМ КТ ПРОФ ДПП"
winehelper install arm-kt-es - "АРМ КТ ПРОФ НШ"
winehelper install arm-kt-med - "АРМ КТ ПРОФ МЕД"
winehelper install arm-kt-prof - "АРМ КТ ПРОФ ПРОФЕССИЯ"
winehelper install arm-kt-spo - "АРМ КТ ПРОФ СПО"
winehelper install arm-kt-vuz - "АРМ КТ ПРОФ ВУЗ"
* winehelper killal - убивает только процессы запущенные в WinwHelper
* другие небольшие улучшения и оптимизации скриптов
0.5.4:
* обновлен графический режим Qt5:
- добавлена возможность установки системных зависимостей

371
README.md Normal file
View File

@@ -0,0 +1,371 @@
<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>
Расположения лога запуска программы а также резервной копии префикса можно просмотреть с помощью кнопки **«Открыть папку с логом/резервной копией префикса»** которая появляется автоматически после создания лога или резервной копии.
<div align="center">
<img src="image/handbook/folder_log_backup.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)

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# info_ru: Сервис обновления ПО
# info_ru: Сервис обновления ПО: "R-Атлас", "R-Инфо" и "R-Тариф".
########################################################################
export PROG_URL="https://daobit.ru"
export WH_WINE_USE="wine_x_tkg_10-0_i586" # wine-9.0.9-alt1-i586"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# info_ru: «Справки БК» — специальное программное обеспечение, предназначенное для заполнения справок о доходах, расходах, об имуществе и обязательствах имущественного характера.
# info_ru: «Справки БК» (Windows версия 2.5.5) от 31.01.2024 — специальное программное обеспечение, предназначенное для заполнения справок о доходах, расходах, об имуществе и обязательствах имущественного характера.
########################################################################
export PROG_URL="https://spravki-bk.ru"
export WH_WINE_USE="wine-9.0.14-alt1-i586-spravkibk"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD Учебная Версия 17"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
@@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1"
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad17.whdb"
source "$WH_DB_DIR/t-flex-cad.whdb"
# Программа T-FLEX CAD Учебная Версия
export AUTOINSTALL_ZIP="${WH_TMP_DIR}/TFCAD_ST_17x64_PACK.zip"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 17"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
@@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1"
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad17.whdb"
source "$WH_DB_DIR/t-flex-cad.whdb"
# Программа T-FLEX CAD
export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 17.zip"

View File

@@ -6,7 +6,7 @@ export PROG_NAME="Приложения для T-FLEX CAD 17"
export PROG_ICON="tflexcad"
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"
export WH_XDG_OPEN="log"

View File

@@ -6,7 +6,7 @@ export PROG_NAME="Ресурсы для T-FLEX CAD 17"
export PROG_ICON="tflexcad"
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"
export WH_XDG_OPEN="log"

34
autoinstall/t-flex-cad18 Normal file
View File

@@ -0,0 +1,34 @@
#!/usr/bin/env bash
# info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД.
########################################################################
export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 18"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
export WH_XDG_OPEN="log"
export WH_USE_MESA_GL_OVERRIDE="1"
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad.whdb"
# Программа T-FLEX CAD
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 18.zip"
AUTOINSTALL_DIR="${WH_TMP_DIR}"
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 18"
AUTOINSTALL_EXE="${WH_TMP_DIR}/T-FLEX CAD 18/T-FLEX CAD 18.msi"
if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AUTOINSTALL_ZIP}" ; then
unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}"
try_remove_file "${AUTOINSTALL_ZIP}"
wine_run_install "${AUTOINSTALL_EXE}" /q
try_remove_dir "${AUTOINSTALL_UNPACK}"
WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe"
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad"
fi

View 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}"

View 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}"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX CAD 2D+ 17"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
@@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1"
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad17.whdb"
source "$WH_DB_DIR/t-flex-cad.whdb"
# Программа T-FLEX CAD 2D+ 17
export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 2D+ 17.zip"

View 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

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX DOCs 17"
export PROG_ICON="tflexdoc"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
@@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1"
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad17.whdb"
source "$WH_DB_DIR/t-flex-cad.whdb"
# Программа T-FLEX DOC
AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX DOCs 17 Client.zip"

View File

@@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru"
export PROG_NAME="T-FLEX Viewer 17"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
@@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1"
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad17.whdb"
source "$WH_DB_DIR/t-flex-cad.whdb"
# Программа T-FLEX Viewer
export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX Viewer 17.zip"

View 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

View File

@@ -1,28 +1,24 @@
#!/usr/bin/env bash
# info_ru: Компоненты сервисов поддержки T-FLEX 17
# info_ru: Компоненты сервисов поддержки T-FLEX 17 и 18
########################################################################
export WH_WINDOWS_VER="10"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WINEPREFIX="tflex"
export PROG_VERSION=""
export WH_XDG_OPEN="log"
export INSTALL_DLL="corefonts d3dcompiler_47 dotnet48 vcrun2022 ucrtbase2019 msxml6 fontsmooth=rgb baekmuk droid eufonts ipamona liberation lucida opensymbol sourcehansans tahoma takao uff unifont vlgothic wenquanyi wenquanyizenhei"
export INSTALL_DLL="corefonts d3dcompiler_47 dotnet48 dotnet20 vcrun2019 ucrtbase2019 msxml6 fontsmooth=rgb baekmuk droid eufonts ipamona liberation lucida opensymbol sourcehansans tahoma takao uff unifont vlgothic wenquanyi wenquanyizenhei"
export WH_USE_MESA_GL_OVERRIDE="1"
# Компоненты поддержки T-FLEX PLM (Linux)
GRDCONTROL_VER="4.3.0-0"
AUTOINSTALL_ZIP_LIN="$WH_TMP_DIR/Prerequisites_T-FLEX_Linux.zip"
AUTOINSTALL_DIR_LIN="$WH_TMP_DIR/Prerequisites_T-FLEX_Linux"
AUTOINSTALL_REG_LIN="$AUTOINSTALL_DIR_LIN/Components/fake_hasp.reg"
# Компоненты поддержки T-FLEX PLM (Windows)
AUTOINSTALL_ZIP_WIN="$WH_TMP_DIR/T-FLEX 17 Prerequisites.zip"
AUTOINSTALL_DIR_WIN="$WH_TMP_DIR/Компоненты поддержки T-FLEX 17"
AUTOINSTALL_EXE_WIN1="$AUTOINSTALL_DIR_WIN/Access Database Engine 2007/AccessDatabaseEngine.exe"
AUTOINSTALL_EXE_WIN_MSI="$AUTOINSTALL_DIR_WIN/Access Database Engine 2007"
AUTOINSTALL_EXE_WIN2="$AUTOINSTALL_DIR_WIN/TSC2/Setup_TSC2.msi"
AUTOINSTALL_EXE_ADE2007="$AUTOINSTALL_DIR_LIN/Components/AccessDatabaseEngine.exe"
AUTOINSTALL_EXE_TSC2="$AUTOINSTALL_DIR_LIN/Components/Setup_TSC2.msi"
AUTOINSTALL_EXE_VC_X86="$AUTOINSTALL_DIR_LIN/Components/vc_redist.x86.exe"
AUTOINSTALL_EXE_VC_X64="$AUTOINSTALL_DIR_LIN/Components/vc_redist.x64.exe"
prepair_wine
@@ -42,11 +38,8 @@ else
|| ! systemctl list-units --type service --state running | grep hasplmd \
|| ! rpm -q grdcontrol | grep -q "$GRDCONTROL_VER"
then
# Компоненты поддержки T-FLEX PLM (Linux)
if try_download "https://www.tflex.ru/downloads/Prerequisites_T-FLEX_Linux.zip" "${AUTOINSTALL_ZIP_LIN}" ; then
unpack "$AUTOINSTALL_ZIP_LIN" "$AUTOINSTALL_DIR_LIN"
"$WINELOADER" regedit "$AUTOINSTALL_REG_LIN"
fi
try_download "https://www.tflex.ru/downloads/Prerequisites_T-FLEX_Linux.zip" "${AUTOINSTALL_ZIP_LIN}"
unpack "$AUTOINSTALL_ZIP_LIN" "$AUTOINSTALL_DIR_LIN"
if rpm -q grdcontrol | grep -q "$GRDCONTROL_VER"
then print_info "grdcontrol-$GRDCONTROL_VER уже установлен в системе."
@@ -55,14 +48,14 @@ else
if [[ "$BASE_PFX" == "none" ]] ; then
print_info "Запускаем подготовку префикса."
# Компоненты поддержки T-FLEX PLM (Windows)
if try_download "https://www.tflex.ru/downloads/T-FLEX%2017%20Prerequisites.zip" "${AUTOINSTALL_ZIP_WIN}" ; then
unpack "$AUTOINSTALL_ZIP_WIN" "$WH_TMP_DIR"
unpack "$AUTOINSTALL_EXE_WIN1" "$AUTOINSTALL_EXE_WIN_MSI"
wine_run_install "$AUTOINSTALL_EXE_WIN_MSI/AceRedist.msi" /q
wine_run_install "$AUTOINSTALL_EXE_WIN2" /q
fi
unpack "$AUTOINSTALL_EXE_ADE2007" "$AUTOINSTALL_DIR_LIN/ADE2007"
wine_run_install "$AUTOINSTALL_DIR_LIN/ADE2007/AceRedist.msi" /q
wine_run_install "$AUTOINSTALL_EXE_VC_X86" /quiet
wine_run_install "$AUTOINSTALL_EXE_VC_X64" /quiet
wine_run_install "$AUTOINSTALL_EXE_TSC2" /q
rm -fR "$DRIVE_C/Program Files/Common Files/System"
rm -fR "$DRIVE_C/Program Files (x86)/Common Files/System"
@@ -74,9 +67,9 @@ else
mv -f "$AUTOINSTALL_DIR_LIN/Components/Windows/System32/"*.dll \
"$DRIVE_C/windows/system32"
"$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/fake_hasp.reg"
"$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/ado-32.reg"
"$WINELOADER"64 regedit "$AUTOINSTALL_DIR_LIN/Components/ado-64.reg"
"$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/tflex.reg"
"$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/ado-64.reg"
fi
if systemctl list-units --type service --state running | grep aksusbd \
@@ -98,14 +91,12 @@ else
fi
try_remove_dir "$AUTOINSTALL_DIR_LIN"
try_remove_dir "$AUTOINSTALL_DIR_WIN"
if [[ $TFLEX_ERROR == "1" ]] ; then
fatal "Произошла ошибка во время подготовки префикса, или установки компонентов ПО."
else
echo "t-flex-cad-prepair" >> "$WINEPREFIX/winetricks.log"
try_remove_file "$AUTOINSTALL_ZIP_LIN"
try_remove_file "$AUTOINSTALL_ZIP_WIN"
# try_remove_file "$AUTOINSTALL_ZIP_LIN"
print_info "Подготовка префикса и установка компонентов завершены."
fi
fi

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
image/handbook/help.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
image/handbook/info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

BIN
image/handbook/log.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
image/handbook/search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
image/ksamu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,10 +1,10 @@
#!/usr/bin/env bash
# info_ru: Ручная установка дополнений для T-FLEX CAD 17
# info_ru: Ручная установка дополнений для T-FLEX CAD 17 или 18
########################################################################
export PROG_NAME="T-FLEX CAD 17"
export PROG_NAME="T-FLEX CAD 17/18"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex17_pfx_x64_v02"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
@@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1"
if [[ -f "$2" ]] ; then
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad17.whdb"
source "$WH_DB_DIR/t-flex-cad.whdb"
wine_run_install "$2"
else

View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash
# info_ru: Ручная установка дополнений для T-FLEX DOCS 17 или 18
########################################################################
export PROG_NAME="T-FLEX DOCS 17/18"
export PROG_ICON="tflexcad"
export WH_WINE_USE="wine_wh_tflex_10-9_amd64"
export BASE_PFX="tflex_pfx_x64_v03"
export WINEARCH="win64"
export WH_WINDOWS_VER="10"
export WINEPREFIX="tflex"
export WH_XDG_OPEN="log"
export WH_USE_MESA_GL_OVERRIDE="1"
if [[ -f "$2" ]] ; then
# используем общий whdb файл для подготовки префикса и сервисов
# prepair_wine используется из файла настроек
source "$WH_DB_DIR/t-flex-cad.whdb"
wine_run_install "$2"
else
fatal "Не найден файл установки. Перезапустите по примеру:
winehelper install $1 \"/путь/до/файла\""
fi

View File

@@ -171,13 +171,9 @@ d62225f6a23e49355a59a2bd9a495390694bd70d4be6d6527cfb7fb2e2d65f0d defpfx_x64_v01
# create with wine_x_tkg_10-0_amd64 (universal user: xuser and isolate_home by default)
# winetricks msxml3 msxml4 msxml6 andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts wsh57 vcrun6 gdiplus lucida tahoma ucrtbase2019 vcrun2019 dotnet40 dotnet48 dotnet20sp2 d3dcompiler_47
f4cb2f380ad8887f334c6eb3c272b343ae8de327764945266e9e74f8acbac69f tflex17_pfx_x64_v01.tar.xz
# create with wine_x_tkg_10-0_amd64 (universal user: xuser)
# winetricks isolate_home msxml6 ipamona opensymbol wenquanyi ucrtbase2019 uff unifont droid wenquanyizenhei remove_mono internal dotnet40 dotnet48 dotnet20sp2 eufonts takao d3dcompiler_47 fontsmooth=rgb vcrun2022 vlgothic andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts liberation sourcehansans baekmuk tahoma lucida
be09f25bb795c5f912fad2d122c68c8aed937821255f161c2d75a4773d11a044 tflex17_pfx_x64_v02.tar.xz
68ad589a3e6d8a845c2e3bd4c2672cf97982b3fea0ca4b4f2fb6da126d8b3075 tflex_pfx_x64_v03.tar.xz
# create with wine_wh_tflex_10-9_amd64
# winetricks isolate_home msxml6 ipamona opensymbol wenquanyi ucrtbase2019 uff unifont droid wenquanyizenhei remove_mono internal dotnet40 dotnet48 dotnet20 eufonts takao d3dcompiler_47 fontsmooth=rgb vcrun2022 vlgothic andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts liberation sourcehansans baekmuk tahoma lucida
# winetricks isolate_home msxml6 ipamona opensymbol wenquanyi ucrtbase2019 uff unifont droid wenquanyizenhei internal dotnet48 dotnet20 eufonts takao d3dcompiler_47 fontsmooth=rgb vcrun2019 vlgothic andale arial comicsans courier georgia impact times trebuchet verdana webdings corefonts liberation sourcehansans baekmuk tahoma lucida t-flex-cad-prepair
7edbd69b40b8ca3fb3594933c6cd37030180c494c08fd13cbd1a5b46565d65e6 ved_ctm_pfx_x86_v03.tar.xz
# create with wine_x_tkg_10-0_amd64 (universal user: xuser)
@@ -212,12 +208,18 @@ dfb44ce5e5af7dba1686932c63d6b05e5dd6919a21c78130a7d1d0271b93958e audiorecstatio
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
# winetricks arial dotnet7 dotnetdesktop7 renderer=gdi
4fa93434c5c15440014357323257ddcee7d28b94ad6a56bd6f5a08b33ae4c3cb scadaoffice_pfx_x64_v04.tar.xz
# create with wine-8.8-staging-amd64
8c6312f2e4e846a98ca4a87fc90ee1917eb28d4caaddde040fb4d2dd05f8c0fe scadaoffice_pfx_x64_v05.tar.xz
# create with wine_x_tkg_10-0_amd64 (universal user: xuser)
# winetricks dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6 dotnet20
# + addons with ODBC, SSH, *.reg
# addons with ODBC, SSH, *.reg
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz
ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client_pfx_x86_v01.tar.xz
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
# winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip
f18864014fdb2fead0b45b5e70e95073072b89168df8cd6debba89081ac51a2a ksamu_pfx_x64_v01.tar.xz
# create with wine_x_tkg_10-0_i586 (universal user: xuser)
# winetricks msxml6 msxml4 msxml3 riched30 msls31 riched20 msftedit richtx32 fontsmooth=gray
# + manuall installed riched32

17
testinstall/ksamu Normal file
View File

@@ -0,0 +1,17 @@
#!/usr/bin/env bash
# info_ru: Программа “КСАМУ”.
########################################################################
export PROG_URL="https://docs.medicine-it.ru/"
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="ksamu"
export PROG_NAME="КСАМУ"
export PROG_ICON="ksamu"
export BASE_PFX="ksamu_pfx_x64_v01"
export WINEARCH="win64"
export INSTALL_DLL="richtx32 riched20 riched30 msls31 msftedit msxml6 msxml3 msxml4 fontsmooth=gray" #riched32
export WH_USE_EXTRA_FONTS="1"
export WH_WINDOWS_VER="7"
prepair_wine
create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON"

View File

@@ -1,12 +1,12 @@
#!/usr/bin/env bash
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций, с дополнением Apache OpenOffice. Apache OpenOffice - пакет офисного программного обеспечения для обработки текстов, электронных таблиц, презентаций, графики, баз данных и многого другого.
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
########################################################################
export PROG_URL="https://scadoffice.ru"
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="scadoffice"
export PROG_NAME="SCAD Office"
export PROG_ICON="scadoffice"
export BASE_PFX="scadaoffice_pfx_x64_v04"
export BASE_PFX="scadaoffice_pfx_x64_v05"
export WH_WINDOWS_VER="10"
export WINEARCH="win64"
export INSTALL_DLL="dotnet20 dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6"
@@ -32,39 +32,39 @@ if [[ -n $2 ]] ; then
fi
fi
if [[ $BASE_PFX == "none" ]] ; then
print_info "Установка дополнительных компонентов..."
print_info "Установка дополнительных компонентов..."
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons"
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"
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
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
# Установка 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/"
# Установка SSH
cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/"
try_remove_dir "$ADDONS_PATH"
try_remove_file "$ADDONS_PACK"
fi
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"
wine_run_install "${AUTOINSTALL_EXE}" /auto /hide
# временно запрещаем запуск hasplms.exe, hasplmv.exe для успешного завершения установки
tmp_winedlloverride_update "hasplms.exe,hasplmv.exe=d"
wine_run_install "$AUTOINSTALL_EXE"
try_remove_file "$AUTOINSTALL_EXE"
# Определение всех программ, значков и исполняемых файлов

View File

@@ -16,7 +16,7 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then
USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME"
RUN_SCRIPT="/usr/bin/$SCRIPT_NAME"
DATA_PATH="/usr/share/$SCRIPT_NAME"
WH_ICON_PATH="$DATA_PATH/image/gui/winehelper.svg"
WH_ICON_PATH="/usr/share/icons/hicolor/scalable/apps/winehelper.svg"
CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG"
LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE"
AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT"
@@ -31,6 +31,7 @@ else
LICENSE_FILE="$DATA_PATH/LICENSE"
AGREEMENT="$DATA_PATH/LICENSE_AGREEMENT"
THIRD_PARTY_FILE="$DATA_PATH/THIRD-PARTY"
WH_DEVEL="1"
# минимальная проверка синтаксиса скриптов
for self_check_script in "$RUN_SCRIPT" \
@@ -101,14 +102,6 @@ else
check_variables DXVK_NVAPI_LOG_LEVEL "none"
fi
if [[ $WINEDEBUG != "-all" ]] ; then
export LOG_FILE="$HOME/winehelper.log"
date > "$LOG_FILE"
print_warning "Включен режим логирования работы WINE."
print_warning "Лог будет сохранен по пути: $LOG_FILE"
sleep 3
fi
##### WINETRICKS VERSION #####
WINETRICKS_VERSION="20250102"
@@ -161,6 +154,7 @@ check_variables WH_WINDOWS_VER "10"
# check_variables WH_USE_GSTREAMER "1"
# check_variables WH_USE_D3D_EXTRAS "1"
check_variables WH_USE_SHADER_CACHE "1"
check_variables WH_USE_MESA_GL_OVERRIDE "0"
check_variables WH_USE_WINE_DXGI "0"
check_variables WH_DLL_INSTALL ""
@@ -482,6 +476,10 @@ var_winedlloverride_update () {
fi
}
tmp_winedlloverride_update () {
var_winedlloverride_update "$1"
}
var_dxvk_config_update () {
if [[ -n "${DXVK_CONFIG}" ]]
then export DXVK_CONFIG="${1};${DXVK_CONFIG}"
@@ -550,8 +548,6 @@ create_desktop () {
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
fatal "Использование: $0 desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]"
elif [[ ! -f "$exe_file" ]] ; then
print_warning "Для создания ярлыка не найден исполняемый файл: $exe_file"
local BASENAME_EXE="$(basename "$exe_file")"
print_info "Запускаем поиск $BASENAME_EXE"
local FIND_PATH
@@ -562,9 +558,11 @@ create_desktop () {
exe_file="$(find "$FIND_PATH" -type f -not -type l \
-not -path "*/windows/*" -not -path "*/dosdevices/*" \
-iname "$BASENAME_EXE")"
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]]
then fatal "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
else print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]] ; then
print_error "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
return 1
else
print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
fi
fi
@@ -1284,7 +1282,8 @@ init_wineprefix () {
echo "# переменные последнего использования префикса:" > "$WINEPREFIX/last.conf"
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 \
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
echo "export $var=\"${!var}\"" >> "$WINEPREFIX/last.conf"
done
@@ -1345,23 +1344,25 @@ kill_wine () {
}
init_database () {
WHDB_FILE="0"
if [[ -f "$WIN_FILE_EXEC" ]] ; then
local whdb_file="0"
if [[ -n "$WIN_FILE_EXEC" ]] \
&& [[ -f "$WIN_FILE_EXEC" ]]
then
WHDB="$(basename "$WIN_FILE_EXEC" .exe)"
if [[ -f "$WIN_FILE_EXEC".whdb ]] ; then
WHDB_FILE="$WIN_FILE_EXEC".whdb
whdb_file="$WIN_FILE_EXEC".whdb
else
orig_IFS="$IFS" && IFS=$'\n'
if WH_FIND_DB_FILE="$(grep -ilw "#$WHDB.exe" "$WH_DB_DIR"/* )" ; then
WHDB_FILE="$WH_FIND_DB_FILE"
whdb_file="$WH_FIND_DB_FILE"
fi
IFS="$orig_IFS"
fi
fi
if [[ "$WHDB_FILE" != "0" ]] ; then
print_info "Используется файл настроек: $WHDB_FILE"
. "$WHDB_FILE"
if [[ "$whdb_file" != "0" ]] ; then
print_info "Используется файл настроек: $whdb_file"
. "$whdb_file"
fi
if check_prefix_var && [[ -f "$WINEPREFIX/last.conf" ]] ; then
@@ -1387,48 +1388,73 @@ prepair_wine () {
}
wine_run () {
if [[ $WINEARCH == "win32" ]] \
&& file "$WIN_FILE_EXEC" | grep -q "x86-64"
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
fi
local wh_add_args win_file_exec win_file_path win_file_name
WIN_FILE_PATH="$(dirname "$WIN_FILE_EXEC")"
[[ -d "$WIN_FILE_PATH" ]] && cd "$WIN_FILE_PATH"
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 [[ -f "$1" ]] ; then
win_file_exec="$(readlink -f "$1")"
win_file_path="$(dirname "$win_file_exec")"
win_file_name="$(basename "$win_file_exec")"
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"
case "${win_file_name,,}" in
*.exe) wh_add_args="$WINE_WIN_START" ;;
*.msi) wh_add_args="msiexec /i" ;;
*.bat|*.cmd) wh_add_args="" ;;
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
esac
echo "##### Лог WINE #####" | tee -a "$LOG_FILE"
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS 2>&1 | tee -a "$LOG_FILE"
if [[ $WINEARCH == "win32" ]] \
&& file "$win_file_exec" | grep -q "x86-64"
then fatal "Нельзя запустить 64-битное приложение в 32-битном префиксе!"
fi
else
$MANGOHUD_RUN "$WINELOADER" "$@" $LAUNCH_PARAMETERS
fatal "Команда введена не правильно или не найден исполняемый файл $1"
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
cd "$DRIVE_C"
}
wine_run_install () {
print_info "Запускаем установку: $1."
if [[ "$INSTALL_MODE" == "manual" ]]
then print_warning "Рекомендуется не менять пути для установки приложения!"
fi
[[ ! -f "$1" ]] && fatal "Нет файла для установки: $1"
case "${1,,}" in
*.exe) wine_run $WINE_WIN_START "$@" ;;
*.msi) wine_run msiexec /i "$@" ;;
*.bat|*.cmd) wine_run "$@" ;;
*) fatal "Не удалось запустить файл $1. Проверьте расширение файла." ;;
case "$WH_INSTALL_MODE" in
"manual") print_warning "Рекомендуется не менять пути для установки приложения!" ;;
"test") print_warning "Установка приложения из списка экспериментальных скриптов." ;;
esac
wait_wineserver
if [[ ! -f "$1" ]]
then fatal "Нет файла для установки: $1"
else wine_run "$@"
fi
}
run_autoinstall () {
if [[ $WH_USE_GUI == "1" ]] \
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
then print_ok "Соглашения приняты из графического интерфейса."
else print_license_agreement
fi
if [[ $1 == "--clear-pfx" ]] ; then
export CLEAR_PREFIX="1"
shift
@@ -1443,47 +1469,55 @@ run_autoinstall () {
elif [[ -f "$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
INSTALL_SCRIPT="$WH_MANUALINSTALL_DIR/$INSTALL_SCRIPT_NAME"
WH_INSTALL_MODE="manual"
elif [[ -d "$WH_TESTINSTALL_DIR" ]] \
&& [[ -f "$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]]
then
elif [[ -f "$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME" ]] ; then
INSTALL_SCRIPT="$WH_TESTINSTALL_DIR/$INSTALL_SCRIPT_NAME"
WH_INSTALL_MODE="test"
else
INSTALL_SCRIPT="0"
fi
export INSTALL_SCRIPT INSTALL_MODE
export INSTALL_SCRIPT WH_INSTALL_MODE
if [[ $INSTALL_SCRIPT_NAME == "list" ]] || [[ -z "$INSTALL_SCRIPT_NAME" ]] ; then
list_install_scripts() {
local dir="$1"
local title="$2"
[[ ! -d "$dir" ]] || [[ -z "$(ls -A "$dir" 2>/dev/null)" ]] && return
print_install_list () {
parse_install_scripts() {
local parse_dir="$1"
[[ ! -d "$parse_dir" ]] || [[ -z "$(ls -A "$parse_dir" 2>/dev/null)" ]] && return
print_info "$title"
awk '
FNR==1 {
if (progname) {
printf "\n%s - %s\n%s\n", filename, progname, info
awk '
FNR==1 {
if (progname) {
printf "\n%s - %s\n%s\n", filename, progname, info
}
progname=""; info=""; filename=FILENAME
sub(".*/", "", filename)
}
progname=""; info=""; filename=FILENAME
sub(".*/", "", filename)
}
/info_ru:/ { sub(/.*info_ru: /, ""); info=$0 }
/PROG_NAME=/ { sub(/.*PROG_NAME=/, ""); progname=$0 }
END {
if (progname) {
printf "\n%s - %s\n%s\n", filename, progname, info
/info_ru:/ { sub(/.*info_ru: /, ""); info=$0 }
/PROG_NAME=/ { sub(/.*PROG_NAME=/, ""); progname=$0 }
END {
if (progname) {
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" "Список программ с возможностью автоматической установки:"
echo
list_install_scripts "$WH_MANUALINSTALL_DIR" "Список программ с возможностью установки из существующего дистрибутива:"
print_install_list | less -R --use-color
elif [[ "$INSTALL_SCRIPT" != "0" ]] ; then
if [[ $WH_USE_GUI == "1" ]] \
&& [[ $(ps -o command= -p "$PPID" | awk '{print $2}') =~ "$DATA_PATH/winehelper_gui.py" ]]
then print_ok "Соглашения приняты из графического интерфейса."
else print_license_agreement
fi
source "$INSTALL_SCRIPT" "$@"
print_info "Завершена установка $INSTALL_SCRIPT_NAME"
else
@@ -1774,6 +1808,7 @@ remove_winehelper () {
echo " - Все настройки WineHelper"
echo " - Все приложения/программы, установленные через WineHelper"
echo " - Все ярлыки из меню и с рабочего стола, созданные с помощью WineHelper"
echo " - Все резервные копии и логи, созданные WineHelper"
echo "======================================================"
if print_confirmation "Продолжить?" ; then
echo "----------------------------------------------"
@@ -1789,6 +1824,7 @@ remove_winehelper () {
# Удаление рабочих каталогов
try_remove_dir "$USER_WORK_PATH"
try_remove_dir "$HOME/winehelper_backup_log"
# Удаление файлов меню
try_remove_dir "$WH_MENU_DIR"
@@ -1867,7 +1903,8 @@ backup_prefix() {
check_prefix_var
local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir
backup_base_dir="$(xdg-user-dir DESKTOP)"
backup_base_dir="$HOME/winehelper_backup_log"
create_new_dir "$backup_base_dir"
backup_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack"
backup_dest_path="$backup_base_dir/$backup_archive_name"
temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)"
@@ -2146,20 +2183,21 @@ select_component_version() {
}
run_install_to_prefix() {
export WINEPREFIX="$1"
local WIN_FILE_EXEC="$2"
if [[ -z "$WINEPREFIX" ]] || [[ -z "$WIN_FILE_EXEC" ]]; then
if [[ -z "$1" ]] || [[ -z "$2" ]] || [[ ! -f "$2" ]] ; then
fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>"
fi
export WINEPREFIX="$1"
shift
check_prefix_var
prepair_wine
wine_run_install "$WIN_FILE_EXEC"
wine_run "$@"
}
run_install_dxvk() {
local version="$1"
if [[ -z "$version" ]] ; then
version=$(select_component_version "DXVK")
[[ $? -ne 0 ]] && print_info "Установка DXVK отменена." && return
@@ -2167,21 +2205,27 @@ run_install_dxvk() {
list_component_versions "DXVK"
return
fi
check_prefix_var
init_database
export DXVK_VER="$version"
init_wine_ver
init_wineprefix
if [[ "$DXVK_VER" == "none" ]]
then print_info "Удаление DXVK..."
else print_info "Установка DXVK: $DXVK_VER"
fi
init_dxvk "$DXVK_VER"
wait_wineserver
}
run_install_vkd3d() {
local version="$1"
if [[ -z "$version" ]] ; then
version=$(select_component_version "VKD3D")
[[ $? -ne 0 ]] && print_info "Установка VKD3D отменена." && return
@@ -2189,15 +2233,20 @@ run_install_vkd3d() {
list_component_versions "VKD3D"
return
fi
check_prefix_var
init_database
export VKD3D_VER="$version"
init_wine_ver
init_wineprefix
if [[ "$VKD3D_VER" == "none" ]]
then print_info "Удаление VKD3D..."
else print_info "Установка VKD3D: $VKD3D_VER"
fi
init_vkd3d "$VKD3D_VER"
wait_wineserver
}
@@ -2216,9 +2265,7 @@ run_change_wine_version() {
fi
init_wine_ver
init_wineprefix
wait_wineserver
print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE."
}
@@ -2258,7 +2305,8 @@ create_new_dir "$WH_DIST_DIR"
create_new_dir "$WH_PREFIXES_DIR"
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" ]]
then try_force_link_dir "$HOME/.local/share/$SCRIPT_NAME" "$HOME/.winehelper"
fi
@@ -2304,12 +2352,14 @@ case "$arg1" in
WIN_FILE_EXEC="$(readlink -f "$arg1")"
WIN_FILE_NAME="$(basename "$WIN_FILE_EXEC")"
find_prefix "$WIN_FILE_EXEC"
case "${WIN_FILE_NAME,,}" in
*.exe) prepair_wine ; wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" ;;
*.msi) prepair_wine ; wine_run msiexec /i "$WIN_FILE_EXEC" "$@" ;;
*.bat|*.cmd) prepair_wine ; wine_run start "$WIN_FILE_EXEC" "$@" ;;
*) fatal "Тип файла не поддерживается." ;;
esac
prepair_wine
if [[ -n "$1" ]] && [[ -f "$1" ]] ; then
WIN_OPEN_FILE="$("$WINELOADER" winepath -w "$1")"
shift
fi
wine_run "$WIN_FILE_EXEC" "$@" "$WIN_OPEN_FILE"
else
print_error "Команды $arg1 не существует."
wh_info

View File

@@ -13,7 +13,7 @@ from functools import partial
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar,
QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu)
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal
from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor
from PyQt5.QtNetwork import QLocalServer, QLocalSocket
@@ -428,6 +428,8 @@ class WinetricksManagerDialog(QDialog):
"Для переустановки компонента: Выделите его в списке и нажмите кнопку «Переустановить»."
)
installation_complete = pyqtSignal()
def __init__(self, prefix_path, winetricks_path, parent=None, wine_executable=None):
super().__init__(parent)
self.prefix_path = prefix_path
@@ -617,12 +619,33 @@ class WinetricksManagerDialog(QDialog):
self._log(f"--- Предупреждение: не удалось прочитать {log_path}: {e} ---")
return installed_verbs
def _parse_winetricks_list_output(self, output, installed_verbs, list_widget):
def _parse_winetricks_list_output(self, output, installed_verbs, list_widget, category):
"""Парсит вывод 'winetricks list' и заполняет QListWidget."""
# Regex, который обрабатывает строки как с префиксом статуса '[ ]', так и без него.
# 1. `(?:\[(.)]\s+)?` - опциональная группа для статуса (напр. '[x]').
# 2. `([^\s]+)` - имя компонента (без пробелов).
# 3. `(.*)` - оставшаяся часть строки (описание).
# Определяем шаблоны для фильтрации на основе категории
dlls_blacklist_pattern = None
fonts_blacklist_pattern = None
settings_blacklist_pattern = None
if category == 'dlls':
# Исключаем d3d*, directx9, dont_use, dxvk*, vkd3d*, galliumnine, faudio*, Foundation
dlls_blacklist_pattern = re.compile(
r'^(d3d|directx9|dont_use|dxvk|vkd3d|galliumnine|faudio|foundation)', re.IGNORECASE
)
elif category == 'fonts':
fonts_blacklist_pattern = re.compile(
r'^(dont_use)', re.IGNORECASE
)
elif category == 'settings':
# Исключаем vista*, alldlls, autostart_*, bad*, good*, win*, videomemory*, vd=*, isolate_home
settings_blacklist_pattern = re.compile(
r'^(vista|alldlls|autostart_|bad|good|win|videomemory|vd=|isolate_home)', re.IGNORECASE
)
line_re = re.compile(r"^\s*(?:\[(.)]\s+)?([^\s]+)\s*(.*)")
found_items = False
@@ -643,6 +666,14 @@ class WinetricksManagerDialog(QDialog):
if '/' in name or '\\' in name or name.lower() in ('executing', 'using', 'warning:') or name.endswith(':'):
continue
# Применяем фильтры для черных списков
if dlls_blacklist_pattern and dlls_blacklist_pattern.search(name):
continue
if fonts_blacklist_pattern and fonts_blacklist_pattern.search(name):
continue
if settings_blacklist_pattern and settings_blacklist_pattern.search(name):
continue
is_checked = name in installed_verbs
item_text = f"{name.ljust(27)}{description.strip()}"
item = QListWidgetItem(item_text)
@@ -681,7 +712,7 @@ class WinetricksManagerDialog(QDialog):
self._log("--------------------------------------------------", "red")
else:
installed_verbs = self._parse_winetricks_log()
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget)
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget, category)
if from_cache is None: # Только если мы не читали из кэша
# Сохраняем успешный результат в кэш
@@ -856,6 +887,7 @@ class WinetricksManagerDialog(QDialog):
# Перезагружаем данные, чтобы обновить состояние
self.initial_states.clear()
self.load_all_categories()
self.installation_complete.emit()
self.installation_finished = True
def closeEvent(self, event):
@@ -1590,10 +1622,34 @@ class WineHelperGUI(QMainWindow):
"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_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.process = None
@@ -1636,8 +1692,8 @@ class WineHelperGUI(QMainWindow):
self.main_layout.addLayout(content_layout)
# Фиксируем минимальные размеры
self.stacked_widget.setMinimumWidth(520)
self.info_panel.setMinimumWidth(415)
self.stacked_widget.setMinimumWidth(535)
self.info_panel.setMinimumWidth(395)
# Вкладки
self.create_auto_install_tab()
@@ -1732,8 +1788,9 @@ class WineHelperGUI(QMainWindow):
if tab_name == "Автоматическая установка":
title = "Автоматическая установка"
html_content = ("<h3>Автоматическая установка</h3>"
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас.</p>"
"<p>Просто выберите программу и нажмите «Установить».</p>")
"<p>Скрипты из этого списка скачают, установят и настроят приложение за вас. "
"Просто выберите программу и нажмите «Установить».</p>"
"<p>Для доступа к экспериментальным скриптам установки отметьте опцию <b>«Показать тестовые версии»</b> внизу списка.</p>")
show_global = False
elif tab_name == "Ручная установка":
title = "Ручная установка"
@@ -1762,6 +1819,7 @@ class WineHelperGUI(QMainWindow):
if show_global:
self.backup_button.setVisible(False)
self.create_log_button.setVisible(False)
self.open_log_dir_button.setVisible(False)
self.uninstall_button.setVisible(False)
self.current_selected_app = None
@@ -1856,6 +1914,7 @@ class WineHelperGUI(QMainWindow):
# --- Верхний ряд кнопок ---
top_buttons_layout = QHBoxLayout()
self.run_button = QPushButton("Запустить")
self.run_button.setStyleSheet(self.RUN_BUTTON_STYLE)
self.run_button.clicked.connect(self.toggle_run_stop_app)
top_buttons_layout.addWidget(self.run_button)
installed_action_layout.addLayout(top_buttons_layout)
@@ -1877,6 +1936,12 @@ class WineHelperGUI(QMainWindow):
self.backup_button.clicked.connect(self.backup_prefix_for_app)
installed_global_layout.addWidget(self.backup_button)
self.open_log_dir_button = QPushButton("Открыть папку с логом/резервной копией префикса")
self.open_log_dir_button.setIcon(QIcon.fromTheme("folder-open"))
self.open_log_dir_button.clicked.connect(self.open_log_directory)
self.open_log_dir_button.setVisible(False) # Скрыта по умолчанию
installed_global_layout.addWidget(self.open_log_dir_button)
self.uninstall_button = QPushButton("Удалить префикс")
self.uninstall_button.setIcon(QIcon.fromTheme("user-trash"))
self.uninstall_button.clicked.connect(self.uninstall_app)
@@ -2013,14 +2078,14 @@ class WineHelperGUI(QMainWindow):
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 кнопками установщиков.
Кнопки создаются только для скриптов, в которых найдена переменная PROG_NAME.
:param grid_layout: QGridLayout для заполнения.
:param scripts_list: Список имен скриптов.
:param script_folder: Имя папки со скриптами ('autoinstall' или 'manualinstall').
:param script_folder: Имя папки со скриптами ('autoinstall', 'manualinstall' или 'testinstall').
:param button_list: Список для хранения созданных кнопок.
"""
button_index = 0
@@ -2034,7 +2099,13 @@ class WineHelperGUI(QMainWindow):
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]
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()
@@ -2044,12 +2115,12 @@ class WineHelperGUI(QMainWindow):
layout.addWidget(btn)
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)
button_list.append(btn)
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):
"""
Создает стандартную вкладку с полем поиска и сеточным макетом с прокруткой.
Возвращает кортеж (главный виджет вкладки, сеточный макет, поле поиска, область прокрутки).
@@ -2083,11 +2154,12 @@ class WineHelperGUI(QMainWindow):
grid_layout.setColumnStretch(1, 1)
v_scroll_layout.addLayout(grid_layout)
v_scroll_layout.addStretch(1)
if add_stretch:
v_scroll_layout.addStretch(1)
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):
"""
Создает и заполняет вкладку для установки (автоматической или ручной).
Возвращает кортеж со скриптами, кнопками и виджетами.
@@ -2097,15 +2169,16 @@ class WineHelperGUI(QMainWindow):
)
scripts = []
script_path = os.path.join(Var.DATA_PATH, script_folder)
if os.path.isdir(script_path):
try:
scripts = sorted(os.listdir(script_path))
except OSError as e:
print(f"Не удалось прочитать директорию {script_path}: {e}")
buttons_list = []
self._populate_install_grid(grid_layout, scripts, script_folder, buttons_list)
for folder in script_folders:
script_path = os.path.join(Var.DATA_PATH, folder)
if os.path.isdir(script_path):
try:
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:
print(f"Не удалось прочитать директорию {script_path}: {e}")
self.add_tab(tab_widget, tab_title)
@@ -2117,30 +2190,89 @@ class WineHelperGUI(QMainWindow):
scripts, buttons, layout,
search_edit, scroll_area
) = self._create_and_populate_install_tab(
"Автоматическая установка", "autoinstall", "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
"Автоматическая установка", ["autoinstall"], "Поиск скрипта автоматической установки...", partial(self.filter_buttons, 'auto')
)
self.autoinstall_scripts = scripts
self.install_tabs_data['auto'] = {
'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area
}
# Добавляем чекбокс для тестовых версий
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):
"""Создает вкладку для ручной установки программ"""
(
scripts, buttons, layout,
search_edit, scroll_area
) = self._create_and_populate_install_tab(
"Ручная установка", "manualinstall", "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
"Ручная установка", ["manualinstall"], "Поиск скрипта ручной установки...", partial(self.filter_buttons, 'manual')
)
self.manualinstall_scripts = scripts
self.install_tabs_data['manual'] = {
'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
script_folders = ["autoinstall"]
if data['test_checkbox'].isChecked():
script_folders.append("testinstall")
# Перед удалением кнопок останавливаем все связанные с ними таймеры анимации
for btn in data['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 self.current_active_button in data['buttons']:
self.current_active_button = None
# Очищаем старые кнопки и layout
for btn in data['buttons']:
btn.parent().deleteLater()
data['buttons'].clear()
# Заполняем layout новыми кнопками
scripts = []
for folder in script_folders:
script_path = os.path.join(Var.DATA_PATH, folder)
if os.path.isdir(script_path):
try:
folder_scripts = sorted(os.listdir(script_path))
self._populate_install_grid(data['layout'], folder_scripts, folder, data['buttons'])
scripts.extend(folder_scripts)
except OSError as e:
print(f"Не удалось прочитать директорию {script_path}: {e}")
self.autoinstall_scripts = scripts
# Применяем текущий фильтр поиска к обновленному списку
self.filter_buttons('auto')
def create_installed_tab(self):
"""Создает вкладку для отображения установленных программ в виде кнопок"""
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, "Установленные")
@@ -2172,6 +2304,13 @@ class WineHelperGUI(QMainWindow):
self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected)
selector_layout.addWidget(self.created_prefix_selector, 1)
self.open_prefix_folder_button = QPushButton()
self.open_prefix_folder_button.setIcon(QIcon.fromTheme("folder-open"))
self.open_prefix_folder_button.setToolTip("Открыть папку префикса в файловом менеджере")
self.open_prefix_folder_button.setEnabled(False)
self.open_prefix_folder_button.clicked.connect(self.open_selected_prefix_folder)
selector_layout.addWidget(self.open_prefix_folder_button)
self.create_base_pfx_button = QPushButton()
self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export"))
self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)")
@@ -2316,6 +2455,24 @@ class WineHelperGUI(QMainWindow):
management_layout.setColumnStretch(2, 2)
container_layout.addWidget(self.prefix_management_groupbox)
# --- Кнопка полного удаления ---
# Добавляем разделитель и кнопку в основной контейнер управления
container_layout.addSpacing(15)
self.remove_all_button = QPushButton("Удалить все данные WineHelper")
self.remove_all_button.setStyleSheet("""
QPushButton:!disabled {
background-color: #d32f2f;
color: white;
padding: 5px;
}
""")
self.remove_all_button.setMinimumHeight(32)
self.remove_all_button.setFont(QFont('Arial', 10, QFont.Bold))
self.remove_all_button.setToolTip("ВНИМАНИЕ: Удаляет ВСЕ данные WineHelper, включая все префиксы, настройки и ярлыки.")
self.remove_all_button.clicked.connect(self.remove_all_data)
container_layout.addWidget(self.remove_all_button)
layout.addWidget(self.management_container_groupbox)
layout.addStretch()
self.add_tab(self.prefix_tab, "Менеджер префиксов")
@@ -2357,6 +2514,7 @@ class WineHelperGUI(QMainWindow):
prefix_names = []
self.created_prefix_selector.blockSignals(True)
self.remove_all_button.setEnabled(bool(prefix_names))
self.created_prefix_selector.clear()
if prefix_names:
self.created_prefix_selector.addItems(prefix_names)
@@ -2372,7 +2530,9 @@ class WineHelperGUI(QMainWindow):
self.current_managed_prefix_name = None
self._setup_prefix_management_panel(None)
self.delete_prefix_button.setEnabled(False)
self.remove_all_button.setEnabled(False)
self.create_base_pfx_button.setEnabled(False)
self.open_prefix_folder_button.setEnabled(False)
else:
# Прокручиваем к выбранному элементу, чтобы он был виден в списке
self.created_prefix_selector.view().scrollTo(
@@ -2382,7 +2542,9 @@ class WineHelperGUI(QMainWindow):
self.current_managed_prefix_name = prefix_name
self._setup_prefix_management_panel(prefix_name)
self.delete_prefix_button.setEnabled(True)
self.remove_all_button.setEnabled(True)
self.create_base_pfx_button.setEnabled(True)
self.open_prefix_folder_button.setEnabled(True)
def delete_selected_prefix(self):
"""Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'."""
@@ -2491,6 +2653,21 @@ class WineHelperGUI(QMainWindow):
self._run_simple_command("create-base-pfx", [prefix_name])
self.command_dialog.exec_()
def open_selected_prefix_folder(self):
"""Открывает папку выбранного префикса в системном файловом менеджере."""
prefix_name = self.current_managed_prefix_name
if not prefix_name:
return
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
if os.path.isdir(prefix_path):
try:
subprocess.Popen(['xdg-open', prefix_path])
except Exception as e:
QMessageBox.warning(self, "Ошибка", f"Не удалось открыть директорию:\n{prefix_path}\n\nОшибка: {e}")
else:
QMessageBox.warning(self, "Ошибка", f"Директория префикса не найдена:\n{prefix_path}")
def _setup_prefix_management_panel(self, prefix_name):
"""Настраивает панель управления префиксом на основе текущего состояния."""
is_prefix_selected = bool(prefix_name)
@@ -2549,19 +2726,39 @@ class WineHelperGUI(QMainWindow):
self.esync_button.blockSignals(False)
self.fsync_button.blockSignals(False)
# --- Чтение и отображение установленных компонентов Winetricks ---
winetricks_log_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name, "winetricks.log")
installed_verbs = []
if os.path.exists(winetricks_log_path):
try:
with open(winetricks_log_path, 'r', encoding='utf-8') as f:
for line in f:
verb = line.split('#', 1)[0].strip()
if verb:
installed_verbs.append(verb)
except IOError as e:
print(f"Ошибка чтения winetricks.log: {e}")
# Фильтруем служебные компоненты, чтобы не засорять вывод
verbs_to_ignore = {
'isolate_home', 'winxp', 'win7', 'win10', 'win11',
'vista', 'win2k', 'win2k3', 'win2k8', 'win8', 'win81',
'workaround', 'internal'
}
display_verbs = sorted([v for v in installed_verbs if v not in verbs_to_ignore])
# Карта для красивого отображения известных переменных
display_map = {
"WINEPREFIX": ("Путь", lambda v: v),
"WINEARCH": ("Архитектура", lambda v: "64-bit" if v == "win64" else "32-bit"),
"WH_WINE_USE": ("Версия Wine", lambda v: "Системная" if v == "system" else v),
"BASE_PFX": ("Тип", lambda v: 'Чистый' if v == "none" else 'С рекомендуемыми библиотеками'),
"DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"),
"VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"),
"WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"),
"WINEFSYNC": ("FSync", lambda v: "Включен" if v == "1" else "Выключен"),
"WH_XDG_OPEN": ("Ассоциации файлов", lambda v: v if v and v != "0" else "Не заданы"),
}
display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "BASE_PFX", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC", "WH_XDG_OPEN"]
display_order = ["WINEPREFIX", "WINEARCH", "WH_WINE_USE", "DXVK_VER", "VKD3D_VER", "WINEESYNC", "WINEFSYNC", "WH_XDG_OPEN"]
html_content = f'<p style="line-height: 1.3; font-size: 9pt;">'
html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>"
@@ -2583,6 +2780,15 @@ class WineHelperGUI(QMainWindow):
html_content += "<br><b>Дополнительные параметры:</b><br>"
html_content += other_vars_html
html_content += "<br><b>Компоненты (Winetricks):</b> "
if display_verbs:
# Используем span вместо div, чтобы избежать лишних отступов
html_content += '<span style="max-height: 120px; overflow-y: auto;">'
html_content += ", ".join(html.escape(v) for v in display_verbs)
html_content += '</span>'
else:
html_content += "Не установлены"
html_content += "</p>"
self.prefix_info_display.setHtml(html_content)
@@ -3139,9 +3345,6 @@ class WineHelperGUI(QMainWindow):
"""Открывает диалог создания нового префикса."""
dialog = CreatePrefixDialog(self)
if dialog.exec_() == QDialog.Accepted:
if not self._show_license_agreement_dialog():
return
self.start_prefix_creation(
prefix_name=dialog.prefix_name,
wine_arch=dialog.wine_arch,
@@ -3358,11 +3561,7 @@ class WineHelperGUI(QMainWindow):
self.current_selected_app['name'] = name
self.current_selected_app['exec'] = exec_cmd
# Состояния кнопки
if desktop_path in self.running_apps:
self.run_button.setText("Остановить")
else:
self.run_button.setText("Запустить")
self._set_run_button_state(desktop_path in self.running_apps)
# Показываем панель информации
self.info_panel.setVisible(True)
@@ -3378,6 +3577,7 @@ class WineHelperGUI(QMainWindow):
self.installed_global_action_widget.setVisible(True)
self.backup_button.setVisible(True)
self.create_log_button.setVisible(True)
self.update_open_log_dir_button_visibility()
self.uninstall_button.setVisible(True)
self.manual_install_path_widget.setVisible(False)
@@ -3386,6 +3586,27 @@ class WineHelperGUI(QMainWindow):
self.current_selected_app = None
self.info_panel.setVisible(False)
def update_open_log_dir_button_visibility(self):
"""Проверяет наличие лог-файла или бэкапов и обновляет видимость кнопки."""
log_dir_path = os.path.join(os.path.expanduser("~"), "winehelper_backup_log")
is_visible = False
if os.path.isdir(log_dir_path):
# Кнопка должна быть видна, если директория не пуста.
if os.listdir(log_dir_path):
is_visible = True
self.open_log_dir_button.setVisible(is_visible)
def open_log_directory(self):
"""Открывает директорию с лог-файлами."""
log_dir_path = os.path.join(os.path.expanduser("~"), "winehelper_backup_log")
if os.path.isdir(log_dir_path):
try:
subprocess.Popen(['xdg-open', log_dir_path])
except Exception as e:
QMessageBox.warning(self, "Ошибка", f"Не удалось открыть директорию:\n{log_dir_path}\n\nОшибка: {e}")
else:
QMessageBox.information(self, "Информация", f"Директория с логами не найдена:\n{log_dir_path}")
def _get_prefix_name_for_selected_app(self):
"""Извлекает имя префикса для выбранного приложения."""
if not self.current_selected_app or 'desktop_path' not in self.current_selected_app:
@@ -3426,8 +3647,8 @@ class WineHelperGUI(QMainWindow):
msg_box = QMessageBox(self)
msg_box.setWindowTitle("Создание резервной копии")
msg_box.setText(
f"Будет создана резервная копия префикса '{prefix_name}'.\n"
f"Файл будет сохранен на вашем Рабочем столе в формате .whpack.\n\nПродолжить?"
f"Будет создана резервная копия префикса '{prefix_name}'.\n\n"
f"Файл будет сохранен в домашней директории в папке winehelper_backup_log/ в формате .whpack.\n\nПродолжить?"
)
msg_box.addButton(yes_button, QMessageBox.YesRole)
msg_box.addButton(no_button, QMessageBox.NoRole)
@@ -3460,6 +3681,7 @@ class WineHelperGUI(QMainWindow):
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
self.command_process.finished.connect(self._handle_command_finished)
self.command_process.finished.connect(self.update_open_log_dir_button_visibility)
winehelper_path = self.winehelper_path
args = ["backup-prefix", prefix_name]
@@ -3525,9 +3747,10 @@ class WineHelperGUI(QMainWindow):
msg_box = QMessageBox(self)
msg_box.setWindowTitle("Создание лога")
msg_box.setText(
"Приложение будет запущено в режиме отладки.\n"
"После закрытия приложения лог будет сохранен в вашем домашнем каталоге "
"под именем 'winehelper.log'."
"Приложение будет запущено в режиме отладки.\n\n"
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' "
"в вашем домашнем каталоге под именем (пример: prefix_program.log).\n\n"
"Продолжить?"
)
msg_box.addButton(yes_button, QMessageBox.YesRole)
msg_box.addButton(no_button, QMessageBox.NoRole)
@@ -3569,6 +3792,7 @@ class WineHelperGUI(QMainWindow):
wine_executable = self._get_wine_executable_for_prefix(prefix_name)
dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self, wine_executable=wine_executable)
dialog.installation_complete.connect(lambda: self.update_prefix_info_display(prefix_name))
dialog.exec_()
def _get_wine_executable_for_prefix(self, prefix_name):
@@ -3731,10 +3955,27 @@ class WineHelperGUI(QMainWindow):
# Если текущее выбранное приложение - то, что только что завершилось, обновляем кнопку
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:
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):
"""Внутренний метод для запуска приложения (с отладкой или без) с использованием QProcess."""
if not self.current_selected_app or 'exec' not in self.current_selected_app:
@@ -3793,6 +4034,7 @@ class WineHelperGUI(QMainWindow):
# и избегания проблем с замыканием в lambda.
process.finished.connect(partial(self._on_app_process_finished, desktop_path))
process.finished.connect(self.update_open_log_dir_button_visibility)
try:
process.start(program, arguments)
@@ -3800,7 +4042,7 @@ class WineHelperGUI(QMainWindow):
raise RuntimeError(f"Не удалось запустить процесс: {process.errorString()}")
self.running_apps[desktop_path] = process
self.run_button.setText("Остановить")
self._set_run_button_state(True)
print(f"Запущено: {program} {' '.join(arguments)}")
except Exception as e:
QMessageBox.critical(self, "Ошибка запуска",
@@ -3811,6 +4053,55 @@ class WineHelperGUI(QMainWindow):
QMessageBox.critical(self, "Ошибка",
f"Не удалось обработать команду запуска:\n{command_str}\n\nОшибка: {str(e)}")
def remove_all_data(self):
"""Запускает процесс полного удаления всех данных WineHelper."""
# Первое подтверждение
msg_box1 = QMessageBox(self)
msg_box1.setIcon(QMessageBox.Critical)
msg_box1.setWindowTitle('Подтверждение полного удаления')
msg_box1.setText(
"<h2>ВНИМАНИЕ!</h2>"
"<p>Это действие полностью и безвозвратно удалит <b>ВСЕ</b> данные, связанные с WineHelper, включая:</p>"
"<ul>"
"<li>Все созданные префиксы и установленные в них программы.</li>"
"<li>Все ярлыки в меню и на рабочем столе.</li>"
"<li>Все настройки, кэш и резервные копии.</li>"
"</ul>"
"<p>Продолжить?</p>"
)
msg_box1.setTextFormat(Qt.RichText)
yes_button1 = msg_box1.addButton("Да, я понимаю", QMessageBox.YesRole)
no_button1 = msg_box1.addButton("Отмена", QMessageBox.NoRole)
msg_box1.setDefaultButton(no_button1)
msg_box1.exec_()
if msg_box1.clickedButton() != yes_button1:
return
# Второе, финальное подтверждение
msg_box2 = QMessageBox(self)
msg_box2.setIcon(QMessageBox.Critical)
msg_box2.setWindowTitle('Последнее предупреждение')
msg_box2.setText("<h3>Вы уверены, что хотите удалить ВСЁ?</h3><p>Это действие необратимо.</p>")
msg_box2.setTextFormat(Qt.RichText)
yes_button2 = msg_box2.addButton("Да, удалить всё", QMessageBox.DestructiveRole)
no_button2 = msg_box2.addButton("Нет, я передумал", QMessageBox.RejectRole)
msg_box2.setDefaultButton(no_button2)
msg_box2.exec_()
if msg_box2.clickedButton() != yes_button2:
return
# Запускаем команду и выходим из приложения
try:
# Запускаем команду в фоне и не ждем ее завершения
subprocess.Popen([self.winehelper_path, "remove-all", "--force"])
# Сообщаем пользователю и закрываем GUI
QMessageBox.information(self, "Удаление", "Запущена процедура удаления WineHelper. Приложение будет закрыто.")
self.quit_application()
except Exception as e:
QMessageBox.critical(self, "Ошибка", f"Не удалось запустить команду удаления: {e}")
def quit_application(self):
"""Инициирует процесс выхода из приложения."""
self.is_quitting = True
@@ -4029,6 +4320,8 @@ class WineHelperGUI(QMainWindow):
if script_name in self.autoinstall_scripts:
script_path = os.path.join(Var.DATA_PATH, "autoinstall", script_name)
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)
else:
script_path = os.path.join(Var.DATA_PATH, "manualinstall", script_name)
@@ -4194,7 +4487,9 @@ class WineHelperGUI(QMainWindow):
winehelper_path = self.winehelper_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)
if not os.path.exists(winehelper_path):
@@ -4511,6 +4806,7 @@ class WineHelperGUI(QMainWindow):
self.command_process.deleteLater()
self.command_process = None
self.command_close_button.setEnabled(True)
self.command_log_output.ensureCursorVisible()
def _handle_launcher_creation_finished(self, exit_code, exit_status):
"""Обрабатывает завершение создания ярлыка."""