Compare commits
	
		
			42 Commits
		
	
	
		
			66c56f6ecf
			...
			tflex18
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6476a84ce7 | ||
|  | db7e3f5220 | ||
|  | 9029f4d0e8 | ||
|  | cedebe73c1 | ||
|  | e04811446c | ||
|  | 15712f0a0a | ||
|  | 8eeee56ee1 | ||
|  | ac4dd4f0bf | ||
|  | c15d751372 | ||
|  | 78113b92a5 | ||
|  | 9e8e41e812 | ||
|  | 5f4d3a54b1 | ||
|  | 9d16883e6e | ||
|  | e3cafee4f5 | ||
|  | e2b2c9568c | ||
|  | 7113d864be | ||
|  | 9a1a88d01b | ||
|  | ad775e4644 | ||
|  | 36f5c306c5 | ||
|  | 173a7ae41f | ||
|  | 32e56879f7 | ||
|  | b88ea9f478 | ||
|  | dd82cee5ea | ||
|  | a35efc347d | ||
|  | 95a8d370ab | ||
|  | dd2901c85e | ||
|  | 9f28363ac2 | ||
|  | 756c9e6d9e | ||
|  | 663cd10a5f | ||
|  | 86beb9eaee | ||
|  | 4610f6a6da | ||
|  | 4563d5641f | ||
| 17a8f3c63d | |||
|  | 08ef246712 | ||
|  | 07e220794d | ||
|  | 15432ace98 | ||
|  | e04a59507b | ||
|  | d5f337e6b4 | ||
|  | 904c9c9895 | ||
|  | 1d4ee1fd70 | ||
|  | 02a2256c8c | ||
|  | cbcdba204e | 
							
								
								
									
										17
									
								
								CHANGELOG
									
									
									
									
									
								
							
							
						
						| @@ -1,5 +1,22 @@ | |||||||
