Compare commits

...

16 Commits

Author SHA1 Message Date
Sergey Palcheh
463306d0cf the window about the successful installation of components has been removed 2025-09-24 10:42:08 +06:00
Sergey Palcheh
940cface08 the status bar in the prefix component manager window has been removed 2025-09-24 10:38:02 +06:00
Mikhail Tergoev
48d870979f Merge branch 'minergenon-devel' 2025-09-23 10:23:00 +03:00
Sergey Palcheh
cbe535b878 removed the jump when selecting the app button 2025-09-23 10:40:33 +06:00
Mikhail Tergoev
fd3442888d Merge branch 'minergenon-devel' 2025-09-22 22:22:22 +03:00
Sergey Palcheh
7321542477 the install app prefix button has been changed 2025-09-22 18:03:17 +06:00
Sergey Palcheh
477f44a11e the pop-up window was removed after the prefix was removed 2025-09-22 17:28:34 +06:00
Sergey Palcheh
4f9821450a removed the pop-up window after creating a shortcut 2025-09-22 17:21:11 +06:00
Sergey Palcheh
f858746064 removed the pop-up window after creating the prefix 2025-09-22 17:12:21 +06:00
Sergey Palcheh
1123c018eb removed the pop-up window after successful installation 2025-09-22 17:01:46 +06:00
Sergey Palcheh
998eff3263 changed the launch of the system wine when installing the application 2025-09-22 16:48:49 +06:00
Mikhail Tergoev
4aebb722ca changed icon for menu directory 2025-09-17 13:48:40 +03:00
Mikhail Tergoev
4672dcd4e1 disabled winebth.sys by default 2025-09-17 13:37:42 +03:00
Mikhail Tergoev
e174b034df fixed info for arm-kt-med 2025-09-17 12:38:26 +03:00
Mikhail Tergoev
3100475b1e added StartupWMClass for desktop files 2025-09-17 12:36:27 +03:00
Mikhail Tergoev
148a7dbfce force disabled winemenubuilder.exe 2025-09-17 12:28:29 +03:00
4 changed files with 79 additions and 116 deletions

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# info_ru: Программа “АРМ КТ ПРОФ МЕД” для заполнения бланков документов о послевузовском профессиональном образовании и сертификатов специалиста.###################################################### # info_ru: Программа “АРМ КТ ПРОФ МЕД” для заполнения бланков документов о послевузовском профессиональном образовании и сертификатов специалиста.
######################################################
export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-3" export PROG_URL="https://armregistr.ru/programmnoe-obespechenie/licenziya-na-programmnoe-obespechenie-dlya-zapolneniya-blank-3"
export WH_WINE_USE="wine_x_tkg_10-0_amd64" export WH_WINE_USE="wine_x_tkg_10-0_amd64"
export WINEPREFIX="arm-kt" export WINEPREFIX="arm-kt"

View File

