From f73f717d0e0ec043f5673e969ecae81d718f0aa0 Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Mon, 25 Aug 2025 14:19:45 +0600 Subject: [PATCH] the prefix control unit has been added to the Create prefix tab --- winehelper_gui.py | 133 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 122 insertions(+), 11 deletions(-) diff --git a/winehelper_gui.py b/winehelper_gui.py index 9df665b..f1f769b 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -1268,6 +1268,8 @@ class WineHelperGUI(QMainWindow): self.icon_animators = {} self.previous_tab_index = 0 self.selected_wine_version_value = None + self.last_created_prefix_name = None + self.last_created_prefix_info = None # State for command dialog log processing (specifically for prefix creation) self.command_output_buffer = "" @@ -1814,7 +1816,7 @@ class WineHelperGUI(QMainWindow): form_layout.setSpacing(10) self.prefix_name_edit = QLineEdit() - self.prefix_name_edit.setPlaceholderText("Например: 'm_prefix'") + self.prefix_name_edit.setPlaceholderText("Например: my_prefix") form_layout.addRow("Имя нового префикса:", self.prefix_name_edit) self.arch_groupbox = QGroupBox("Архитектура") @@ -1849,22 +1851,104 @@ class WineHelperGUI(QMainWindow): version_layout.addWidget(select_version_button) form_layout.addRow("Версия Wine/Proton:", version_layout) - layout.addLayout(form_layout) - layout.addStretch() + # --- GroupBox for managing the created prefix --- + self.prefix_management_groupbox = QGroupBox("Управление префиксом") + self.prefix_management_groupbox.setEnabled(False) # Disabled by default + management_layout = QGridLayout(self.prefix_management_groupbox) + management_layout.setSpacing(5) + + # --- Left side: Buttons --- + self.prefix_winetricks_button = QPushButton("Менеджер компонентов") + self.prefix_winetricks_button.clicked.connect( + lambda: self.open_winetricks_manager(prefix_name=self.last_created_prefix_name)) + self.prefix_winetricks_button.setToolTip( + "Установка компонентов, библиотек и шрифтов в префикс с помощью Winetricks.") + management_layout.addWidget(self.prefix_winetricks_button, 0, 0) + + self.prefix_winecfg_button = QPushButton("Редактор настроек") + self.prefix_winecfg_button.clicked.connect( + lambda: self._run_wine_util('winecfg', prefix_name=self.last_created_prefix_name)) + self.prefix_winecfg_button.setToolTip( + "Запуск утилиты winecfg для настройки параметров Wine (версия Windows, диски, аудио и т.д.).") + management_layout.addWidget(self.prefix_winecfg_button, 0, 1) + + self.prefix_regedit_button = QPushButton("Редактор реестра") + self.prefix_regedit_button.clicked.connect( + lambda: self._run_wine_util('regedit', prefix_name=self.last_created_prefix_name)) + self.prefix_regedit_button.setToolTip( + "Запуск редактора реестра Wine (regedit) для просмотра и изменения ключей реестра в префиксе.") + management_layout.addWidget(self.prefix_regedit_button, 1, 0) + + self.prefix_uninstaller_button = QPushButton("Удаление программ") + self.prefix_uninstaller_button.clicked.connect( + lambda: self._run_wine_util('uninstaller', prefix_name=self.last_created_prefix_name)) + self.prefix_uninstaller_button.setToolTip( + "Запуск стандартного деинсталлятора Wine для удаления установленных в префикс Windows-программ.") + management_layout.addWidget(self.prefix_uninstaller_button, 1, 1) + + self.prefix_cmd_button = QPushButton("Командная строка") + self.prefix_cmd_button.clicked.connect(lambda: self._run_wine_util('cmd', prefix_name=self.last_created_prefix_name)) + self.prefix_cmd_button.setToolTip("Запуск командной строки (cmd) в окружении выбранного префикса.") + management_layout.addWidget(self.prefix_cmd_button, 2, 0) + + self.prefix_winefile_button = QPushButton("Файловый менеджер") + self.prefix_winefile_button.clicked.connect( + lambda: self._run_wine_util('winefile', prefix_name=self.last_created_prefix_name)) + self.prefix_winefile_button.setToolTip("Запуск файлового менеджера Wine (winefile) для просмотра файлов внутри префикса.") + management_layout.addWidget(self.prefix_winefile_button, 2, 1) + + # --- Right side: Info display --- + self.prefix_info_display = QTextBrowser() + self.prefix_info_display.setReadOnly(True) + self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) + management_layout.addWidget(self.prefix_info_display, 0, 2, 3, 1) + + # Устанавливаем растяжение колонок, чтобы область кнопок и область информации были примерно равны + management_layout.setColumnStretch(0, 1) + management_layout.setColumnStretch(1, 1) + management_layout.setColumnStretch(2, 2) self.create_prefix_button = QPushButton("Создать префикс") self.create_prefix_button.setFont(QFont('Arial', 12, QFont.Bold)) self.create_prefix_button.setStyleSheet("background-color: #0078d7; color: white;") self.create_prefix_button.setEnabled(False) self.create_prefix_button.clicked.connect(self.start_prefix_creation) - layout.addWidget(self.create_prefix_button) + layout.addLayout(form_layout) + layout.addWidget(self.create_prefix_button) + layout.addWidget(self.prefix_management_groupbox) + layout.addStretch() self.add_tab(self.prefix_tab, "Создать префикс") self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection) self.prefix_name_edit.textChanged.connect(self.update_create_prefix_button_state) + self.prefix_name_edit.textChanged.connect(self.on_prefix_name_edited) self.wine_version_edit.textChanged.connect(self.update_create_prefix_button_state) + def on_prefix_name_edited(self, text): + """Сбрасывает состояние управления префиксом, когда пользователь вводит новое имя.""" + if text and self.prefix_management_groupbox.isEnabled(): + self.prefix_management_groupbox.setEnabled(False) + self.prefix_management_groupbox.setTitle("Управление префиксом") + self.last_created_prefix_name = None + self.last_created_prefix_info = None + self.prefix_info_display.clear() + + def update_prefix_info_display(self): + """Обновляет информационный блок для созданного префикса.""" + if not self.last_created_prefix_info: + self.prefix_info_display.clear() + return + + info = self.last_created_prefix_info + html_content = f""" +

+ Имя: {html.escape(info['name'])}
+ Архитектура: {html.escape(info['arch'])}
+ Версия Wine: {html.escape(info['wine_version'])}
+ Путь: {html.escape(info['path'])}

""" + self.prefix_info_display.setHtml(html_content) + def create_help_tab(self): """Создает вкладку 'Справка' с подвкладками""" help_tab = QWidget() @@ -1996,6 +2080,13 @@ class WineHelperGUI(QMainWindow): if not self._show_license_agreement_dialog(): return + # Сбрасываем состояние управления предыдущим созданным префиксом + self.last_created_prefix_name = None + self.last_created_prefix_info = None + self.prefix_info_display.clear() + self.prefix_management_groupbox.setEnabled(False) + self.prefix_management_groupbox.setTitle("Управление префиксом") + prefix_name = self.prefix_name_edit.text().strip() if not prefix_name: @@ -2016,6 +2107,15 @@ class WineHelperGUI(QMainWindow): wine_use = self.selected_wine_version_value wine_use_display = self.wine_version_edit.text() + # Сохраняем информацию для отображения после создания + self.last_created_prefix_info = { + 'name': prefix_name, + 'path': prefix_path, + 'arch': "32-bit" if wine_arch == "win32" else "64-bit", + 'type': 'Чистый' if base_pfx else 'С рекомендуемыми библиотеками', + 'wine_version': wine_use_display + } + self.command_dialog = QDialog(self) self.command_dialog.setWindowTitle(f"Создание префикса: {prefix_name}") self.command_dialog.setMinimumSize(750, 400) @@ -2078,9 +2178,14 @@ class WineHelperGUI(QMainWindow): self._handle_command_finished(exit_code, exit_status) if exit_code == 0: + self.last_created_prefix_name = prefix_name + self.prefix_management_groupbox.setTitle(f"Управление префиксом «{prefix_name}»") + self.prefix_management_groupbox.setEnabled(True) + self.update_prefix_info_display() self.prefix_name_edit.clear() self.wine_version_edit.clear() - QMessageBox.information(self, "Успех", f"Префикс '{prefix_name}' успешно создан.") + QMessageBox.information(self, "Успех", + f"Префикс '{prefix_name}' успешно создан.\nТеперь вы можете управлять им с помощью кнопок ниже.") def update_installed_apps(self): """Обновляет список установленных приложений в виде кнопок""" @@ -2364,11 +2469,14 @@ class WineHelperGUI(QMainWindow): if msg_box.clickedButton() == yes_button: self._run_app_launcher(debug=True) - def open_winetricks_manager(self): + def open_winetricks_manager(self, prefix_name=None): """Открывает новый диалог для управления компонентами Winetricks.""" - prefix_name = self._get_prefix_name_for_selected_app() if not prefix_name: - QMessageBox.warning(self, "Менеджер Winetricks", "Сначала выберите установленное приложение, чтобы открыть менеджер для его префикса.") + prefix_name = self._get_prefix_name_for_selected_app() + + if not prefix_name: + QMessageBox.warning(self, "Менеджер Winetricks", + "Не удалось определить префикс. Выберите установленное приложение или создайте новый префикс.") return prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) @@ -2395,11 +2503,14 @@ class WineHelperGUI(QMainWindow): dialog = WinetricksManagerDialog(prefix_path, winetricks_path, self) dialog.exec_() - def _run_wine_util(self, util_name): + def _run_wine_util(self, util_name, prefix_name=None): """Запускает стандартную утилиту Wine для выбранного префикса.""" - prefix_name = self._get_prefix_name_for_selected_app() if not prefix_name: - QMessageBox.warning(self, "Ошибка", "Сначала выберите установленное приложение.") + prefix_name = self._get_prefix_name_for_selected_app() + + if not prefix_name: + QMessageBox.warning(self, "Ошибка", + "Не удалось определить префикс. Выберите установленное приложение или создайте новый префикс.") return prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)