| История изменений: | История изменений: | ||||||
|  |  | ||||||
|  | 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: | 0.5.4: | ||||||
| * обновлен графический режим Qt5: | * обновлен графический режим Qt5: | ||||||
|     - добавлена возможность установки системных зависимостей |     - добавлена возможность установки системных зависимостей | ||||||
|   | |||||||
							
								
								
									
										371
									
								
								README.md
									
									
									
									
									
										Normal 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) | ||||||
							
								
								
									
										17
									
								
								autoinstall/ksamu
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Программа “КСАМУ”. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://docs.medicine-it.ru/" | ||||||
|  | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
|  | export WINEPREFIX="ksamu" | ||||||
|  | export PROG_NAME="КСАМУ" | ||||||
|  | export PROG_ICON="ksamu" | ||||||
|  | export BASE_PFX="ksamu_pfx_x64_v01" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export INSTALL_DLL="richtx32 riched20 riched30 msls31 msftedit msxml6 msxml3 msxml4 fontsmooth=gray" #riched32 | ||||||
|  | export WH_USE_EXTRA_FONTS="1" | ||||||
|  | export WH_WINDOWS_VER="7" | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | create_desktop "$PROG_NAME" "$DRIVE_C/KSAMU/KSAMU.exe" "$PROG_ICON" | ||||||
| @@ -1,12 +1,12 @@ | |||||||
| #!/usr/bin/env bash | #!/usr/bin/env bash | ||||||
| # info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций, с дополнением Apache OpenOffice. Apache OpenOffice - пакет офисного программного обеспечения для обработки текстов, электронных таблиц, презентаций, графики, баз данных и многого другого. | # info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций. | ||||||
| ######################################################################## | ######################################################################## | ||||||
| export PROG_URL="https://scadoffice.ru" | export PROG_URL="https://scadoffice.ru" | ||||||
| export WH_WINE_USE="wine_x_tkg_10-0_amd64" | export WH_WINE_USE="wine_x_tkg_10-0_amd64" | ||||||
| export WINEPREFIX="scadoffice" | export WINEPREFIX="scadoffice" | ||||||
| export PROG_NAME="SCAD Office" | export PROG_NAME="SCAD Office" | ||||||
| export PROG_ICON="scadoffice" | export PROG_ICON="scadoffice" | ||||||
| export BASE_PFX="scadaoffice_pfx_x64_v04" | export BASE_PFX="scadaoffice_pfx_x64_v05" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEARCH="win64" | export WINEARCH="win64" | ||||||
| export INSTALL_DLL="dotnet20 dotnet48 gdiplus vcrun6sp6 vcrun2005 vcrun2019 d3dx11_42 d3dx11_43 d3dx9 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 richtx32 riched30 riched20 msxml6" | export 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 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| if [[ $BASE_PFX == "none" ]] ; then | print_info "Установка дополнительных компонентов..." | ||||||
|     print_info "Установка дополнительных компонентов..." |  | ||||||
|  |  | ||||||
|     ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")" | ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")" | ||||||
|     ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons" | ADDONS_PATH="${WH_TMP_DIR}/scadoffice_addons" | ||||||
|  |  | ||||||
|     ADDONS_PATH_REG="${ADDONS_PATH}/REG" | ADDONS_PATH_REG="${ADDONS_PATH}/REG" | ||||||
|     ADDONS_PATH_MDAC="${ADDONS_PATH}/mdac64" | ADDONS_PATH_MDAC="${ADDONS_PATH}/mdac64" | ||||||
|     ADDONS_PATH_OPENSSH="${ADDONS_PATH}/OpenSSH" | ADDONS_PATH_OPENSSH="${ADDONS_PATH}/OpenSSH" | ||||||
|  |  | ||||||
|     if try_download "$SCADOFFICE_ADDONS_URL" "${ADDONS_PACK}" ; then | if try_download "$SCADOFFICE_ADDONS_URL" "${ADDONS_PACK}" ; then | ||||||
|         create_new_dir "${ADDONS_PATH}" |     create_new_dir "${ADDONS_PATH}" | ||||||
|         unpack "${ADDONS_PACK}" "${ADDONS_PATH}" |     unpack "${ADDONS_PACK}" "${ADDONS_PATH}" | ||||||
|         wine_run regedit "${ADDONS_PATH_REG}"/*.reg |     wine_run regedit "${ADDONS_PATH_REG}"/*.reg | ||||||
|  |  | ||||||
|         # Установка ODBC |     # Установка ODBC | ||||||
|         rm -fR "$DRIVE_C/Program Files (x86)/Common Files/System" |     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}/System" "$DRIVE_C/Program Files (x86)/Common Files/System" | ||||||
|         cp -r "${ADDONS_PATH_MDAC}"/*.* "$DRIVE_C/windows/system32/" |     cp -r "${ADDONS_PATH_MDAC}"/*.* "$DRIVE_C/windows/system32/" | ||||||
|         wine_run regedit "${ADDONS_PATH_MDAC}"/*.reg |     wine_run regedit "${ADDONS_PATH_MDAC}"/*.reg | ||||||
|  |  | ||||||
|         # Установка SSH |     # Установка SSH | ||||||
|         cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/" |     cp -r "${ADDONS_PATH_OPENSSH}" "$DRIVE_C/windows/system32/" | ||||||
|  |  | ||||||
|         try_remove_dir "$ADDONS_PATH" |     try_remove_dir "$ADDONS_PATH" | ||||||
|         try_remove_file "$ADDONS_PACK" |     try_remove_file "$ADDONS_PACK" | ||||||
|     fi |  | ||||||
| fi | fi | ||||||
|  |  | ||||||
| if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then | if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then | ||||||
|     create_new_dir "$DRIVE_C/SDATA" |     create_new_dir "$DRIVE_C/SDATA" | ||||||
|     create_new_dir "$DRIVE_C/SWORK" |     create_new_dir "$DRIVE_C/SWORK" | ||||||
|     wine_run_install "${AUTOINSTALL_EXE}" /auto /hide |     export WINE_WIN_START="" | ||||||
|  |     var_winedlloverride_update "hasplms.exe,hasplmv.exe=d" | ||||||
|  |     wine_run_install "$AUTOINSTALL_EXE" | ||||||
|     try_remove_file "$AUTOINSTALL_EXE" |     try_remove_file "$AUTOINSTALL_EXE" | ||||||
|  |  | ||||||
|     # Определение всех программ, значков и исполняемых файлов |     # Определение всех программ, значков и исполняемых файлов | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru" | |||||||
| export PROG_NAME="T-FLEX CAD Учебная Версия 17" | export PROG_NAME="T-FLEX CAD Учебная Версия 17" | ||||||
| export PROG_ICON="tflexcad" | export PROG_ICON="tflexcad" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| @@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1" | |||||||
|  |  | ||||||
| # используем общий whdb файл для подготовки префикса и сервисов | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
| # prepair_wine используется из файла настроек | # prepair_wine используется из файла настроек | ||||||
| source "$WH_DB_DIR/t-flex-cad17.whdb" | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
| # Программа T-FLEX CAD Учебная Версия | # Программа T-FLEX CAD Учебная Версия | ||||||
| export AUTOINSTALL_ZIP="${WH_TMP_DIR}/TFCAD_ST_17x64_PACK.zip" | export AUTOINSTALL_ZIP="${WH_TMP_DIR}/TFCAD_ST_17x64_PACK.zip" | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru" | |||||||
| export PROG_NAME="T-FLEX CAD 17" | export PROG_NAME="T-FLEX CAD 17" | ||||||
| export PROG_ICON="tflexcad" | export PROG_ICON="tflexcad" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| @@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1" | |||||||
|  |  | ||||||
| # используем общий whdb файл для подготовки префикса и сервисов | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
| # prepair_wine используется из файла настроек | # prepair_wine используется из файла настроек | ||||||
| source "$WH_DB_DIR/t-flex-cad17.whdb" | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
| # Программа T-FLEX CAD | # Программа T-FLEX CAD | ||||||
| export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 17.zip" | export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 17.zip" | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export PROG_NAME="Приложения для T-FLEX CAD 17" | |||||||
| export PROG_ICON="tflexcad" | export PROG_ICON="tflexcad" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| export WH_XDG_OPEN="log" | export WH_XDG_OPEN="log" | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ export PROG_NAME="Ресурсы для T-FLEX CAD 17" | |||||||
| export PROG_ICON="tflexcad" | export PROG_ICON="tflexcad" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| export WH_XDG_OPEN="log" | export WH_XDG_OPEN="log" | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								autoinstall/t-flex-cad18
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://www.tflexcad.ru" | ||||||
|  | export PROG_NAME="T-FLEX CAD 18" | ||||||
|  | export PROG_ICON="tflexcad" | ||||||
|  | export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | ||||||
|  | export BASE_PFX="tflex_pfx_x64_v03" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export WH_WINDOWS_VER="10" | ||||||
|  | export WINEPREFIX="tflex" | ||||||
|  | export WH_XDG_OPEN="log" | ||||||
|  | export WH_USE_MESA_GL_OVERRIDE="1" | ||||||
|  |  | ||||||
|  | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
|  | # prepair_wine используется из файла настроек | ||||||
|  | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
|  | # Программа T-FLEX CAD | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 18.zip" | ||||||
|  | AUTOINSTALL_DIR="${WH_TMP_DIR}" | ||||||
|  | AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 18" | ||||||
|  | AUTOINSTALL_EXE="${WH_TMP_DIR}/T-FLEX CAD 18/T-FLEX CAD 18.msi" | ||||||
|  |  | ||||||
|  | if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%2018.zip" "${AUTOINSTALL_ZIP}" ; then | ||||||
|  |     unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}" | ||||||
|  |     try_remove_file "${AUTOINSTALL_ZIP}" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /q | ||||||
|  |     try_remove_dir "${AUTOINSTALL_UNPACK}" | ||||||
|  |  | ||||||
|  |     WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" | ||||||
|  |     create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad" | ||||||
|  | fi | ||||||
							
								
								
									
										52
									
								
								autoinstall/t-flex-cad18-applications
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,52 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Приложения для T-FLEX CAD 18 (T-FLEX Анализ 18, T-FLEX Динамика 18, T-FLEX Детали машин 18, T-FLEX Раскрой 18, T-FLEX VR 18, T-FLEX Печатные платы 18) | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://www.tflexcad.ru" | ||||||
|  | export PROG_NAME="Приложения для T-FLEX CAD 18" | ||||||
|  | export PROG_ICON="tflexcad" | ||||||
|  | export WH_WINDOWS_VER="10" | ||||||
|  | export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | ||||||
|  | export BASE_PFX="tflex_pfx_x64_v03" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export WINEPREFIX="tflex" | ||||||
|  | export WH_XDG_OPEN="log" | ||||||
|  | export WH_USE_MESA_GL_OVERRIDE="1" | ||||||
|  |  | ||||||
|  | check_prefix_var | ||||||
|  | if [[ ! -f "$WINEPREFIX/drive_c/Program Files/T-FLEX CAD 18/Program/TFlexCad.exe" ]] | ||||||
|  | then fatal "Изначально установите T-FLEX CAD 18." | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | BASE_URL="https://www.tflex.ru/downloads/V18" | ||||||
|  | FILES=( | ||||||
|  |     "T-FLEX Analysis 18.zip" | ||||||
|  |     "T-FLEX Dynamics 18.zip" | ||||||
|  |     "T-FLEX Machinery 18.zip" | ||||||
|  |     "T-FLEX Nesting 18.zip" | ||||||
|  |     "T-FLEX VR 18.zip" | ||||||
|  |     "T-FLEX Circuits 18.zip" | ||||||
|  | ) | ||||||
|  | UNPACK_APP="${WH_TMP_DIR}/unpack_applications" | ||||||
|  |  | ||||||
|  | prepair_wine | ||||||
|  |  | ||||||
|  | # Скачивание всех файлов | ||||||
|  | for file_name in "${FILES[@]}" ; do | ||||||
|  |     local output="${WH_TMP_DIR}/${file_name// /_}" | ||||||
|  |  | ||||||
|  |     if try_download "$BASE_URL/$file_name" "$output" ; then | ||||||
|  |         unpack "$output" "${UNPACK_APP}" | ||||||
|  |     fi | ||||||
|  |     try_remove_file "$output" | ||||||
|  | done | ||||||
|  |  | ||||||
|  | # Установка .msi файлов | ||||||
|  | for msi_file in "${UNPACK_APP}"/*/*.msi ; do | ||||||
|  |     if [[ -f "$msi_file" ]] ; then | ||||||
|  |         wine_run_install "$msi_file" /q | ||||||
|  |     else | ||||||
|  |         fatal "Нет .msi файлов для установки в ${UNPACK_APP}/*." | ||||||
|  |     fi | ||||||
|  | done | ||||||
|  |  | ||||||
|  | try_remove_dir "${UNPACK_APP}" | ||||||
							
								
								
									
										49
									
								
								autoinstall/t-flex-cad18-resources
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,49 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Обучающие материалы, примеры, бесплатные библиотеки для T-FLEX CAD 18 (Учебное пособие 18, Стандартные элементы 18, Примеры 17) | ||||||
|  | ######################################################################## | ||||||
|  | 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}" | ||||||
| @@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru" | |||||||
| export PROG_NAME="T-FLEX CAD 2D+ 17" | export PROG_NAME="T-FLEX CAD 2D+ 17" | ||||||
| export PROG_ICON="tflexcad" | export PROG_ICON="tflexcad" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| @@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1" | |||||||
|  |  | ||||||
| # используем общий whdb файл для подготовки префикса и сервисов | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
| # prepair_wine используется из файла настроек | # prepair_wine используется из файла настроек | ||||||
| source "$WH_DB_DIR/t-flex-cad17.whdb" | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
| # Программа T-FLEX CAD 2D+ 17 | # Программа T-FLEX CAD 2D+ 17 | ||||||
| export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 2D+ 17.zip" | export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 2D+ 17.zip" | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								autoinstall/t-flex-cad2d+18
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Профессиональная САПР, объединяющая в себе мощные параметрические возможности 2D и 3D-моделирования со средствами создания и оформления чертежей и конструкторской документации по ЕСКД. | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://www.tflexcad.ru" | ||||||
|  | export PROG_NAME="T-FLEX CAD 2D+ 18" | ||||||
|  | export PROG_ICON="tflexcad" | ||||||
|  | export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | ||||||
|  | export BASE_PFX="tflex_pfx_x64_v03" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export WH_WINDOWS_VER="10" | ||||||
|  | export WINEPREFIX="tflex" | ||||||
|  | export WH_XDG_OPEN="log" | ||||||
|  | export WH_USE_MESA_GL_OVERRIDE="1" | ||||||
|  |  | ||||||
|  | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
|  | # prepair_wine используется из файла настроек | ||||||
|  | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
|  | # Программа T-FLEX CAD 2D+ 18 | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX CAD 2D+ 18.zip" | ||||||
|  | AUTOINSTALL_DIR="${WH_TMP_DIR}" | ||||||
|  | AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX CAD 2D+ 18" | ||||||
|  | AUTOINSTALL_EXE="${AUTOINSTALL_UNPACK}/T-FLEX CAD 2D+ 18.msi" | ||||||
|  |  | ||||||
|  | if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20CAD%202D+%2018.zip" "${AUTOINSTALL_ZIP}" ; then | ||||||
|  |     unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}" | ||||||
|  |     try_remove_file "${AUTOINSTALL_ZIP}" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /q | ||||||
|  |     try_remove_dir "${AUTOINSTALL_UNPACK}" | ||||||
|  |  | ||||||
|  |     WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX CAD 2D+ 18/Program/TFlexCad.exe" | ||||||
|  |     create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" "TFlexCad2D" | ||||||
|  | fi | ||||||
| @@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru" | |||||||
| export PROG_NAME="T-FLEX DOCs 17" | export PROG_NAME="T-FLEX DOCs 17" | ||||||
| export PROG_ICON="tflexdoc" | export PROG_ICON="tflexdoc" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| @@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1" | |||||||
|  |  | ||||||
| # используем общий whdb файл для подготовки префикса и сервисов | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
| # prepair_wine используется из файла настроек | # prepair_wine используется из файла настроек | ||||||
| source "$WH_DB_DIR/t-flex-cad17.whdb" | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
| # Программа T-FLEX DOC | # Программа T-FLEX DOC | ||||||
| AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX DOCs 17 Client.zip" | AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX DOCs 17 Client.zip" | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ export PROG_URL="https://www.tflexcad.ru" | |||||||
| export PROG_NAME="T-FLEX Viewer 17" | export PROG_NAME="T-FLEX Viewer 17" | ||||||
| export PROG_ICON="tflexcad" | export PROG_ICON="tflexcad" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| @@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1" | |||||||
|  |  | ||||||
| # используем общий whdb файл для подготовки префикса и сервисов | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
| # prepair_wine используется из файла настроек | # prepair_wine используется из файла настроек | ||||||
| source "$WH_DB_DIR/t-flex-cad17.whdb" | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
| # Программа T-FLEX Viewer | # Программа T-FLEX Viewer | ||||||
| export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX Viewer 17.zip" | export AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX Viewer 17.zip" | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								autoinstall/t-flex-viewer18
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # info_ru: Просмотр, печать и аннотирование документов T-FLEX CAD | ||||||
|  | ######################################################################## | ||||||
|  | export PROG_URL="https://www.tflexcad.ru" | ||||||
|  | export PROG_NAME="T-FLEX Viewer 18" | ||||||
|  | export PROG_ICON="tflexcad" | ||||||
|  | export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | ||||||
|  | export BASE_PFX="tflex_pfx_x64_v03" | ||||||
|  | export WINEARCH="win64" | ||||||
|  | export WH_WINDOWS_VER="10" | ||||||
|  | export WINEPREFIX="tflex" | ||||||
|  | export WH_XDG_OPEN="log" | ||||||
|  | export WH_USE_MESA_GL_OVERRIDE="1" | ||||||
|  |  | ||||||
|  | # используем общий whdb файл для подготовки префикса и сервисов | ||||||
|  | # prepair_wine используется из файла настроек | ||||||
|  | source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
|  |  | ||||||
|  | # Программа T-FLEX Viewer | ||||||
|  | AUTOINSTALL_ZIP="${WH_TMP_DIR}/T-FLEX Viewer 18.zip" | ||||||
|  | AUTOINSTALL_DIR="${WH_TMP_DIR}" | ||||||
|  | AUTOINSTALL_UNPACK="${WH_TMP_DIR}/T-FLEX Viewer 18" | ||||||
|  | AUTOINSTALL_EXE="${AUTOINSTALL_UNPACK}/T-FLEX Viewer 18.msi" | ||||||
|  |  | ||||||
|  | if try_download "https://www.tflex.ru/downloads/V18/T-FLEX%20Viewer%2018.zip" "${AUTOINSTALL_ZIP}" ; then | ||||||
|  |     unpack "${AUTOINSTALL_ZIP}" "${AUTOINSTALL_DIR}" | ||||||
|  |     try_remove_file "${AUTOINSTALL_ZIP}" | ||||||
|  |  | ||||||
|  |     wine_run_install "${AUTOINSTALL_EXE}" /q | ||||||
|  |     try_remove_dir "${AUTOINSTALL_UNPACK}" | ||||||
|  |  | ||||||
|  |     WIN_FILE_EXEC="$DRIVE_C/Program Files/T-FLEX Viewer 18/Program/TFlexViewer.exe" | ||||||
|  |     create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON" | ||||||
|  | fi | ||||||
| @@ -1,28 +1,24 @@ | |||||||
| #!/usr/bin/env bash | #!/usr/bin/env bash | ||||||
| # info_ru: Компоненты сервисов поддержки T-FLEX 17 | # info_ru: Компоненты сервисов поддержки T-FLEX 17 и 18 | ||||||
| ######################################################################## | ######################################################################## | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| export PROG_VERSION="" | export PROG_VERSION="" | ||||||
| export WH_XDG_OPEN="log" | 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" | export WH_USE_MESA_GL_OVERRIDE="1" | ||||||
| 
 | 
 | ||||||
| # Компоненты поддержки T-FLEX PLM (Linux) |  | ||||||
| GRDCONTROL_VER="4.3.0-0" | GRDCONTROL_VER="4.3.0-0" | ||||||
| AUTOINSTALL_ZIP_LIN="$WH_TMP_DIR/Prerequisites_T-FLEX_Linux.zip" | AUTOINSTALL_ZIP_LIN="$WH_TMP_DIR/Prerequisites_T-FLEX_Linux.zip" | ||||||
| AUTOINSTALL_DIR_LIN="$WH_TMP_DIR/Prerequisites_T-FLEX_Linux" | 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_EXE_ADE2007="$AUTOINSTALL_DIR_LIN/Components/AccessDatabaseEngine.exe" | ||||||
| AUTOINSTALL_ZIP_WIN="$WH_TMP_DIR/T-FLEX 17 Prerequisites.zip" | AUTOINSTALL_EXE_TSC2="$AUTOINSTALL_DIR_LIN/Components/Setup_TSC2.msi" | ||||||
| AUTOINSTALL_DIR_WIN="$WH_TMP_DIR/Компоненты поддержки T-FLEX 17" | AUTOINSTALL_EXE_VC_X86="$AUTOINSTALL_DIR_LIN/Components/vc_redist.x86.exe" | ||||||
| AUTOINSTALL_EXE_WIN1="$AUTOINSTALL_DIR_WIN/Access Database Engine 2007/AccessDatabaseEngine.exe" | AUTOINSTALL_EXE_VC_X64="$AUTOINSTALL_DIR_LIN/Components/vc_redist.x64.exe" | ||||||
| AUTOINSTALL_EXE_WIN_MSI="$AUTOINSTALL_DIR_WIN/Access Database Engine 2007" |  | ||||||
| AUTOINSTALL_EXE_WIN2="$AUTOINSTALL_DIR_WIN/TSC2/Setup_TSC2.msi" |  | ||||||
| 
 | 
 | ||||||
| prepair_wine | prepair_wine | ||||||
| 
 | 
 | ||||||
| @@ -42,11 +38,8 @@ else | |||||||
|     || ! systemctl list-units --type service --state running | grep hasplmd \ |     || ! systemctl list-units --type service --state running | grep hasplmd \ | ||||||
|     || ! rpm -q grdcontrol | grep -q "$GRDCONTROL_VER" |     || ! rpm -q grdcontrol | grep -q "$GRDCONTROL_VER" | ||||||
|     then |     then | ||||||
|         # Компоненты поддержки T-FLEX PLM (Linux) |         try_download "https://www.tflex.ru/downloads/Prerequisites_T-FLEX_Linux.zip" "${AUTOINSTALL_ZIP_LIN}" | ||||||
|         if try_download "https://www.tflex.ru/downloads/Prerequisites_T-FLEX_Linux.zip" "${AUTOINSTALL_ZIP_LIN}" ; then |         unpack "$AUTOINSTALL_ZIP_LIN" "$AUTOINSTALL_DIR_LIN" | ||||||
|             unpack "$AUTOINSTALL_ZIP_LIN" "$AUTOINSTALL_DIR_LIN" |  | ||||||
|             "$WINELOADER" regedit "$AUTOINSTALL_REG_LIN" |  | ||||||
|         fi |  | ||||||
| 
 | 
 | ||||||
|         if rpm -q grdcontrol | grep -q "$GRDCONTROL_VER" |         if rpm -q grdcontrol | grep -q "$GRDCONTROL_VER" | ||||||
|         then print_info "grdcontrol-$GRDCONTROL_VER уже установлен в системе." |         then print_info "grdcontrol-$GRDCONTROL_VER уже установлен в системе." | ||||||
| @@ -55,14 +48,14 @@ else | |||||||
| 
 | 
 | ||||||
|         if [[ "$BASE_PFX" == "none" ]] ; then |         if [[ "$BASE_PFX" == "none" ]] ; then | ||||||
|             print_info "Запускаем подготовку префикса." |             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 |             unpack "$AUTOINSTALL_EXE_ADE2007" "$AUTOINSTALL_DIR_LIN/ADE2007" | ||||||
|                 wine_run_install "$AUTOINSTALL_EXE_WIN2" /q |             wine_run_install "$AUTOINSTALL_DIR_LIN/ADE2007/AceRedist.msi" /q | ||||||
|             fi | 
 | ||||||
|  |             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/Common Files/System" | ||||||
|             rm -fR "$DRIVE_C/Program Files (x86)/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 \ |             mv -f "$AUTOINSTALL_DIR_LIN/Components/Windows/System32/"*.dll \ | ||||||
|                   "$DRIVE_C/windows/system32" |                   "$DRIVE_C/windows/system32" | ||||||
| 
 | 
 | ||||||
|  |             "$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/fake_hasp.reg" | ||||||
|             "$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/ado-32.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/ado-64.reg" | ||||||
|             "$WINELOADER" regedit "$AUTOINSTALL_DIR_LIN/Components/tflex.reg" |  | ||||||
|         fi |         fi | ||||||
| 
 | 
 | ||||||
|         if systemctl list-units --type service --state running | grep aksusbd \ |         if systemctl list-units --type service --state running | grep aksusbd \ | ||||||
| @@ -98,14 +91,12 @@ else | |||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     try_remove_dir "$AUTOINSTALL_DIR_LIN" |     try_remove_dir "$AUTOINSTALL_DIR_LIN" | ||||||
|     try_remove_dir "$AUTOINSTALL_DIR_WIN" |  | ||||||
| 
 | 
 | ||||||
|     if [[ $TFLEX_ERROR == "1" ]] ; then |     if [[ $TFLEX_ERROR == "1" ]] ; then | ||||||
|         fatal "Произошла ошибка во время подготовки префикса, или установки компонентов ПО." |         fatal "Произошла ошибка во время подготовки префикса, или установки компонентов ПО." | ||||||
|     else |     else | ||||||
|         echo "t-flex-cad-prepair" >> "$WINEPREFIX/winetricks.log" |         echo "t-flex-cad-prepair" >> "$WINEPREFIX/winetricks.log" | ||||||
|         try_remove_file "$AUTOINSTALL_ZIP_LIN" | #         try_remove_file "$AUTOINSTALL_ZIP_LIN" | ||||||
|         try_remove_file "$AUTOINSTALL_ZIP_WIN" |  | ||||||
|         print_info "Подготовка префикса и установка компонентов завершены." |         print_info "Подготовка префикса и установка компонентов завершены." | ||||||
|     fi |     fi | ||||||
| fi | fi | ||||||
							
								
								
									
										
											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/folder_log_backup.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 111 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 | 
							
								
								
									
										
											BIN
										
									
								
								image/ksamu.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.0 KiB | 
| @@ -1,10 +1,10 @@ | |||||||
| #!/usr/bin/env bash | #!/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 PROG_ICON="tflexcad" | ||||||
| export WH_WINE_USE="wine_wh_tflex_10-9_amd64" | 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 WINEARCH="win64" | ||||||
| export WH_WINDOWS_VER="10" | export WH_WINDOWS_VER="10" | ||||||
| export WINEPREFIX="tflex" | export WINEPREFIX="tflex" | ||||||
| @@ -14,7 +14,7 @@ export WH_USE_MESA_GL_OVERRIDE="1" | |||||||
| if [[ -f "$2" ]] ; then | if [[ -f "$2" ]] ; then | ||||||
|     # используем общий whdb файл для подготовки префикса и сервисов |     # используем общий whdb файл для подготовки префикса и сервисов | ||||||
|     # prepair_wine используется из файла настроек |     # prepair_wine используется из файла настроек | ||||||
|     source "$WH_DB_DIR/t-flex-cad17.whdb" |     source "$WH_DB_DIR/t-flex-cad.whdb" | ||||||
| 
 | 
 | ||||||
|     wine_run_install "$2" |     wine_run_install "$2" | ||||||
| else | else | ||||||
							
								
								
									
										23
									
								
								manualinstall/t-flex-docs-manual
									
									
									
									
									
										Normal 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 | ||||||
