diff --git a/winehelper b/winehelper index def5032e..d995b42a 100755 --- a/winehelper +++ b/winehelper @@ -2126,6 +2126,19 @@ select_component_version() { done } +run_install_to_prefix() { + export WINEPREFIX="$1" + local WIN_FILE_EXEC="$2" + + if [[ -z "$WINEPREFIX" ]] || [[ -z "$WIN_FILE_EXEC" ]]; then + fatal "Использование: $SCRIPT_NAME install-to-prefix <имя_префикса> <путь_к_установщику>" + fi + + check_prefix_var + prepair_wine + wine_run_install "$WIN_FILE_EXEC" +} + run_install_dxvk() { local version="$1" if [[ -z "$version" ]] ; then @@ -2258,6 +2271,7 @@ case "$arg1" in winetricks) prepair_wine ; "$WH_WINETRICKS" -q "$@" ;; desktop) create_desktop "$@" ; exit 0 ;; install|-i) run_autoinstall "$@" ;; + install-to-prefix) run_install_to_prefix "$@" ;; install-dxvk) run_install_dxvk "$@" ;; install-vkd3d) run_install_vkd3d "$@" ;; change-wine) run_change_wine_version "$@" ;; diff --git a/winehelper_gui.py b/winehelper_gui.py index 89a46b80..a1ddb479 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -2142,61 +2142,49 @@ class WineHelperGUI(QMainWindow): self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.") management_layout.addWidget(self.vkd3d_manage_button, 5, 1) - # --- Правая сторона: Информационный блок --- + # --- Правая сторона: Информационный блок и кнопки установки --- + right_column_widget = QWidget() + right_column_layout = QVBoxLayout(right_column_widget) + right_column_layout.setContentsMargins(0, 0, 0, 0) + right_column_layout.setSpacing(10) + self.prefix_info_display = QTextBrowser() self.prefix_info_display.setReadOnly(True) self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) - # Увеличиваем rowspan, чтобы охватить все строки с кнопками - management_layout.addWidget(self.prefix_info_display, 0, 2, 6, 1) - - management_layout.setColumnStretch(0, 1) - management_layout.setColumnStretch(1, 1) - management_layout.setColumnStretch(2, 2) - - separator = QFrame() - separator.setFrameShape(QFrame.HLine) - separator.setFrameShadow(QFrame.Sunken) - management_layout.addWidget(separator, 6, 0, 1, 3) + right_column_layout.addWidget(self.prefix_info_display) install_group = QWidget() install_layout = QVBoxLayout(install_group) - install_layout.setContentsMargins(0, 5, 0, 0) + install_layout.setContentsMargins(0, 0, 0, 0) install_layout.setSpacing(5) - install_path_layout = QHBoxLayout() - self.prefix_install_path_edit = QLineEdit() - self.prefix_install_path_edit.setPlaceholderText("Укажите путь к установочному файлу .exe или .msi...") - install_path_layout.addWidget(self.prefix_install_path_edit) - - self.prefix_browse_button = QPushButton("Обзор...") - self.prefix_browse_button.clicked.connect(self.browse_for_prefix_installer) - install_path_layout.addWidget(self.prefix_browse_button) - install_layout.addLayout(install_path_layout) - - # Layout для кнопок установки и создания ярлыка - action_buttons_layout = QHBoxLayout() - self.prefix_install_button = QPushButton("Установить приложение в префикс") self.prefix_install_button.setEnabled(False) - self.prefix_install_button.clicked.connect(self.run_prefix_installer) - action_buttons_layout.addWidget(self.prefix_install_button) + self.prefix_install_button.clicked.connect(self.browse_and_run_prefix_installer) + install_layout.addWidget(self.prefix_install_button) self.create_launcher_button = QPushButton("Создать ярлык для приложения в префиксе") self.create_launcher_button.setToolTip( "Создает ярлык в меню и на вкладке 'Установленные' для .exe файла внутри префикса.") self.create_launcher_button.clicked.connect(self.create_launcher_for_prefix) self.create_launcher_button.setEnabled(False) # Изначально неактивна - action_buttons_layout.addWidget(self.create_launcher_button) - install_layout.addLayout(action_buttons_layout) - management_layout.addWidget(install_group, 7, 0, 1, 3) + install_layout.addWidget(self.create_launcher_button) + right_column_layout.addWidget(install_group) + + right_column_layout.setStretch(0, 1) # Информационное окно растягивается + right_column_layout.setStretch(1, 0) # Группа кнопок не растягивается + + management_layout.addWidget(right_column_widget, 0, 2, 6, 1) + + management_layout.setColumnStretch(0, 1) + management_layout.setColumnStretch(1, 1) + management_layout.setColumnStretch(2, 2) container_layout.addWidget(self.prefix_management_groupbox) layout.addWidget(self.management_container_groupbox) layout.addStretch() self.add_tab(self.prefix_tab, "Менеджер префиксов") - self.prefix_install_path_edit.textChanged.connect(self.update_prefix_install_button_state) - def _get_current_prefixes(self): """Возвращает множество имен существующих префиксов.""" prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes") @@ -2322,7 +2310,6 @@ class WineHelperGUI(QMainWindow): # Успешное удаление, обновляем GUI self._remove_prefix_from_gui_state(prefix_name) self.update_installed_apps() - QMessageBox.information(self, "Успех", f"Префикс '{prefix_name}' и все связанные с ним данные были успешно удалены.") else: QMessageBox.critical(self, "Ошибка удаления", f"Не удалось удалить префикс '{prefix_name}'.\nПодробности смотрите в логе.") @@ -2331,18 +2318,16 @@ class WineHelperGUI(QMainWindow): is_prefix_selected = bool(prefix_name) self.prefix_management_groupbox.setEnabled(is_prefix_selected) self.create_launcher_button.setEnabled(is_prefix_selected) + self.prefix_install_button.setEnabled(is_prefix_selected) if is_prefix_selected: self.update_prefix_info_display(prefix_name) else: self.prefix_info_display.clear() - self.prefix_install_path_edit.clear() # Сбрасываем состояние кнопок, когда префикс не выбран self.esync_button.setChecked(False) self.fsync_button.setChecked(False) - self.update_prefix_install_button_state() - def update_prefix_info_display(self, prefix_name): """Обновляет информационный блок для созданного префикса, читая данные из last.conf.""" if not prefix_name: @@ -2422,8 +2407,13 @@ class WineHelperGUI(QMainWindow): html_content += "

" self.prefix_info_display.setHtml(html_content) - def browse_for_prefix_installer(self): - """Открывает диалог выбора файла для установки в созданный префикс.""" + def browse_and_run_prefix_installer(self): + """Открывает диалог выбора файла и запускает установку в созданный префикс.""" + prefix_name = self.current_managed_prefix_name + if not prefix_name: + QMessageBox.warning(self, "Ошибка", "Сначала выберите префикс для установки.") + return + file_path, _ = QFileDialog.getOpenFileName( self, "Выберите установочный файл", @@ -2431,18 +2421,11 @@ class WineHelperGUI(QMainWindow): "Исполняемые файлы (*.exe *.msi);;Все файлы (*)" ) if file_path: - self.prefix_install_path_edit.setText(file_path) + self.run_prefix_installer(file_path) - def update_prefix_install_button_state(self): - """Обновляет состояние кнопки установки в префикс.""" - path_ok = bool(self.prefix_install_path_edit.text().strip()) - prefix_selected = self.current_managed_prefix_name is not None - self.prefix_install_button.setEnabled(path_ok and prefix_selected) - - def run_prefix_installer(self): - """Запускает установку файла в выбранный префикс.""" + def run_prefix_installer(self, installer_path): + """Запускает установку файла в выбранный префикс через скрипт winehelper.""" prefix_name = self.current_managed_prefix_name - installer_path = self.prefix_install_path_edit.text().strip() if not prefix_name: QMessageBox.warning(self, "Ошибка", "Не выбран префикс для установки.") @@ -2451,9 +2434,6 @@ class WineHelperGUI(QMainWindow): QMessageBox.warning(self, "Ошибка", "Указан неверный путь к установочному файлу.") return - prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) - wine_executable = self._get_wine_executable_for_prefix(prefix_name) - self.command_dialog = QDialog(self) self.command_dialog.setWindowTitle(f"Установка в префикс: {prefix_name}") self.command_dialog.setMinimumSize(750, 400) @@ -2477,13 +2457,12 @@ class WineHelperGUI(QMainWindow): self.command_process.readyReadStandardOutput.connect(self._handle_command_output) self.command_process.finished.connect(self._handle_prefix_install_finished) - env = QProcessEnvironment.systemEnvironment() - env.insert("WINEPREFIX", prefix_path) - self.command_process.setProcessEnvironment(env) + # Окружение полностью настраивается скриптом winehelper + self.command_process.setProcessEnvironment(QProcessEnvironment.systemEnvironment()) - args = [installer_path] - self.command_log_output.append(f"Запуск установки: {shlex.quote(wine_executable)} {shlex.quote(installer_path)}") - self.command_process.start(wine_executable, args) + args = ["install-to-prefix", prefix_name, installer_path] + self.command_log_output.append(f"Выполнение: {shlex.quote(self.winehelper_path)} {' '.join(shlex.quote(a) for a in args)}") + self.command_process.start(self.winehelper_path, args) self.command_dialog.exec_() def _get_prefix_component_version(self, prefix_name, component_key): @@ -2991,10 +2970,6 @@ class WineHelperGUI(QMainWindow): if not self.management_container_groupbox.isVisible(): self.management_container_groupbox.setVisible(True) - QMessageBox.information(self, "Успех", - f"Префикс '{prefix_name}' успешно создан.\n" - "Теперь вы можете управлять им, выбрав его из выпадающего списка.") - def update_installed_apps(self): """Обновляет список установленных приложений в виде кнопок""" # Если активная кнопка находится в списке удаляемых, сбрасываем ее @@ -3063,7 +3038,6 @@ class WineHelperGUI(QMainWindow): self.command_process.deleteLater() self.command_process = None self.command_close_button.setEnabled(True) - self.prefix_install_path_edit.clear() self.update_installed_apps() def _set_active_button(self, button_widget): @@ -4124,18 +4098,6 @@ class WineHelperGUI(QMainWindow): self.created_prefix_selector.setCurrentIndex(0) # --- Конец обновления списка префиксов --- - # Создаем кастомный диалог, чтобы кнопка была на русском - success_box = QMessageBox(self.install_dialog) - success_box.setWindowTitle("Успех") - title_name = self._get_current_app_title() - success_text = f"Программа «{title_name}» установлена успешно!" - if new_prefix_name: - success_text += f"\n\nНовый префикс '{new_prefix_name}' был автоматически выбран в списке управления на вкладке 'Менеджер префиксов'." - success_box.setText(success_text) - success_box.setIcon(QMessageBox.Information) - success_box.addButton("Готово", QMessageBox.AcceptRole) - success_box.exec_() - self.update_installed_apps() # Кнопка закрыть @@ -4235,7 +4197,6 @@ class WineHelperGUI(QMainWindow): """Обрабатывает завершение создания ярлыка.""" self._handle_command_finished(exit_code, exit_status) if exit_code == 0: - QMessageBox.information(self, "Успех", "Ярлык успешно создан.") self.update_installed_apps() # Переключаемся на вкладку "Установленные" for i in range(self.tab_bar.count()):