Compare commits

..

7 Commits

Author SHA1 Message Date
Mikhail Tergoev
d5f337e6b4 Merge branch 'minergenon-devel' 2025-09-29 23:54:59 +03:00
Sergey Palcheh
904c9c9895 revision of the sub-tab Authors 2025-09-29 21:24:37 +06:00
Sergey Palcheh
1d4ee1fd70 the prefix control display is enabled by default 2025-09-29 20:40:07 +06:00
Sergey Palcheh
02a2256c8c fixed the character input in the name of the prefix being created 2025-09-29 20:27:33 +06:00
Mikhail Tergoev
cbcdba204e TODO: system menu directory 2025-09-29 16:05:26 +03:00
Mikhail Tergoev
66c56f6ecf removed broken README.MD 2025-09-29 15:52:21 +03:00
Mikhail Tergoev
221b59eda7 added README.MD 2025-09-29 15:50:46 +03:00
5 changed files with 52 additions and 255 deletions

234
README.md
View File

@@ -1,234 +0,0 @@
<div align="center">
<img src="image/gui/winehelper.svg" width="64">
<h1 align="center">WineHelper</h1>
<p align="center">Инструмент для упрощения установки Windows-приложений на Linux. Он использует подготовленные скрипты, портативные версии Wine и изолированные префиксы, обеспечивая максимальную повторяемость на различных операционных системах основанных на Alt Linux, начиная с релиза p10 и выше.</p>
</div>
## Установка
```
$ su -
# apt-get update && apt-get dist-upgrade
# apt-get install winehelper
# exit
```
<!-- Описание использования GUI -->
<details>
<summary style="font-size: 35px; font-weight: bold;">Использование WineHelper (CLI)</summary>
### Список приложений для установки
Вывод списка приложений, доступных к установке:
```
$ winehelper install list
```
или сокращенная команда:
```
$ winehelper -i
```
### Запуск установки приложений
Скрипты установки разделены на два типа:
1. **Список программ с возможностью автоматической установки** — содержит полностью автоматизированные скрипты установок программ у который есть дистрибутивы (установщики) в свободном доступе.
Процесс полностью автоматизирован.
Пример:
```
$ winehelper install spravki-bk
```
или сокращенная команда:
```
$ winehelper -i spravki-bk
```
2. **Список программ с возможностью установки из существующего дистрибутива** — содержит скрипты установок для программ, которых нет в свободном доступе.
Пример:
```
$ winehelper install is-record-station "/путь/до/установочногоайла"
```
или сокращенная команда:
```
$ winehelper -i is-record-station "/путь/до/установочногоайла"
```
### Процесс установки приложений
При первом запуске **WineHelper** проверяются и при необходимости устанавливаются дополнительные зависимости (запрашиваются права root).
Процесс установки приложений:
1. Отображаются лицензионные соглашения на сторонние компоненты. Для продолжения введите **y** и нажмите **Enter**.
2. Далее процесс проходит автоматически с подробным выводом в терминал:
- Загрузка и проверка хэш-суммы нужной версии Wine.
- Загрузка и проверка хэш-суммы базового префикса.
- Инициализация и подготовка префикса.
- Скачивание дистрибутива (установщика) программы с официального сайта (если применимо).
- Установка приложения.
- Создание .desktop-файла (ярлыка) на рабочем столе и в меню приложений.
Если устанавливаемое приложение требует дополнительных действий от пользователя (ввод лицензии, настройка), это будет явно указано в терминале.
### Удаление префикса с приложением
Для удаления префикса выполните команду:
```
$ winehelper remove-prefix [имя_префикса]
```
Если имя префикса не указано, будет выведен список существующих префиксов:
```
0 - Отмена
1 - Префикс1
2 - Префикс2
Выберите префикс (0-2):
```
Необходимо указать номер, удаляемого префикса и нажать клавишу **Enter**. Далее потребуется подтвердить удаление префикса, вводом **y**.
В результате будут удалены:
- сам префикс;
- установленное ПО;
- desktop-файлы (ярлыки для установленного ПО в префиксе).
###
Команда создания резервной копии префикса:
```
$ winehelper backup-prefix [имя_префикса]
```
Если имя префикса не указано, будет выведен список существующих префиксов:
```
0 - Отмена
1 - Префикс1
2 - Префикс2
Выберите префикс (0-2):
```
Необходимо указать номер, удаляемого префикса и нажать клавишу **Enter**.
После выбора префикса автоматически:
- Создаётся копия префикса.
- Внутри префикса сохраняется используемая версия WINE.
- Копируются иконки для ярлыков (.desktop-файлов).
- Сохраняется информация о ярлыках (.desktop-файлах) для будущей распаковки префикса.
- Резервная копия сохраняется на рабочем столе с именем: {{path|backup_имя_префиксаата_создания.whpack}}
### Восстановление префикса из резервной копии
Команда восстановления префикса из резервной копии:
```
$ winehelper restore-prefix "путь/до/файла.whpack"
```
Восстановление префикса не требует подключение к интернету и происходит в автоматическом режиме:
- Распаковка префикса.
- Восстановление версии WINE.
- Восстановление ярлыков (.esktop-файdлов).
После завершения восстановления приложение доступно для запуска через меню или рабочий стол.
### Использование команд WINE в WineHelper
WineHelper предоставляет доступ к основным инструментам WINE:
```
winehelper winefile # запуск файлового менеджера wine
winehelper winecfg # запуск wine конфигуратора для префикса
winehelper winereg # запуск редактора реестра для префикса
winehelper wineconsole # запуск терминала wine (cmd.exe)
winehelper winetricks # запуск графического интерфейса winetricks
winehelper winetricks [компонент] # автоматическая установка дополнительного компонента в префикс
```
После выполнения любой из вышеперечисленных команд отображается список существующих префиксов:
```
0 - Отмена
1 - Префикс1
2 - Префикс2
Выберите префикс (0-2):
```
Команда выполняется в выбранном вами префиксе.
### Запуск стороннего *.exe файла в WineHelper
Есть 2 варианта:
1. В командной строке выполнить команду:
```
$ winehelper "путь/до/файла.exe"
0 - Отмена
1 - Префикс1
2 - Префикс2
Выберите префикс (0-2):
```
Файл будет запущен в выбранном префиксе.
2. С помощью файлового менеджера WINE:'''
```
$ winehelper winefile
0 - Отмена
1 - Префикс1
2 - Префикс2
Выберите префикс (0-2):
```
В файловом менеджере найти и запустить нужный exe-файл.
### Дополнительные команды
```
$ winehelper help
```
Вывод:
<pre>
Использование: winehelper [команда]
Команды:
install list список возможных установочных скриптов
install [скрипт] запустить скрипт установки программы
install [скрипт] --clear-pfx не использовать готовый префикс для установки ПО
install-dxvk [версия|none|list] установить, удалить или показать версии DXVK
install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D
change-wine [версия] изменить версию Wine/Proton для текущего префикса
installed список установленных программ
run [программа] запуск программы (отладка)
remove-all удалить WineHelper и все связанные данные
create-prefix создать префикс
remove-prefix [имя_префикса] удалить префикс и все связанные данные
backup-prefix [имя_префикса] создать резервную копию префикса
restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии
Параметры:
--help показать эту справку и выйти
--version показать информацию о пакете и его версии
--changelog показать историю изменений
--debug [команда] включить режим логирования работы WINE
</pre>
</details>
<!-- Описание использования GUI -->
<details>
<summary style="font-size: 35px; font-weight: bold;">Использование WineHelper (GUI)</summary>
### Список приложений для установки
При использовании графического интерфейса списки приложений расположены во вкладках **Автоматическая установка** и **Ручная установка**.
<div align="center">
<img src="image/handbook/auto_install.png">
</div>
<div align="center">
<img src="image/handbook/manual_install.png">
</div>
</details>
### Примечание
> [!WARNING]
> Проект находится на стадии WIP (work in progress)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

View File

@@ -126,6 +126,12 @@ WH_TESTINSTALL_DIR="$DATA_PATH/testinstall"
WH_WINETRICKS="$DATA_PATH/winetricks_$WINETRICKS_VERSION"
WH_MENU_DIR="$HOME/.local/share/applications/WineHelper"
# TODO: system menu directory
# /usr/share/desktop-directories/WineHelper.directory
# /etc/xdg/menus/applications-merged/WineHelper.menu
# user menu directory
WH_MENU_CATEGORY="$HOME/.local/share/desktop-directories/WineHelper.directory"
WH_MENU_CONFIG="$HOME/.config/menus/applications-merged/WineHelper.menu"

View File

@@ -1210,9 +1210,9 @@ class CreatePrefixDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.parent_gui = parent # Store reference to main window
self.parent_gui = parent # Сохранить ссылку на главное окно
self.setWindowTitle("Создание нового префикса")
self.setMinimumSize(500, 250)
self.setMinimumSize(680, 250)
self.setModal(True)
# Attributes to store results
@@ -1226,9 +1226,22 @@ class CreatePrefixDialog(QDialog):
form_layout = QFormLayout()
form_layout.setSpacing(10)
# Создаем виджет для поля ввода и предупреждения
name_input_widget = QWidget()
name_input_layout = QVBoxLayout(name_input_widget)
name_input_layout.setContentsMargins(0, 0, 0, 0)
name_input_layout.setSpacing(2)
self.prefix_name_edit = QLineEdit()
self.prefix_name_edit.setPlaceholderText("Например: my_prefix")
form_layout.addRow("<b>Имя нового префикса:</b>", self.prefix_name_edit)
name_input_layout.addWidget(self.prefix_name_edit)
self.name_warning_label = QLabel("Имя может содержать только латинские буквы, цифры, тире и знаки подчеркивания.")
self.name_warning_label.setStyleSheet("color: red;")
self.name_warning_label.setVisible(False)
name_input_layout.addWidget(self.name_warning_label)
form_layout.addRow("<b>Имя нового префикса:</b>", name_input_widget)
arch_widget = QWidget()
arch_layout = QHBoxLayout(arch_widget)
@@ -1285,7 +1298,7 @@ class CreatePrefixDialog(QDialog):
# Connect signals
self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection)
self.prefix_name_edit.textChanged.connect(self.update_create_button_state)
self.prefix_name_edit.textChanged.connect(self.validate_prefix_name)
self.wine_version_edit.textChanged.connect(self.update_create_button_state)
def open_wine_version_dialog(self):
@@ -1301,11 +1314,28 @@ class CreatePrefixDialog(QDialog):
self.wine_version_edit.clear()
self.selected_wine_version_value = None
def validate_prefix_name(self, text):
"""Проверяет имя префикса в реальном времени и показывает/скрывает предупреждение."""
valid_pattern = r'^[a-zA-Z0-9_-]*$'
if re.match(valid_pattern, text):
self.name_warning_label.setVisible(False)
else:
# Удаляем недопустимые символы
cleaned_text = re.sub(r'[^a-zA-Z0-9_-]', '', text)
# Блокируем сигналы, чтобы избежать рекурсии при изменении текста
self.prefix_name_edit.blockSignals(True)
self.prefix_name_edit.setText(cleaned_text)
self.prefix_name_edit.blockSignals(False)
self.name_warning_label.setVisible(True)
self.update_create_button_state()
def update_create_button_state(self):
"""Включает или выключает кнопку 'Создать'."""
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)
# Кнопка активна, только если имя валидно и версия выбрана
self.create_button.setEnabled(name_ok and version_ok and not self.name_warning_label.isVisible())
def accept_creation(self):
"""Валидирует данные, сохраняет их и закрывает диалог с успехом."""
@@ -1315,8 +1345,8 @@ class CreatePrefixDialog(QDialog):
QMessageBox.warning(self, "Ошибка", "Имя префикса не может быть пустым.")
return
if not re.match(r'^[a-zA-Z0-9_.-]+$', prefix_name):
QMessageBox.warning(self, "Ошибка", "Имя префикса может содержать только латинские буквы, цифры, точки, дефисы и подчеркивания.")
if not re.match(r'^[a-zA-Z0-9_-]+$', prefix_name):
QMessageBox.warning(self, "Ошибка", "Имя префикса может содержать только латинские буквы, цифры, дефисы и знаки подчеркивания.")
return
prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)
@@ -2133,7 +2163,7 @@ class WineHelperGUI(QMainWindow):
# --- Контейнер для выбора и управления созданными префиксами ---
self.management_container_groupbox = QGroupBox()
self.management_container_groupbox.setVisible(False) # Скрыт, пока нет префиксов
self.management_container_groupbox.setVisible(True) # Всегда виден
container_layout = QVBoxLayout(self.management_container_groupbox)
selector_layout = QHBoxLayout()
@@ -2313,8 +2343,8 @@ class WineHelperGUI(QMainWindow):
def _load_created_prefixes(self):
"""Загружает и обновляет список созданных префиксов в выпадающем списке."""
prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes")
if not os.path.isdir(prefixes_root_path):
self.management_container_groupbox.setVisible(False)
has_prefixes_dir = os.path.isdir(prefixes_root_path)
if not has_prefixes_dir:
return
try:
@@ -2333,12 +2363,9 @@ class WineHelperGUI(QMainWindow):
self.created_prefix_selector.blockSignals(False)
if not prefix_names:
self.management_container_groupbox.setVisible(False)
self.on_created_prefix_selected(-1) # Убедимся, что панель управления сброшена
return
self.management_container_groupbox.setVisible(True)
def on_created_prefix_selected(self, index):
"""Обрабатывает выбор префикса из выпадающего списка."""
if index == -1:
@@ -3014,14 +3041,15 @@ class WineHelperGUI(QMainWindow):
authors_text = QTextEdit()
authors_text.setReadOnly(True)
authors_text.setHtml("""
<div style="text-align: center;">
<h2>Разработчики</h2>
<div style="text-align: center; font-size: 10pt;">
<p><span style="font-size: 11pt;"><b>Разработчики</b></span><br>
Михаил Тергоев (fidel)<br>
Сергей Пальчех (minergenon)</p>
<p><b>Помощники</b><br>
<p><span style="font-size: 11pt;"><b>Помощники</b></span><br>
Иван Мажукин (vanomj)</p>
<p><b>Идея и поддержка:</b><br>
сообщество ALT Linux</p>
<p><span style="font-size: 11pt;"><b>Идея и поддержка</b></span><br>
ООО "Базальт СПО"<br>
ALT Linux Team</p>
<br>
<p>Отдельная благодарность всем, кто вносит свой вклад в развитие проекта,<br>
тестирует и сообщает об ошибках!</p>
@@ -3199,9 +3227,6 @@ class WineHelperGUI(QMainWindow):
self.created_prefix_selector.setCurrentText(prefix_name)
if not self.management_container_groupbox.isVisible():
self.management_container_groupbox.setVisible(True)
def update_installed_apps(self):
"""Обновляет список установленных приложений в виде кнопок"""
# Если активная кнопка находится в списке удаляемых, сбрасываем ее