| @@ -171,13 +171,9 @@ d62225f6a23e49355a59a2bd9a495390694bd70d4be6d6527cfb7fb2e2d65f0d  defpfx_x64_v01 | |||||||
| # create with wine_x_tkg_10-0_amd64 (universal user: xuser and isolate_home by default) | # 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 | # 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 | 68ad589a3e6d8a845c2e3bd4c2672cf97982b3fea0ca4b4f2fb6da126d8b3075  tflex_pfx_x64_v03.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 |  | ||||||
| # create with wine_wh_tflex_10-9_amd64 | # 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 | 7edbd69b40b8ca3fb3594933c6cd37030180c494c08fd13cbd1a5b46565d65e6  ved_ctm_pfx_x86_v03.tar.xz | ||||||
| # create with wine_x_tkg_10-0_amd64 (universal user: xuser) | # 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) | # create with wine_x_tkg_10-0_i586 (universal user: xuser) | ||||||
| # winetricks arial dotnet7 dotnetdesktop7 renderer=gdi | # winetricks arial dotnet7 dotnetdesktop7 renderer=gdi | ||||||
|  |  | ||||||
| 4fa93434c5c15440014357323257ddcee7d28b94ad6a56bd6f5a08b33ae4c3cb  scadaoffice_pfx_x64_v04.tar.xz | 8c6312f2e4e846a98ca4a87fc90ee1917eb28d4caaddde040fb4d2dd05f8c0fe  scadaoffice_pfx_x64_v05.tar.xz | ||||||
| # create with wine-8.8-staging-amd64 | # 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 | # 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 | 0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb  scadoffice_addons_v02.tar.xz | ||||||
|  |  | ||||||
| ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218  ais-lpu-client_pfx_x86_v01.tar.xz | ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218  ais-lpu-client_pfx_x86_v01.tar.xz | ||||||
| # create with wine_x_tkg_10-0_i586 (universal user: xuser) | # create with wine_x_tkg_10-0_i586 (universal user: xuser) | ||||||
| # winetricks vcrun2005 vcrun2008 dotnet20sp2 dotnet40 mfc42 7zip | # 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 | ||||||
|   | |||||||
							
								
								
									
										39
									
								
								winehelper
									
									
									
									
									
								
							
							
						
						| @@ -16,7 +16,7 @@ if [[ "$(realpath "$0")" == "/usr/bin/$SCRIPT_NAME" ]] ; then | |||||||
|     USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME" |     USER_WORK_PATH="$HOME/.local/share/$SCRIPT_NAME" | ||||||
|     RUN_SCRIPT="/usr/bin/$SCRIPT_NAME" |     RUN_SCRIPT="/usr/bin/$SCRIPT_NAME" | ||||||
|     DATA_PATH="/usr/share/$SCRIPT_NAME" |     DATA_PATH="/usr/share/$SCRIPT_NAME" | ||||||
|     WH_ICON_PATH="$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" |     CHANGELOG_FILE="/usr/share/doc/winehelper-$WH_VERSION/CHANGELOG" | ||||||
|     LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE" |     LICENSE_FILE="/usr/share/doc/winehelper-$WH_VERSION/LICENSE" | ||||||
|     AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT" |     AGREEMENT="/usr/share/doc/winehelper-$WH_VERSION/LICENSE_AGREEMENT" | ||||||
| @@ -102,7 +102,9 @@ else | |||||||
| fi | fi | ||||||
|  |  | ||||||
| if [[ $WINEDEBUG != "-all" ]] ; then | if [[ $WINEDEBUG != "-all" ]] ; then | ||||||
|     export LOG_FILE="$HOME/winehelper.log" |     log_dir="$HOME/winehelper_backup_log" | ||||||
|  |     mkdir -p "$log_dir" | ||||||
|  |     export LOG_FILE="$log_dir/winehelper.log" | ||||||
|     date > "$LOG_FILE" |     date > "$LOG_FILE" | ||||||
|     print_warning "Включен режим логирования работы WINE." |     print_warning "Включен режим логирования работы WINE." | ||||||
|     print_warning "Лог будет сохранен по пути: $LOG_FILE" |     print_warning "Лог будет сохранен по пути: $LOG_FILE" | ||||||
| @@ -126,6 +128,12 @@ 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" | ||||||
|  |  | ||||||
| @@ -155,6 +163,7 @@ check_variables WH_WINDOWS_VER "10" | |||||||
| # check_variables WH_USE_GSTREAMER "1" | # check_variables WH_USE_GSTREAMER "1" | ||||||
| # check_variables WH_USE_D3D_EXTRAS "1" | # check_variables WH_USE_D3D_EXTRAS "1" | ||||||
| check_variables WH_USE_SHADER_CACHE "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_USE_WINE_DXGI "0" | ||||||
| check_variables WH_DLL_INSTALL "" | check_variables WH_DLL_INSTALL "" | ||||||
|  |  | ||||||
| @@ -544,8 +553,6 @@ create_desktop () { | |||||||
|     if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then |     if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then | ||||||
|         fatal "Использование: $0 desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]" |         fatal "Использование: $0 desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]" | ||||||
|     elif [[ ! -f "$exe_file" ]] ; then |     elif [[ ! -f "$exe_file" ]] ; then | ||||||
|         print_warning "Для создания ярлыка не найден исполняемый файл: $exe_file" |  | ||||||
|  |  | ||||||
|         local BASENAME_EXE="$(basename "$exe_file")" |         local BASENAME_EXE="$(basename "$exe_file")" | ||||||
|         print_info "Запускаем поиск $BASENAME_EXE" |         print_info "Запускаем поиск $BASENAME_EXE" | ||||||
|         local FIND_PATH |         local FIND_PATH | ||||||
| @@ -556,9 +563,11 @@ create_desktop () { | |||||||
|         exe_file="$(find "$FIND_PATH" -type f -not -type l \ |         exe_file="$(find "$FIND_PATH" -type f -not -type l \ | ||||||
|                     -not -path "*/windows/*" -not -path "*/dosdevices/*" \ |                     -not -path "*/windows/*" -not -path "*/dosdevices/*" \ | ||||||
|                     -iname "$BASENAME_EXE")" |                     -iname "$BASENAME_EXE")" | ||||||
|         if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]] |         if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]] ; then | ||||||
|         then fatal "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE" |             print_error "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE" | ||||||
|         else print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/" |             return 1 | ||||||
|  |         else | ||||||
|  |             print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/" | ||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
| @@ -1417,12 +1426,6 @@ wine_run_install () { | |||||||
| } | } | ||||||
|  |  | ||||||
| run_autoinstall () { | 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 |     if [[ $1 == "--clear-pfx" ]] ; then | ||||||
|         export CLEAR_PREFIX="1" |         export CLEAR_PREFIX="1" | ||||||
|         shift |         shift | ||||||
| @@ -1478,6 +1481,11 @@ run_autoinstall () { | |||||||
|         echo |         echo | ||||||
|         list_install_scripts "$WH_MANUALINSTALL_DIR" "Список программ с возможностью установки из существующего дистрибутива:" |         list_install_scripts "$WH_MANUALINSTALL_DIR" "Список программ с возможностью установки из существующего дистрибутива:" | ||||||
|     elif [[ "$INSTALL_SCRIPT" != "0" ]] ; then |     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" "$@" |         source "$INSTALL_SCRIPT" "$@" | ||||||
|         print_info "Завершена установка $INSTALL_SCRIPT_NAME" |         print_info "Завершена установка $INSTALL_SCRIPT_NAME" | ||||||
|     else |     else | ||||||
| @@ -1768,6 +1776,7 @@ remove_winehelper () { | |||||||
|         echo " - Все настройки WineHelper" |         echo " - Все настройки WineHelper" | ||||||
|         echo " - Все приложения/программы, установленные через WineHelper" |         echo " - Все приложения/программы, установленные через WineHelper" | ||||||
|         echo " - Все ярлыки из меню и с рабочего стола, созданные с помощью WineHelper" |         echo " - Все ярлыки из меню и с рабочего стола, созданные с помощью WineHelper" | ||||||
|  |         echo " - Все резервные копии и логи, созданные WineHelper" | ||||||
|         echo "======================================================" |         echo "======================================================" | ||||||
|         if print_confirmation "Продолжить?" ; then |         if print_confirmation "Продолжить?" ; then | ||||||
|             echo "----------------------------------------------" |             echo "----------------------------------------------" | ||||||
| @@ -1783,6 +1792,7 @@ remove_winehelper () { | |||||||
|  |  | ||||||
|     # Удаление рабочих каталогов |     # Удаление рабочих каталогов | ||||||
|     try_remove_dir "$USER_WORK_PATH" |     try_remove_dir "$USER_WORK_PATH" | ||||||
|  |     try_remove_dir "$HOME/winehelper_backup_log" | ||||||
|  |  | ||||||
|     # Удаление файлов меню |     # Удаление файлов меню | ||||||
|     try_remove_dir "$WH_MENU_DIR" |     try_remove_dir "$WH_MENU_DIR" | ||||||
| @@ -1861,7 +1871,8 @@ backup_prefix() { | |||||||
|     check_prefix_var |     check_prefix_var | ||||||
|  |  | ||||||
|     local backup_base_dir backup_archive_name backup_dest_path temp_backup_dir temp_prefix_dir temp_users_dir |     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_archive_name="backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S).whpack" | ||||||
|     backup_dest_path="$backup_base_dir/$backup_archive_name" |     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)" |     temp_backup_dir="$WH_TMP_DIR/backup_${PREFIX_NAME}_$(date +%d.%m.%Y-%H.%M.%S)" | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ from functools import partial | |||||||
| from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar, | from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QTabBar, | ||||||
|                              QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox, |                              QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox, | ||||||
|                              QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu) |                              QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser, QInputDialog, QDialogButtonBox, QSystemTrayIcon, QMenu) | ||||||
| from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve | from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve, pyqtSignal | ||||||
| from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor | from PyQt5.QtGui import QIcon, QFont, QTextCursor, QPixmap, QPainter, QCursor | ||||||
| from PyQt5.QtNetwork import QLocalServer, QLocalSocket | 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): |     def __init__(self, prefix_path, winetricks_path, parent=None, wine_executable=None): | ||||||
|         super().__init__(parent) |         super().__init__(parent) | ||||||
|         self.prefix_path = prefix_path |         self.prefix_path = prefix_path | ||||||
| @@ -617,12 +619,33 @@ class WinetricksManagerDialog(QDialog): | |||||||
|             self._log(f"--- Предупреждение: не удалось прочитать {log_path}: {e} ---") |             self._log(f"--- Предупреждение: не удалось прочитать {log_path}: {e} ---") | ||||||
|         return installed_verbs |         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.""" |         """Парсит вывод 'winetricks list' и заполняет QListWidget.""" | ||||||
|         # Regex, который обрабатывает строки как с префиксом статуса '[ ]', так и без него. |         # Regex, который обрабатывает строки как с префиксом статуса '[ ]', так и без него. | ||||||
|         # 1. `(?:\[(.)]\s+)?` - опциональная группа для статуса (напр. '[x]'). |         # 1. `(?:\[(.)]\s+)?` - опциональная группа для статуса (напр. '[x]'). | ||||||
|         # 2. `([^\s]+)` - имя компонента (без пробелов). |         # 2. `([^\s]+)` - имя компонента (без пробелов). | ||||||
|         # 3. `(.*)` - оставшаяся часть строки (описание). |         # 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*(.*)") |         line_re = re.compile(r"^\s*(?:\[(.)]\s+)?([^\s]+)\s*(.*)") | ||||||
|         found_items = False |         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(':'): |             if '/' in name or '\\' in name or name.lower() in ('executing', 'using', 'warning:') or name.endswith(':'): | ||||||
|                 continue |                 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 |             is_checked = name in installed_verbs | ||||||
|             item_text = f"{name.ljust(27)}{description.strip()}" |             item_text = f"{name.ljust(27)}{description.strip()}" | ||||||
|             item = QListWidgetItem(item_text) |             item = QListWidgetItem(item_text) | ||||||
| @@ -681,7 +712,7 @@ class WinetricksManagerDialog(QDialog): | |||||||
|             self._log("--------------------------------------------------", "red") |             self._log("--------------------------------------------------", "red") | ||||||
|         else: |         else: | ||||||
|             installed_verbs = self._parse_winetricks_log() |             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:  # Только если мы не читали из кэша |             if from_cache is None:  # Только если мы не читали из кэша | ||||||
|                 # Сохраняем успешный результат в кэш |                 # Сохраняем успешный результат в кэш | ||||||
| @@ -856,6 +887,7 @@ class WinetricksManagerDialog(QDialog): | |||||||
|         # Перезагружаем данные, чтобы обновить состояние |         # Перезагружаем данные, чтобы обновить состояние | ||||||
|         self.initial_states.clear() |         self.initial_states.clear() | ||||||
|         self.load_all_categories() |         self.load_all_categories() | ||||||
|  |         self.installation_complete.emit() | ||||||
|         self.installation_finished = True |         self.installation_finished = True | ||||||
|  |  | ||||||
|     def closeEvent(self, event): |     def closeEvent(self, event): | ||||||
| @@ -1210,9 +1242,9 @@ class CreatePrefixDialog(QDialog): | |||||||
|  |  | ||||||
|     def __init__(self, parent=None): |     def __init__(self, parent=None): | ||||||
|         super().__init__(parent) |         super().__init__(parent) | ||||||
|         self.parent_gui = parent  # Store reference to main window |         self.parent_gui = parent  # Сохранить ссылку на главное окно | ||||||
|         self.setWindowTitle("Создание нового префикса") |         self.setWindowTitle("Создание нового префикса") | ||||||
|         self.setMinimumSize(500, 250) |         self.setMinimumSize(680, 250) | ||||||
|         self.setModal(True) |         self.setModal(True) | ||||||
|  |  | ||||||
|         # Attributes to store results |         # Attributes to store results | ||||||
| @@ -1226,9 +1258,22 @@ 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") | ||||||
|         form_layout.addRow("<b>Имя нового префикса:</b>", self.prefix_name_edit) |         name_input_layout.addWidget(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) | ||||||
| @@ -1285,7 +1330,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.update_create_button_state) |         self.prefix_name_edit.textChanged.connect(self.validate_prefix_name) | ||||||
|         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): | ||||||
| @@ -1301,11 +1346,28 @@ 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): | ||||||
|         """Валидирует данные, сохраняет их и закрывает диалог с успехом.""" |         """Валидирует данные, сохраняет их и закрывает диалог с успехом.""" | ||||||
| @@ -1315,8 +1377,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) | ||||||
| @@ -1606,8 +1668,8 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.main_layout.addLayout(content_layout) |         self.main_layout.addLayout(content_layout) | ||||||
|  |  | ||||||
|         # Фиксируем минимальные размеры |         # Фиксируем минимальные размеры | ||||||
|         self.stacked_widget.setMinimumWidth(520) |         self.stacked_widget.setMinimumWidth(535) | ||||||
|         self.info_panel.setMinimumWidth(415) |         self.info_panel.setMinimumWidth(395) | ||||||
|  |  | ||||||
|         # Вкладки |         # Вкладки | ||||||
|         self.create_auto_install_tab() |         self.create_auto_install_tab() | ||||||
| @@ -1732,6 +1794,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|         if show_global: |         if show_global: | ||||||
|             self.backup_button.setVisible(False) |             self.backup_button.setVisible(False) | ||||||
|             self.create_log_button.setVisible(False) |             self.create_log_button.setVisible(False) | ||||||
|  |             self.open_log_dir_button.setVisible(False) | ||||||
|             self.uninstall_button.setVisible(False) |             self.uninstall_button.setVisible(False) | ||||||
|         self.current_selected_app = None |         self.current_selected_app = None | ||||||
|  |  | ||||||
| @@ -1847,6 +1910,12 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.backup_button.clicked.connect(self.backup_prefix_for_app) |         self.backup_button.clicked.connect(self.backup_prefix_for_app) | ||||||
|         installed_global_layout.addWidget(self.backup_button) |         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 = QPushButton("Удалить префикс") | ||||||
|         self.uninstall_button.setIcon(QIcon.fromTheme("user-trash")) |         self.uninstall_button.setIcon(QIcon.fromTheme("user-trash")) | ||||||
|         self.uninstall_button.clicked.connect(self.uninstall_app) |         self.uninstall_button.clicked.connect(self.uninstall_app) | ||||||
| @@ -2133,7 +2202,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|  |  | ||||||
|         # --- Контейнер для выбора и управления созданными префиксами --- |         # --- Контейнер для выбора и управления созданными префиксами --- | ||||||
|         self.management_container_groupbox = QGroupBox() |         self.management_container_groupbox = QGroupBox() | ||||||
|         self.management_container_groupbox.setVisible(False)  # Скрыт, пока нет префиксов |         self.management_container_groupbox.setVisible(True)  # Всегда виден | ||||||
|         container_layout = QVBoxLayout(self.management_container_groupbox) |         container_layout = QVBoxLayout(self.management_container_groupbox) | ||||||
|  |  | ||||||
|         selector_layout = QHBoxLayout() |         selector_layout = QHBoxLayout() | ||||||
| @@ -2142,6 +2211,13 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected) |         self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected) | ||||||
|         selector_layout.addWidget(self.created_prefix_selector, 1) |         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 = QPushButton() | ||||||
|         self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export")) |         self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export")) | ||||||
|         self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)") |         self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)") | ||||||
| @@ -2286,6 +2362,24 @@ class WineHelperGUI(QMainWindow): | |||||||
|         management_layout.setColumnStretch(2, 2) |         management_layout.setColumnStretch(2, 2) | ||||||
|  |  | ||||||
|         container_layout.addWidget(self.prefix_management_groupbox) |         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.addWidget(self.management_container_groupbox) | ||||||
|         layout.addStretch() |         layout.addStretch() | ||||||
|         self.add_tab(self.prefix_tab, "Менеджер префиксов") |         self.add_tab(self.prefix_tab, "Менеджер префиксов") | ||||||
| @@ -2313,8 +2407,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") | ||||||
|         if not os.path.isdir(prefixes_root_path): |         has_prefixes_dir = os.path.isdir(prefixes_root_path) | ||||||
|             self.management_container_groupbox.setVisible(False) |         if not has_prefixes_dir: | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         try: |         try: | ||||||
| @@ -2327,25 +2421,25 @@ class WineHelperGUI(QMainWindow): | |||||||
|             prefix_names = [] |             prefix_names = [] | ||||||
|  |  | ||||||
|         self.created_prefix_selector.blockSignals(True) |         self.created_prefix_selector.blockSignals(True) | ||||||
|  |         self.remove_all_button.setEnabled(bool(prefix_names)) | ||||||
|         self.created_prefix_selector.clear() |         self.created_prefix_selector.clear() | ||||||
|         if prefix_names: |         if prefix_names: | ||||||
|             self.created_prefix_selector.addItems(prefix_names) |             self.created_prefix_selector.addItems(prefix_names) | ||||||
|         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: | ||||||
|             self.current_managed_prefix_name = None |             self.current_managed_prefix_name = None | ||||||
|             self._setup_prefix_management_panel(None) |             self._setup_prefix_management_panel(None) | ||||||
|             self.delete_prefix_button.setEnabled(False) |             self.delete_prefix_button.setEnabled(False) | ||||||
|  |             self.remove_all_button.setEnabled(False) | ||||||
|             self.create_base_pfx_button.setEnabled(False) |             self.create_base_pfx_button.setEnabled(False) | ||||||
|  |             self.open_prefix_folder_button.setEnabled(False) | ||||||
|         else: |         else: | ||||||
|             # Прокручиваем к выбранному элементу, чтобы он был виден в списке |             # Прокручиваем к выбранному элементу, чтобы он был виден в списке | ||||||
|             self.created_prefix_selector.view().scrollTo( |             self.created_prefix_selector.view().scrollTo( | ||||||
| @@ -2355,7 +2449,9 @@ class WineHelperGUI(QMainWindow): | |||||||
|             self.current_managed_prefix_name = prefix_name |             self.current_managed_prefix_name = prefix_name | ||||||
|             self._setup_prefix_management_panel(prefix_name) |             self._setup_prefix_management_panel(prefix_name) | ||||||
|             self.delete_prefix_button.setEnabled(True) |             self.delete_prefix_button.setEnabled(True) | ||||||
|  |             self.remove_all_button.setEnabled(True) | ||||||
|             self.create_base_pfx_button.setEnabled(True) |             self.create_base_pfx_button.setEnabled(True) | ||||||
|  |             self.open_prefix_folder_button.setEnabled(True) | ||||||
|  |  | ||||||
|     def delete_selected_prefix(self): |     def delete_selected_prefix(self): | ||||||
|         """Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'.""" |         """Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'.""" | ||||||
| @@ -2464,6 +2560,21 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self._run_simple_command("create-base-pfx", [prefix_name]) |         self._run_simple_command("create-base-pfx", [prefix_name]) | ||||||
|         self.command_dialog.exec_() |         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): |     def _setup_prefix_management_panel(self, prefix_name): | ||||||
|         """Настраивает панель управления префиксом на основе текущего состояния.""" |         """Настраивает панель управления префиксом на основе текущего состояния.""" | ||||||
|         is_prefix_selected = bool(prefix_name) |         is_prefix_selected = bool(prefix_name) | ||||||
| @@ -2522,19 +2633,39 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.esync_button.blockSignals(False) |         self.esync_button.blockSignals(False) | ||||||
|         self.fsync_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 = { |         display_map = { | ||||||
|             "WINEPREFIX": ("Путь", lambda v: v), |             "WINEPREFIX": ("Путь", lambda v: v), | ||||||
|             "WINEARCH": ("Архитектура", lambda v: "64-bit" if v == "win64" else "32-bit"), |             "WINEARCH": ("Архитектура", lambda v: "64-bit" if v == "win64" else "32-bit"), | ||||||
|             "WH_WINE_USE": ("Версия Wine", lambda v: "Системная" if v == "system" else v), |             "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 "Не установлено"), |             "DXVK_VER": ("Версия DXVK", lambda v: v if v else "Не установлено"), | ||||||
|             "VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"), |             "VKD3D_VER": ("Версия VKD3D", lambda v: v if v else "Не установлено"), | ||||||
|             "WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"), |             "WINEESYNC": ("ESync", lambda v: "Включен" if v == "1" else "Выключен"), | ||||||
|             "WINEFSYNC": ("FSync", 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 "Не заданы"), |             "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'<p style="line-height: 1.3; font-size: 9pt;">' | ||||||
|         html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>" |         html_content += f"<b>Имя:</b> {html.escape(prefix_name)}<br>" | ||||||
| @@ -2556,6 +2687,15 @@ class WineHelperGUI(QMainWindow): | |||||||
|             html_content += "<br><b>Дополнительные параметры:</b><br>" |             html_content += "<br><b>Дополнительные параметры:</b><br>" | ||||||
|             html_content += other_vars_html |             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>" |         html_content += "</p>" | ||||||
|         self.prefix_info_display.setHtml(html_content) |         self.prefix_info_display.setHtml(html_content) | ||||||
|  |  | ||||||
| @@ -3014,14 +3154,15 @@ 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;"> |             <div style="text-align: center; font-size: 10pt;"> | ||||||
|                 <h2>Разработчики</h2> |                 <p><span style="font-size: 11pt;"><b>Разработчики</b></span><br> | ||||||
|                 Михаил Тергоев (fidel)<br> |                 Михаил Тергоев (fidel)<br> | ||||||
|                 Сергей Пальчех (minergenon)</p> |                 Сергей Пальчех (minergenon)</p> | ||||||
|                 <p><b>Помощники</b><br> |                 <p><span style="font-size: 11pt;"><b>Помощники</b></span><br> | ||||||
|                 Иван Мажукин (vanomj)</p> |                 Иван Мажукин (vanomj)</p> | ||||||
|                 <p><b>Идея и поддержка:</b><br> |                 <p><span style="font-size: 11pt;"><b>Идея и поддержка</b></span><br> | ||||||
|                 сообщество ALT Linux</p> |                 ООО "Базальт СПО"<br> | ||||||
|  |                 ALT Linux Team</p> | ||||||
|                 <br> |                 <br> | ||||||
|                 <p>Отдельная благодарность всем, кто вносит свой вклад в развитие проекта,<br> |                 <p>Отдельная благодарность всем, кто вносит свой вклад в развитие проекта,<br> | ||||||
|                 тестирует и сообщает об ошибках!</p> |                 тестирует и сообщает об ошибках!</p> | ||||||
| @@ -3111,9 +3252,6 @@ class WineHelperGUI(QMainWindow): | |||||||
|         """Открывает диалог создания нового префикса.""" |         """Открывает диалог создания нового префикса.""" | ||||||
|         dialog = CreatePrefixDialog(self) |         dialog = CreatePrefixDialog(self) | ||||||
|         if dialog.exec_() == QDialog.Accepted: |         if dialog.exec_() == QDialog.Accepted: | ||||||
|             if not self._show_license_agreement_dialog(): |  | ||||||
|                 return |  | ||||||
|  |  | ||||||
|             self.start_prefix_creation( |             self.start_prefix_creation( | ||||||
|                 prefix_name=dialog.prefix_name, |                 prefix_name=dialog.prefix_name, | ||||||
|                 wine_arch=dialog.wine_arch, |                 wine_arch=dialog.wine_arch, | ||||||
| @@ -3199,9 +3337,6 @@ 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): | ||||||
|         """Обновляет список установленных приложений в виде кнопок""" |         """Обновляет список установленных приложений в виде кнопок""" | ||||||
|         # Если активная кнопка находится в списке удаляемых, сбрасываем ее |         # Если активная кнопка находится в списке удаляемых, сбрасываем ее | ||||||
| @@ -3353,6 +3488,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|                 self.installed_global_action_widget.setVisible(True) |                 self.installed_global_action_widget.setVisible(True) | ||||||
|                 self.backup_button.setVisible(True) |                 self.backup_button.setVisible(True) | ||||||
|                 self.create_log_button.setVisible(True) |                 self.create_log_button.setVisible(True) | ||||||
|  |                 self.update_open_log_dir_button_visibility() | ||||||
|                 self.uninstall_button.setVisible(True) |                 self.uninstall_button.setVisible(True) | ||||||
|                 self.manual_install_path_widget.setVisible(False) |                 self.manual_install_path_widget.setVisible(False) | ||||||
|  |  | ||||||
| @@ -3361,6 +3497,27 @@ class WineHelperGUI(QMainWindow): | |||||||
|             self.current_selected_app = None |             self.current_selected_app = None | ||||||
|             self.info_panel.setVisible(False) |             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): |     def _get_prefix_name_for_selected_app(self): | ||||||
|         """Извлекает имя префикса для выбранного приложения.""" |         """Извлекает имя префикса для выбранного приложения.""" | ||||||
|         if not self.current_selected_app or 'desktop_path' not in self.current_selected_app: |         if not self.current_selected_app or 'desktop_path' not in self.current_selected_app: | ||||||
| @@ -3401,8 +3558,8 @@ class WineHelperGUI(QMainWindow): | |||||||
|         msg_box = QMessageBox(self) |         msg_box = QMessageBox(self) | ||||||
|         msg_box.setWindowTitle("Создание резервной копии") |         msg_box.setWindowTitle("Создание резервной копии") | ||||||
|         msg_box.setText( |         msg_box.setText( | ||||||
|             f"Будет создана резервная копия префикса '{prefix_name}'.\n" |             f"Будет создана резервная копия префикса '{prefix_name}'.\n\n" | ||||||
|             f"Файл будет сохранен на вашем Рабочем столе в формате .whpack.\n\nПродолжить?" |             f"Файл будет сохранен в домашней директории в папке winehelper_backup_log/ в формате .whpack.\n\nПродолжить?" | ||||||
|         ) |         ) | ||||||
|         msg_box.addButton(yes_button, QMessageBox.YesRole) |         msg_box.addButton(yes_button, QMessageBox.YesRole) | ||||||
|         msg_box.addButton(no_button, QMessageBox.NoRole) |         msg_box.addButton(no_button, QMessageBox.NoRole) | ||||||
| @@ -3435,6 +3592,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.command_process.setProcessChannelMode(QProcess.MergedChannels) |         self.command_process.setProcessChannelMode(QProcess.MergedChannels) | ||||||
|         self.command_process.readyReadStandardOutput.connect(self._handle_command_output) |         self.command_process.readyReadStandardOutput.connect(self._handle_command_output) | ||||||
|         self.command_process.finished.connect(self._handle_command_finished) |         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 |         winehelper_path = self.winehelper_path | ||||||
|         args = ["backup-prefix", prefix_name] |         args = ["backup-prefix", prefix_name] | ||||||
| @@ -3500,9 +3658,9 @@ class WineHelperGUI(QMainWindow): | |||||||
|         msg_box = QMessageBox(self) |         msg_box = QMessageBox(self) | ||||||
|         msg_box.setWindowTitle("Создание лога") |         msg_box.setWindowTitle("Создание лога") | ||||||
|         msg_box.setText( |         msg_box.setText( | ||||||
|             "Приложение будет запущено в режиме отладки.\n" |             "Приложение будет запущено в режиме отладки.\n\n" | ||||||
|             "После закрытия приложения лог будет сохранен в вашем домашнем каталоге " |             "После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' " | ||||||
|             "под именем 'winehelper.log'." |             "в вашем домашнем каталоге под именем 'winehelper.log'." | ||||||
|         ) |         ) | ||||||
|         msg_box.addButton(yes_button, QMessageBox.YesRole) |         msg_box.addButton(yes_button, QMessageBox.YesRole) | ||||||
|         msg_box.addButton(no_button, QMessageBox.NoRole) |         msg_box.addButton(no_button, QMessageBox.NoRole) | ||||||
| @@ -3544,6 +3702,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|  |  | ||||||
|         wine_executable = self._get_wine_executable_for_prefix(prefix_name) |         wine_executable = self._get_wine_executable_for_prefix(prefix_name) | ||||||
|         dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self, wine_executable=wine_executable) |         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_() |         dialog.exec_() | ||||||
|  |  | ||||||
|     def _get_wine_executable_for_prefix(self, prefix_name): |     def _get_wine_executable_for_prefix(self, prefix_name): | ||||||
| @@ -3768,6 +3927,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|             # и избегания проблем с замыканием в lambda. |             # и избегания проблем с замыканием в lambda. | ||||||
|             process.finished.connect(partial(self._on_app_process_finished, desktop_path)) |             process.finished.connect(partial(self._on_app_process_finished, desktop_path)) | ||||||
|  |  | ||||||
|  |             process.finished.connect(self.update_open_log_dir_button_visibility) | ||||||
|  |  | ||||||
|             try: |             try: | ||||||
|                 process.start(program, arguments) |                 process.start(program, arguments) | ||||||
| @@ -3786,6 +3946,55 @@ class WineHelperGUI(QMainWindow): | |||||||
|             QMessageBox.critical(self, "Ошибка", |             QMessageBox.critical(self, "Ошибка", | ||||||
|                                  f"Не удалось обработать команду запуска:\n{command_str}\n\nОшибка: {str(e)}") |                                  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): |     def quit_application(self): | ||||||
|         """Инициирует процесс выхода из приложения.""" |         """Инициирует процесс выхода из приложения.""" | ||||||
|         self.is_quitting = True |         self.is_quitting = True | ||||||
| @@ -4486,6 +4695,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|             self.command_process.deleteLater() |             self.command_process.deleteLater() | ||||||
|             self.command_process = None |             self.command_process = None | ||||||
|         self.command_close_button.setEnabled(True) |         self.command_close_button.setEnabled(True) | ||||||
|  |         self.command_log_output.ensureCursorVisible() | ||||||
|  |  | ||||||
|     def _handle_launcher_creation_finished(self, exit_code, exit_status): |     def _handle_launcher_creation_finished(self, exit_code, exit_status): | ||||||
|         """Обрабатывает завершение создания ярлыка.""" |         """Обрабатывает завершение создания ярлыка.""" | ||||||
|   | |||||||