diff --git a/winehelper_gui.py b/winehelper_gui.py index becb13f..4c682b5 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -2202,6 +2202,7 @@ class WineHelperGUI(QMainWindow): self.install_tabs_data['auto'] = { 'buttons': buttons, 'layout': layout, 'search_edit': search_edit, 'scroll_area': scroll_area } + self.install_tabs_data['auto']['test_buttons'] = [] # Добавляем чекбокс для тестовых версий test_checkbox = QCheckBox("Показать тестовые версии") @@ -2237,43 +2238,63 @@ class WineHelperGUI(QMainWindow): if not data: return - script_folders = ["autoinstall"] - if data['test_checkbox'].isChecked(): - script_folders.append("testinstall") + is_checked = data['test_checkbox'].isChecked() + test_buttons = data.get('test_buttons', []) - # Перед удалением кнопок останавливаем все связанные с ними таймеры анимации - for btn in data['buttons']: - if btn in self.icon_animators: - anim_data = self.icon_animators.pop(btn) - if 'main_timer' in anim_data: - anim_data['main_timer'].stop() - if 'animation' in anim_data and anim_data['animation']: - anim_data['animation'].stop() - - # Сбрасываем ссылку на активную кнопку, если она была удалена - if self.current_active_button in data['buttons']: - self.current_active_button = None - - # Очищаем старые кнопки и layout - for btn in data['buttons']: - btn.parent().deleteLater() - data['buttons'].clear() - - # Заполняем layout новыми кнопками - scripts = [] - for folder in script_folders: - script_path = os.path.join(Var.DATA_PATH, folder) + # Если нужно показать тестовые версии и они еще не добавлены + if is_checked and not test_buttons: + test_script_folder = "testinstall" + script_path = os.path.join(Var.DATA_PATH, test_script_folder) if os.path.isdir(script_path): try: folder_scripts = sorted(os.listdir(script_path)) - self._populate_install_grid(data['layout'], folder_scripts, folder, data['buttons']) - scripts.extend(folder_scripts) - except OSError as e: - print(f"Не удалось прочитать директорию {script_path}: {e}") + # Запоминаем, какие кнопки являются тестовыми + new_test_buttons = [] + self._populate_install_grid(data['layout'], folder_scripts, test_script_folder, new_test_buttons) + data['test_buttons'] = new_test_buttons + data['buttons'].extend(new_test_buttons) + self.autoinstall_scripts.extend(folder_scripts) - self.autoinstall_scripts = scripts - # Применяем текущий фильтр поиска к обновленному списку - self.filter_buttons('auto') + # Применяем фильтр и прокручиваем к первому новому элементу + self.filter_buttons('auto') + if new_test_buttons: + first_new_button = new_test_buttons[0] + frame = first_new_button.parent() + if isinstance(frame, QFrame): + # Даем время на отрисовку перед прокруткой + QTimer.singleShot(100, lambda: data['scroll_area'].ensureWidgetVisible(frame, 50, 50)) + + except OSError as e: + print(f"Не удалось прочитать директорию {test_script_folder}: {e}") + + # Если нужно скрыть тестовые версии и они были добавлены + elif not is_checked and test_buttons: + # Останавливаем анимацию и удаляем виджеты тестовых кнопок + for btn in test_buttons: + if btn in self.icon_animators: + anim_data = self.icon_animators.pop(btn) + if 'main_timer' in anim_data: + anim_data['main_timer'].stop() + if 'animation' in anim_data and anim_data['animation']: + anim_data['animation'].stop() + + # Удаляем кнопку из основного списка + if btn in data['buttons']: + data['buttons'].remove(btn) + + # Удаляем фрейм кнопки из layout + frame = btn.parent() + if frame: + frame.deleteLater() + + # Очищаем список тестовых кнопок + data['test_buttons'].clear() + # Обновляем список скриптов + self.autoinstall_scripts = [s for s in self.autoinstall_scripts if not os.path.exists(os.path.join(Var.DATA_PATH, "testinstall", s))] + + # В любом случае применяем фильтр, чтобы скрыть/показать кнопки в соответствии с поиском + if data['test_checkbox'].isChecked(): + self.filter_buttons('auto') def create_installed_tab(self): """Создает вкладку для отображения установленных программ в виде кнопок"""