forked from CastroFidel/winehelper
		
	added the wine/proton control button to the created prefix
This commit is contained in:
		
							
								
								
									
										30
									
								
								winehelper
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								winehelper
									
									
									
									
									
								
							| @@ -1652,8 +1652,8 @@ select_wine_version() { | |||||||
|         read -p "Введите номер для выбора wine/proton (0-$max_choice): " user_choice |         read -p "Введите номер для выбора wine/proton (0-$max_choice): " user_choice | ||||||
|         if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then |         if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then | ||||||
|             if [[ "$user_choice" == "0" ]]; then |             if [[ "$user_choice" == "0" ]]; then | ||||||
|                 print_info "Создание префикса отменено." |                 print_info "Операция отменена." | ||||||
|                 exit 0 |                 return 1 | ||||||
|             fi |             fi | ||||||
|             local selected_opt |             local selected_opt | ||||||
|             selected_opt="${selectable_options[$user_choice]}" |             selected_opt="${selectable_options[$user_choice]}" | ||||||
| @@ -1667,6 +1667,7 @@ select_wine_version() { | |||||||
|             print_error "Неверный выбор. Введите число от 0 до $max_choice." |             print_error "Неверный выбор. Введите число от 0 до $max_choice." | ||||||
|         fi |         fi | ||||||
|     done |     done | ||||||
|  |     return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
| create_prefix() { | create_prefix() { | ||||||
| @@ -1716,7 +1717,7 @@ create_prefix() { | |||||||
|         *) fatal "Неверный выбор. Операция отменена." ;; |         *) fatal "Неверный выбор. Операция отменена." ;; | ||||||
|     esac |     esac | ||||||
|  |  | ||||||
|     select_wine_version |     select_wine_version || exit 0 | ||||||
|  |  | ||||||
|     print_info "Выберите тип создаваемого префикса:" |     print_info "Выберите тип создаваемого префикса:" | ||||||
|     echo " 0) Отмена создания префикса" |     echo " 0) Отмена создания префикса" | ||||||
| @@ -2171,6 +2172,27 @@ run_install_vkd3d() { | |||||||
|     wait_wineserver |     wait_wineserver | ||||||
| } | } | ||||||
|  |  | ||||||
|  | run_change_wine_version() { | ||||||
|  |     local new_version="$1" | ||||||
|  |  | ||||||
|  |     check_prefix_var | ||||||
|  |     init_database | ||||||
|  |  | ||||||
|  |     if [[ -z "$new_version" ]]; then | ||||||
|  |         select_wine_version || exit 0 | ||||||
|  |         new_version="$WH_WINE_USE" | ||||||
|  |     else | ||||||
|  |         export WH_WINE_USE="$new_version" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     init_wine_ver | ||||||
|  |  | ||||||
|  |     init_wineprefix | ||||||
|  |  | ||||||
|  |     wait_wineserver | ||||||
|  |     print_ok "Версия Wine для префикса $PREFIX_NAME успешно изменена на $WH_WINE_USE." | ||||||
|  | } | ||||||
|  |  | ||||||
| wh_info () { | wh_info () { | ||||||
|     echo "Использование: $SCRIPT_NAME [команда] |     echo "Использование: $SCRIPT_NAME [команда] | ||||||
|  |  | ||||||
| @@ -2181,6 +2203,7 @@ wh_info () { | |||||||
|  |  | ||||||
|     install-dxvk [версия|none|list] установить, удалить или показать версии DXVK |     install-dxvk [версия|none|list] установить, удалить или показать версии DXVK | ||||||
|     install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D |     install-vkd3d [версия|none|list] установить, удалить или показать версии VKD3D | ||||||
|  |     change-wine [версия]            изменить версию Wine/Proton для текущего префикса | ||||||
|  |  | ||||||
|     installed                       список установленных программ |     installed                       список установленных программ | ||||||
|     run [программа]                 запуск программы (отладка) |     run [программа]                 запуск программы (отладка) | ||||||
| @@ -2231,6 +2254,7 @@ case "$arg1" in | |||||||
|     install|-i) run_autoinstall "$@" ;; |     install|-i) run_autoinstall "$@" ;; | ||||||
|     install-dxvk) run_install_dxvk "$@" ;; |     install-dxvk) run_install_dxvk "$@" ;; | ||||||
|     install-vkd3d) run_install_vkd3d "$@" ;; |     install-vkd3d) run_install_vkd3d "$@" ;; | ||||||
|  |     change-wine) run_change_wine_version "$@" ;; | ||||||
|     installed) check_installed_programs "$1" ;; |     installed) check_installed_programs "$1" ;; | ||||||
|     run|-r) run_installed_programs "$1" ;; |     run|-r) run_installed_programs "$1" ;; | ||||||
|     backup-prefix) backup_prefix "$@" ;; |     backup-prefix) backup_prefix "$@" ;; | ||||||
|   | |||||||
| @@ -2105,29 +2105,35 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.prefix_winefile_button.setToolTip("Запуск файлового менеджера Wine (winefile) для просмотра файлов внутри префикса.") |         self.prefix_winefile_button.setToolTip("Запуск файлового менеджера Wine (winefile) для просмотра файлов внутри префикса.") | ||||||
|         management_layout.addWidget(self.prefix_winefile_button, 2, 1) |         management_layout.addWidget(self.prefix_winefile_button, 2, 1) | ||||||
|  |  | ||||||
|  |         self.change_wine_version_button = QPushButton("Управление Wine/Proton") | ||||||
|  |         self.change_wine_version_button.setMinimumHeight(32) | ||||||
|  |         self.change_wine_version_button.clicked.connect(self.open_wine_version_manager) | ||||||
|  |         self.change_wine_version_button.setToolTip("Изменение версии Wine или Proton для выбранного префикса.") | ||||||
|  |         management_layout.addWidget(self.change_wine_version_button, 3, 0, 1, 2) | ||||||
|  |  | ||||||
|         # Добавляем небольшой отступ |         # Добавляем небольшой отступ | ||||||
|         spacer_widget = QWidget() |         spacer_widget = QWidget() | ||||||
|         spacer_widget.setFixedHeight(5) |         spacer_widget.setFixedHeight(5) | ||||||
|         management_layout.addWidget(spacer_widget, 3, 0, 1, 2) |         management_layout.addWidget(spacer_widget, 4, 0, 1, 2) | ||||||
|  |  | ||||||
|         self.dxvk_manage_button = QPushButton("Управление DXVK") |         self.dxvk_manage_button = QPushButton("Управление DXVK") | ||||||
|         self.dxvk_manage_button.setMinimumHeight(32) |         self.dxvk_manage_button.setMinimumHeight(32) | ||||||
|         self.dxvk_manage_button.clicked.connect(lambda: self.open_component_version_manager('dxvk')) |         self.dxvk_manage_button.clicked.connect(lambda: self.open_component_version_manager('dxvk')) | ||||||
|         self.dxvk_manage_button.setToolTip("Установка или удаление определенной версии DXVK в префиксе.") |         self.dxvk_manage_button.setToolTip("Установка или удаление определенной версии DXVK в префиксе.") | ||||||
|         management_layout.addWidget(self.dxvk_manage_button, 4, 0) |         management_layout.addWidget(self.dxvk_manage_button, 5, 0) | ||||||
|  |  | ||||||
|         self.vkd3d_manage_button = QPushButton("Управление VKD3D") |         self.vkd3d_manage_button = QPushButton("Управление VKD3D") | ||||||
|         self.vkd3d_manage_button.setMinimumHeight(32) |         self.vkd3d_manage_button.setMinimumHeight(32) | ||||||
|         self.vkd3d_manage_button.clicked.connect(lambda: self.open_component_version_manager('vkd3d-proton')) |         self.vkd3d_manage_button.clicked.connect(lambda: self.open_component_version_manager('vkd3d-proton')) | ||||||
|         self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.") |         self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.") | ||||||
|         management_layout.addWidget(self.vkd3d_manage_button, 4, 1) |         management_layout.addWidget(self.vkd3d_manage_button, 5, 1) | ||||||
|  |  | ||||||
|         # --- Правая сторона: Информационный блок --- |         # --- Правая сторона: Информационный блок --- | ||||||
|         self.prefix_info_display = QTextBrowser() |         self.prefix_info_display = QTextBrowser() | ||||||
|         self.prefix_info_display.setReadOnly(True) |         self.prefix_info_display.setReadOnly(True) | ||||||
|         self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) |         self.prefix_info_display.setFrameStyle(QFrame.StyledPanel) | ||||||
|         # Увеличиваем rowspan, чтобы учесть добавленный отступ |         # Увеличиваем rowspan, чтобы учесть добавленный отступ | ||||||
|         management_layout.addWidget(self.prefix_info_display, 0, 2, 5, 1) |         management_layout.addWidget(self.prefix_info_display, 0, 2, 6, 1) | ||||||
|  |  | ||||||
|         management_layout.setColumnStretch(0, 1) |         management_layout.setColumnStretch(0, 1) | ||||||
|         management_layout.setColumnStretch(1, 1) |         management_layout.setColumnStretch(1, 1) | ||||||
| @@ -2137,7 +2143,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|         separator = QFrame() |         separator = QFrame() | ||||||
|         separator.setFrameShape(QFrame.HLine) |         separator.setFrameShape(QFrame.HLine) | ||||||
|         separator.setFrameShadow(QFrame.Sunken) |         separator.setFrameShadow(QFrame.Sunken) | ||||||
|         management_layout.addWidget(separator, 5, 0, 1, 3) |         management_layout.addWidget(separator, 6, 0, 1, 3) | ||||||
|  |  | ||||||
|         install_group = QWidget() |         install_group = QWidget() | ||||||
|         install_layout = QVBoxLayout(install_group) |         install_layout = QVBoxLayout(install_group) | ||||||
| @@ -2169,8 +2175,7 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.create_launcher_button.setEnabled(False)  # Изначально неактивна |         self.create_launcher_button.setEnabled(False)  # Изначально неактивна | ||||||
|         action_buttons_layout.addWidget(self.create_launcher_button) |         action_buttons_layout.addWidget(self.create_launcher_button) | ||||||
|         install_layout.addLayout(action_buttons_layout) |         install_layout.addLayout(action_buttons_layout) | ||||||
|  |         management_layout.addWidget(install_group, 7, 0, 1, 3) | ||||||
|         management_layout.addWidget(install_group, 6, 0, 1, 3) |  | ||||||
|  |  | ||||||
|         container_layout.addWidget(self.prefix_management_groupbox) |         container_layout.addWidget(self.prefix_management_groupbox) | ||||||
|         layout.addWidget(self.management_container_groupbox) |         layout.addWidget(self.management_container_groupbox) | ||||||
| @@ -2528,6 +2533,81 @@ class WineHelperGUI(QMainWindow): | |||||||
|                 # Если лицензия принята, запускаем установку. |                 # Если лицензия принята, запускаем установку. | ||||||
|                 self.run_component_install_command(prefix_name, command, version) |                 self.run_component_install_command(prefix_name, command, version) | ||||||
|  |  | ||||||
|  |     def open_wine_version_manager(self): | ||||||
|  |         """Открывает диалог для смены версии Wine/Proton для префикса.""" | ||||||
|  |         prefix_name = self.current_managed_prefix_name | ||||||
|  |         if not prefix_name: | ||||||
|  |             QMessageBox.warning(self, "Ошибка", "Сначала выберите префикс.") | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         # Определяем архитектуру префикса | ||||||
|  |         prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) | ||||||
|  |         last_conf_path = os.path.join(prefix_path, "last.conf") | ||||||
|  |         architecture = "win64"  # По умолчанию | ||||||
|  |         if os.path.exists(last_conf_path): | ||||||
|  |             try: | ||||||
|  |                 with open(last_conf_path, 'r', encoding='utf-8') as f: | ||||||
|  |                     for line in f: | ||||||
|  |                         if 'WINEARCH=' in line: | ||||||
|  |                             arch_val = line.split('=', 1)[1].strip().strip('"\'') | ||||||
|  |                             if arch_val: | ||||||
|  |                                 architecture = arch_val | ||||||
|  |                                 break | ||||||
|  |             except Exception as e: | ||||||
|  |                 print(f"Предупреждение: не удалось прочитать архитектуру из {last_conf_path}: {e}") | ||||||
|  |  | ||||||
|  |         dialog = WineVersionSelectionDialog(architecture, self) | ||||||
|  |         if dialog.exec_() == QDialog.Accepted and dialog.selected_version: | ||||||
|  |             new_version = dialog.selected_version | ||||||
|  |             new_version_display = dialog.selected_display_text | ||||||
|  |  | ||||||
|  |             if not self._show_license_agreement_dialog(): | ||||||
|  |                 return  # Пользователь отклонил лицензию | ||||||
|  |  | ||||||
|  |             self.run_change_wine_version_command(prefix_name, new_version, new_version_display) | ||||||
|  |  | ||||||
|  |     def run_change_wine_version_command(self, prefix_name, new_version, new_version_display): | ||||||
|  |         """Выполняет команду смены версии Wine/Proton через winehelper.""" | ||||||
|  |         self.command_dialog = QDialog(self) | ||||||
|  |         self.command_dialog.setWindowTitle(f"Смена версии Wine на: {new_version_display}") | ||||||
|  |         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) | ||||||
|  |         self.command_log_output.setFont(QFont('DejaVu Sans Mono', 10)) | ||||||
|  |         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.command_output_buffer = "" | ||||||
|  |         self.command_last_line_was_progress = False | ||||||
|  |  | ||||||
|  |         self.command_process = QProcess(self.command_dialog) | ||||||
|  |         self.command_process.setProcessChannelMode(QProcess.MergedChannels) | ||||||
|  |         self.command_process.readyReadStandardOutput.connect(self._handle_prefix_creation_output) | ||||||
|  |         self.command_process.finished.connect( | ||||||
|  |             lambda exit_code, exit_status: self._handle_change_wine_version_finished( | ||||||
|  |                 prefix_name, exit_code, exit_status | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         env = QProcessEnvironment.systemEnvironment() | ||||||
|  |         env.insert("WINEPREFIX", os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name)) | ||||||
|  |         self.command_process.setProcessEnvironment(env) | ||||||
|  |  | ||||||
|  |         args = ["change-wine", new_version] | ||||||
|  |         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 run_component_install_command(self, prefix_name, command, version): |     def run_component_install_command(self, prefix_name, command, version): | ||||||
|         """Выполняет команду установки компонента (DXVK/VKD3D) через winehelper.""" |         """Выполняет команду установки компонента (DXVK/VKD3D) через winehelper.""" | ||||||
|         prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) |         prefix_path = os.path.join(Var.USER_WORK_PATH, "prefixes", prefix_name) | ||||||
| @@ -2568,11 +2648,31 @@ class WineHelperGUI(QMainWindow): | |||||||
|         self.command_process.start(self.winehelper_path, args) |         self.command_process.start(self.winehelper_path, args) | ||||||
|         self.command_dialog.exec_() |         self.command_dialog.exec_() | ||||||
|  |  | ||||||
|  |     def _handle_change_wine_version_finished(self, prefix_name, exit_code, exit_status): | ||||||
|  |         """Обрабатывает завершение смены версии Wine и обновляет информацию о префиксе.""" | ||||||
|  |         # Обрабатываем остаток в буфере, если он есть | ||||||
|  |         if self.command_output_buffer: | ||||||
|  |             self._process_command_log_line(self.command_output_buffer) | ||||||
|  |             self.command_output_buffer = "" | ||||||
|  |  | ||||||
|  |         # Если последней строкой был прогресс, "завершаем" его переносом строки. | ||||||
|  |         if self.command_last_line_was_progress: | ||||||
|  |             cursor = self.command_log_output.textCursor() | ||||||
|  |             cursor.movePosition(QTextCursor.End) | ||||||
|  |             cursor.insertText("\n") | ||||||
|  |             self.command_last_line_was_progress = False | ||||||
|  |  | ||||||
|  |         # Вызываем общий обработчик для обновления лога и кнопки закрытия | ||||||
|  |         self._handle_command_finished(exit_code, exit_status) | ||||||
|  |  | ||||||
|  |         # В случае успеха обновляем панель информации о префиксе | ||||||
|  |         if exit_code == 0: | ||||||
|  |             self.update_prefix_info_display(prefix_name) | ||||||
|  |  | ||||||
|     def _handle_component_install_finished(self, prefix_name, exit_code, exit_status): |     def _handle_component_install_finished(self, prefix_name, exit_code, exit_status): | ||||||
|         """Обрабатывает завершение установки компонента и обновляет информацию о префиксе.""" |         """Обрабатывает завершение установки компонента и обновляет информацию о префиксе.""" | ||||||
|         # Вызываем общий обработчик для обновления лога и кнопки закрытия |         # Вызываем общий обработчик для обновления лога и кнопки закрытия | ||||||
|         self._handle_command_finished(exit_code, exit_status) |         self._handle_command_finished(exit_code, exit_status) | ||||||
|  |  | ||||||
|         # В случае успеха обновляем панель информации о префиксе |         # В случае успеха обновляем панель информации о префиксе | ||||||
|         if exit_code == 0: |         if exit_code == 0: | ||||||
|             self.update_prefix_info_display(prefix_name) |             self.update_prefix_info_display(prefix_name) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user