@@ -617,6 +617,7 @@ create_desktop () {
echo "StartupNotify=true" echo "StartupNotify=true"
echo "Path=$DATA_PATH" echo "Path=$DATA_PATH"
echo "Icon=$icon_file" echo "Icon=$icon_file"
echo "StartupWMClass=$(basename "$exe_file")"
} > "$USER_WORK_PATH/$desktop_filename.desktop" } > "$USER_WORK_PATH/$desktop_filename.desktop"
chmod +x "$USER_WORK_PATH/$desktop_filename.desktop" chmod +x "$USER_WORK_PATH/$desktop_filename.desktop"
@@ -652,7 +653,7 @@ create_desktop () {
[Desktop Entry] [Desktop Entry]
Type=Directory Type=Directory
Name=WineHelper Name=WineHelper
Icon=wine Icon=winehelper
EOF EOF
fi fi
@@ -1355,8 +1356,6 @@ init_database () {
} }
prepair_wine () { prepair_wine () {
var_winedlloverride_update "winemenubuilder.exe=d"
if [[ -n "$INSTALL_SCRIPT_NAME" ]] if [[ -n "$INSTALL_SCRIPT_NAME" ]]
then print_info "Используются настройки из скрипта установки: $INSTALL_SCRIPT_NAME" then print_info "Используются настройки из скрипта установки: $INSTALL_SCRIPT_NAME"
else init_database else init_database
@@ -2127,6 +2126,19 @@ select_component_version() {
done 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() { run_install_dxvk() {
local version="$1" local version="$1"
if [[ -z "$version" ]] ; then if [[ -z "$version" ]] ; then
@@ -2243,6 +2255,10 @@ else
arg1="--help" arg1="--help"
fi fi
# отключаем создание .desktop файлов средствами wine
# и отключаем winebth, так как может сломать winedevice.exe
var_winedlloverride_update "winemenubuilder.exe,winebth.sys=d"
case "$arg1" in case "$arg1" in
--version|version) rpm -qi "$SCRIPT_NAME" ; exit 0 ;; --version|version) rpm -qi "$SCRIPT_NAME" ; exit 0 ;;
--help|help) wh_info ; exit 0 ;; --help|help) wh_info ; exit 0 ;;
@@ -2255,6 +2271,7 @@ case "$arg1" in
winetricks) prepair_wine ; "$WH_WINETRICKS" -q "$@" ;; winetricks) prepair_wine ; "$WH_WINETRICKS" -q "$@" ;;
desktop) create_desktop "$@" ; exit 0 ;; desktop) create_desktop "$@" ; exit 0 ;;
install|-i) run_autoinstall "$@" ;; install|-i) run_autoinstall "$@" ;;
install-to-prefix) run_install_to_prefix "$@" ;;
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 "$@" ;; change-wine) run_change_wine_version "$@" ;;

View File

@@ -1,3 +1,4 @@
#!/usr/bin/env xdg-open
[Desktop Entry] [Desktop Entry]
Name=WineHelper Name=WineHelper
Exec=winehelper gui %F Exec=winehelper gui %F
@@ -7,3 +8,4 @@ Type=Application
Categories=WineHelper;Utility;Emulator; Categories=WineHelper;Utility;Emulator;
StartupNotify=true StartupNotify=true
Icon=winehelper Icon=winehelper
StartupWMClass=winehelper

View File

@@ -474,10 +474,9 @@ class WinetricksManagerDialog(QDialog):
self.log_output.setText(self.INFO_TEXT) self.log_output.setText(self.INFO_TEXT)
main_layout.addWidget(self.log_output) main_layout.addWidget(self.log_output)
# Кнопки управления # Кнопки управления, выровненные по правому краю
button_layout = QHBoxLayout() button_layout = QHBoxLayout()
self.status_label = QLabel("Загрузка компонентов...") button_layout.addStretch(1)
button_layout.addWidget(self.status_label, 1)
self.apply_button = QPushButton("Применить") self.apply_button = QPushButton("Применить")
self.apply_button.setEnabled(False) self.apply_button.setEnabled(False)
@@ -548,7 +547,6 @@ class WinetricksManagerDialog(QDialog):
def load_all_categories(self): def load_all_categories(self):
"""Запускает загрузку всех категорий.""" """Запускает загрузку всех категорий."""
self.loading_count = len(self.categories) self.loading_count = len(self.categories)
self.category_statuses = {name: "загрузка..." for name in self.categories.keys()}
for internal_name in self.categories.values(): for internal_name in self.categories.values():
self._start_load_process(internal_name) self._start_load_process(internal_name)
@@ -602,13 +600,6 @@ class WinetricksManagerDialog(QDialog):
process.finished.connect(partial(self._on_load_finished, category)) process.finished.connect(partial(self._on_load_finished, category))
process.start(self.winetricks_path, [category, "list"]) process.start(self.winetricks_path, [category, "list"])
def _update_status_label(self):
"""Обновляет текстовую метку состояния загрузки."""
status_parts = []
for name, status in self.category_statuses.items():
status_parts.append(f"{name}: {status}")
self.status_label.setText(" | ".join(status_parts))
def _parse_winetricks_log(self): def _parse_winetricks_log(self):
"""Читает winetricks.log и возвращает множество установленных компонентов.""" """Читает winetricks.log и возвращает множество установленных компонентов."""
installed_verbs = set() installed_verbs = set()
@@ -681,22 +672,15 @@ class WinetricksManagerDialog(QDialog):
if exit_code != 0 or exit_status != QProcess.NormalExit: if exit_code != 0 or exit_status != QProcess.NormalExit:
error_string = process.errorString() if process else "N/A" error_string = process.errorString() if process else "N/A"
self._log(f"--- Ошибка загрузки категории '{category}' (код: {exit_code}) ---", "red") self._log(f"--- Ошибка загрузки категории '{category_display_name}' (код: {exit_code}) ---", "red")
self.category_statuses[category_display_name] = "ошибка"
self._update_status_label() # Показываем ошибку в статусе
if exit_status == QProcess.CrashExit: if exit_status == QProcess.CrashExit:
self._log("--- Процесс winetricks завершился аварийно. ---", "red") self._log("--- Процесс winetricks завершился аварийно. ---", "red")
# По умолчанию используется "Неизвестная ошибка", которая не очень полезна.
if error_string != "Неизвестная ошибка": if error_string != "Неизвестная ошибка":
self._log(f"--- Системная ошибка: {error_string} ---", "red") self._log(f"--- Системная ошибка: {error_string} ---", "red")
self._log(output if output.strip() else "Winetricks не вернул вывод. Проверьте, что он работает корректно.") self._log(output if output.strip() else "Winetricks не вернул вывод. Проверьте, что он работает корректно.")
self._log("--------------------------------------------------", "red") self._log("--------------------------------------------------", "red")
else: else:
self.category_statuses[category_display_name] = "готово"
installed_verbs = self._parse_winetricks_log() installed_verbs = self._parse_winetricks_log()
# Обновляем статус только если это была сетевая загрузка
if from_cache is None:
self._update_status_label()
found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget) found_items = self._parse_winetricks_list_output(output, installed_verbs, list_widget)
if from_cache is None: # Только если мы не читали из кэша if from_cache is None: # Только если мы не читали из кэша
@@ -721,7 +705,6 @@ class WinetricksManagerDialog(QDialog):
self.loading_count -= 1 self.loading_count -= 1
if self.loading_count == 0: if self.loading_count == 0:
self.status_label.setText("Готово.")
self._update_ui_state() self._update_ui_state()
def _on_item_changed(self, item): def _on_item_changed(self, item):
@@ -862,11 +845,6 @@ class WinetricksManagerDialog(QDialog):
# 3. Обрабатываем успех # 3. Обрабатываем успех
self._log("\n=== Все операции успешно завершены ===") self._log("\n=== Все операции успешно завершены ===")
self._show_message_box("Успех",
"Операции с компонентами были успешно выполнены.",
QMessageBox.Information,
{"buttons": {"Да": QMessageBox.AcceptRole}})
self.apply_button.setEnabled(True) self.apply_button.setEnabled(True)
self.reinstall_button.setEnabled(False) # Сбрасываем в неактивное состояние self.reinstall_button.setEnabled(False) # Сбрасываем в неактивное состояние
self.close_button.setEnabled(True) self.close_button.setEnabled(True)
@@ -876,7 +854,6 @@ class WinetricksManagerDialog(QDialog):
search_edit.clear() search_edit.clear()
# Перезагружаем данные, чтобы обновить состояние # Перезагружаем данные, чтобы обновить состояние
self.status_label.setText("Обновление данных...")
self.initial_states.clear() self.initial_states.clear()
self.load_all_categories() self.load_all_categories()
self.installation_finished = True self.installation_finished = True
@@ -2142,61 +2119,49 @@ class WineHelperGUI(QMainWindow):
self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.") self.vkd3d_manage_button.setToolTip("Установка или удаление определенной версии vkd3d-proton в префиксе.")
management_layout.addWidget(self.vkd3d_manage_button, 5, 1) 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 = 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, чтобы охватить все строки с кнопками right_column_layout.addWidget(self.prefix_info_display)
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)
install_group = QWidget() install_group = QWidget()
install_layout = QVBoxLayout(install_group) install_layout = QVBoxLayout(install_group)
install_layout.setContentsMargins(0, 5, 0, 0) install_layout.setContentsMargins(0, 0, 0, 0)
install_layout.setSpacing(5) 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 = QPushButton("Установить приложение в префикс")
self.prefix_install_button.setEnabled(False) self.prefix_install_button.setEnabled(False)
self.prefix_install_button.clicked.connect(self.run_prefix_installer) self.prefix_install_button.clicked.connect(self.browse_and_run_prefix_installer)
action_buttons_layout.addWidget(self.prefix_install_button) install_layout.addWidget(self.prefix_install_button)
self.create_launcher_button = QPushButton("Создать ярлык для приложения в префиксе") self.create_launcher_button = QPushButton("Создать ярлык для приложения в префиксе")
self.create_launcher_button.setToolTip( self.create_launcher_button.setToolTip(
"Создает ярлык в меню и на вкладке 'Установленные' для .exe файла внутри префикса.") "Создает ярлык в меню и на вкладке 'Установленные' для .exe файла внутри префикса.")
self.create_launcher_button.clicked.connect(self.create_launcher_for_prefix) self.create_launcher_button.clicked.connect(self.create_launcher_for_prefix)
self.create_launcher_button.setEnabled(False) # Изначально неактивна self.create_launcher_button.setEnabled(False) # Изначально неактивна
action_buttons_layout.addWidget(self.create_launcher_button) install_layout.addWidget(self.create_launcher_button)
install_layout.addLayout(action_buttons_layout) right_column_layout.addWidget(install_group)
management_layout.addWidget(install_group, 7, 0, 1, 3)
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) container_layout.addWidget(self.prefix_management_groupbox)
layout.addWidget(self.management_container_groupbox) layout.addWidget(self.management_container_groupbox)
layout.addStretch() layout.addStretch()
self.add_tab(self.prefix_tab, "Менеджер префиксов") self.add_tab(self.prefix_tab, "Менеджер префиксов")
self.prefix_install_path_edit.textChanged.connect(self.update_prefix_install_button_state)
def _get_current_prefixes(self): def _get_current_prefixes(self):
"""Возвращает множество имен существующих префиксов.""" """Возвращает множество имен существующих префиксов."""
prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes") prefixes_root_path = os.path.join(Var.USER_WORK_PATH, "prefixes")
@@ -2322,7 +2287,6 @@ class WineHelperGUI(QMainWindow):
# Успешное удаление, обновляем GUI # Успешное удаление, обновляем GUI
self._remove_prefix_from_gui_state(prefix_name) self._remove_prefix_from_gui_state(prefix_name)
self.update_installed_apps() self.update_installed_apps()
QMessageBox.information(self, "Успех", f"Префикс '{prefix_name}' и все связанные с ним данные были успешно удалены.")
else: else:
QMessageBox.critical(self, "Ошибка удаления", f"Не удалось удалить префикс '{prefix_name}'.\nПодробности смотрите в логе.") QMessageBox.critical(self, "Ошибка удаления", f"Не удалось удалить префикс '{prefix_name}'.\nПодробности смотрите в логе.")
@@ -2331,18 +2295,16 @@ class WineHelperGUI(QMainWindow):
is_prefix_selected = bool(prefix_name) is_prefix_selected = bool(prefix_name)
self.prefix_management_groupbox.setEnabled(is_prefix_selected) self.prefix_management_groupbox.setEnabled(is_prefix_selected)
self.create_launcher_button.setEnabled(is_prefix_selected) self.create_launcher_button.setEnabled(is_prefix_selected)
self.prefix_install_button.setEnabled(is_prefix_selected)
if is_prefix_selected: if is_prefix_selected:
self.update_prefix_info_display(prefix_name) self.update_prefix_info_display(prefix_name)
else: else:
self.prefix_info_display.clear() self.prefix_info_display.clear()
self.prefix_install_path_edit.clear()
# Сбрасываем состояние кнопок, когда префикс не выбран # Сбрасываем состояние кнопок, когда префикс не выбран
self.esync_button.setChecked(False) self.esync_button.setChecked(False)
self.fsync_button.setChecked(False) self.fsync_button.setChecked(False)
self.update_prefix_install_button_state()
def update_prefix_info_display(self, prefix_name): def update_prefix_info_display(self, prefix_name):
"""Обновляет информационный блок для созданного префикса, читая данные из last.conf.""" """Обновляет информационный блок для созданного префикса, читая данные из last.conf."""
if not prefix_name: if not prefix_name:
@@ -2422,8 +2384,13 @@ class WineHelperGUI(QMainWindow):
html_content += "</p>" html_content += "</p>"
self.prefix_info_display.setHtml(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( file_path, _ = QFileDialog.getOpenFileName(
self, self,
"Выберите установочный файл", "Выберите установочный файл",
@@ -2431,18 +2398,11 @@ class WineHelperGUI(QMainWindow):
"Исполняемые файлы (*.exe *.msi);;Все файлы (*)" "Исполняемые файлы (*.exe *.msi);;Все файлы (*)"
) )
if file_path: if file_path:
self.prefix_install_path_edit.setText(file_path) self.run_prefix_installer(file_path)
def update_prefix_install_button_state(self): def run_prefix_installer(self, installer_path):
"""Обновляет состояние кнопки установки в префикс.""" """Запускает установку файла в выбранный префикс через скрипт winehelper."""
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):
"""Запускает установку файла в выбранный префикс."""
prefix_name = self.current_managed_prefix_name prefix_name = self.current_managed_prefix_name
installer_path = self.prefix_install_path_edit.text().strip()
if not prefix_name: if not prefix_name:
QMessageBox.warning(self, "Ошибка", "Не выбран префикс для установки.") QMessageBox.warning(self, "Ошибка", "Не выбран префикс для установки.")
@@ -2451,9 +2411,6 @@ class WineHelperGUI(QMainWindow):
QMessageBox.warning(self, "Ошибка", "Указан неверный путь к установочному файлу.") QMessageBox.warning(self, "Ошибка", "Указан неверный путь к установочному файлу.")
return 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 = QDialog(self)
self.command_dialog.setWindowTitle(f"Установка в префикс: {prefix_name}") self.command_dialog.setWindowTitle(f"Установка в префикс: {prefix_name}")
self.command_dialog.setMinimumSize(750, 400) self.command_dialog.setMinimumSize(750, 400)
@@ -2477,13 +2434,12 @@ class WineHelperGUI(QMainWindow):
self.command_process.readyReadStandardOutput.connect(self._handle_command_output) self.command_process.readyReadStandardOutput.connect(self._handle_command_output)
self.command_process.finished.connect(self._handle_prefix_install_finished) self.command_process.finished.connect(self._handle_prefix_install_finished)
env = QProcessEnvironment.systemEnvironment() # Окружение полностью настраивается скриптом winehelper
env.insert("WINEPREFIX", prefix_path) self.command_process.setProcessEnvironment(QProcessEnvironment.systemEnvironment())
self.command_process.setProcessEnvironment(env)
args = [installer_path] args = ["install-to-prefix", prefix_name, installer_path]
self.command_log_output.append(f"Запуск установки: {shlex.quote(wine_executable)} {shlex.quote(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(wine_executable, args) self.command_process.start(self.winehelper_path, args)
self.command_dialog.exec_() self.command_dialog.exec_()
def _get_prefix_component_version(self, prefix_name, component_key): def _get_prefix_component_version(self, prefix_name, component_key):
@@ -2991,10 +2947,6 @@ class WineHelperGUI(QMainWindow):
if not self.management_container_groupbox.isVisible(): if not self.management_container_groupbox.isVisible():
self.management_container_groupbox.setVisible(True) self.management_container_groupbox.setVisible(True)
QMessageBox.information(self, "Успех",
f"Префикс '{prefix_name}' успешно создан.\n"
"Теперь вы можете управлять им, выбрав его из выпадающего списка.")
def update_installed_apps(self): def update_installed_apps(self):
"""Обновляет список установленных приложений в виде кнопок""" """Обновляет список установленных приложений в виде кнопок"""
# Если активная кнопка находится в списке удаляемых, сбрасываем ее # Если активная кнопка находится в списке удаляемых, сбрасываем ее
@@ -3063,7 +3015,6 @@ class WineHelperGUI(QMainWindow):
self.command_process.deleteLater() self.command_process.deleteLater()
self.command_process = None self.command_process = None
self.command_close_button.setEnabled(True) self.command_close_button.setEnabled(True)
self.prefix_install_path_edit.clear()
self.update_installed_apps() self.update_installed_apps()
def _set_active_button(self, button_widget): def _set_active_button(self, button_widget):
@@ -3084,11 +3035,13 @@ class WineHelperGUI(QMainWindow):
def show_installed_app_info(self, desktop_path, button_widget): def show_installed_app_info(self, desktop_path, button_widget):
"""Показывает информацию об установленном приложении в правой панели.""" """Показывает информацию об установленном приложении в правой панели."""
self._set_active_button(button_widget) self._set_active_button(button_widget)
# Очищаем поле поиска и принудительно обновляем список, чтобы показать все приложения # Если в поиске был текст, очищаем его и перерисовываем список.
self.installed_search_edit.blockSignals(True) # Это предотвращает "прыжок", если список не был отфильтрован.
self.installed_search_edit.clear() if self.installed_search_edit.text():
self.installed_search_edit.blockSignals(False) self.installed_search_edit.blockSignals(True)
self.filter_installed_buttons() self.installed_search_edit.clear()
self.installed_search_edit.blockSignals(False)
self.filter_installed_buttons()
# Прокручиваем к выбранному элементу # Прокручиваем к выбранному элементу
frame = button_widget.parent() frame = button_widget.parent()
@@ -3758,11 +3711,14 @@ class WineHelperGUI(QMainWindow):
search_edit = tab_data['search_edit'] search_edit = tab_data['search_edit']
scroll_area = tab_data['scroll_area'] scroll_area = tab_data['scroll_area']
# Общая логика: очищаем поиск, обновляем список и прокручиваем к элементу # Если в поиске был текст, очищаем его и перерисовываем список.
search_edit.blockSignals(True) # Это предотвращает "прыжок", если список не был отфильтрован.
search_edit.clear() if search_edit.text():
search_edit.blockSignals(False) search_edit.blockSignals(True)
self.filter_buttons(tab_type) search_edit.clear()
search_edit.blockSignals(False)
self.filter_buttons(tab_type)
frame = button_widget.parent() frame = button_widget.parent()
if isinstance(frame, QFrame): if isinstance(frame, QFrame):
QTimer.singleShot(0, lambda: scroll_area.ensureWidgetVisible(frame)) QTimer.singleShot(0, lambda: scroll_area.ensureWidgetVisible(frame))
@@ -4124,18 +4080,6 @@ class WineHelperGUI(QMainWindow):
self.created_prefix_selector.setCurrentIndex(0) 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() self.update_installed_apps()
# Кнопка закрыть # Кнопка закрыть
@@ -4235,7 +4179,6 @@ class WineHelperGUI(QMainWindow):
"""Обрабатывает завершение создания ярлыка.""" """Обрабатывает завершение создания ярлыка."""
self._handle_command_finished(exit_code, exit_status) self._handle_command_finished(exit_code, exit_status)
if exit_code == 0: if exit_code == 0:
QMessageBox.information(self, "Успех", "Ярлык успешно создан.")
self.update_installed_apps() self.update_installed_apps()
# Переключаемся на вкладку "Установленные" # Переключаемся на вкладку "Установленные"
for i in range(self.tab_bar.count()): for i in range(self.tab_bar.count()):