Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
266302d643 | ||
|
|
38d3a43c03 | ||
|
|
c2c5a05013 | ||
|
|
410b24c9b5 | ||
|
|
a525b9f749 | ||
|
|
3c856cd890 | ||
|
|
c2bf75d0da | ||
|
|
50a2498abb | ||
|
|
53ec0f88bd | ||
|
|
b8cebe18b7 | ||
|
|
fe4473ef76 | ||
|
|
7c53112cc9 | ||
|
|
453b5a5a99 | ||
|
|
4990ac941a | ||
|
|
656e20eaa1 | ||
|
|
72ccbaa747 | ||
|
|
e4bafa7a1f | ||
|
|
271fb70d74 | ||
|
|
0884034a31 | ||
|
|
fe37c07729 | ||
|
|
5f506223ac | ||
|
|
0590170cd2 | ||
|
|
ae4eed8be9 | ||
|
|
0231f7fe3f | ||
|
|
e4e7828420 | ||
|
|
41ec383343 | ||
|
|
3591f657f9 | ||
|
|
db88a6ebd0 | ||
|
|
691f13b046 | ||
|
|
b865533a4b | ||
|
|
df22c2b1db | ||
|
|
3bf33340b9 | ||
|
|
1c221ed1cc | ||
|
|
5fa4514665 | ||
|
|
a5e339b112 | ||
|
|
b33f476fc9 | ||
|
|
22d76d4bea | ||
|
|
6a5aeed900 | ||
|
|
b462a4729c | ||
|
|
fb79aeaddb | ||
|
|
47fbff3a0f | ||
|
|
e6051aa04b | ||
|
|
552c118595 | ||
|
|
906ad8cae6 | ||
|
|
cb6255454a | ||
|
|
daf0758d75 | ||
|
|
c8deeb1b8a | ||
|
|
9a8c185846 | ||
|
|
66f11f384d | ||
|
|
e1701fbac9 | ||
|
|
e6717908ac | ||
|
|
68c665fb8e | ||
|
|
d83ef56e0e | ||
|
|
261b70fbe0 | ||
|
|
b76c6f25f5 | ||
|
|
5e22af5b4b | ||
|
|
f84e8a9de3 | ||
|
|
422a22562f | ||
|
|
1caa6e2fc1 | ||
|
|
547a705e37 | ||
|
|
8d69318f11 | ||
|
|
e68636758c | ||
|
|
1f94dfd0e2 | ||
|
|
50bd638ad7 | ||
|
|
b07c35e879 | ||
|
|
0baa84dbed | ||
|
|
f1821b40ff | ||
|
|
608faea597 | ||
|
|
827395a0ed | ||
|
|
3fdfe0fffc | ||
|
|
f9be296cac | ||
|
|
b2e79a3571 | ||
|
|
2d808ae555 | ||
|
|
732c688e3a | ||
|
|
7611dc16c6 | ||
|
|
010f757589 | ||
|
|
55d591ac4f | ||
|
|
95ad8bdedc | ||
|
|
7fe5208333 | ||
|
|
c2e24ff327 | ||
|
|
1b63f2dd0c | ||
|
|
7cf76aaf97 | ||
|
|
b126910229 | ||
|
|
96e29eb528 | ||
|
|
3ec7b756de | ||
|
|
f640aaf6af | ||
|
|
93b9e2f638 | ||
|
|
2030cea983 | ||
|
|
793d960b65 | ||
|
|
ef74003283 | ||
|
|
81a43ca9bd | ||
|
|
f10921840e | ||
|
|
425268ade2 | ||
|
|
743ab69455 | ||
|
|
502c5e4b1b | ||
|
|
44881267cf | ||
|
|
0433ff6cee | ||
|
|
8c984f1b15 | ||
|
|
319c4453fd | ||
|
|
9ec692833e | ||
|
|
1a9297e3e5 | ||
|
|
625ee0a223 | ||
|
|
991a03b829 | ||
|
|
8eba7d21d0 | ||
|
|
eed297a226 | ||
|
|
9017aaac25 | ||
|
|
18f35ed08b | ||
|
|
f5b62e9ec2 | ||
|
|
ae55e69700 | ||
|
|
723cfdcc4c | ||
|
|
fb2f2cf020 | ||
|
|
a7d2ea994e | ||
|
|
572ce2a08a | ||
|
|
d48e50a0b4 | ||
|
|
7321bde951 | ||
|
|
f5e10a8b0d | ||
|
|
61e659ea2e | ||
|
|
728266cdb3 | ||
|
|
055dc04bb1 | ||
|
|
3b5432ecdd | ||
|
|
415ed948ad | ||
|
|
b6e99d01af | ||
|
|
6b53afa238 | ||
|
|
b27d5f31ae | ||
|
|
e62cd1463a | ||
|
|
3bab2d12c7 | ||
|
|
a14ad4ff70 | ||
|
|
39fd02d358 | ||
|
|
d7d0ef4516 | ||
|
|
4b540302dc | ||
|
|
ff7c36208d | ||
|
|
4f3355e633 | ||
|
|
bb637f48f6 | ||
|
|
e76f49a3bd | ||
|
|
0ed10c72f9 | ||
|
|
34849c9490 | ||
|
|
ebabc7ebf7 | ||
|
|
726f2f4b43 | ||
|
|
8a94f519a3 | ||
|
|
468ea73aa6 | ||
|
|
a860cacf2c | ||
|
|
416c4e5336 | ||
|
|
48f694322a | ||
|
|
b58d768ca6 | ||
|
|
28062ff5bb | ||
|
|
4bd3028c4a | ||
|
|
8edceb667c | ||
|
|
45b495eff0 | ||
|
|
0469197d77 | ||
|
|
4f067d6850 | ||
|
|
d0c6bdfdb6 | ||
|
|
41bde9d985 | ||
|
|
ee9bb767a7 | ||
|
|
1e0f8255ea | ||
|
|
af8471ea40 | ||
|
|
4bfeae6e42 | ||
|
|
ccd3176d2a | ||
|
|
0d23121a14 | ||
|
|
4fbb250a34 | ||
|
|
6091bf2cf9 | ||
|
|
dbe5226d29 | ||
|
|
08cc66c533 | ||
|
|
c457dc0d31 | ||
|
|
b3e4ae719d | ||
|
|
dc75805a31 | ||
|
|
3aebe55162 | ||
|
|
9a7a2d5f50 | ||
|
|
b4ccebc65d | ||
|
|
36b009ecd4 | ||
|
|
372b4c6a6a | ||
|
|
15d5db87ad | ||
|
|
a8a35d5bd8 | ||
|
|
87ad9e12b6 | ||
|
|
45987c9941 | ||
|
|
a2f25738cf | ||
|
|
a1c823017b | ||
|
|
5e1640a9c6 | ||
|
|
abb6f84c60 | ||
|
|
985be9b36c | ||
|
|
33ffa28d60 | ||
|
|
e1bbdebfdd | ||
|
|
a1ae2c125d | ||
|
|
4b8f94a9cc | ||
|
|
db7201f279 | ||
|
|
bfe9a3dc91 | ||
|
|
af2db32352 | ||
|
|
c04b2df049 | ||
|
|
e8e068ba3b | ||
|
|
32ac86ed51 | ||
|
|
e33d4037b1 | ||
|
|
c5cfe30877 | ||
|
|
b8bd9cd08d | ||
|
|
d942cb64c9 |
No files matched your search
@@ -0,0 +1,2 @@
|
||||
seh
|
||||
testser
|
||||
+16
-5
@@ -40,9 +40,20 @@ env/
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
.ruff_cache/
|
||||
.mypy_cache/
|
||||
.pytest_cache/
|
||||
.tox/
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.bak
|
||||
# Test and coverage
|
||||
.coverage
|
||||
htmlcov/
|
||||
|
||||
# RPM / package build artifacts
|
||||
*.rpm
|
||||
*.src.rpm
|
||||
RPMS/
|
||||
SRPMS/
|
||||
BUILD/
|
||||
BUILDROOT/
|
||||
*.spec~
|
||||
@@ -0,0 +1,111 @@
|
||||
default_language_version:
|
||||
python: python3
|
||||
|
||||
exclude: |
|
||||
(?x)(
|
||||
^\.git/|
|
||||
^__pycache__/|
|
||||
.*\.pyc$
|
||||
)
|
||||
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v5.0.0
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
- id: end-of-file-fixer
|
||||
- id: check-yaml
|
||||
- id: check-json
|
||||
- id: check-toml
|
||||
- id: check-added-large-files
|
||||
args: ["--maxkb=1024"]
|
||||
- id: check-merge-conflict
|
||||
- id: check-symlinks
|
||||
- id: check-executables-have-shebangs
|
||||
- id: check-shebang-scripts-are-executable
|
||||
- id: mixed-line-ending
|
||||
args: ["--fix=lf"]
|
||||
- id: check-case-conflict
|
||||
- id: check-ast
|
||||
- id: debug-statements
|
||||
- id: detect-private-key
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: bash-syntax-check
|
||||
name: bash syntax check
|
||||
entry: bash -n
|
||||
language: system
|
||||
files: |
|
||||
(?x)(
|
||||
^winehelper$|
|
||||
^dependencies\.sh$|
|
||||
^autoinstall/|
|
||||
^manualinstall/|
|
||||
^testinstall/|
|
||||
^hiden_scripts/|
|
||||
^database/.*\.whdb$
|
||||
)
|
||||
types: [shell]
|
||||
|
||||
- id: py-compile
|
||||
name: python compile
|
||||
entry: python3 -m py_compile
|
||||
language: system
|
||||
types: [python]
|
||||
|
||||
- id: shellcheck
|
||||
name: shellcheck
|
||||
entry: shellcheck
|
||||
args: ["--severity=error", "--exclude=SC2068,SC2145,SC2199"]
|
||||
language: system
|
||||
files: |
|
||||
(?x)(
|
||||
^winehelper$|
|
||||
^dependencies\.sh$|
|
||||
^autoinstall/|
|
||||
^manualinstall/|
|
||||
^testinstall/|
|
||||
^hiden_scripts/|
|
||||
^database/.*\.whdb$
|
||||
)
|
||||
types: [shell]
|
||||
|
||||
- repo: https://github.com/scop/pre-commit-shfmt
|
||||
rev: v3.10.0-1
|
||||
hooks:
|
||||
- id: shfmt
|
||||
args: ["--write", "--indent", "4", "--case-indent", "--space-redirects"]
|
||||
files: |
|
||||
(?x)(
|
||||
^winehelper$|
|
||||
^dependencies\.sh$|
|
||||
^autoinstall/|
|
||||
^manualinstall/|
|
||||
^testinstall/|
|
||||
^hiden_scripts/|
|
||||
^database/.*\.whdb$
|
||||
)
|
||||
types: [shell]
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.11.4
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: ["--fix", "--show-fixes"]
|
||||
- id: ruff-format
|
||||
|
||||
- repo: https://github.com/codespell-project/codespell
|
||||
rev: v2.3.0
|
||||
hooks:
|
||||
- id: codespell
|
||||
args: ["--ignore-words", ".codespell-ignorewords"]
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: sha256sum-list-check
|
||||
name: sha256sum.list format check
|
||||
entry: scripts/check_sha256sum_list.sh
|
||||
language: script
|
||||
files: ^sha256sum\.list$
|
||||
pass_filenames: false
|
||||
@@ -15,8 +15,8 @@ WineHelper — инструмент для упрощения установки
|
||||
## Технологический стек
|
||||
|
||||
### Основные технологии
|
||||
- **Bash** — основной язык для CLI-интерфейса (~2692 строк в главном скрипте)
|
||||
- **Python 3** — графический интерфейс с использованием PyQt5
|
||||
- **Bash** — основной язык для CLI-интерфейса (~3075 строк в главном скрипте)
|
||||
- **Python 3** — графический интерфейс с использованием PyQt5 (~3413 строк в `winehelper_gui.py` и модули `winehelperqt/`)
|
||||
- **Wine** — запуск Windows-приложений (поддерживаются различные версии: vanilla, staging, Proton, tkg, crossover)
|
||||
- **DXVK/VKD3D** — трансляция DirectX → Vulkan
|
||||
|
||||
@@ -39,12 +39,16 @@ winehelper/
|
||||
├── winehelper_gui.py # GUI на PyQt5 (точка входа)
|
||||
├── winehelperqt/ # Python-модуль GUI
|
||||
│ ├── __init__.py # Экспорты основных классов
|
||||
│ ├── logger.py # Единый логгер (get_logger/setup_logger), вывод в консоль
|
||||
│ ├── dialogs/ # Диалоговые окна
|
||||
│ │ ├── base_version_dialog.py
|
||||
│ │ ├── component_version.py
|
||||
│ │ ├── create_prefix.py # Создание префикса
|
||||
│ │ ├── file_associations.py
|
||||
│ │ ├── settings.py # Настройки
|
||||
│ │ ├── noexec_warning.py # Предупреждение о noexec
|
||||
│ │ ├── prefix_logging.py # Включение/выключение логирования на вкладке префиксов
|
||||
│ │ ├── settings.py # Настройки префикса
|
||||
│ │ ├── windows_version.py # Выбор версии Windows
|
||||
│ │ ├── wine_version.py # Выбор версии Wine
|
||||
│ │ └── winetricks_manager.py
|
||||
│ ├── parsers/ # Парсеры
|
||||
@@ -52,14 +56,35 @@ winehelper/
|
||||
│ │ ├── sha256_parser.py # Парсинг sha256sum.list
|
||||
│ │ └── winetricks_parser.py
|
||||
│ ├── services/ # Бизнес-логика
|
||||
│ │ ├── application_installer.py
|
||||
│ │ ├── app_launcher.py # Запуск приложений
|
||||
│ │ ├── command_runner.py # Диалоги выполнения команд winehelper (бэкап, удаление и т.п.)
|
||||
│ │ ├── desktop_file_manager.py
|
||||
│ │ ├── install_runner.py # Диалог и процесс установки приложений
|
||||
│ │ ├── prefix_manager.py # Управление префиксами
|
||||
│ │ ├── process_handler.py
|
||||
│ │ ├── script_manager.py
|
||||
│ │ ├── settings_manager.py
|
||||
│ │ └── winetricks_service.py
|
||||
│ ├── utils/ # Утилиты
|
||||
│ │ └── log_handler.py # Обработка логов
|
||||
│ └── widgets/ # Кастомные виджеты
|
||||
│ │ ├── cache_service.py
|
||||
│ │ ├── desktop_entry.py
|
||||
│ │ ├── dialog_utils.py
|
||||
│ │ ├── environment.py
|
||||
│ │ ├── export_utils.py
|
||||
│ │ ├── font_utils.py # Системные шрифты: app_font()/fixed_font()
|
||||
│ │ ├── grid_utils.py
|
||||
│ │ ├── log_handler.py # Обработка логов
|
||||
│ │ ├── prefix_info.py # Построение HTML с информацией о префиксе
|
||||
│ │ ├── process_utils.py
|
||||
│ │ └── version_utils.py
|
||||
│ └── widgets/ # Вкладки главного окна и кастомные виджеты
|
||||
│ ├── help_tab.py # Вкладка «Справка»
|
||||
│ ├── icon_manager.py
|
||||
│ ├── info_panel.py # Контроллер правой информационной панели
|
||||
│ ├── install_tab.py # Вкладки установки (авто/ручная/сторонняя)
|
||||
│ ├── installed_tab.py # Вкладка «Установленные»
|
||||
│ ├── prefix_tab.py # Вкладка «Менеджер префиксов»
|
||||
│ ├── tab_names.py # Константы имён вкладок (TabNames)
|
||||
│ └── __init__.py
|
||||
├── autoinstall/ # Скрипты автоматической установки (43 приложения)
|
||||
├── manualinstall/ # Скрипты ручной установки (9 приложений)
|
||||
├── testinstall/ # Тестовые скрипты установки
|
||||
@@ -68,9 +93,14 @@ winehelper/
|
||||
│ ├── gui/ # Иконки приложения (SVG)
|
||||
│ └── handbook/ # Скриншоты для документации
|
||||
├── hiden_scripts/ # Скрытые/вспомогательные скрипты
|
||||
├── scripts/ # Вспомогательные скрипты
|
||||
│ └── check_sha256sum_list.sh # Проверка формата sha256sum.list
|
||||
├── auto_completion/ # Автодополнение для bash
|
||||
├── dependencies.sh # Установка системных зависимостей
|
||||
├── sha256sum.list # SHA256 хеши загружаемых файлов
|
||||
├── .pre-commit-config.yaml # Настройки pre-commit
|
||||
├── pyproject.toml # Настройки ruff
|
||||
├── .codespell-ignorewords # Исключения для codespell
|
||||
└── winehelper.desktop # Desktop-файл для запуска GUI
|
||||
```
|
||||
|
||||
@@ -92,11 +122,23 @@ winehelper/
|
||||
|
||||
Модульная архитектура PyQt5:
|
||||
|
||||
- **WineHelperGUI** — главное окно, управление вкладками
|
||||
- **PrefixManager** — CRUD операции с префиксами
|
||||
- **ApplicationInstaller** — установка приложений
|
||||
- **WineHelperGUI** — главное окно приложения (`winehelper_gui.py`)
|
||||
- **ScriptManager** — загрузка и обработка скриптов установки
|
||||
- **ScriptParser** — парсинг информации из скриптов установки
|
||||
- **Диалоги** — модальные окна для настроек и выбора
|
||||
- **PrefixManager** — CRUD операции с префиксами
|
||||
- **DesktopFileManager** — работа с .desktop файлами
|
||||
- **AppLauncher** — запуск и мониторинг установленных приложений
|
||||
- **SettingsManager** — чтение/запись настроек префиксов
|
||||
- **WinetricksService** — работа с компонентами Winetricks
|
||||
- **Диалоги** — модальные окна для настроек и выбора (Wine, Windows, компоненты, ассоциации файлов, предупреждение noexec)
|
||||
- **Утилиты** — логирование, работа с окружением, экспорт, сеточные макеты, управление иконками
|
||||
|
||||
#### Как CLI и GUI общаются
|
||||
|
||||
- **CLI → GUI.** `./winehelper gui` экспортирует окружение (`DATA_PATH`, `RUN_SCRIPT`, `USER_WORK_PATH`, `WH_DIST_DIR`, `WH_TMP_DIR`, `WH_DEVEL`, `WH_ICON_*`, `LICENSE_FILE`, `AGREEMENT`, `CHANGELOG_FILE`, …) и затем `exec`-ает `python3 winehelper_gui.py`. GUI читает его через `winehelperqt/utils/environment.py` (`EnvironmentConfig`). **Запустить GUI напрямую через `python3 winehelper_gui.py` нельзя** — нужно это окружение.
|
||||
- **GUI → CLI.** Каждое действие GUI (установка, удаление/бэкап/восстановление префикса, winetricks, запуск exe, killall…) собирает argv `winehelper <команда>` из `EnvironmentConfig.RUN_SCRIPT` и выполняет в `QProcess`, стримя stdout в диалог лога. Общая настройка `QProcess` — `winehelperqt/utils/process_utils.py`; диалоги долгих команд — `services/command_runner.py`, `services/install_runner.py`.
|
||||
- CLI определяет запуск из GUI (`WH_USE_GUI=1` + проверка родительского процесса) и пропускает интерактивный лицензионный запрос.
|
||||
- Завершённые объекты `QProcess` нужно удалять (см. `utils/process_utils.py`) — утечки были реальным багом.
|
||||
|
||||
### Скрипты установки
|
||||
|
||||
@@ -121,6 +163,27 @@ wine_run_install "${SETUP_EXE}" /S
|
||||
create_desktop "Имя ярлыка" "${EXE_PATH}" "icon_name"
|
||||
```
|
||||
|
||||
**Важно: скрипты не исполняются, а подключаются (`source`)** внутри функции `run_autoinstall`. Поэтому они вызывают функции CLI напрямую и видят его переменные. Любая синтаксическая ошибка в скрипте ломает сам CLI — перед коммитом проверяйте `bash -n` / shellcheck.
|
||||
|
||||
- `$1` — имя скрипта; `$2` — путь к дистрибутиву от пользователя для скриптов `manualinstall/` (при отсутствии `$2` скрипт обязан вызвать `fatal`).
|
||||
- `PROG_ICON="icon_name"` указывает на `image/<icon_name>.png`.
|
||||
- Режим определяется каталогом:
|
||||
- `autoinstall/` — полностью автоматическая установка, показывается в GUI;
|
||||
- `manualinstall/` — требуется дистрибутив пользователя;
|
||||
- `testinstall/` — экспериментальные, в GUI скрыты за галочкой;
|
||||
- `hiden_scripts/` — не перечисляются нигде, запускаются только по явному пути.
|
||||
- Каждый скачиваемый архив (сборки Wine, базовые префиксы, DXVK/VKD3D) должен иметь строку в `sha256sum.list` — `check_file_sum` отвергает незарегистрированные.
|
||||
|
||||
### Файлы `.whdb` и `last.conf`
|
||||
|
||||
Пофайловые настройки запуска — это тоже bash-сниппеты, которые подключаются (`source`):
|
||||
|
||||
- `create_desktop` создаёт `<exe>.whdb` рядом с установленным exe, копируя туда строки `export` из скрипта. Скрипты могут дописывать в этот файл дополнительный bash (хуки, фоновые задачи) — пример: `autoinstall/ksamu`.
|
||||
- `database/*.whdb` — общие профили, сопоставляемые по строке-комментарию `#name.exe`, когда своего `<exe>.whdb` нет (например, T-FLEX).
|
||||
- Перед каждым `wine_run` функция `init_database` подключает подходящий `.whdb`, затем `$WINEPREFIX/last.conf` (последние использованные настройки этого префикса). `last.conf` — это то, что правит диалог «настройки префикса» в GUI (`WH_WINDOWS_VER`, `WH_MAIN_DECORATED`, `WH_VIRTUAL_DESKTOP`, `WH_XDG_OPEN`, `WH_USE_CPCSP_PROXY` и т. д.).
|
||||
|
||||
Всё это подключается через `source`, поэтому синтаксическая ошибка в скрипте или `.whdb` ломает CLI — проверяйте `bash -n` / shellcheck перед коммитом.
|
||||
|
||||
## Режимы работы
|
||||
|
||||
### Системный режим
|
||||
@@ -133,15 +196,25 @@ create_desktop "Имя ярлыка" "${EXE_PATH}" "icon_name"
|
||||
При запуске из репозитория:
|
||||
- Рабочая директория: `~/test-winehelper/`
|
||||
- Данные берутся из текущей директории
|
||||
- Включается проверка синтаксиса скриптов
|
||||
- Устанавливается `WH_DEVEL=1` — в GUI появляется вкладка «Настройки» и dev-иконка
|
||||
- Префиксы, скачанные сборки Wine (`dist/`) и временные файлы лежат под `~/test-winehelper/`, поэтому запуски в режиме разработки не трогают реальную установку пользователя
|
||||
- Включается проверка синтаксиса: CLI прогоняет `bash -n` по самому себе, `dependencies.sh` и каждому скрипту в `autoinstall/`, `manualinstall/`, `testinstall/`, `database/`; при первой же синтаксической ошибке работа прерывается
|
||||
|
||||
| | системный режим | режим разработки |
|
||||
|---|---|---|
|
||||
| данные (`DATA_PATH`) | `/usr/share/winehelper/` | корень репозитория |
|
||||
| рабочая директория (`USER_WORK_PATH`) | `~/.local/share/winehelper/` | `~/test-winehelper/` |
|
||||
| `WH_DEVEL` | не задана | `1` |
|
||||
|
||||
## Команды CLI
|
||||
|
||||
```bash
|
||||
# Установка
|
||||
winehelper install list # Список доступных программ
|
||||
winehelper -i <script_name> # Установить программу
|
||||
winehelper -i <script_name> /path # Установить из дистрибутива
|
||||
winehelper -i <script_name> # Установить программу (autoinstall/)
|
||||
winehelper -i <script_name> /path # Установить из дистрибутива (manualinstall/, $2 = путь к дистрибутиву)
|
||||
winehelper -i "/path/to/script" # Установить из стороннего скрипта (режим "another")
|
||||
winehelper -i <script_name> --clear-pfx # Игнорировать BASE_PFX, строить префикс с нуля
|
||||
|
||||
# Управление префиксами
|
||||
winehelper create-prefix # Создать префикс
|
||||
@@ -150,23 +223,45 @@ winehelper backup-prefix [name] # Создать бэкап (.whpack)
|
||||
winehelper restore-prefix <path> # Восстановить из бэкапа
|
||||
|
||||
# Wine tools
|
||||
winehelper winefile # Файловый менеджер
|
||||
winehelper winecfg # Настройки Wine
|
||||
winehelper winereg # Редактор реестра
|
||||
winehelper winefile # Файловый менеджер
|
||||
winehelper wineconsole # Терминал Wine (cmd.exe)
|
||||
winehelper winetricks [component] # Winetricks
|
||||
winehelper <file.exe> # Запустить exe в префиксе
|
||||
winehelper run <exe_name> # Запустить установленную программу (префикс берётся из .whdb)
|
||||
winehelper debug [флаги] [программа] # Запуск программы в отладчике winedbg
|
||||
winehelper killall # Остановить все процессы Wine, запущенные из USER_WORK_PATH
|
||||
winehelper run-in-prefix <префикс> <файл> # Запустить произвольный exe/msi в указанном префиксе
|
||||
winehelper --help # Полный список подкоманд (функция wh_info)
|
||||
|
||||
# Управление компонентами
|
||||
winehelper install-dxvk [version] # Установить DXVK
|
||||
winehelper install-vkd3d [version] # Установить VKD3D
|
||||
winehelper change-wine [version] # Сменить версию Wine
|
||||
winehelper clear-winetricks-cache # Очистить кэш Winetricks
|
||||
|
||||
# Другое
|
||||
winehelper --debug <command> # Режим отладки
|
||||
winehelper --changelog # История изменений
|
||||
winehelper gui # Запустить GUI
|
||||
```
|
||||
|
||||
### Переменные окружения и неинтерактивный режим
|
||||
|
||||
```bash
|
||||
WH_LOG_LEVEL=debug ./winehelper gui # Уровень логов GUI: debug/info/warning/error
|
||||
WH_SKIP_DEPS=1 ./winehelper ... # Пропустить проверку i586-зависимостей (rpm -q 32-битных библиотек)
|
||||
yes | ./winehelper -i <script> # Неинтерактивно: лицензионный запрос — это `read -p`;
|
||||
# когда stdin не tty, проверка зависимостей тоже пропускается
|
||||
```
|
||||
|
||||
## Как работает выполнение (runtime)
|
||||
|
||||
- `wine_run` сопоставляет тип файла способу запуска: `.msi` → `msiexec /i` (для тихой установки передавайте `/qn`), `.exe` → `start /wait /high /unix` (переменная `WINE_WIN_START`).
|
||||
- Вывод Wine каждого запуска дублируется (`tee`) в `~/winehelper_backup_log/<префикс>_<exe>_<дата>.log`.
|
||||
- По `sha256sum.list` проверяются **только** сборки Wine, базовые префиксы и DXVK/VKD3D. Скачанные дистрибутивы приложений **не** проверяются (`check_file_sum` отвергает лишь незарегистрированные архивы из первого списка).
|
||||
- Внутренний конвейер CLI: инициализация окружения/путей → помощники (`fatal`, `print_*`, `try_download`, `unpack`, `check_file_sum`) → управление Wine/DXVK/префиксами (`init_wine_ver`, `init_wineprefix`, `prepair_wine`) → `wine_run` / `wine_run_install` → интеграция с рабочим столом (`create_desktop`) → большой диспетчер `case "$arg1"` внизу файла. Новые подкоманды добавляются в этот `case` и в текст `--help` (функция `wh_info`).
|
||||
|
||||
## Разработка
|
||||
|
||||
### Запуск в режиме разработки
|
||||
@@ -180,6 +275,78 @@ winehelper gui # Запустить GUI
|
||||
./winehelper -i alta-expert
|
||||
```
|
||||
|
||||
### Стиль коммитов
|
||||
|
||||
Коммиты оформляются по Conventional Commits с указанием области: `feat(gui): ...`, `refactor(gui): ...`, `fix(gui): ...` и т. п. Документация, комментарии, сообщения лога и строки интерфейса — на русском; так же оформляется и новый код.
|
||||
|
||||
### Pre-commit
|
||||
|
||||
Проект использует [pre-commit](https://pre-commit.com/) для автоматической проверки кода перед коммитом.
|
||||
|
||||
#### Установка
|
||||
|
||||
```bash
|
||||
# Установить pre-commit
|
||||
pip install --user pre-commit
|
||||
|
||||
# Установить git-хуки
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
#### Использование
|
||||
|
||||
Проверка запускается автоматически при обычном `git commit`:
|
||||
|
||||
```bash
|
||||
git add some-file.py
|
||||
git commit -m "feat: описание изменения"
|
||||
```
|
||||
|
||||
Если хуки проходят — коммит создаётся. Если падают — коммит отменяется, а в терминале выводится список ошибок.
|
||||
|
||||
Проверить все файлы вручную:
|
||||
|
||||
```bash
|
||||
pre-commit run --all-files
|
||||
```
|
||||
|
||||
Проверить только staged-файлы:
|
||||
|
||||
```bash
|
||||
pre-commit run
|
||||
```
|
||||
|
||||
Обновить версии хуков:
|
||||
|
||||
```bash
|
||||
pre-commit autoupdate
|
||||
```
|
||||
|
||||
#### Включённые проверки
|
||||
|
||||
- `trailing-whitespace`, `end-of-file-fixer`, `mixed-line-ending` — форматирование файлов
|
||||
- `check-ast` — синтаксис Python
|
||||
- `debug-statements` — отладочные вызовы (`breakpoint()`, `pdb`)
|
||||
- `detect-private-key` — случайно закоммиченные ключи
|
||||
- `bash-syntax-check` — синтаксис bash-скриптов
|
||||
- `py-compile` — компиляция Python-файлов (`python3 -m py_compile`)
|
||||
- `shellcheck` — линтинг bash-скриптов
|
||||
- `shfmt` — форматирование bash-скриптов
|
||||
- `ruff` — линтинг Python (импорты, отступы, line-length=120)
|
||||
- `ruff-format` — автоформатирование Python
|
||||
- `codespell` — проверка орфографии
|
||||
- `sha256sum.list format check` — валидация формата `sha256sum.list`
|
||||
|
||||
#### Важные нюансы
|
||||
|
||||
- Хук проверяет только файлы из индекса (`git add`).
|
||||
- Чтобы пропустить проверку (не рекомендуется):
|
||||
```bash
|
||||
git commit --no-verify
|
||||
```
|
||||
- `pyproject.toml` содержит настройки `ruff` (line-length=120, select правил).
|
||||
- Слова, которые `codespell` считает опечатками, но которые являются корректными для проекта, перечислены в `.codespell-ignorewords`.
|
||||
|
||||
### Добавление нового скрипта установки
|
||||
|
||||
1. Создать файл в `autoinstall/` (для автоматической установки) или `manualinstall/` (требуется дистрибутив)
|
||||
@@ -195,12 +362,38 @@ winehelper gui # Запустить GUI
|
||||
- Проверять наличие переменных перед использованием
|
||||
- Использовать функции обработки ошибок (`fatal`, `print_error`)
|
||||
- Экранировать все пути с помощью кавычек
|
||||
- Предпочитать готовые помощники (`try_remove_file`, `try_copy_dir`, `create_new_dir`, `try_download`) сырым `rm`/`cp`/`wget`
|
||||
|
||||
**Python:**
|
||||
- Импортировать из `winehelperqt` относительно
|
||||
- Использовать type hints где возможно
|
||||
- Импорты — только абсолютные (`from winehelperqt.x import y`). Относительные (`from .`, `from ..`) запрещены
|
||||
- Qt импортируется ТОЛЬКО через слой совместимости: `from winehelperqt.qt_compat import Qt, QWidget, ...`. Прямые импорты `PyQt5`/`PyQt6` в коде запрещены (единственное исключение — сам `winehelperqt/qt_compat.py`). Это нужно для работы на PyQt6 (p11+) и PyQt5 (p10) из единой кодовой базы:
|
||||
- enum'ы только в scoped-форме: `Qt.AlignmentFlag.AlignCenter`, `QFont.Weight.Bold`, `QMessageBox.StandardButton.Yes` (работает в PyQt5 ≥5.11 и PyQt6);
|
||||
- `exec()` вместо `exec_()`;
|
||||
- сравнение int из сигналов (например `QCheckBox.stateChanged`) с enum — через `Qt.CheckState(state) == Qt.CheckState.Checked`;
|
||||
- для теста конкретного binding'а: `WH_QT_BINDING=pyqt5 ./winehelper gui` (или `pyqt6`);
|
||||
- выбор binding'а также сохраняется во вкладке «Настройки» (ключ `qt_binding` в `~/.config/winehelper/logging.conf`: auto/pyqt6/pyqt5; приоритет: `WH_QT_BINDING` > конфиг > auto); применяется при перезапуске GUI — переключение «на лету» в одном процессе невозможно (PyQt5 и PyQt6 нельзя загружать вместе)
|
||||
- Документация на русском языке
|
||||
- Классы должны наследоваться от соответствующих QWidget
|
||||
- Код проходит проверки `ruff` и `ruff-format` (см. раздел Pre-commit)
|
||||
- Желательно добавлять type hints для новых функций и методов
|
||||
- Для вывода сообщений использовать логгер, а не `print()`:
|
||||
```python
|
||||
from winehelperqt.logger import get_logger
|
||||
logger = get_logger(__name__)
|
||||
```
|
||||
Логгер настраивается один раз в `main()` (`winehelper_gui.py`) через `setup_logger()`.
|
||||
Уровень задаётся переменной окружения `WH_LOG_LEVEL` (debug/info/warning/error, по умолчанию info)
|
||||
либо во вкладке «Настройки» GUI (вкладка отображается только в режиме разработки — при тестовом запуске из репозитория, когда `WH_DEVEL=1`).
|
||||
Вывод идёт в stdout — виден при запуске GUI из терминала (`./winehelper gui`).
|
||||
При выводе в терминал (tty) уровни подсвечиваются цветом (`ColoredFormatter`): DEBUG — голубой, INFO — зелёный, WARNING — жёлтый, ERROR — красный, CRITICAL — жирный красный.
|
||||
|
||||
## Воспроизведение в headless-окружении (podman)
|
||||
|
||||
Использовалось для бага #59578. Образ `registry.altlinux.org/sisyphus/base` уже содержит репозиторий `x86_64-i586`. От root:
|
||||
`apt-get install apt-repo xorg-xvfb xdotool ImageMagick winetricks 7-zip icoutils cabextract procps psmisc which`,
|
||||
затем `bash dependencies.sh` (нужен `apt-repo`), `useradd -m test`, `mkdir -m 1777 /tmp/.X11-unix`.
|
||||
|
||||
CLI запускать от непривилегированного пользователя (от root он отказывается), репозиторий монтировать read-only (режим разработки → `~/test-winehelper/`), поднять `Xvfb :99` + `DISPLAY=:99` и обязательно задать **`LANG=ru_RU.UTF-8`** — без UTF-8 локали установка MSI с кириллическими путями откатывается (`cabinet_copy_file ... error 3`), а интерфейсы приложений рисуют `?`. Скриншоты: `import -window root out.png`; список окон: `xdotool search --name ""`.
|
||||
|
||||
## Безопасность
|
||||
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
История изменений:
|
||||
|
||||
0.13.0
|
||||
* обновлен графический режим Qt5:
|
||||
- исправлены/улучшены основные функции
|
||||
- запуск утилит Wine выполняется через winehelper (CLI) вместо прямого вызова wine
|
||||
- добавлены индикаторы-иконки на кнопках версий Wine и DXVK/VKD3D
|
||||
- добавлена сортировка версий Wine по убыванию
|
||||
- удалена вкладка "Загрузка" в окне выбора версии Wine
|
||||
- исправлена автопрокрутка списка в менеджере компонентов при поиске
|
||||
- исправлено определение .exe файлов без учета регистра
|
||||
- скрытие ярлыка установленного приложения, если .exe файл отсутствует
|
||||
- добавлена корректная активация CPCSP_PROXY в дополнительных настройках префикса
|
||||
- добавлена принудительная переустановка cpcsp_proxy при включении
|
||||
* добавлены версии wine:
|
||||
- wine-11.0-alt-tkg
|
||||
- wine-9.0-alt-tkg (i586, amd64, wow64)
|
||||
- wine-10.0-alt-tkg (i586, amd64, wow64)
|
||||
- wine-10.0-alt-scadoffice-wow64
|
||||
* удалены неиспользуемые версии wine
|
||||
* обновлены скрипты установок:
|
||||
- t-flex: единый префикс для всех версий, используется wine с исправлением всплывающих окон и 3D на Wayland
|
||||
- emias: используется wine с исправлением сворачивания окон
|
||||
- scadoffice: используется специальная сборка wine (демо версия программы)
|
||||
- olimp: добавлен itss в префикс, исправлен фокус окна и окна справки
|
||||
- ctm-service: исправлено имя exe для desktop файла
|
||||
- daobit-cservice: исправлено имя установщика и замена CService32.exe
|
||||
* добавлена поддержка запуска сторонних скриптов установки
|
||||
* добавлена минимальная генерация .whdb файла при ручном создании ярлыка
|
||||
* возвращено уведомление о монтировании home с флагом noexec
|
||||
* добавлена возможность выбрать рабочий каталог для WineHelper:
|
||||
winehelper data-path "/путь/к/каталогу"
|
||||
|
||||
0.12.0
|
||||
* исправлена работа cpcsp_proxy при монтировании home с флагом noexec
|
||||
* обновлены все скрипты установки ВЭД и СТМ
|
||||
|
||||
@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
@@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
@@ -158,7 +158,7 @@ Library.
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
@@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
@@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
@@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
|
||||
@@ -72,6 +72,12 @@
|
||||
$ winehelper -i is-record-station "/путь/до/установочного_файла"
|
||||
```
|
||||
|
||||
3. **Установка из стороннего скрипта** — можно передать путь к собственному скрипту установки, подготовленному по шаблону WineHelper.
|
||||
Пример:
|
||||
```
|
||||
$ winehelper -i "/путь/до/скрипта_установки"
|
||||
```
|
||||
|
||||
### Процесс установки приложений из списка скриптов
|
||||
|
||||
При первом запуске **WineHelper** проверяются и при необходимости устанавливаются дополнительные зависимости (запрашиваются права root).
|
||||
@@ -142,7 +148,7 @@ $ winehelper "/путь/до/установочного_файла.exe"
|
||||
2 - Префикс2
|
||||
Выберите префикс (0-2):
|
||||
```
|
||||
Необходимо указать номер удаляемого префикса и нажать клавишу **Enter**.
|
||||
Необходимо указать номер удаляемого префикса и нажать клавишу **Enter**.
|
||||
После выбора префикса автоматически:
|
||||
- Создаётся копия префикса.
|
||||
- Внутри префикса сохраняется используемая версия WINE.
|
||||
@@ -171,7 +177,6 @@ WineHelper предоставляет доступ к основным инст
|
||||
winehelper winecfg # запуск wine конфигуратора для префикса
|
||||
winehelper winereg # запуск редактора реестра для префикса
|
||||
winehelper wineconsole # запуск терминала wine (cmd.exe)
|
||||
winehelper winetricks # запуск графического интерфейса winetricks
|
||||
winehelper winetricks [компонент] # автоматическая установка дополнительного компонента в префикс
|
||||
```
|
||||
После выполнения любой из вышеперечисленных команд отображается список существующих префиксов:
|
||||
@@ -219,24 +224,40 @@ WineHelper предоставляет доступ к основным инст
|
||||
install list список возможных установочных скриптов
|
||||
install [скрипт] запустить скрипт установки программы
|
||||
install [скрипт] --clear-pfx не использовать готовый префикс для установки ПО
|
||||
install "путь/до/скрипта" запустить сторонний скрипт установки
|
||||
|
||||
install-dxvk [версия|none|list] установить, удалить или показать версии DXVK
|
||||
install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D
|
||||
change-wine [версия] изменить версию Wine для текущего префикса
|
||||
|
||||
installed список установленных программ
|
||||
run [программа] запуск программы (отладка)
|
||||
run [программа] запуск программы
|
||||
debug [флаги] [программа] запуск программы в отладчике winedbg
|
||||
Флаги:
|
||||
--auto, -a автоматический backtrace
|
||||
--gdb, -g режим gdb
|
||||
--interactive, -i интерактивный режим
|
||||
remove-all удалить WineHelper и все связанные данные
|
||||
create-prefix создать префикс
|
||||
remove-prefix [имя_префикса] удалить префикс и все связанные данные
|
||||
backup-prefix [имя_префикса] создать резервную копию префикса
|
||||
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
|
||||
clear-winetricks-cache очистить кэш Winetricks
|
||||
|
||||
winecfg запуск wine конфигуратора для префикса
|
||||
winereg запуск редактора реестра для префикса
|
||||
winefile запуск файлового менеджера wine
|
||||
wineconsole запуск терминала wine (cmd.exe)
|
||||
control запуск панели управления wine
|
||||
uninstaller запуск удаления программ wine
|
||||
winetricks [компонент] автоматическая установка дополнительного компонента в префикс
|
||||
killall остановить все процессы Wine
|
||||
run-in-prefix <префикс> <файл> запустить файл в указанном префиксе
|
||||
|
||||
Параметры:
|
||||
--help показать эту справку и выйти
|
||||
--version показать информацию о пакете и его версии
|
||||
--changelog показать историю изменений
|
||||
--debug [команда] включить режим логирования работы WINE
|
||||
</pre>
|
||||
|
||||
</details>
|
||||
|
||||
@@ -4,25 +4,21 @@ _winehelper_completions() {
|
||||
COMPREPLY=()
|
||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||
opts="--help --version --debug install installed install-dxvk install-vkd3d -r -i remove-all --clear-pfx killall remove-prefix backup-prefix restore-prefix create-prefix --changelog changelog change-wine clear-winetricks-cache"
|
||||
wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run"
|
||||
opts="--help --version install installed install-dxvk install-vkd3d -r -i remove-all killall remove-prefix backup-prefix restore-prefix create-prefix change-wine change-windows-ver clear-winetricks-cache gui data-path version help --changelog changelog create-base-pfx init-prefix run-in-prefix debug"
|
||||
wine_cmd="winecfg winereg winefile wineconsole winetricks desktop regedit explorer cmd run uninstaller control"
|
||||
|
||||
case "${prev}" in
|
||||
winehelper)
|
||||
COMPREPLY=( $(compgen -W "${opts} ${wine_cmd}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
--debug)
|
||||
COMPREPLY=( $(compgen -W "${wine_cmd}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
install|-i)
|
||||
local scripts="$(ls -1 /usr/share/winehelper/autoinstall) $(ls -1 /usr/share/winehelper/manualinstall)"
|
||||
COMPREPLY=( $(compgen -W "list ${scripts}" -- "${cur}") )
|
||||
local scripts="$(ls -1 /usr/share/winehelper/autoinstall 2>/dev/null) $(ls -1 /usr/share/winehelper/manualinstall 2>/dev/null) $(ls -1 /usr/share/winehelper/testinstall 2>/dev/null)"
|
||||
COMPREPLY=( $(compgen -W "list --clear-pfx ${scripts}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
run|installed)
|
||||
local installed=$(ls -1 ~/.local/share/winehelper/ | grep ".desktop" | sed 's/.desktop//')
|
||||
local installed=$(ls -1 ~/.local/share/winehelper/ 2>/dev/null | grep ".desktop" | sed 's/.desktop//')
|
||||
COMPREPLY=( $(compgen -W "${installed}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
@@ -31,7 +27,17 @@ _winehelper_completions() {
|
||||
COMPREPLY=( $(compgen -W "${prefixes}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
run-in-prefix)
|
||||
local prefixes=$(ls -1 ~/.local/share/winehelper/prefixes 2>/dev/null)
|
||||
COMPREPLY=( $(compgen -W "${prefixes}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
restore-prefix)
|
||||
COMPREPLY=( $(compgen -f -X '!*.whpack' -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
data-path)
|
||||
COMPREPLY=( $(compgen -d -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
install-dxvk|install-vkd3d)
|
||||
@@ -48,7 +54,15 @@ _winehelper_completions() {
|
||||
COMPREPLY=( $(compgen -W "system ${wine_versions}" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
change-windows-ver)
|
||||
COMPREPLY=( $(compgen -W "2k xp xp64 2k3 vista 7 8 81 10 11" -- "${cur}") )
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
if [[ "${COMP_WORDS[COMP_CWORD-2]}" == "run-in-prefix" ]] ; then
|
||||
COMPREPLY=( $(compgen -f -- "${cur}") )
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -5,8 +5,9 @@ _winehelper() {
|
||||
|
||||
opts=(
|
||||
'--help[Вывести справку]'
|
||||
'help[Вывести справку]'
|
||||
'--version[Показать информацию о пакете и его версии]'
|
||||
'--debug[Режим отладки]'
|
||||
'version[Показать информацию о пакете и его версии]'
|
||||
'install[Запустить скрипт установки программы]'
|
||||
'install-dxvk[Установить/удалить DXVK]'
|
||||
'install-vkd3d[Установить/удалить VKD3D]'
|
||||
@@ -14,14 +15,22 @@ _winehelper() {
|
||||
'-r[Запуск программы (отладка)]'
|
||||
'-i[Запустить скрипт установки программы]'
|
||||
'remove-all[Удалить WineHelper и все связанные данные]'
|
||||
'--clear-pfx[Очистить префикс \[имя_префикса\]]'
|
||||
'killall[Убить все процессы]'
|
||||
'create-prefix[Создать новый префикс]'
|
||||
'remove-prefix[Удалить префикс и все связанные данные]'
|
||||
'backup-prefix[Создать резерную копию префикса]'
|
||||
'restore-prefix[восстановить префикс из резервной копии "путь/до/whpack"]'
|
||||
'backup-prefix[Создать резервную копию префикса]'
|
||||
'restore-prefix[Восстановить префикс из резервной копии "путь/до/whpack"]'
|
||||
'change-wine[Изменить версию Wine для префикса]'
|
||||
'change-windows-ver[Изменить версию Windows для префикса]'
|
||||
'clear-winetricks-cache[Очистить кэш Winetricks]'
|
||||
'gui[Запустить графический интерфейс]'
|
||||
'data-path[Изменить рабочий каталог WineHelper]'
|
||||
'create-base-pfx[Создать базовый шаблонный префикс]'
|
||||
'init-prefix[Инициализировать префикс]'
|
||||
'run-in-prefix[Запустить файл в указанном префиксе]'
|
||||
'debug[Запуск программы в отладчике]'
|
||||
'--changelog[Показать историю изменений]'
|
||||
'changelog[Показать историю изменений]'
|
||||
)
|
||||
|
||||
wine_cmd=(
|
||||
@@ -34,6 +43,8 @@ _winehelper() {
|
||||
regedit
|
||||
explorer
|
||||
cmd
|
||||
uninstaller
|
||||
control
|
||||
'run[Запуск программы (отладка)]'
|
||||
)
|
||||
|
||||
@@ -47,23 +58,28 @@ _winehelper() {
|
||||
_values 'winehelper options' "${opts[@]}" "${wine_cmd[@]}"
|
||||
;;
|
||||
args)
|
||||
if [[ "$words[2]" == "run-in-prefix" ]] && [[ ${#words[@]} -gt 3 ]] ; then
|
||||
_files
|
||||
return
|
||||
fi
|
||||
|
||||
case $words[2] in
|
||||
--debug)
|
||||
_values 'wine commands' "${wine_cmd[@]}"
|
||||
;;
|
||||
install|-i)
|
||||
_get_list_for_install
|
||||
;;
|
||||
run|installed)
|
||||
run|installed|debug)
|
||||
_get_installed_list
|
||||
;;
|
||||
remove-prefix|backup-prefix)
|
||||
remove-prefix|backup-prefix|run-in-prefix)
|
||||
_get_prefixes
|
||||
;;
|
||||
create-prefix)
|
||||
create-prefix|init-prefix|create-base-pfx|gui|killall|clear-winetricks-cache|remove-all|version|--version|help|--help|changelog|--changelog)
|
||||
;;
|
||||
restore-prefix)
|
||||
_files
|
||||
_files -g '*.whpack'
|
||||
;;
|
||||
data-path)
|
||||
_path_files -/
|
||||
;;
|
||||
install-dxvk)
|
||||
_get_component_versions 'install-dxvk'
|
||||
@@ -74,6 +90,11 @@ _winehelper() {
|
||||
change-wine)
|
||||
_get_wine_versions
|
||||
;;
|
||||
change-windows-ver)
|
||||
_values 'windows versions' 2k xp xp64 2k3 vista 7 8 81 10 11
|
||||
;;
|
||||
winecfg|winereg|winefile|wineconsole|winetricks|desktop|regedit|explorer|cmd|uninstaller|control)
|
||||
;;
|
||||
*)
|
||||
_values 'winehelper options' "${opts[@]}" "${wine_cmd[@]}"
|
||||
;;
|
||||
@@ -117,8 +138,11 @@ _get_prefixes () {
|
||||
}
|
||||
|
||||
_get_list_for_install () {
|
||||
|
||||
packages=(${(f)"$(winehelper install list 2>/dev/null |
|
||||
local -a packages
|
||||
|
||||
packages=(--clear-pfx)
|
||||
|
||||
packages+=(${(f)"$(winehelper install list 2>/dev/null |
|
||||
awk -F ' - ' '
|
||||
/^[^ ]+ - \("/ {next}
|
||||
/^[[:space:]]*$/ {next}
|
||||
@@ -131,14 +155,8 @@ _get_list_for_install () {
|
||||
if (name && desc) print name ":" desc
|
||||
}
|
||||
')"})
|
||||
|
||||
packages+=(
|
||||
scadoffice:"SCAD Office"
|
||||
t-flex-cad17-applications:"Приложения для T-FLEX CAD 17"
|
||||
t-flex-cad17-resources:"Обучающие материалы T-FLEX CAD 17"
|
||||
)
|
||||
|
||||
_describe 'packages' packages
|
||||
_describe 'packages' packages
|
||||
}
|
||||
|
||||
_get_installed_list () {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Пакет программ для таможенного оформления. Включает программы Такса и ТамДок в комплектациях Эксперт, а также программу Заполнитель.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.alta.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="alta"
|
||||
export PROG_NAME="Альта-Эксперт"
|
||||
export BASE_PFX="alta_pfx_x86_v01"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Таможенное оформление товаров
|
||||
########################################################################
|
||||
export PROG_URL="https://www.alta.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="alta"
|
||||
export PROG_NAME="Альта-ГТД"
|
||||
export PROG_ICON="altagtd"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Пакет программ для таможенного оформления. Включает программы Альта-ГТД, Такса и ТамДок в комплектациях Максимум, а также программу Заполнитель.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.alta.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="alta"
|
||||
export PROG_NAME="Альта-Максимум"
|
||||
export BASE_PFX="alta_pfx_x86_v01"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Таможенное законодательство
|
||||
########################################################################
|
||||
export PROG_URL="https://www.alta.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="alta"
|
||||
export PROG_NAME="Таможенные документы"
|
||||
export PROG_ICON="altatamdoc"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Расчет контракта
|
||||
########################################################################
|
||||
export PROG_URL="https://www.alta.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="alta"
|
||||
export PROG_NAME="Такса"
|
||||
export PROG_ICON="altatax"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Автоматизация импорта данных
|
||||
########################################################################
|
||||
export PROG_URL="https://www.alta.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="alta"
|
||||
export PROG_NAME="Заполнитель"
|
||||
export PROG_ICON="altazap"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Система “A'PROPOS-Z - Графит ТМ” для проектирования этапов механообработки, синтеза, расчета и верефикация операционных размерных текстур. Графическое моделирование технологии иформирование карт эскизов.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.tezis.pro"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="apropos-z"
|
||||
export PROG_NAME="A'PROPOS-Z - Графит ТМ"
|
||||
export PROG_ICON="apropos-z"
|
||||
@@ -24,5 +24,3 @@ if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_EXE" ; then
|
||||
|
||||
create_desktop "$PROG_NAME" "$DRIVE_C/Program Files/A'PROPOS-Z/Apropos-Z.exe" "$PROG_ICON"
|
||||
fi
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ АТТЕСТАТ” для документов об основном общем, среднем общем образовании.
|
||||
########################################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-4"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ АТТЕСТАТ"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ ДПП” для заполнения бланков документов о повышении квалификации и профессиональной переподготовке.
|
||||
########################################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ ДПП"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ НШ” для заполнения бланков документов об окончании начальной школы.
|
||||
########################################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-1"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ НШ"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ МЕД” для заполнения бланков документов о послевузовском профессиональном образовании и сертификатов специалиста.
|
||||
######################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-3"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ МЕД"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ ПРОФЕССИЯ” для заполнения бланков документов профессионального обучения.
|
||||
########################################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-5"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ ПРОФЕССИЯ"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ СПО” для заполнения бланков документов о среднем профессиональном образовании.
|
||||
########################################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-2"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ СПО"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа “АРМ КТ ПРОФ ВУЗ” для заполнения бланков документов о высшем образовании.
|
||||
########################################################################
|
||||
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-6"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="arm-kt"
|
||||
export PROG_NAME="АРМ КТ ПРОФ ВУЗ"
|
||||
export PROG_ICON="armkt"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://www.ctm.ru"
|
||||
export PROG_NAME="СТМ-Финансы"
|
||||
export PROG_ICON="ctmfinance"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://www.ctm.ru"
|
||||
export PROG_NAME="СТМ-Журналы"
|
||||
export PROG_ICON="ctmjournals"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://www.ctm.ru"
|
||||
export PROG_NAME="Монитор ЭД"
|
||||
export PROG_ICON="ctmmonitor"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://www.ctm.ru"
|
||||
export PROG_NAME="СТМ-Отчет"
|
||||
export PROG_ICON="ctmreport"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://www.ctm.ru"
|
||||
export PROG_NAME="СТМ-Сервис"
|
||||
export PROG_ICON="ctmservice"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
@@ -27,8 +27,10 @@ if try_download "https://files.ctm.ru/CSERVICE/SFX/setup_cs.exe" "${AUTOINSTALL_
|
||||
wine_run_install "${AUTOINSTALL_SETUP}" /cd /targetdir="C:\\\\Program Files\\\\CTM\\\\CSERVICE" /auto /hide
|
||||
try_remove_dir "$AUTOINSTALL_UNPACK"
|
||||
|
||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/CTM/CSERVICE/ctmservc.exe"
|
||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/CTM/CSERVICE/CService32.exe"
|
||||
WIN_FAKE_EXEC="$DRIVE_C/Program Files/CTM/CSERVICE/ctm-service.exe"
|
||||
try_force_link_file "$WIN_FILE_EXEC" "$WIN_FAKE_EXEC"
|
||||
create_desktop "$PROG_NAME" "$WIN_FAKE_EXEC" "$PROG_ICON"
|
||||
|
||||
if [[ "$USE_CTMBAR" == "1" ]] ; then
|
||||
if [[ -f "$DRIVE_C/Program Files/CTM/COMMON/CTMBAR.EXE" ]]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Сервис обновления ПО: "R-Атлас", "R-Инфо" и "R-Тариф".
|
||||
########################################################################
|
||||
export PROG_URL="https://daobit.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586" # wine-9.0.9-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="daobit"
|
||||
export PROG_NAME="Сервис обновления ПО"
|
||||
export PROG_ICON="daobitcservice"
|
||||
@@ -13,7 +13,7 @@ export INSTALL_DLL="dotnet7 dotnetdesktop7 arial renderer=gdi"
|
||||
|
||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/setup_cs.exe"
|
||||
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/setup_cs"
|
||||
AUTOINSTALL_SETUP="${WH_TMP_DIR}/setup_cs/SETUP.EXE"
|
||||
AUTOINSTALL_SETUP="${WH_TMP_DIR}/setup_cs/Setup.exe"
|
||||
|
||||
prepair_wine
|
||||
if try_download "https://files.daobit.ru/CSERVICE/SFX/setup_cs.exe" "${AUTOINSTALL_EXE}" ; then
|
||||
@@ -25,7 +25,9 @@ if try_download "https://files.daobit.ru/CSERVICE/SFX/setup_cs.exe" "${AUTOINSTA
|
||||
wine_run_install "${AUTOINSTALL_SETUP}" /cd /targetdir="C:\\\\Program Files\\\\DAO\\\\CSERVICE" /auto /hide
|
||||
|
||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/DAO/CSERVICE/CService32.exe"
|
||||
create_desktop "$PROG_NAME" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||
WIN_FAKE_EXEC="$DRIVE_C/Program Files/DAO/CSERVICE/daobit-service.exe"
|
||||
try_force_link_file "$WIN_FILE_EXEC" "$WIN_FAKE_EXEC"
|
||||
create_desktop "$PROG_NAME" "$WIN_FAKE_EXEC" "$PROG_ICON"
|
||||
try_remove_dir "$AUTOINSTALL_UNPACK"
|
||||
try_remove_file "$AUTOINSTALL_EXE"
|
||||
fi
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Построение маршрутов железнодорожных грузоперевозок
|
||||
########################################################################
|
||||
export PROG_URL="https://daobit.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586" # wine-9.0.9-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="daobit"
|
||||
export PROG_NAME="R-Атлас"
|
||||
export PROG_ICON="daobitratlas"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Специализированная информация для организации железнодорожных перевозок
|
||||
########################################################################
|
||||
export PROG_URL="https://daobit.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586" # wine-9.0.9-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="daobit"
|
||||
export PROG_NAME="R-Инфо"
|
||||
export PROG_ICON="daobitrinfo"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Расчёт размера провозной платы и дополнительных сборов за грузовые перевозки по железной дороге
|
||||
########################################################################
|
||||
export PROG_URL="https://daobit.ru"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586" # wine-9.0.9-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="daobit"
|
||||
export PROG_NAME="R-Тариф"
|
||||
export PROG_ICON="daobitrtariff"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://www.keepsoft.ru"
|
||||
export PROG_NAME="Конструктор тестов"
|
||||
export AUTOINSTALL_EXE="${WH_TMP_DIR}/simulator4.exe"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="keepsoft_similator4"
|
||||
export BASE_PFX="defpfx_x86_v01"
|
||||
export WINEARCH="win32"
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
# info_ru: “КСАМУ” - Комплексная система автоматизации медицинского учреждения.
|
||||
########################################################################
|
||||
export PROG_URL="https://docs.medicine-it.ru/"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="ksamu"
|
||||
export PROG_NAME="КСАМУ"
|
||||
export PROG_ICON="ksamu"
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Это мощный, современный инструмент быстрой и качественной разработки АСУТП
|
||||
########################################################################
|
||||
export PROG_URL="https://www.krug2000.ru"
|
||||
export WH_WINE_USE="wine-11.12-alt-sk2000-i586"
|
||||
export WINEPREFIX="scada-krug-2000"
|
||||
export PROG_NAME="SCADA КРУГ 2000"
|
||||
export PROG_ICON="krugtaskmanager"
|
||||
export BASE_PFX="scadakrug2k_pfx_v01"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL="dotnet48 vcrun6 vcrun2008 vcrun2022 d3dcompiler_47 mdac28 corefonts riched20 wsh57"
|
||||
|
||||
KRUG_VERSION="4_4"
|
||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/01_scada_v${KRUG_VERSION}_release.zip"
|
||||
AUTOINSTALL_UNPACK="${WH_TMP_DIR}/scada_krug_${KRUG_VERSION}"
|
||||
|
||||
prepair_wine
|
||||
if try_download "https://www.krug2000.ru/sp/01_scada_v${KRUG_VERSION}_release.zip" "${AUTOINSTALL_EXE}"; then
|
||||
unpack "${AUTOINSTALL_EXE}" "${AUTOINSTALL_UNPACK}"
|
||||
try_remove_file "$AUTOINSTALL_EXE"
|
||||
|
||||
# Корневой setup.exe в архиве — HTML-меню автозапуска, тихую установку не поддерживает (bug #59578).
|
||||
# Настоящий инсталлятор — DeveloperStudio/SCADA KRUG 2000.msi, ставим его напрямую.
|
||||
AUTOINSTALL_SETUP="$(find "$AUTOINSTALL_UNPACK" -iname "SCADA KRUG 2000.msi" -print -quit)"
|
||||
[[ -f "$AUTOINSTALL_SETUP" ]] || fatal "В архиве дистрибутива не найден файл SCADA KRUG 2000.msi."
|
||||
|
||||
wine_run_install "${AUTOINSTALL_SETUP}" /qn
|
||||
# Инсталлятор оставляет запущенными KrugTaskManager.exe, SMTListener.exe, KrugTaskStarter.exe
|
||||
"$WINESERVER" -k
|
||||
try_remove_dir "$AUTOINSTALL_UNPACK"
|
||||
|
||||
create_desktop "Менеджер задач" "$DRIVE_C/Program Files/Krug2000/Bin/KrugTaskManager.exe" "$PROG_ICON"
|
||||
fi
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD Учебная Версия 17"
|
||||
export PROG_ICON="tflexcad17"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD 17"
|
||||
export PROG_ICON="tflexcad17"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="Приложения для T-FLEX CAD 17"
|
||||
export PROG_ICON="tflexcad17"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="Ресурсы для T-FLEX CAD 17"
|
||||
export PROG_ICON="tflexcad17"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD 18"
|
||||
export PROG_ICON="tflexcad18"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex18"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="Приложения для T-FLEX CAD 18"
|
||||
export PROG_ICON="tflexcad18"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WINEPREFIX="tflex18"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="Ресурсы для T-FLEX CAD 18"
|
||||
export PROG_ICON="tflexcad18"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WINEPREFIX="tflex18"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD 2D+ 17"
|
||||
export PROG_ICON="tflexcad17"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX CAD 2D+ 18"
|
||||
export PROG_ICON="tflexcad18"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex18"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX DOCs 17"
|
||||
export PROG_ICON="tflexdoc17"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX Viewer 17"
|
||||
export PROG_ICON="tflexcad17"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
export PROG_URL="https://www.tflexcad.ru"
|
||||
export PROG_NAME="T-FLEX Viewer 18"
|
||||
export PROG_ICON="tflexcad18"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex18"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://ctm.ru"
|
||||
export PROG_NAME="ВЭД-Алфавит"
|
||||
export PROG_ICON="vedalf"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://ctm.ru"
|
||||
export PROG_NAME="ВЭД-Контроль"
|
||||
export PROG_ICON="vedcontrol"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://ctm.ru"
|
||||
export PROG_NAME="ВЭД-Декларант"
|
||||
export PROG_ICON="veddcl"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://ctm.ru"
|
||||
export PROG_NAME="ВЭД-Инфо"
|
||||
export PROG_ICON="vedinfo"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://ctm.ru"
|
||||
export PROG_NAME="ВЭД-Платежи"
|
||||
export PROG_ICON="vedpayments"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
export PROG_URL="https://ctm.ru"
|
||||
export PROG_NAME="ВЭД-Склад"
|
||||
export PROG_ICON="vedsts"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ved_ctm"
|
||||
export BASE_PFX="ved_ctm_pfx_x86_v05"
|
||||
export WINEARCH="win32"
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: ZET 9 Lite — бесплатная астрологическая программа: натальные карты, транзиты, прогнозы, расчёты по швейцарским эфемеридам.
|
||||
########################################################################
|
||||
export PROG_URL="https://astrozet.net"
|
||||
export WH_WINE_USE="wine-11.12-alt-tkg-wow64"
|
||||
export WINEPREFIX="zet9"
|
||||
export PROG_NAME="ZET 9 Lite"
|
||||
export PROG_ICON="zet9"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
|
||||
AUTOINSTALL_URL="https://astrozet.net/upload/ZET9SETUP229-RU.exe"
|
||||
AUTOINSTALL_EXE="${WH_TMP_DIR}/ZET9SETUP229-RU.exe"
|
||||
|
||||
prepair_wine
|
||||
if try_download "$AUTOINSTALL_URL" "$AUTOINSTALL_EXE" ; then
|
||||
wine_run_install "$AUTOINSTALL_EXE" /S
|
||||
try_remove_file "$AUTOINSTALL_EXE"
|
||||
|
||||
create_desktop "$PROG_NAME" "$DRIVE_C/ZET 9/zet.exe" "$PROG_ICON"
|
||||
fi
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Компоненты сервисов поддержки T-FLEX 17 и 18
|
||||
########################################################################
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WH_WINE_USE="wine-10.18.1-tflex-alt3-wow64"
|
||||
export WH_WINE_USE="wine-10.9-alt-tflex-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export PROG_VERSION=""
|
||||
|
||||
+6
-9
@@ -1,19 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
##### CHECK ROOT #####
|
||||
if [[ $(id -u) -ne 0 ]] ; then
|
||||
if [[ $(id -u) -ne 0 ]]; then
|
||||
echo "Перезапустите скрипт $0 от root пользователя!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
##### MESSAGES FUNCTIONS #####
|
||||
if [[ -t 0 ]] ; then
|
||||
print_error () { printf "\E[31m%s Ошибка: $* %s\e[0m\n" ;}
|
||||
if [[ -t 0 ]]; then
|
||||
print_error() { printf "\E[31m%s Ошибка: $* %s\e[0m\n"; }
|
||||
else
|
||||
print_error () { echo -e "Ошибка: $*" ;}
|
||||
print_error() { echo -e "Ошибка: $*"; }
|
||||
fi
|
||||
|
||||
fatal () {
|
||||
fatal() {
|
||||
print_error "$@ Аварийное завершение работы WineHelper!"
|
||||
exit 1
|
||||
}
|
||||
@@ -29,7 +29,4 @@ apt-get update || fatal "Не удалось обновить список до
|
||||
##### INSTALL DEPENDENCIES #####
|
||||
# fonts-ttf-ms
|
||||
|
||||
apt-get install -y i586-{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,\
|
||||
libnm,libnss,libnss-mdns,libnsl1,libunwind,libunixODBC2,ocl-icd,libfreetype,\
|
||||
libcups,libfontconfig1,libgnutls30,libGL,libEGL,libvulkan1,xorg-dri-swrast,\
|
||||
xorg-dri-intel,xorg-dri-radeon} || fatal "Не удалось установить зависимости."
|
||||
apt-get install -y i586-{wine,glibc-core,libstdc++6,glibc-pthread,glibc-nss,libnm,libnss,libnss-mdns,libnsl1,libunwind,libunixODBC2,ocl-icd,libfreetype,libcups,libfontconfig1,libgnutls30,libGL,libEGL,libvulkan1,xorg-dri-swrast,xorg-dri-intel,xorg-dri-radeon} || fatal "Не удалось установить зависимости."
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Автоматизация установки МИС Витакарта (AIS LPU Client).
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="ais-lpu-client"
|
||||
export PROG_NAME="AIS LPU Client"
|
||||
export PROG_ICON="ais_lpu_client"
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.1 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 250 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: ADEM 9.0 — интегрированная система CAD/CAM/CAPP/PDM для конструкторско-технологической подготовки производства. Ручная установка из дистрибутива CADCAMCAPPAdem90st.exe.
|
||||
########################################################################
|
||||
export PROG_URL="https://adem.ru"
|
||||
export WH_WINE_USE="wine-11.18-alt-adem-wow64"
|
||||
export WINEPREFIX="adem"
|
||||
export PROG_NAME="ADEM 9.0"
|
||||
export PROG_ICON="adem"
|
||||
export BASE_PFX="adem_pfx_x64_v02"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export INSTALL_DLL="dotnet48 vcrun2008 vcrun2010 vcrun2012 vcrun2022 corefonts"
|
||||
|
||||
if [[ -f "$2" ]] \
|
||||
&& [[ $(basename "$2") =~ ^CADCAMCAPPAdem.*\.exe$ ]]
|
||||
then
|
||||
prepair_wine
|
||||
|
||||
# Inno Setup. Файлы CADCAMCAPPAdem90st-N.bin должны лежать рядом с exe.
|
||||
# Установщик сам вызывает SwitchLang.exe (xcopy русских ресурсов) и regsvr32.
|
||||
wine_run_install "$2" # /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
|
||||
|
||||
ADEM_PATH="$DRIVE_C/Program Files (x86)/Adem Group/Adem90"
|
||||
create_desktop "$PROG_NAME" "$ADEM_PATH/2-d/admsrv90r.exe" "$PROG_ICON"
|
||||
else
|
||||
fatal "Не найден файл установки CADCAMCAPPAdem90st.exe. Перезапустите по примеру:
|
||||
winehelper install $1 \"/путь/до/CADCAMCAPPAdem90st.exe\""
|
||||
fi
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Специализированное программное обеспечение «Автономная станция прослушивания» предназначено для загрузки и прослушивания электронных материалов итогового собеседования.
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="desktopaudiostation"
|
||||
export PROG_NAME="АС Прослушивания"
|
||||
export PROG_ICON="desktopaudiostation"
|
||||
|
||||
+2
-1
@@ -2,12 +2,13 @@
|
||||
# info_ru: Установщик "ЕМИАС" - Единая медицинская информационно-аналитическая система
|
||||
########################################################################
|
||||
export PROG_URL="https://emias.info/"
|
||||
export WH_WINE_USE="wine-11.4.1-emias-alt2-wow64"
|
||||
export WH_WINE_USE="wine-11.0-alt-emias-wow64"
|
||||
export WINEPREFIX="emias"
|
||||
export PROG_NAME="КИС ЕМИАС"
|
||||
export BASE_PFX="none"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="7"
|
||||
export WH_MAIN_DECORATED="0"
|
||||
export WH_USE_CPCSP_PROXY="1"
|
||||
export CPCSP_PROXY_WOW64_VER="0.7.7-alt1.1-em-wow64"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Специализированное программное обеспечение «Автономная станция записи» предназначено для записи ответов участников итогового собеседования.
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="isrecordingstation"
|
||||
export PROG_NAME="АС Записи"
|
||||
export PROG_ICON="isrecordingstation"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Установщик программного комплекса NetTest (демо-версия)
|
||||
########################################################################
|
||||
export PROG_URL="https://www.kpolyakov.spb.ru/prog/nettest/nettget.htm"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-amd64"
|
||||
export WINEPREFIX="nettest"
|
||||
export PROG_NAME="NetTest"
|
||||
export BASE_PFX="none"
|
||||
@@ -33,7 +33,3 @@ else
|
||||
fatal "Не найден файл архива для $PROG_NAME. Перезапустите по примеру:
|
||||
winehelper install $1 \"/путь/до/архива\""
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -2,13 +2,13 @@
|
||||
# info_ru: "КИС Олимп" - программно-аналитический комплекс, состоящий из самостоятельных подключаемых модулей.
|
||||
########################################################################
|
||||
export PROG_URL="https://olimp.best/"
|
||||
export WH_WINE_USE="wine-10.18.3-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="olimp"
|
||||
export PROG_NAME="КИС Олимп"
|
||||
export BASE_PFX="olimp_pfx_x86_v02"
|
||||
export BASE_PFX="olimp_pfx_x86_v04"
|
||||
export WINEARCH="win32"
|
||||
export WH_WINDOWS_VER="7"
|
||||
export INSTALL_DLL="jet40 dotnet45 corefonts lucida opensymbol tahoma cjkfonts mdac28 msxml4 native_oleaut32 vcrun2005"
|
||||
export INSTALL_DLL="jet40 dotnet45 corefonts lucida opensymbol tahoma cjkfonts mdac28 msxml4 native_oleaut32 vcrun2005 ie8 itss"
|
||||
export WINEDLLOVERRIDES="d2d1=n"
|
||||
export WH_MAIN_DECORATED="0"
|
||||
export FREETYPE_PROPERTIES="truetype:interpreter-version=35"
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Это мощный, современный инструмент быстрой и качественной разработки АСУТП
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586" # wine-9.0.9-alt1-i586"
|
||||
export WINEPREFIX="scada-krug-2000"
|
||||
export PROG_NAME="SCADA КРУГ 2000"
|
||||
export PROG_ICON="krugtaskmanager"
|
||||
export BASE_PFX="scadakrug2k_pfx_v01"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEARCH="win32"
|
||||
export INSTALL_DLL="dotnet48 vcrun6 vcrun2008 vcrun2022 d3dcompiler_47 mdac28 corefonts riched20 wsh57"
|
||||
export USE_RENDERER="proton"
|
||||
|
||||
if [[ -f "$2" ]] ; then
|
||||
prepair_wine
|
||||
|
||||
kill_autostart "KrugTaskManager.exe" &
|
||||
wine_run_install "$2" /quiet
|
||||
|
||||
WIN_FILE_EXEC="$DRIVE_C/Program Files/Krug2000/Bin/KrugTaskManager.exe"
|
||||
create_desktop "Менеджер задач" "$WIN_FILE_EXEC" "$PROG_ICON"
|
||||
else
|
||||
fatal "Не найден файл установки для $PROG_NAME. Перезапустите по примеру:
|
||||
winehelper install $1 \"/путь/до/установочного_файла\""
|
||||
fi
|
||||
@@ -7,7 +7,7 @@ export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
export WINE_D3D_CONFIG="renderer=vulkan"
|
||||
|
||||
@@ -7,7 +7,7 @@ export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex18"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ export WH_WINE_USE="wine-10.18.1-tflex-alt2-wow64"
|
||||
export BASE_PFX="tflex_pfx_x64_v03"
|
||||
export WINEARCH="win64"
|
||||
export WH_WINDOWS_VER="10"
|
||||
export WINEPREFIX="tflex17"
|
||||
export WINEPREFIX="tflex"
|
||||
export WH_XDG_OPEN="log"
|
||||
export WH_USE_MESA_GL_OVERRIDE="1"
|
||||
export WINE_D3D_CONFIG="renderer=gdi"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
[tool.ruff]
|
||||
line-length = 120
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "W", "F", "I", "ISC"]
|
||||
|
||||
[tool.ruff.format]
|
||||
quote-style = "double"
|
||||
indent-style = "space"
|
||||
Executable
+17
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
file="sha256sum.list"
|
||||
|
||||
if [[ ! -f "$file" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
awk '
|
||||
/^#/ { next }
|
||||
NF == 0 { next }
|
||||
$1 !~ /^[a-f0-9]{64}$/ {
|
||||
print "Invalid hash line: " NR ": " $0
|
||||
exit 1
|
||||
}
|
||||
' "$file"
|
||||
+26
-22
@@ -1,27 +1,26 @@
|
||||
##### WINE WOW64 #####
|
||||
8b9a6548eb5df921514cd569607e7f845acd18a3a6cf56f1f724b38bc9a94e43 wine-11.6.1-scadoffice-alt5-wow64.tar.xz
|
||||
a176e2ee3d60f691538b3c463047ff5eabd0ba2e37c0158783d79e9fa68caa2f wine-11.4.1-emias-alt2-wow64.tar.xz
|
||||
3c7c394658ad993968532e20ae9b591c1a0ec5b7495c8450de09bd4f8947462e wine-11.3.1-alt1-wow64.tar.xz
|
||||
349c707148a23e667970309248bbbf97b4e2a0db59c548e73d9fe9c3f585872c wine-10.18.1-alt1-wow64.tar.xz
|
||||
2f36e9d29d87d09c91176e1c89199101f638b7be050d60b2d6603572c44ebf9b wine-10.18.1-tflex-alt3-wow64.tar.xz
|
||||
e9a8b79dfe12cad1304dca573d73aefe109e3d69b6fff739c8dbb8b2d3c271c6 wine-10.12.1-alt1-wow64.tar.xz
|
||||
496e8436a57eb6617d7d90f06b9d7d80d12a5604fb676eddedb2eab346d4f71a wine-11.19-alt-tkg-wow64.tar.xz
|
||||
da8a6b1ced50e4563e00494f2dceddd11b8dbeebd80979172a176242a63a06b8 wine-11.18-alt-adem-wow64.tar.xz
|
||||
e99a44d9f302869287cbe699c2800e3ab4b3e1f9501f20fa3b0491c9cfaae1e7 wine-11.12-alt-tkg-wow64.tar.xz
|
||||
90676579fc97b0bdd0cc265b5c728683f8ce8d8998b020ac39d7c26ebf8783d9 wine-11.0-alt-tkg-wow64.tar.xz
|
||||
d8275a94f7538e600b4c82b0693a9ab1ebf0d5f141ea7ec3bc2a0e230b15676b wine-11.0-alt-emias-wow64.tar.xz
|
||||
d86724bd1b3a7a798f221a6a84430d37a3f531014756b7de49c0d8444d748bd7 wine-10.9-alt-tflex-wow64.tar.xz
|
||||
1f5214b5070066e6868da4f8961506e1d80a00470e5a135945386421a4ca02df wine-10.0.2-alt-scadoffice-wow64.tar.xz
|
||||
714687110724f4772d4028fb340ac1c8f9a32f0454c76822c967af9ef06844eb wine-10.0-alt-tkg-wow64.tar.xz
|
||||
4826028ddd49cc6ec2760be8dbb8ff2353a58323a87c846a8667e41e90851ea1 wine-9.0-alt-tkg-wow64.tar.xz
|
||||
|
||||
##### WINE AMD64 #####
|
||||
009c95bfe2df3f9264c9c5092f3e30ea7a168dd7869046058a718a70739602d4 wine_wh_tflex_10-9_amd64.tar.xz
|
||||
71d6fdfd23d7988471d345c68e81699b8af931352b03dd216424b398f63c7b12 wine_x_tkg_10-0_amd64.tar.xz
|
||||
e0a84bb4908c3927954d7eef6b8ac7212e442b8c107d000c6890fec340f96183 wine-9.0.14-alt1-amd64.tar.xz
|
||||
fd209c95a3aa507002374417365b3d1119dbe3a0a6d223034171221a2b187b66 wine-9.0-cx-amd64.tar.xz
|
||||
f1bf1261550ca2928cefacdb724926d3d6d103433d0ff6882ee9783a50d8f4e4 wine-8.8-staging-amd64.tar.xz
|
||||
61bec1230b37b8fcc69fd45f848b44fd88cc41fcdd5dc3080336d7da63660f40 wine-7.16.1-alt1-amd64.tar.xz
|
||||
d1bfda024138f6e83ee531df513e6ebebb7aee1e40ce3f5cd3a4d0631107e482 wine-11.12-alt-tkg-amd64.tar.xz
|
||||
7a735f1e00173d8d3e3727aab927c4eb86aca018f39a4e8dfc1936909b8b9654 wine-11.0-alt-tkg-amd64.tar.xz
|
||||
2f3aa24fcb52a12bac35a77bf088aa8308e2e0ac3bf89f9b3f9e8e3c7090bbe8 wine-10.0-alt-tkg-amd64.tar.xz
|
||||
4251e75b410268fca9dabc168f838a56f5f02b970c6d4250763da8e791e8880d wine-9.0-alt-tkg-amd64.tar.xz
|
||||
|
||||
##### WINE I586 #####
|
||||
52642ce2218ef8e272f2cac5d28811072899ba5b490ae56a6a26bbd0631ba986 wine-10.18.3-i586.tar.xz
|
||||
1385323e059c376299a83088ada85e625c170337ba07e5307df75961726d8eee wine-10.18.1-alt2-i586.tar.xz
|
||||
49ce3e1152f01c1f24ca148092a66f6eccd68cf4ee35d0cb04900120f45dd864 wine-10.12.1-alt1-i586.tar.xz
|
||||
3571c40a787f0386e0160b5d471b1bf11fa2a235b497156cd38198b90bcb4a9f wine_x_tkg_10-0_i586.tar.xz
|
||||
fb7fdfde96de10a1b3b051bdf2727b6a7c1768b878483726454dd6726e9e0193 wine-9.0.14-alt1-i586-spravkibk.tar.xz
|
||||
6f86d2220b65b709bf88c6f829a4998de3b929cc2091cd1333a51c32e1491b79 wine-9.0.9-alt1-i586.tar.xz
|
||||
6fea17fd131f57c2ebf7ca4c60d3c5a9e819afe16e5d0b77ecb750da99ae0e38 wine-7.16.1-alt1-i586.tar.xz
|
||||
d9210f9be6ccc8be38d5d201aa06a924eeb6079f062dd4bad22da5e3eedeb630 wine-11.12-alt-sk2000-i586.tar.xz
|
||||
b660de1ce16fc90f54997e6cf30d9cf92daa932f5ef14ba8bd7cd5d7a4fa25af wine-11.12-alt-tkg-i586.tar.xz
|
||||
b082dc92c0ed96366353b8a9f62b126276d2476be85d2b37d47a886771a808b6 wine-11.0-alt-tkg-i586.tar.xz
|
||||
d63ae109e2495d3817172146107d9ddfd0b63a0f76b4d575279ae6b642522795 wine-10.0-alt-tkg-i586.tar.xz
|
||||
9a3160ae815b2dd008f67bf230b4e440c6b341d770b7c2a4b1a2c50283c7a895 wine-9.0-alt-tkg-i586.tar.xz
|
||||
|
||||
##### DXVK #####
|
||||
98411effbc1b3611b11c4ca3af2ad29400b08e1c8c380791d6351600a06fb3c7 dxvk-1.10.3-28.tar.xz
|
||||
@@ -195,7 +194,7 @@ ef7e8f1ba785d48e4ea287feed5b79bd630d423e59efadb43da9653adefef218 ais-lpu-client
|
||||
70a4cbce1b600434b4d5f241ee90dafb15f7b5f821bc1594e728493febaf017b ksamu_pfx_x64_v03.tar.xz
|
||||
# create with wine-10.18.1-alt1-wow64 (universal user: xuser)
|
||||
# winetricks corefonts tahoma msxml6 msxml4 msxml3 riched30 msls31 riched20 msftedit richtx32 fontsmooth=gray
|
||||
# + manuall installed riched32
|
||||
# + manually installed riched32
|
||||
|
||||
5971788003a5337c23003ad0944c59d549e025c5dc10c19d2e0ec9e7dc04819f ppdgr2_pfx_x64_v01.tar.xz
|
||||
# create with wine-10.18.1-alt1-wow64 (universal user: xuser)
|
||||
@@ -217,15 +216,20 @@ d16c300b5451e4fad6eeebeca0949367a7bdf1cb1878fc51f0f9dee33744d3a7 emias_pfx_x64_
|
||||
# create with wine-10.18.1-alt1-wow64 (universal user: xuser)
|
||||
# winetricks crypt32
|
||||
|
||||
cf7f6284fc46d9a0be9756721d04e9f8842a481f805829711d4340fed5e67e69 olimp_pfx_x86_v02.tar.xz
|
||||
49cfb047297c958c7005afa0c4ced371e867b33aca33ad7572ecf7dc7b64552a olimp_pfx_x86_v04.tar.xz
|
||||
# create with wine-10.18.1-alt2-i586
|
||||
# winetricks jet40 dotnet45 corefonts lucida opensymbol tahoma cjkfonts mdac28 msxml4 native_oleaut32 vcrun2005
|
||||
# winetricks jet40 dotnet45 corefonts lucida opensymbol tahoma cjkfonts mdac28 msxml4 native_oleaut32 vcrun2005 ie8 itss
|
||||
# + psqlodbc_x86.msi installed from script
|
||||
|
||||
4fc8ba95190d7d2cd05f60f29fe6af801f99bf046ab75bccd82bf48a600d5fc4 scadoffice_pfx_x64_v06.tar.xz
|
||||
# create with wine-10.18.1-alt1-wow64 (universal user: xuser)
|
||||
# winetricks msxml6 gdiplus vcrun6sp6 vcrun2005 ucrtbase2019 vcrun2019 d3dx9 d3dx11_43 d3dx11_42 d3dcompiler_42 d3dcompiler_43 d3dcompiler_46 d3dcompiler_47 dotnet40 dotnet48 riched20 riched30 msls31 richtx32
|
||||
|
||||
9b7a241374c27ea341294053d817722e16a5e799acce08f285e62b0f60b6547f adem_pfx_x64_v02.tar.xz
|
||||
# create with wine-11.18-alt-adem-wow64 (universal user: xuser)
|
||||
# winetricks dotnet40 dotnet48 vcrun2008 vcrun2010 vcrun2012 vcrun2022 corefonts
|
||||
# + jet40
|
||||
|
||||
##### ADDONS #####
|
||||
# addons with ODBC, SSH, *.reg
|
||||
0f4ef434df07bc338ae308af44330590eaa1d9c94b64850514e55b960642d0eb scadoffice_addons_v02.tar.xz
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа «Декларация» позволяет автоматически формировать налоговые декларации по форме 3-НДФЛ. В процессе заполнения Вами данных программа автоматически проверяет их корректность, что уменьшает вероятность появления ошибки.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="declaration"
|
||||
export PROG_NAME="Декларация"
|
||||
export PROG_ICON="declarac-2"
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Программное обеспечение для 3D-графики, предназначенное для проектирования освещения. (Версия 4.4.0.2)
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="dialux"
|
||||
export PROG_NAME="DIALux"
|
||||
export PROG_ICON="dialux"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Удобная программа для создания двухмерных схем и чертежей. Основной акцент сделан на проектировании систем тепло-, водо- и газоснабжения, водоочистки, автоматизированных систем управления технологическими процессами (АСУТП), а также планов эвакуации при пожаре и авариях.
|
||||
########################################################################
|
||||
export PROG_URL="https://easymnemo.com"
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="easymnemo"
|
||||
export PROG_NAME="Easymnemo"
|
||||
export PROG_ICON="easymnemo"
|
||||
|
||||
+3
-3
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа автоматизации процесса подготовки юридическими и физическими лицами документов для представления в налоговые органы в электронной форме и на бумажном носителе.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="nalog"
|
||||
export PROG_NAME="Налогоплательщик ЮЛ"
|
||||
export PROG_ICON="npul"
|
||||
@@ -95,7 +95,7 @@ if [[ -n "$UPDATE_VER" ]]; then
|
||||
if try_download "https://data.nalog.ru/files/nalul/${UPDATE_URL_PATH}/NalogUL${UPDATE_VER}.msi" "${AUTOINSTALL_UPDATE}"; then
|
||||
wine_run_install "${AUTOINSTALL_UPDATE}" /quiet /norestart
|
||||
try_remove_file "${AUTOINSTALL_UPDATE}"
|
||||
|
||||
|
||||
# После обновления может появиться новая версия печати
|
||||
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "Печать НД с PDF417*.msi" | tail -n 1)"
|
||||
if [[ -n "$PRINT_INSTALLER" ]]; then
|
||||
@@ -106,7 +106,7 @@ if [[ -n "$UPDATE_VER" ]]; then
|
||||
if try_download "https://data.nalog.ru/files/nalul/${UPDATE_URL_PATH}/NalogUL${UPDATE_VER}.exe" "${AUTOINSTALL_UPDATE}"; then
|
||||
wine_run_install "${AUTOINSTALL_UPDATE}" /VERYSILENT /NORESTART
|
||||
try_remove_file "${AUTOINSTALL_UPDATE}"
|
||||
|
||||
|
||||
# После обновления может появиться новая версия печати
|
||||
PRINT_INSTALLER="$(find "$DRIVE_C/npul/INPUTDOC" -name "Печать НД с PDF417*.msi" | tail -n 1)"
|
||||
if [[ -n "$PRINT_INSTALLER" ]]; then
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
# info_ru: Подготовка документов для государственной регистрации (ППДГР)
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="ppdgr2"
|
||||
export PROG_NAME="ППДГР-2"
|
||||
export PROG_ICON="ppdgr"
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Цифровая платформа для обучения и оценки специалистов нефтегазовой отрасли.
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export PROG_NAME="РТСИМ.Карьера"
|
||||
export WINEPREFIX="rtsim"
|
||||
export PROG_ICON="rtsim"
|
||||
|
||||
+10
-8
@@ -2,7 +2,7 @@
|
||||
# info_ru: SCAD Office — это программный комплекс для расчёта строительных конструкций.
|
||||
########################################################################
|
||||
export PROG_URL="https://scadoffice.ru"
|
||||
export WH_WINE_USE="wine-11.6.1-scadoffice-alt5-wow64"
|
||||
export WH_WINE_USE="wine-10.0.2-alt-scadoffice-wow64"
|
||||
export WINEPREFIX="scadoffice"
|
||||
export PROG_NAME="SCAD Office"
|
||||
export PROG_ICON="scadoffice"
|
||||
@@ -33,13 +33,6 @@ if [[ -n $2 ]] ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
||||
create_new_dir "$DRIVE_C/SDATA"
|
||||
create_new_dir "$DRIVE_C/SWORK"
|
||||
wine_run_install "$AUTOINSTALL_EXE"
|
||||
# try_remove_file "$AUTOINSTALL_EXE"
|
||||
fi
|
||||
|
||||
print_info "Установка дополнительных компонентов..."
|
||||
|
||||
ADDONS_PACK="${WH_TMP_DIR}/$(basename "$SCADOFFICE_ADDONS_URL")"
|
||||
@@ -65,6 +58,15 @@ if try_download "$SCADOFFICE_ADDONS_URL" "$ADDONS_PACK" ; then
|
||||
try_remove_dir "$ADDONS_PATH"
|
||||
fi
|
||||
|
||||
|
||||
if try_download "https://scadhelp.ru/files/10/download" "${AUTOINSTALL_EXE}" ; then
|
||||
create_new_dir "$DRIVE_C/SDATA"
|
||||
create_new_dir "$DRIVE_C/SWORK"
|
||||
wine_run_install "$AUTOINSTALL_EXE"
|
||||
"$WINESERVER" -k
|
||||
# try_remove_file "$AUTOINSTALL_EXE"
|
||||
fi
|
||||
|
||||
# Определение всех программ, значков и исполняемых файлов
|
||||
declare -a PROG_NAME_All=("Арбат" "Вест" "Глобальные настройки" "Декор" "Дискретная арматура" "Запрос" "Камин" "КоКон" "Комета" "Конструктор сечений" "Консул" "Конфигуратор лицензий" "Кристалл" "Кросс" "Куст" "Магнум" "Монолит" "Откос" "Пастернак" "Преобразование ед. измерений" "Cортамент металлопроката" "Расчет по формуле" "Редактор акселерограмм" "Редактор динамичности" "Редактор материалов" "Тонус" "Эквивалентное сечение" "SCAD++")
|
||||
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
# info_ru: Справочник кодов обозначения налоговых органов для целей учета налогоплательщиков
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="soun"
|
||||
export PROG_NAME="СОУН"
|
||||
export PROG_ICON="soun"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Программный комплекс для энергетики.
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-9.0.14-alt1-amd64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-amd64"
|
||||
export WINEPREFIX="swmanmodus"
|
||||
export BASE_PFX="none"
|
||||
export WH_WINDOWS_VER="10"
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Программный комплекс СуперОкна для фабрик по изготовлению окон и дверей.
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="swnd"
|
||||
export PROG_NAME="СуперОкна 8"
|
||||
export PROG_ICON="swnd"
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# info_ru: Бесплатная версия программы СуперОкна для небольших предприятий.
|
||||
########################################################################
|
||||
export WH_WINE_USE="wine-10.12.1-alt1-i586"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-i586"
|
||||
export WINEPREFIX="swnd"
|
||||
export PROG_NAME="СуперОкна 8 бесплатная"
|
||||
export PROG_ICON="swnd"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# info_ru: Программа проверки файлов на соответствие форматам представления в электронном виде налоговых деклараций, бухгалтерской отчетности.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.nalog.gov.ru"
|
||||
export WH_WINE_USE="wine-10.18.1-alt1-wow64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-wow64"
|
||||
export WINEPREFIX="nalog"
|
||||
export PROG_NAME="Тестер"
|
||||
export PROG_ICON="tester"
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
# info_ru: ZuluGIS 2021 Инженерные расчёты (Полный) 64-бит. Включает ZuluGIS, пакеты расчетов ZuluThermo, ZuluHydro, ZuluDrain, ZuluGaz, ZuluSteam, библиотеки ZuluXTools и ZuluNetTools. Дополнительно в состав пакета входит Microsoft SQL Server Express LocalDB 2012.
|
||||
########################################################################
|
||||
export PROG_URL="https://www.politerm.com"
|
||||
export WH_WINE_USE="wine_x_tkg_10-0_amd64"
|
||||
export WH_WINE_USE="wine-10.0-alt-tkg-amd64"
|
||||
export PROG_NAME="ZuluGIS 2021"
|
||||
export WINEPREFIX="zulugis"
|
||||
export PROG_ICON="zulugis"
|
||||
|
||||
+1049
-811
File diff suppressed because it is too large.
Load diff
+560
-3057
File diff suppressed because it is too large.
Load diff
@@ -7,66 +7,7 @@ GUI пакет для winehelper.
|
||||
- services: Бизнес-логика (кэширование, установка и т.д.)
|
||||
- parsers: Парсеры (sha256sum.list, winetricks output)
|
||||
- utils: Утилиты (обработчики логов и т.д.)
|
||||
|
||||
Реэкспортов нет: импорты — только абсолютные из конкретных модулей
|
||||
(например, from winehelperqt.services.prefix_manager import PrefixManager).
|
||||
"""
|
||||
|
||||
# Parsers
|
||||
from winehelperqt.parsers.sha256_parser import Sha256Parser
|
||||
from winehelperqt.parsers.winetricks_parser import WinetricksOutputParser
|
||||
from winehelperqt.parsers.script_parser import ScriptParser
|
||||
|
||||
# Utils
|
||||
from winehelperqt.utils.log_handler import LogProgressHandler, MultiLogHandler
|
||||
from winehelperqt.utils.cache_service import CacheService, FileCacheService
|
||||
|
||||
# Services
|
||||
from winehelperqt.services.winetricks_service import WinetricksCacheService
|
||||
from winehelperqt.services.winetricks_service import WinetricksLogReader
|
||||
from winehelperqt.services.prefix_manager import PrefixManager
|
||||
from winehelperqt.services.process_handler import ProcessHandler
|
||||
from winehelperqt.services.process_handler import CommandRunner
|
||||
from winehelperqt.services.desktop_file_manager import DesktopFileManager
|
||||
from winehelperqt.services.application_installer import ApplicationInstaller
|
||||
from winehelperqt.services.script_manager import ScriptManager
|
||||
from winehelperqt.services.script_manager import ScriptInfo
|
||||
from winehelperqt.services.installation_manager import InstallationManager
|
||||
from winehelperqt.services.app_launcher import AppLauncher
|
||||
from winehelperqt.services.settings_manager import SettingsManager
|
||||
|
||||
# Widgets
|
||||
from winehelperqt.widgets.icon_manager import IconManager
|
||||
|
||||
# Dialogs
|
||||
from winehelperqt.dialogs.winetricks_manager import WinetricksManagerDialog
|
||||
|
||||
__all__ = [
|
||||
# Parsers
|
||||
'Sha256Parser',
|
||||
'WinetricksOutputParser',
|
||||
'ScriptParser',
|
||||
|
||||
# Utils
|
||||
'LogProgressHandler',
|
||||
'MultiLogHandler',
|
||||
'CacheService',
|
||||
'FileCacheService',
|
||||
|
||||
# Services
|
||||
'WinetricksCacheService',
|
||||
'WinetricksLogReader',
|
||||
'PrefixManager',
|
||||
'ProcessHandler',
|
||||
'CommandRunner',
|
||||
'DesktopFileManager',
|
||||
'ApplicationInstaller',
|
||||
'ScriptManager',
|
||||
'ScriptInfo',
|
||||
'InstallationManager',
|
||||
'AppLauncher',
|
||||
'SettingsManager',
|
||||
|
||||
# Widgets
|
||||
'IconManager',
|
||||
|
||||
# Dialogs
|
||||
'WinetricksManagerDialog',
|
||||
]
|
||||
@@ -1,30 +1,3 @@
|
||||
"""
|
||||
Диалоги для winehelper GUI.
|
||||
"""
|
||||
from winehelperqt.dialogs.base_version_dialog import (
|
||||
BaseVersionSelectionDialog,
|
||||
WineVersionSelectionDialogBase,
|
||||
ComponentVersionSelectionDialogBase,
|
||||
)
|
||||
from winehelperqt.dialogs.winetricks_manager import WinetricksManagerDialog
|
||||
from winehelperqt.dialogs.wine_version import WineVersionSelectionDialog
|
||||
from winehelperqt.dialogs.component_version import ComponentVersionSelectionDialog
|
||||
from winehelperqt.dialogs.create_prefix import CreatePrefixDialog
|
||||
from winehelperqt.dialogs.file_associations import FileAssociationsDialog
|
||||
from winehelperqt.dialogs.settings import AdditionalSettingsDialog, AppAdditionalSettingsDialog
|
||||
|
||||
__all__ = [
|
||||
# Base classes
|
||||
'BaseVersionSelectionDialog',
|
||||
'WineVersionSelectionDialogBase',
|
||||
'ComponentVersionSelectionDialogBase',
|
||||
|
||||
# Dialogs
|
||||
'WinetricksManagerDialog',
|
||||
'WineVersionSelectionDialog',
|
||||
'ComponentVersionSelectionDialog',
|
||||
'CreatePrefixDialog',
|
||||
'FileAssociationsDialog',
|
||||
'AdditionalSettingsDialog',
|
||||
'AppAdditionalSettingsDialog',
|
||||
]
|
||||
@@ -2,19 +2,32 @@
|
||||
Базовые классы для диалогов выбора версий.
|
||||
Устраняет дублирование кода между WineVersionSelectionDialog и ComponentVersionSelectionDialog.
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QGridLayout, QScrollArea,
|
||||
QTabWidget, QLineEdit, QPushButton, QLabel, QWidget, QMessageBox
|
||||
)
|
||||
from PyQt5.QtCore import Qt, pyqtSignal
|
||||
|
||||
from winehelperqt.logger import get_logger
|
||||
from winehelperqt.parsers.sha256_parser import Sha256Parser
|
||||
from winehelperqt.qt_compat import (
|
||||
QDialog,
|
||||
QGridLayout,
|
||||
QHBoxLayout,
|
||||
QLabel,
|
||||
QLineEdit,
|
||||
QMessageBox,
|
||||
QProcess,
|
||||
QPushButton,
|
||||
QScrollArea,
|
||||
Qt,
|
||||
QTabWidget,
|
||||
QTimer,
|
||||
QVBoxLayout,
|
||||
QWidget,
|
||||
)
|
||||
from winehelperqt.utils.environment import EnvironmentConfig
|
||||
from winehelperqt.utils.grid_utils import GridUtils
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class BaseVersionSelectionDialog(QDialog):
|
||||
@@ -25,15 +38,37 @@ class BaseVersionSelectionDialog(QDialog):
|
||||
- Поле поиска с фильтрацией
|
||||
- Сетка кнопок с версиями
|
||||
- Базовая логика выбора версии
|
||||
|
||||
Построение UI двухфазное: конечный наследник обязан вызвать
|
||||
self._setup_ui() в конце своего __init__, когда установлены все поля,
|
||||
необходимые виртуальным методам (_create_version_container, populate_ui).
|
||||
"""
|
||||
|
||||
NUM_COLUMNS = 3
|
||||
|
||||
version_selected = pyqtSignal(str)
|
||||
# Кэш версии системного Wine на время сессии.
|
||||
# None — версия ещё не определена; "" — определить не удалось
|
||||
# (кэшируем и неудачу, чтобы не запускать wine --version при каждом открытии диалога);
|
||||
# непустая строка — определённая версия.
|
||||
_system_wine_version_cache = None
|
||||
|
||||
@classmethod
|
||||
def get_system_wine_version(cls):
|
||||
"""Возвращает версию системного Wine (None — ещё не определена)."""
|
||||
return cls._system_wine_version_cache
|
||||
|
||||
@classmethod
|
||||
def set_system_wine_version(cls, version):
|
||||
"""Запоминает результат определения версии системного Wine (включая неудачу)."""
|
||||
cls._system_wine_version_cache = version or ""
|
||||
|
||||
def __init__(self, title, parent=None, min_width=600, min_height=400):
|
||||
"""
|
||||
Инициализирует базовый диалог выбора версий.
|
||||
|
||||
Не строит UI: виртуальные методы (_create_version_container,
|
||||
load_versions, populate_ui) зависят от полей наследников, поэтому
|
||||
_setup_ui() вызывается конечным классом в конце своего __init__.
|
||||
"""
|
||||
super().__init__(parent)
|
||||
|
||||
@@ -46,15 +81,13 @@ class BaseVersionSelectionDialog(QDialog):
|
||||
self.search_edit = None
|
||||
self.main_layout = None
|
||||
|
||||
self._setup_ui()
|
||||
|
||||
def _get_sha256_path(self):
|
||||
"""Возвращает путь к файлу sha256sum.list."""
|
||||
data_path = EnvironmentConfig.DATA_PATH
|
||||
if data_path:
|
||||
return os.path.join(data_path, "sha256sum.list")
|
||||
# Фолбэк: ищем рядом с этим файлом (для отладки)
|
||||
return os.path.join(os.path.dirname(__file__), '../../sha256sum.list')
|
||||
# Фолбэк: явно разрешаем путь из расположения пакета
|
||||
return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "sha256sum.list"))
|
||||
|
||||
def _setup_ui(self):
|
||||
"""Создает базовый UI диалога."""
|
||||
@@ -77,71 +110,14 @@ class BaseVersionSelectionDialog(QDialog):
|
||||
|
||||
def filter_versions(self):
|
||||
"""Фильтрует версии по тексту поиска."""
|
||||
search_text = self.search_edit.text().lower()
|
||||
|
||||
visible_buttons = []
|
||||
for btn_widget in self.buttons:
|
||||
if search_text in btn_widget.text().lower():
|
||||
visible_buttons.append(btn_widget)
|
||||
|
||||
for btn_widget in self.buttons:
|
||||
btn_widget.setVisible(False)
|
||||
|
||||
for i, btn_widget in enumerate(visible_buttons):
|
||||
row, col = divmod(i, self.NUM_COLUMNS)
|
||||
if hasattr(self, 'grid_layout'):
|
||||
self.grid_layout.addWidget(btn_widget, row, col)
|
||||
btn_widget.setVisible(True)
|
||||
grid_layout = getattr(self, "grid_layout", None)
|
||||
GridUtils.filter_buttons(self.buttons, self.search_edit.text(), grid_layout, self.NUM_COLUMNS)
|
||||
|
||||
def on_version_selected(self, version_name):
|
||||
"""Обрабатывает выбор версии."""
|
||||
self.selected_version = version_name
|
||||
self.version_selected.emit(version_name)
|
||||
self.accept()
|
||||
|
||||
def get_selected_version(self):
|
||||
"""Возвращает выбранную версию."""
|
||||
return self.selected_version
|
||||
|
||||
@staticmethod
|
||||
def create_grid_buttons(
|
||||
grid_layout,
|
||||
versions_list,
|
||||
on_click_callback,
|
||||
start_row=0,
|
||||
num_columns=3,
|
||||
is_download_tab=False,
|
||||
version_filter=None
|
||||
):
|
||||
"""Создает сетку кнопок для версий."""
|
||||
buttons = []
|
||||
row, col = start_row, 0
|
||||
|
||||
for version_data in versions_list:
|
||||
if isinstance(version_data, tuple):
|
||||
display_name, value_name = version_data
|
||||
else:
|
||||
display_name = value_name = version_data
|
||||
|
||||
btn = QPushButton(display_name)
|
||||
btn.clicked.connect(lambda checked, vn=value_name: on_click_callback(vn))
|
||||
|
||||
if version_filter and not is_download_tab:
|
||||
should_disable = version_filter(value_name)
|
||||
if should_disable:
|
||||
btn.setEnabled(False)
|
||||
btn.setToolTip("Эта версия несовместима с выбранной архитектурой.")
|
||||
|
||||
grid_layout.addWidget(btn, row, col)
|
||||
buttons.append(btn)
|
||||
|
||||
col += 1
|
||||
if col >= num_columns:
|
||||
col = 0
|
||||
row += 1
|
||||
|
||||
return buttons
|
||||
|
||||
|
||||
class WineVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
"""
|
||||
@@ -155,13 +131,11 @@ class WineVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
self.architecture = architecture
|
||||
self.wine_versions_data = {}
|
||||
self.system_wine_display_name = "Системная версия"
|
||||
self.system_wine_available = True
|
||||
self.selected_display_text = None
|
||||
|
||||
super().__init__(
|
||||
title=f"Выбор версии Wine для {architecture} префикса",
|
||||
parent=parent,
|
||||
min_width=900,
|
||||
min_height=500
|
||||
title=f"Выбор версии Wine для {architecture} префикса", parent=parent, min_width=900, min_height=500
|
||||
)
|
||||
|
||||
def _create_version_container(self):
|
||||
@@ -177,7 +151,7 @@ class WineVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
loading_widget = QWidget()
|
||||
loading_layout = QVBoxLayout(loading_widget)
|
||||
status_label = QLabel("Загрузка, пожалуйста, подождите...")
|
||||
status_label.setAlignment(Qt.AlignCenter)
|
||||
status_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
loading_layout.addWidget(status_label)
|
||||
self.main_tabs.addTab(loading_widget, "Загрузка...")
|
||||
self.main_tabs.setEnabled(False)
|
||||
@@ -193,11 +167,7 @@ class WineVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
self.wine_versions_data = Sha256Parser.parse_wine_versions(sha256_path)
|
||||
|
||||
if not self.wine_versions_data:
|
||||
QMessageBox.warning(
|
||||
self,
|
||||
"Ошибка",
|
||||
f"Файл с версиями не найден или пуст:\n{sha256_path}"
|
||||
)
|
||||
QMessageBox.warning(self, "Ошибка", f"Файл с версиями не найден или пуст:\n{sha256_path}")
|
||||
|
||||
def _get_installed_versions(self):
|
||||
"""Возвращает список локально установленных версий Wine."""
|
||||
@@ -207,35 +177,74 @@ class WineVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
return Sha256Parser.get_installed_versions(dist_path)
|
||||
|
||||
def _get_system_wine_version(self):
|
||||
"""Получает версию системного Wine."""
|
||||
if shutil.which('wine'):
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['wine', '--version'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True,
|
||||
encoding='utf-8'
|
||||
)
|
||||
return result.stdout.strip()
|
||||
except (FileNotFoundError, subprocess.CalledProcessError) as e:
|
||||
print(f"Не удалось получить версию системного wine: {e}")
|
||||
"""
|
||||
Получает версию системного Wine (с кэшированием на время сессии).
|
||||
|
||||
Определение выполняется асинхронно через QProcess, чтобы открытие
|
||||
диалога не блокировало GUI на время работы wine --version; по готовности
|
||||
текст кнопки системной версии обновляется на вкладке «Установленные версии Wine».
|
||||
|
||||
Returns:
|
||||
Строка с версией; "Системная версия", если версию определить
|
||||
не удалось; None, если Wine не установлен в системе.
|
||||
"""
|
||||
cached = BaseVersionSelectionDialog.get_system_wine_version()
|
||||
if cached is not None:
|
||||
return cached or "Системная версия"
|
||||
|
||||
if not shutil.which("wine"):
|
||||
logger.debug("Системный wine не найден в системе")
|
||||
return None
|
||||
|
||||
self._probe_system_wine_version()
|
||||
return "Системная версия"
|
||||
|
||||
def _is_version_compatible(self, version_name):
|
||||
"""Проверяет совместимость версии с выбранной архитектурой."""
|
||||
is_win64_prefix = self.architecture == "win64"
|
||||
is_win32_prefix = self.architecture == "win32"
|
||||
re_32bit_version = re.compile(r'i[3-6]86|i586')
|
||||
def _probe_system_wine_version(self):
|
||||
"""Запускает асинхронное определение версии системного Wine (без блокировки GUI)."""
|
||||
if BaseVersionSelectionDialog.get_system_wine_version() is not None:
|
||||
# Версию уже определил другой диалог или прогрев при старте GUI:
|
||||
# обновим кнопку из кэша на следующем тике событий
|
||||
QTimer.singleShot(0, self._update_system_wine_button_text)
|
||||
return
|
||||
|
||||
if is_win64_prefix and re_32bit_version.search(version_name):
|
||||
return False
|
||||
proc = QProcess(self)
|
||||
proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
|
||||
|
||||
if is_win32_prefix:
|
||||
if version_name == "system" or 'wow64' in version_name:
|
||||
return False
|
||||
def on_finished(exit_code, _exit_status):
|
||||
version = ""
|
||||
try:
|
||||
if exit_code == 0:
|
||||
output = proc.readAllStandardOutput().data().decode("utf-8", errors="ignore").strip()
|
||||
version = output.splitlines()[0].strip() if output else ""
|
||||
except RuntimeError:
|
||||
pass
|
||||
# Кэшируем и неудачу (""), чтобы повторные открытия диалога
|
||||
# не запускали новые процессы wine --version
|
||||
BaseVersionSelectionDialog.set_system_wine_version(version)
|
||||
if version:
|
||||
logger.debug("Системный wine: %s", version)
|
||||
self._update_system_wine_button_text()
|
||||
else:
|
||||
logger.warning("Не удалось определить версию системного wine")
|
||||
|
||||
return True
|
||||
def on_error(_error):
|
||||
# Не перезаписываем версию, если её уже определил параллельный запрос
|
||||
if BaseVersionSelectionDialog.get_system_wine_version() is None:
|
||||
BaseVersionSelectionDialog.set_system_wine_version("")
|
||||
|
||||
proc.finished.connect(on_finished)
|
||||
proc.errorOccurred.connect(on_error)
|
||||
proc.start("wine", ["--version"])
|
||||
|
||||
def _update_system_wine_button_text(self):
|
||||
"""Обновляет текст кнопки системной версии после асинхронного определения версии."""
|
||||
version = BaseVersionSelectionDialog.get_system_wine_version()
|
||||
if not version:
|
||||
return
|
||||
for btn in getattr(self, "installed_buttons", []):
|
||||
if getattr(btn, "value_name", None) == "system":
|
||||
btn.setText(f"{version} (Системный)")
|
||||
break
|
||||
|
||||
def populate_ui(self):
|
||||
"""Заполняет UI версиями Wine."""
|
||||
@@ -247,13 +256,7 @@ class ComponentVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
Базовый класс для диалога выбора версии компонента (DXVK, VKD3D).
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
component_group,
|
||||
title,
|
||||
parent=None,
|
||||
add_extra_options=True
|
||||
):
|
||||
def __init__(self, component_group, title, parent=None, add_extra_options=True):
|
||||
"""
|
||||
Инициализирует диалог выбора версии компонента.
|
||||
"""
|
||||
@@ -261,25 +264,20 @@ class ComponentVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
self.versions_data = []
|
||||
self.add_extra_options = add_extra_options
|
||||
|
||||
super().__init__(
|
||||
title=title,
|
||||
parent=parent,
|
||||
min_width=600,
|
||||
min_height=400
|
||||
)
|
||||
super().__init__(title=title, parent=parent, min_width=700, min_height=400)
|
||||
|
||||
def _create_version_container(self):
|
||||
"""Создает контейнер для версий компонента."""
|
||||
self.scroll_area = QScrollArea()
|
||||
self.scroll_area.setWidgetResizable(True)
|
||||
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||
self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
self.main_layout.addWidget(self.scroll_area)
|
||||
|
||||
scroll_content = QWidget()
|
||||
self.scroll_area.setWidget(scroll_content)
|
||||
|
||||
self.grid_layout = QGridLayout(scroll_content)
|
||||
self.grid_layout.setAlignment(Qt.AlignTop)
|
||||
self.grid_layout.setAlignment(Qt.AlignmentFlag.AlignTop)
|
||||
|
||||
self.load_versions(start_row=0)
|
||||
|
||||
@@ -311,10 +309,7 @@ class ComponentVersionSelectionDialogBase(BaseVersionSelectionDialog):
|
||||
def _parse_sha256_list(self):
|
||||
"""Парсит sha256sum.list для получения списка версий компонента."""
|
||||
sha256_path = self._get_sha256_path()
|
||||
self.versions_data = Sha256Parser.parse_component_versions(
|
||||
sha256_path,
|
||||
self.component_group
|
||||
)
|
||||
self.versions_data = Sha256Parser.parse_component_versions(sha256_path, self.component_group)
|
||||
|
||||
def populate_ui(self, start_row):
|
||||
"""Заполняет UI версиями компонента."""
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
from winehelperqt.qt_compat import QDialog, QProcess, QTimer
|
||||
from winehelperqt.utils.dialog_utils import DialogUtils
|
||||
|
||||
|
||||
class CommandDialog(QDialog):
|
||||
"""Модальный диалог для выполнения команд winehelper с защитой от случайного закрытия."""
|
||||
|
||||
TERMINATE_GRACE_MS = 10000
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self._process = None
|
||||
# True, если пользователь сам подтвердил прерывание через закрытие окна
|
||||
self.aborted_by_user = False
|
||||
|
||||
def set_process(self, process):
|
||||
self._process = process
|
||||
|
||||
@staticmethod
|
||||
def _process_is_running(process) -> bool:
|
||||
"""Жив ли процесс (False если объект уже удалён)."""
|
||||
try:
|
||||
return process.state() == QProcess.ProcessState.Running
|
||||
except RuntimeError:
|
||||
return False
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self._process is None or not self._process_is_running(self._process):
|
||||
event.accept()
|
||||
return
|
||||
|
||||
if not DialogUtils.confirm(
|
||||
self,
|
||||
"Прервать выполнение?",
|
||||
"Процесс ещё выполняется.\nВы действительно хотите прервать его?",
|
||||
yes_text="Да, прервать",
|
||||
no_text="Нет",
|
||||
):
|
||||
event.ignore()
|
||||
return
|
||||
|
||||
self.aborted_by_user = True
|
||||
proc = self._process
|
||||
self._process = None
|
||||
try:
|
||||
proc.terminate()
|
||||
# Окно закрываем сразу, не дожидаясь смерти процесса:
|
||||
# если процесс игнорирует SIGTERM, через TERMINATE_GRACE_MS его убьём
|
||||
QTimer.singleShot(
|
||||
self.TERMINATE_GRACE_MS,
|
||||
lambda: proc.kill() if self._process_is_running(proc) else None,
|
||||
)
|
||||
except RuntimeError:
|
||||
pass
|
||||
event.accept()
|
||||
@@ -2,19 +2,18 @@
|
||||
Диалог для выбора версии компонента (DXVK, VKD3D).
|
||||
|
||||
"""
|
||||
|
||||
from functools import partial
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QPushButton
|
||||
)
|
||||
|
||||
from winehelperqt.dialogs.base_version_dialog import ComponentVersionSelectionDialogBase
|
||||
from winehelperqt.dialogs.wine_version import VersionButtonWidget
|
||||
from winehelperqt.utils.version_utils import sort_versions
|
||||
|
||||
|
||||
class ComponentVersionSelectionDialog(ComponentVersionSelectionDialogBase):
|
||||
"""Диалог для выбора версии компонента (DXVK, VKD3D)."""
|
||||
|
||||
def __init__(self, component_group, title, parent=None, add_extra_options=True):
|
||||
def __init__(self, component_group, title, parent=None, add_extra_options=True, installed_version=None):
|
||||
"""
|
||||
Инициализирует диалог выбора версии компонента.
|
||||
|
||||
@@ -23,20 +22,23 @@ class ComponentVersionSelectionDialog(ComponentVersionSelectionDialogBase):
|
||||
title: Заголовок диалога
|
||||
parent: Родительский виджет
|
||||
add_extra_options: Добавлять ли кнопки действий
|
||||
installed_version: Текущая установленная версия компонента в префиксе
|
||||
"""
|
||||
self.installed_version = installed_version
|
||||
super().__init__(
|
||||
component_group=component_group,
|
||||
title=title,
|
||||
parent=parent,
|
||||
add_extra_options=add_extra_options
|
||||
component_group=component_group, title=title, parent=parent, add_extra_options=add_extra_options
|
||||
)
|
||||
|
||||
# UI строим в конце: к этому моменту установлены поля всех уровней
|
||||
self._setup_ui()
|
||||
|
||||
def populate_ui(self, start_row):
|
||||
"""Заполняет UI кнопками версий."""
|
||||
versions = sorted(self.versions_data, reverse=True)
|
||||
versions = sort_versions(self.versions_data, reverse=True)
|
||||
row, col = start_row, 0
|
||||
for version_name in versions:
|
||||
btn = QPushButton(version_name)
|
||||
is_installed = version_name == self.installed_version
|
||||
btn = VersionButtonWidget(version_name, version_name, is_installed=is_installed, show_icon=True)
|
||||
btn.clicked.connect(partial(self.on_version_selected, version_name))
|
||||
self.grid_layout.addWidget(btn, row, col)
|
||||
self.buttons.append(btn)
|
||||
@@ -45,23 +47,6 @@ class ComponentVersionSelectionDialog(ComponentVersionSelectionDialogBase):
|
||||
col = 0
|
||||
row += 1
|
||||
|
||||
def filter_versions(self):
|
||||
"""Фильтрует видимость кнопок версий и перестраивает сетку."""
|
||||
search_text = self.search_edit.text().lower()
|
||||
|
||||
visible_buttons = []
|
||||
for btn_widget in self.buttons:
|
||||
if search_text in btn_widget.text().lower():
|
||||
visible_buttons.append(btn_widget)
|
||||
|
||||
for btn_widget in self.buttons:
|
||||
btn_widget.setVisible(False)
|
||||
|
||||
for i, btn_widget in enumerate(visible_buttons):
|
||||
row, col = divmod(i, self.NUM_COLUMNS)
|
||||
self.grid_layout.addWidget(btn_widget, row, col)
|
||||
btn_widget.setVisible(True)
|
||||
|
||||
def on_version_selected(self, version_name):
|
||||
"""Обрабатывает выбор версии."""
|
||||
self.selected_version = version_name
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
"""
|
||||
Диалог создания лога запуска программы с выбором каналов WINEDEBUG.
|
||||
"""
|
||||
|
||||
from winehelperqt.dialogs.winedebug_base import CREATE_LOG_CHANNELS_KEY, WinedebugChannelsDialog
|
||||
|
||||
|
||||
class CreateLogDialog(WinedebugChannelsDialog):
|
||||
"""Диалог для запуска приложения с созданием лога."""
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(
|
||||
title="Создание лога",
|
||||
description=(
|
||||
"Приложение будет запущено в режиме отладки.\n\n"
|
||||
"После закрытия приложения лог будет сохранен в папке 'winehelper_backup_log' "
|
||||
"в вашем домашнем каталоге под именем (пример: prefix_program.log).\n\n"
|
||||
"Укажите каналы отладки WINEDEBUG:"
|
||||
),
|
||||
primary_button_text="Запустить",
|
||||
channels_key=CREATE_LOG_CHANNELS_KEY,
|
||||
parent=parent,
|
||||
)
|
||||
@@ -1,26 +1,39 @@
|
||||
"""
|
||||
Диалог для создания нового префикса.
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QFormLayout, QPushButton,
|
||||
QLabel, QLineEdit, QRadioButton, QComboBox, QMessageBox, QWidget
|
||||
)
|
||||
from PyQt5.QtGui import QFont
|
||||
|
||||
from winehelperqt.parsers.sha256_parser import Sha256Parser
|
||||
from winehelperqt.dialogs.windows_version import WindowsVersionSelectionDialog
|
||||
from winehelperqt.dialogs.wine_version import WineVersionSelectionDialog
|
||||
from winehelperqt.parsers.sha256_parser import Sha256Parser
|
||||
from winehelperqt.qt_compat import (
|
||||
QComboBox,
|
||||
QDialog,
|
||||
QFormLayout,
|
||||
QHBoxLayout,
|
||||
QLabel,
|
||||
QLineEdit,
|
||||
QMessageBox,
|
||||
QPushButton,
|
||||
QRadioButton,
|
||||
QVBoxLayout,
|
||||
QWidget,
|
||||
)
|
||||
from winehelperqt.utils.environment import EnvironmentConfig
|
||||
from winehelperqt.utils.font_utils import app_font
|
||||
|
||||
|
||||
class CreatePrefixDialog(QDialog):
|
||||
"""Диалог для создания нового префикса."""
|
||||
|
||||
PREFIX_NAME_PATTERN = r"^[a-zA-Z0-9_-]+$"
|
||||
PREFIX_NAME_CHARS = r"[^a-zA-Z0-9_-]"
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.parent_gui = parent
|
||||
self.parent_tab = parent
|
||||
self.setWindowTitle("Создание нового префикса")
|
||||
self.setMinimumSize(680, 250)
|
||||
self.setModal(True)
|
||||
@@ -31,6 +44,7 @@ class CreatePrefixDialog(QDialog):
|
||||
self.prepared_prefixes = {}
|
||||
self.selected_wine_version_value = None
|
||||
self.selected_wine_version_display = None
|
||||
self.selected_windows_version = "10"
|
||||
|
||||
layout = QVBoxLayout(self)
|
||||
form_layout = QFormLayout()
|
||||
@@ -65,6 +79,7 @@ class CreatePrefixDialog(QDialog):
|
||||
form_layout.addRow("<b>Разрядность:</b>", arch_widget)
|
||||
|
||||
self.prefix_template_selector = QComboBox()
|
||||
self.prefix_template_selector.setFixedWidth(170)
|
||||
self.prefix_template_selector.setToolTip("Выберите шаблон для создания префикса.")
|
||||
form_layout.addRow("<b>Шаблон префикса:</b>", self.prefix_template_selector)
|
||||
|
||||
@@ -80,11 +95,18 @@ class CreatePrefixDialog(QDialog):
|
||||
version_layout.addWidget(select_version_button)
|
||||
form_layout.addRow("<b>Версия Wine:</b>", version_layout)
|
||||
|
||||
self.windows_version_combo = QComboBox()
|
||||
self.windows_version_combo.setFixedWidth(170)
|
||||
for display_name, value in WindowsVersionSelectionDialog.WINDOWS_VERSIONS:
|
||||
self.windows_version_combo.addItem(display_name, value)
|
||||
self.windows_version_combo.setCurrentIndex(self.windows_version_combo.findData(self.selected_windows_version))
|
||||
form_layout.addRow("<b>Версия Windows:</b>", self.windows_version_combo)
|
||||
|
||||
layout.addLayout(form_layout)
|
||||
|
||||
button_layout = QHBoxLayout()
|
||||
self.create_button = QPushButton("Создать")
|
||||
self.create_button.setFont(QFont('Arial', 11, QFont.Bold))
|
||||
self.create_button.setFont(app_font(11, bold=True))
|
||||
self.create_button.setStyleSheet("background-color: #0078d7; color: white;")
|
||||
self.create_button.setEnabled(False)
|
||||
self.create_button.clicked.connect(self.accept_creation)
|
||||
@@ -100,13 +122,16 @@ class CreatePrefixDialog(QDialog):
|
||||
self.arch_win32_radio.toggled.connect(self.on_architecture_changed)
|
||||
self.prefix_name_edit.textChanged.connect(self.validate_prefix_name)
|
||||
self.wine_version_edit.textChanged.connect(self.update_create_button_state)
|
||||
# Подключаем один раз здесь: при подключении внутри on_architecture_changed
|
||||
# обработчики накапливались бы при каждом переключении радио 32/64-bit
|
||||
self.prefix_template_selector.currentIndexChanged.connect(self._update_template_tooltip)
|
||||
|
||||
self._load_prepared_prefixes()
|
||||
self.on_architecture_changed()
|
||||
|
||||
def _load_prepared_prefixes(self):
|
||||
"""Загружает и парсит шаблоны префиксов из sha256sum.list."""
|
||||
self.prepared_prefixes = {'win32': [], 'win64': []}
|
||||
self.prepared_prefixes = {"win32": [], "win64": []}
|
||||
data_path = EnvironmentConfig.DATA_PATH
|
||||
if not data_path:
|
||||
QMessageBox.warning(self, "Ошибка", "Переменная окружения DATA_PATH не установлена.")
|
||||
@@ -123,7 +148,7 @@ class CreatePrefixDialog(QDialog):
|
||||
"""Открывает диалог выбора версии Wine."""
|
||||
architecture = "win32" if self.arch_win32_radio.isChecked() else "win64"
|
||||
dialog = WineVersionSelectionDialog(architecture, self)
|
||||
if dialog.exec_() == QDialog.Accepted and dialog.selected_version:
|
||||
if dialog.exec() == QDialog.DialogCode.Accepted and dialog.selected_version:
|
||||
self.wine_version_edit.setText(dialog.selected_display_text)
|
||||
self.selected_wine_version_value = dialog.selected_version
|
||||
|
||||
@@ -140,23 +165,26 @@ class CreatePrefixDialog(QDialog):
|
||||
|
||||
for value, description in templates:
|
||||
display_name = "Чистый префикс" if value == "none" else value
|
||||
self.prefix_template_selector.addItem(display_name, userData={'value': value, 'tooltip': description})
|
||||
self.prefix_template_selector.addItem(display_name, userData={"value": value, "tooltip": description})
|
||||
|
||||
self.prefix_template_selector.blockSignals(False)
|
||||
self.prefix_template_selector.currentIndexChanged.connect(
|
||||
lambda i: self.prefix_template_selector.setToolTip(
|
||||
self.prefix_template_selector.itemData(i)['tooltip']
|
||||
)
|
||||
)
|
||||
self.prefix_template_selector.setToolTip(self.prefix_template_selector.itemData(0)['tooltip'])
|
||||
# Сигнал был заблокирован на время заполнения списка — обновляем подсказку вручную
|
||||
self._update_template_tooltip(self.prefix_template_selector.currentIndex())
|
||||
|
||||
def _update_template_tooltip(self, index):
|
||||
"""Обновляет подсказку выпадающего списка под выбранный шаблон."""
|
||||
data = self.prefix_template_selector.itemData(index)
|
||||
if data:
|
||||
self.prefix_template_selector.setToolTip(data["tooltip"])
|
||||
else:
|
||||
self.prefix_template_selector.setToolTip("Выберите шаблон для создания префикса.")
|
||||
|
||||
def validate_prefix_name(self, text):
|
||||
"""Проверяет имя префикса в реальном времени."""
|
||||
valid_pattern = r'^[a-zA-Z0-9_-]*$'
|
||||
if re.match(valid_pattern, text):
|
||||
if re.match(self.PREFIX_NAME_PATTERN, text):
|
||||
self.name_warning_label.setVisible(False)
|
||||
else:
|
||||
cleaned_text = re.sub(r'[^a-zA-Z0-9_-]', '', text)
|
||||
cleaned_text = re.sub(self.PREFIX_NAME_CHARS, "", text)
|
||||
self.prefix_name_edit.blockSignals(True)
|
||||
self.prefix_name_edit.setText(cleaned_text)
|
||||
self.prefix_name_edit.blockSignals(False)
|
||||
@@ -168,9 +196,7 @@ class CreatePrefixDialog(QDialog):
|
||||
"""Включает или выключает кнопку 'Создать'."""
|
||||
name_ok = bool(self.prefix_name_edit.text().strip())
|
||||
version_ok = bool(self.wine_version_edit.text().strip())
|
||||
self.create_button.setEnabled(
|
||||
name_ok and version_ok and not self.name_warning_label.isVisible()
|
||||
)
|
||||
self.create_button.setEnabled(name_ok and version_ok and not self.name_warning_label.isVisible())
|
||||
|
||||
def accept_creation(self):
|
||||
"""Валидирует данные, сохраняет их и закрывает диалог с успехом."""
|
||||
@@ -180,10 +206,11 @@ class CreatePrefixDialog(QDialog):
|
||||
QMessageBox.warning(self, "Ошибка", "Имя префикса не может быть пустым.")
|
||||
return
|
||||
|
||||
if not re.match(r'^[a-zA-Z0-9_-]+$', prefix_name):
|
||||
if not re.match(self.PREFIX_NAME_PATTERN, prefix_name):
|
||||
QMessageBox.warning(
|
||||
self, "Ошибка",
|
||||
"Имя префикса может содержать только латинские буквы, цифры, дефисы и знаки подчеркивания."
|
||||
self,
|
||||
"Ошибка",
|
||||
"Имя префикса может содержать только латинские буквы, цифры, дефисы и знаки подчеркивания.",
|
||||
)
|
||||
return
|
||||
|
||||
@@ -195,8 +222,10 @@ class CreatePrefixDialog(QDialog):
|
||||
self.prefix_name = prefix_name
|
||||
self.wine_arch = "win32" if self.arch_win32_radio.isChecked() else "win64"
|
||||
|
||||
current_index = self.prefix_template_selector.currentIndex()
|
||||
self.base_pfx = self.prefix_template_selector.itemData(current_index)['value']
|
||||
template_data = self.prefix_template_selector.itemData(self.prefix_template_selector.currentIndex())
|
||||
# Список шаблонов может быть пуст (секция PREFIX отсутствует в sha256sum.list)
|
||||
self.base_pfx = template_data["value"] if template_data else "none"
|
||||
self.selected_wine_version_display = self.wine_version_edit.text()
|
||||
self.selected_windows_version = self.windows_version_combo.currentData()
|
||||
|
||||
self.accept()
|
||||
@@ -0,0 +1,96 @@
|
||||
"""
|
||||
Модуль вывода предупреждения о проверке установки КриптоПро в системе.
|
||||
|
||||
Выводит информационное окно со ссылками на официальный сайт КриптоПро
|
||||
и инструкцию по установке КриптоПро в систему.
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
from winehelperqt.qt_compat import (
|
||||
QApplication,
|
||||
QDialog,
|
||||
QTextBrowser,
|
||||
QVBoxLayout,
|
||||
)
|
||||
|
||||
|
||||
class CryptoProWarningDialog(QDialog):
|
||||
"""Диалог предупреждения о проверке установки КриптоПро."""
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setWindowTitle("WineHelper — Предупреждение!")
|
||||
self.setMinimumSize(600, 400)
|
||||
self.setModal(True)
|
||||
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(12)
|
||||
|
||||
self.info_browser = QTextBrowser()
|
||||
self.info_browser.setOpenExternalLinks(True)
|
||||
self.info_browser.setStyleSheet("""
|
||||
QTextBrowser {
|
||||
background-color: #1e1e1e;
|
||||
color: #e4e4e4;
|
||||
border: none;
|
||||
}
|
||||
""")
|
||||
self.info_browser.setHtml(self._build_html_content())
|
||||
layout.addWidget(self.info_browser)
|
||||
|
||||
def _build_html_content(self) -> str:
|
||||
"""Формирует HTML-содержимое окна."""
|
||||
body_style = (
|
||||
"font-family: 'Segoe UI', 'Noto Sans', sans-serif; font-size: 14px; color: #e4e4e4; line-height: 1.55;"
|
||||
)
|
||||
warning_style = "background-color: #3d351f; border-left: 4px solid #ffcc00; padding: 12px 14px; margin: 0;"
|
||||
warning_text_style = "color: #ffd700; font-weight: bold; text-align: center; margin: 0 0 6px 0;"
|
||||
card_style = "padding: 14px; margin: 0;"
|
||||
title_style = "font-size: 15px; font-weight: bold; color: #ffffff; margin: 0 0 10px 0;"
|
||||
paragraph_style = "margin: 0 0 10px 0;"
|
||||
link_style = "color: #7ec7ff;"
|
||||
|
||||
return f"""
|
||||
<html>
|
||||
<body style="{body_style}">
|
||||
<p style="text-align: center; font-size: 20px; font-weight: bold; color: #ffd700; margin: 0 0 8px 0;">
|
||||
Предупреждение!
|
||||
</p>
|
||||
<div style="{warning_style}">
|
||||
<p style="{warning_text_style} margin-bottom: 0;">
|
||||
⚠️ Проверьте правильность установки КриптоПро в системе!
|
||||
</p>
|
||||
</div>
|
||||
<div style="line-height: 18px; font-size: 1px;"> </div>
|
||||
|
||||
<div style="{card_style}">
|
||||
<p style="{title_style}">Официальный сайт КриптоПро</p>
|
||||
<p style="{paragraph_style}">
|
||||
<a style="{link_style}" href="https://cryptopro.ru/products/csp">
|
||||
https://cryptopro.ru/products/csp
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p style="{title_style} margin-top: 14px;">Инструкция установки КриптоПро в систему</p>
|
||||
<p style="{paragraph_style} margin-bottom: 0;">
|
||||
<a style="{link_style}" href="https://www.altlinux.org/CryptoPro">
|
||||
https://www.altlinux.org/CryptoPro
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
|
||||
def main() -> int:
|
||||
"""Точка входа для автономного запуска модуля."""
|
||||
app = QApplication(sys.argv)
|
||||
dialog = CryptoProWarningDialog()
|
||||
dialog.show()
|
||||
return app.exec()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,10 +1,8 @@
|
||||
"""
|
||||
Диалог для управления ассоциациями файлов (WH_XDG_OPEN).
|
||||
"""
|
||||
from PyQt5.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QLineEdit, QLabel, QDialogButtonBox, QMessageBox
|
||||
)
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
from winehelperqt.qt_compat import QDialog, QDialogButtonBox, QLabel, QLineEdit, QMessageBox, Qt, QVBoxLayout
|
||||
|
||||
|
||||
class FileAssociationsDialog(QDialog):
|
||||
@@ -27,7 +25,7 @@ class FileAssociationsDialog(QDialog):
|
||||
"<b>Пример:</b> <code>pdf docx txt</code>"
|
||||
)
|
||||
info_label.setWordWrap(True)
|
||||
info_label.setTextFormat(Qt.RichText)
|
||||
info_label.setTextFormat(Qt.TextFormat.RichText)
|
||||
layout.addWidget(info_label)
|
||||
|
||||
self.associations_edit = QLineEdit()
|
||||
@@ -37,13 +35,11 @@ class FileAssociationsDialog(QDialog):
|
||||
self.associations_edit.setPlaceholderText("Введите расширения через пробел...")
|
||||
layout.addWidget(self.associations_edit)
|
||||
|
||||
forbidden_label = QLabel(
|
||||
"<small><b>Запрещено использовать:</b> cpl, dll, exe, lnk, msi</small>"
|
||||
)
|
||||
forbidden_label.setTextFormat(Qt.RichText)
|
||||
forbidden_label = QLabel("<small><b>Запрещено использовать:</b> cpl, dll, exe, lnk, msi</small>")
|
||||
forbidden_label.setTextFormat(Qt.TextFormat.RichText)
|
||||
layout.addWidget(forbidden_label)
|
||||
|
||||
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||||
button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
|
||||
button_box.accepted.connect(self.validate_and_accept)
|
||||
button_box.rejected.connect(self.reject)
|
||||
layout.addWidget(button_box)
|
||||
@@ -53,22 +49,20 @@ class FileAssociationsDialog(QDialog):
|
||||
forbidden_extensions = {"cpl", "dll", "exe", "lnk", "msi"}
|
||||
|
||||
input_text = self.associations_edit.text().lower().strip()
|
||||
entered_extensions = {
|
||||
ext.strip() for ext in input_text.split() if ext.strip()
|
||||
}
|
||||
entered_extensions = {ext.strip() for ext in input_text.split() if ext.strip()}
|
||||
|
||||
found_forbidden = entered_extensions.intersection(forbidden_extensions)
|
||||
|
||||
if found_forbidden:
|
||||
msg_box = QMessageBox(self)
|
||||
msg_box.setIcon(QMessageBox.Warning)
|
||||
msg_box.setIcon(QMessageBox.Icon.Warning)
|
||||
msg_box.setWindowTitle("Недопустимые расширения")
|
||||
msg_box.setTextFormat(Qt.RichText)
|
||||
msg_box.setTextFormat(Qt.TextFormat.RichText)
|
||||
msg_box.setText(
|
||||
"Следующие расширения запрещены и не могут быть использованы:<br><br>"
|
||||
f"<b>{', '.join(sorted(list(found_forbidden)))}</b>"
|
||||
)
|
||||
msg_box.exec_()
|
||||
msg_box.exec()
|
||||
return
|
||||
|
||||
self.new_associations = " ".join(sorted(list(entered_extensions)))
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
"""
|
||||
Диалог/виджет глобальных настроек WineHelper GUI.
|
||||
"""
|
||||
|
||||
from winehelperqt.logger import get_logger, setup_logger
|
||||
from winehelperqt.qt_compat import (
|
||||
CURRENT_BINDING,
|
||||
QApplication,
|
||||
QComboBox,
|
||||
QFormLayout,
|
||||
QHBoxLayout,
|
||||
QLabel,
|
||||
QMessageBox,
|
||||
QProcess,
|
||||
QPushButton,
|
||||
Qt,
|
||||
QVBoxLayout,
|
||||
QWidget,
|
||||
available_bindings,
|
||||
)
|
||||
from winehelperqt.services.global_settings_service import GlobalSettingsService
|
||||
from winehelperqt.utils.dialog_utils import DialogUtils
|
||||
from winehelperqt.utils.environment import EnvironmentConfig
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class GlobalSettingsWidget(QWidget):
|
||||
"""Виджет с глобальными настройками приложения."""
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.settings_service = GlobalSettingsService()
|
||||
self._setup_ui()
|
||||
self._load_settings()
|
||||
|
||||
def _setup_ui(self):
|
||||
"""Создаёт элементы управления."""
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setContentsMargins(20, 20, 20, 20)
|
||||
layout.setSpacing(15)
|
||||
|
||||
dev_notice_label = QLabel(
|
||||
"Эта вкладка отображается только в режиме разработки (тестовый запуск из репозитория)."
|
||||
)
|
||||
dev_notice_label.setWordWrap(True)
|
||||
dev_notice_label.setStyleSheet("color: #e05000; font-weight: bold; font-size: 13pt;")
|
||||
layout.addWidget(dev_notice_label)
|
||||
|
||||
form_layout = QFormLayout()
|
||||
form_layout.setSpacing(10)
|
||||
|
||||
self.log_level_label = QLabel("Уровень логирования:")
|
||||
self.log_level_label.setToolTip(
|
||||
"debug — максимально подробный вывод\n"
|
||||
"info — обычный вывод\n"
|
||||
"warning — только предупреждения и ошибки\n"
|
||||
"error — только ошибки"
|
||||
)
|
||||
|
||||
self.log_level_combo = QComboBox()
|
||||
self.log_level_combo.setMinimumWidth(200)
|
||||
self.log_level_combo.addItem("Отладка (debug)", "debug")
|
||||
self.log_level_combo.addItem("Информация (info)", "info")
|
||||
self.log_level_combo.addItem("Предупреждения (warning)", "warning")
|
||||
self.log_level_combo.addItem("Ошибки (error)", "error")
|
||||
|
||||
form_layout.addRow(self.log_level_label, self.log_level_combo)
|
||||
|
||||
self.qt_binding_label = QLabel("Qt binding:")
|
||||
self.qt_binding_label.setToolTip(
|
||||
"Библиотека, через которую работает графический интерфейс.\n"
|
||||
"auto — PyQt6, если он установлен, иначе PyQt5 (рекомендуется).\n"
|
||||
"PyQt6/PyQt5 — строго выбранный binding; если он не установлен,\n"
|
||||
"GUI не запустится (вернуться можно переменной WH_QT_BINDING).\n"
|
||||
"Изменение применяется после перезапуска WineHelper."
|
||||
)
|
||||
|
||||
self.qt_binding_combo = QComboBox()
|
||||
self.qt_binding_combo.setMinimumWidth(200)
|
||||
self.qt_binding_combo.addItem("Авто (рекомендуется)", "auto")
|
||||
self.qt_binding_combo.addItem("PyQt6", "pyqt6")
|
||||
self.qt_binding_combo.addItem("PyQt5", "pyqt5")
|
||||
|
||||
installed = available_bindings()
|
||||
combo_model = self.qt_binding_combo.model()
|
||||
for index in range(self.qt_binding_combo.count()):
|
||||
data = self.qt_binding_combo.itemData(index)
|
||||
if data in ("pyqt5", "pyqt6") and data not in installed:
|
||||
item = combo_model.item(index)
|
||||
item.setEnabled(False)
|
||||
self.qt_binding_combo.setItemText(index, f"{self.qt_binding_combo.itemText(index)} (не установлен)")
|
||||
|
||||
form_layout.addRow(self.qt_binding_label, self.qt_binding_combo)
|
||||
|
||||
layout.addLayout(form_layout)
|
||||
|
||||
layout.addStretch()
|
||||
|
||||
button_layout = QHBoxLayout()
|
||||
button_layout.addStretch()
|
||||
|
||||
self.save_button = QPushButton("Сохранить")
|
||||
self.save_button.setMinimumHeight(32)
|
||||
self.save_button.clicked.connect(self._save_settings)
|
||||
self.save_button.setFocusPolicy(Qt.FocusPolicy.NoFocus)
|
||||
button_layout.addWidget(self.save_button)
|
||||
|
||||
layout.addLayout(button_layout)
|
||||
|
||||
def _load_settings(self):
|
||||
"""Загружает текущие настройки в интерфейс."""
|
||||
current_level = self.settings_service.get_log_level()
|
||||
index = self.log_level_combo.findData(current_level)
|
||||
if index >= 0:
|
||||
self.log_level_combo.setCurrentIndex(index)
|
||||
|
||||
current_binding = self.settings_service.get_qt_binding()
|
||||
index = self.qt_binding_combo.findData(current_binding)
|
||||
if index >= 0:
|
||||
self.qt_binding_combo.setCurrentIndex(index)
|
||||
|
||||
def _save_qt_binding(self):
|
||||
"""
|
||||
Сохраняет выбранный Qt binding; при смене фактического binding'а
|
||||
предлагает перезапустить приложение.
|
||||
|
||||
Returns:
|
||||
bool: False если сохранение не удалось (сообщение уже показано).
|
||||
"""
|
||||
new_binding = self.qt_binding_combo.currentData()
|
||||
if new_binding == self.settings_service.get_qt_binding():
|
||||
return True
|
||||
|
||||
if not self.settings_service.set_qt_binding(new_binding):
|
||||
QMessageBox.warning(self, "Ошибка", "Не удалось сохранить Qt binding.")
|
||||
return False
|
||||
|
||||
# Какой binding фактически загрузится при следующем запуске
|
||||
effective = new_binding
|
||||
if effective == "auto":
|
||||
effective = "pyqt6" if "pyqt6" in available_bindings() else "pyqt5"
|
||||
|
||||
if effective == CURRENT_BINDING:
|
||||
return True
|
||||
|
||||
logger.info("Qt binding изменён: %s -> %s (требуется перезапуск)", CURRENT_BINDING, effective)
|
||||
if DialogUtils.confirm(
|
||||
self,
|
||||
"Изменение Qt binding",
|
||||
f"При следующем запуске будет использован {effective}.\n\nПерезапустить WineHelper сейчас?",
|
||||
default_no=False,
|
||||
):
|
||||
self._restart()
|
||||
else:
|
||||
QMessageBox.information(
|
||||
self, "Сохранено", "Новый Qt binding вступит в силу при следующем запуске WineHelper."
|
||||
)
|
||||
return True
|
||||
|
||||
def _restart(self):
|
||||
"""Перезапускает GUI через скрипт-обёртку winehelper.
|
||||
|
||||
Новый процесс стартует с небольшой задержкой, чтобы текущий успел
|
||||
завершиться и освободить сокет single-instance (QLocalServer).
|
||||
"""
|
||||
run_script = EnvironmentConfig.RUN_SCRIPT
|
||||
if not run_script:
|
||||
QMessageBox.warning(
|
||||
self,
|
||||
"Ошибка",
|
||||
"Не удалось определить путь к скрипту winehelper.\nПерезапустите WineHelper вручную.",
|
||||
)
|
||||
return
|
||||
QProcess.startDetached("sh", ["-c", f'sleep 1; exec "{run_script}" gui'])
|
||||
app = QApplication.instance()
|
||||
if app:
|
||||
app.quit()
|
||||
|
||||
def _save_log_level(self):
|
||||
"""Сохраняет и применяет уровень логирования, только если он изменился."""
|
||||
new_level = self.log_level_combo.currentData()
|
||||
if new_level == self.settings_service.get_log_level():
|
||||
return
|
||||
if self.settings_service.set_log_level(new_level):
|
||||
setup_logger(new_level)
|
||||
# Сообщение отправляем на новом уровне: info-сообщение было бы
|
||||
# отфильтровано, если новый уровень warning/error.
|
||||
log_func = {
|
||||
"debug": logger.debug,
|
||||
"info": logger.info,
|
||||
"warning": logger.warning,
|
||||
"error": logger.error,
|
||||
}[new_level]
|
||||
log_func("Уровень логирования изменён на '%s'", new_level)
|
||||
QMessageBox.information(self, "Сохранено", f"Уровень логирования изменён на '{new_level}'.")
|
||||
else:
|
||||
QMessageBox.warning(self, "Ошибка", "Не удалось сохранить уровень логирования.")
|
||||
|
||||
def _save_settings(self):
|
||||
"""Сохраняет настройки; Qt binding — последним, т.к. может инициировать перезапуск."""
|
||||
self._save_log_level()
|
||||
|
||||
if not self._save_qt_binding():
|
||||
return
|
||||
@@ -0,0 +1,42 @@
|
||||
"""
|
||||
Диалог установки приложения с защитой от случайного закрытия во время процесса.
|
||||
|
||||
В отличие от CommandDialog (который при прерывании закрывается сразу),
|
||||
окно установки остаётся открытым до фактического завершения процесса,
|
||||
чтобы пользователь увидел финальное состояние лога.
|
||||
"""
|
||||
|
||||
from winehelperqt.dialogs.command_dialog import CommandDialog
|
||||
from winehelperqt.utils.dialog_utils import DialogUtils
|
||||
|
||||
|
||||
class InstallDialog(CommandDialog):
|
||||
"""Модальный диалог установки приложения с защитой от случайного закрытия."""
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self._abort_callback = None
|
||||
|
||||
def set_abort_callback(self, callback):
|
||||
"""Задаёт callback, вызываемый при подтверждённом прерывании через закрытие окна."""
|
||||
self._abort_callback = callback
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self._process is None or not self._process_is_running(self._process):
|
||||
event.accept()
|
||||
return
|
||||
|
||||
if not DialogUtils.confirm(
|
||||
self,
|
||||
"Прервать установку?",
|
||||
"Установка еще не завершена.\nВы действительно хотите прервать процесс?",
|
||||
yes_text="Да, прервать",
|
||||
no_text="Нет",
|
||||
):
|
||||
event.ignore()
|
||||
return
|
||||
|
||||
if self._abort_callback:
|
||||
self._abort_callback()
|
||||
# Запрещаем закрытие: окно закроется кнопкой «Закрыть» после завершения процесса
|
||||
event.ignore()
|
||||
Loaded 100 of 146 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user