diff --git a/winehelper_gui.py b/winehelper_gui.py index 94f665c..6d383af 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -2097,6 +2097,13 @@ class WineHelperGUI(QMainWindow): self.created_prefix_selector.currentIndexChanged.connect(self.on_created_prefix_selected) 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.setIcon(QIcon.fromTheme("user-trash")) self.delete_prefix_button.setToolTip("Удалить выбранный префикс") @@ -2293,6 +2300,7 @@ class WineHelperGUI(QMainWindow): self.current_managed_prefix_name = None self._setup_prefix_management_panel(None) self.delete_prefix_button.setEnabled(False) + self.create_base_pfx_button.setEnabled(False) else: # Прокручиваем к выбранному элементу, чтобы он был виден в списке self.created_prefix_selector.view().scrollTo( @@ -2302,6 +2310,7 @@ class WineHelperGUI(QMainWindow): self.current_managed_prefix_name = prefix_name self._setup_prefix_management_panel(prefix_name) self.delete_prefix_button.setEnabled(True) + self.create_base_pfx_button.setEnabled(True) def delete_selected_prefix(self): """Удаляет префикс, выбранный в выпадающем списке на вкладке 'Менеджер префиксов'.""" @@ -2366,6 +2375,50 @@ class WineHelperGUI(QMainWindow): else: 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): """Настраивает панель управления префиксом на основе текущего состояния.""" is_prefix_selected = bool(prefix_name) @@ -4345,13 +4398,22 @@ class WineHelperGUI(QMainWindow): self.install_process.terminate() def _handle_command_output(self): - """Обрабатывает вывод для диалога команды""" + """Обрабатывает вывод для общих команд в модальном диалоге.""" 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'): self.command_log_output.append(output) 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): """Обрабатывает завершение для диалога команды""" if exit_code == 0: