the prefix control unit has been added to the Create prefix tab

This commit is contained in:
Sergey Palcheh
2025-08-25 14:19:45 +06:00
parent cefb3c8d5a
commit f73f717d0e

View File

@@ -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("<b>Имя нового префикса:</b>", self.prefix_name_edit)
self.arch_groupbox = QGroupBox("Архитектура")
@@ -1849,22 +1851,104 @@ class WineHelperGUI(QMainWindow):
version_layout.addWidget(select_version_button)
form_layout.addRow("<b>Версия Wine/Proton:</b>", 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"""
<p style="line-height: 1.3; font-size: 9pt;">
<b>Имя:</b> {html.escape(info['name'])}<br>
<b>Архитектура:</b> {html.escape(info['arch'])}<br>
<b>Версия Wine:</b> {html.escape(info['wine_version'])}<br>
<b>Путь:</b> {html.escape(info['path'])}</p>"""
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)