added a prefix template creation button

This commit is contained in:
Sergey Palcheh
2025-09-27 14:13:56 +06:00
parent 7f64378670
commit 0f8f192634

View File

@@ -2097,6 +2097,13 @@ class WineHelperGUI(QMainWindow):
self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected) self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected)
selector_layout.addWidget(self.created_prefix_selector, 1) selector_layout.addWidget(self.created_prefix_selector, 1)
self.create_base_pfx_button = QPushButton()
self.create_base_pfx_button.setIcon(QIcon.fromTheme("document-export"))
self.create_base_pfx_button.setToolTip("Создать шаблон из выбранного префикса (для опытных пользователей)")
self.create_base_pfx_button.setEnabled(False)
self.create_base_pfx_button.clicked.connect(self.create_base_prefix_from_selected)
selector_layout.addWidget(self.create_base_pfx_button)
self.delete_prefix_button = QPushButton() self.delete_prefix_button = QPushButton()
self.delete_prefix_button.setIcon(QIcon.fromTheme("user-trash")) self.delete_prefix_button.setIcon(QIcon.fromTheme("user-trash"))
self.delete_prefix_button.setToolTip("Удалить выбранный префикс") self.delete_prefix_button.setToolTip("Удалить выбранный префикс")
@@ -2293,6 +2300,7 @@ class WineHelperGUI(QMainWindow):
self.current_managed_prefix_name = None self.current_managed_prefix_name = None
self._setup_prefix_management_panel(None) self._setup_prefix_management_panel(None)
self.delete_prefix_button.setEnabled(False) self.delete_prefix_button.setEnabled(False)
self.create_base_pfx_button.setEnabled(False)
else: else:
# Прокручиваем к выбранному элементу, чтобы он был виден в списке # Прокручиваем к выбранному элементу, чтобы он был виден в списке
self.created_prefix_selector.view().scrollTo( self.created_prefix_selector.view().scrollTo(
@@ -2302,6 +2310,7 @@ class WineHelperGUI(QMainWindow):
self.current_managed_prefix_name = prefix_name self.current_managed_prefix_name = prefix_name
self._setup_prefix_management_panel(prefix_name) self._setup_prefix_management_panel(prefix_name)
self.delete_prefix_button.setEnabled(True) self.delete_prefix_button.setEnabled(True)
self.create_base_pfx_button.setEnabled(True)
def delete_selected_prefix(self): def delete_selected_prefix(self):
"""Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'.""" """Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'."""
@@ -2366,6 +2375,50 @@ class WineHelperGUI(QMainWindow):
else: else:
QMessageBox.critical(self, "Ошибка удаления", f"Не удалось удалить префикс '{prefix_name}'.\nПодробности смотрите в логе.") QMessageBox.critical(self, "Ошибка удаления", f"Не удалось удалить префикс '{prefix_name}'.\nПодробности смотрите в логе.")
def create_base_prefix_from_selected(self):
"""Создает шаблон префикса из выбранного в выпадающем списке."""
prefix_name = self.current_managed_prefix_name
if not prefix_name:
return
msg_box = QMessageBox(self)
msg_box.setIcon(QMessageBox.Question)
msg_box.setWindowTitle("Создание шаблона префикса")
msg_box.setText(
f"Будет создан 'шаблон' из префикса '{prefix_name}'.\n"
"Это продвинутая функция для создания базовых архивов префиксов.\n\n"
"Продолжить?"
)
yes_button = msg_box.addButton("Да, создать", QMessageBox.YesRole)
no_button = msg_box.addButton("Нет", QMessageBox.NoRole)
msg_box.setDefaultButton(no_button)
msg_box.exec_()
if msg_box.clickedButton() != yes_button:
return
self.command_dialog = QDialog(self)
self.command_dialog.setWindowTitle(f"Создание шаблона: {prefix_name}")
self.command_dialog.setMinimumSize(750, 400)
self.command_dialog.setModal(True)
self.command_dialog.setWindowFlags(self.command_dialog.windowFlags() & ~Qt.WindowCloseButtonHint)
layout = QVBoxLayout()
self.command_log_output = QTextEdit()
self.command_log_output.setReadOnly(True)
layout.addWidget(self.command_log_output)
self.command_close_button = QPushButton("Закрыть")
self.command_close_button.setEnabled(False)
self.command_close_button.clicked.connect(self.command_dialog.close)
layout.addWidget(self.command_close_button)
self.command_dialog.setLayout(layout)
self._run_simple_command("create-base-pfx", [prefix_name])
self.command_dialog.exec_()
def _setup_prefix_management_panel(self, prefix_name): def _setup_prefix_management_panel(self, prefix_name):
"""Настраивает панель управления префиксом на основе текущего состояния.""" """Настраивает панель управления префиксом на основе текущего состояния."""
is_prefix_selected = bool(prefix_name) is_prefix_selected = bool(prefix_name)
@@ -4345,13 +4398,22 @@ class WineHelperGUI(QMainWindow):
self.install_process.terminate() self.install_process.terminate()
def _handle_command_output(self): def _handle_command_output(self):
"""Обрабатывает вывод для диалога команды""" """Обрабатывает вывод для общих команд в модальном диалоге."""
if hasattr(self, 'command_process') and self.command_process: if hasattr(self, 'command_process') and self.command_process:
output = self.command_process.readAllStandardOutput().data().decode('utf-8', errors='ignore').strip() # Используем readAll, чтобы получить и stdout, и stderr
output_bytes = self.command_process.readAll()
output = output_bytes.data().decode('utf-8', errors='ignore').strip()
if output and hasattr(self, 'command_log_output'): if output and hasattr(self, 'command_log_output'):
self.command_log_output.append(output) self.command_log_output.append(output)
QApplication.processEvents() QApplication.processEvents()
def _run_simple_command(self, command, args=None):
"""Запускает простую команду winehelper и выводит лог."""
self.command_process = QProcess(self.command_dialog)
self.command_process.setProcessChannelMode(QProcess.MergedChannels)
self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
self.command_process.finished.connect(self._handle_command_finished)
self.command_process.start(self.winehelper_path, [command] + (args or []))
def _handle_command_finished(self, exit_code, exit_status): def _handle_command_finished(self, exit_code, exit_status):
"""Обрабатывает завершение для диалога команды""" """Обрабатывает завершение для диалога команды"""
if exit_code == 0: if exit_code == 0: