From cefb3c8d5a79038e17c483d416d7ef6d203ae531 Mon Sep 17 00:00:00 2001 From: Sergey Palcheh Date: Mon, 25 Aug 2025 13:03:36 +0600 Subject: [PATCH] changing the tab display in the main window --- winehelper_gui.py | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/winehelper_gui.py b/winehelper_gui.py index 5eafbc0..9df665b 100644 --- a/winehelper_gui.py +++ b/winehelper_gui.py @@ -10,7 +10,7 @@ import time import json import hashlib from functools import partial -from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLabel, QTabWidget, +from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLabel, QTabWidget, QTabBar, QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox, QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser) from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve @@ -1275,19 +1275,26 @@ class WineHelperGUI(QMainWindow): # Создаем главный виджет и layout self.main_widget = QWidget() self.setCentralWidget(self.main_widget) - self.main_layout = QHBoxLayout() + self.main_layout = QVBoxLayout() self.main_widget.setLayout(self.main_layout) - # Создаем табы - self.tabs = QTabWidget() - self.main_layout.addWidget(self.tabs, stretch=1) + # Создаем кастомную панель вкладок и виджет со страницами + self.tab_bar = QTabBar() + self.stacked_widget = QStackedWidget() + self.main_layout.addWidget(self.tab_bar) + + # Горизонтальный layout для страниц и инфо-панели + content_layout = QHBoxLayout() + content_layout.addWidget(self.stacked_widget, stretch=1) # Создаем панель информации о скрипте self.create_info_panel() - self.main_layout.addWidget(self.info_panel, stretch=1) + content_layout.addWidget(self.info_panel, stretch=1) + + self.main_layout.addLayout(content_layout) # Фиксируем минимальные размеры - self.tabs.setMinimumWidth(520) + self.stacked_widget.setMinimumWidth(520) self.info_panel.setMinimumWidth(415) # Вкладки @@ -1304,9 +1311,10 @@ class WineHelperGUI(QMainWindow): self.update_installed_apps() # Соединяем сигнал смены вкладок с функцией - self.tabs.currentChanged.connect(self.on_tab_changed) + self.tab_bar.currentChanged.connect(self.stacked_widget.setCurrentIndex) + self.tab_bar.currentChanged.connect(self.on_tab_changed) # Устанавливаем начальное состояние видимости панели - self.on_tab_changed(self.tabs.currentIndex()) + self.on_tab_changed(self.tab_bar.currentIndex()) def activate(self): """ @@ -1319,6 +1327,11 @@ class WineHelperGUI(QMainWindow): self.raise_() self.activateWindow() + def add_tab(self, widget, title): + """Добавляет вкладку в кастомный TabBar и страницу в StackedWidget.""" + self.tab_bar.addTab(title) + self.stacked_widget.addWidget(widget) + def _reset_info_panel_to_default(self, tab_name): """Сбрасывает правую панель в состояние по умолчанию для указанной вкладки.""" if tab_name == "Автоматическая установка": @@ -1360,7 +1373,7 @@ class WineHelperGUI(QMainWindow): def on_tab_changed(self, index): """Скрывает или показывает панель информации в зависимости от активной вкладки.""" # Очищаем поле поиска на вкладке, которую покинули - previous_widget = self.tabs.widget(self.previous_tab_index) + previous_widget = self.stacked_widget.widget(self.previous_tab_index) if previous_widget: # Ищем QLineEdit в дочерних элементах search_edit = previous_widget.findChild(QLineEdit) @@ -1370,7 +1383,7 @@ class WineHelperGUI(QMainWindow): # Обновляем индекс предыдущей вкладки для следующего переключения self.previous_tab_index = index - current_tab_text = self.tabs.tabText(index) + current_tab_text = self.tab_bar.tabText(index) # Сбрасываем растяжение к состоянию по умолчанию: # растягивается виджет с описанием (индекс 1), а не виджет с действиями (индекс 4) @@ -1738,7 +1751,7 @@ class WineHelperGUI(QMainWindow): buttons_list = [] self._populate_install_grid(grid_layout, scripts, script_folder, buttons_list) - self.tabs.addTab(tab_widget, tab_title) + self.add_tab(tab_widget, tab_title) return scripts, buttons_list, grid_layout, search_edit, scroll_area @@ -1773,7 +1786,7 @@ class WineHelperGUI(QMainWindow): installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab( "Поиск установленной программы...", self.filter_installed_buttons ) - self.tabs.addTab(installed_tab, "Установленные") + self.add_tab(installed_tab, "Установленные") def open_wine_version_dialog(self): """Открывает диалог выбора версии Wine.""" @@ -1846,7 +1859,7 @@ class WineHelperGUI(QMainWindow): self.create_prefix_button.clicked.connect(self.start_prefix_creation) layout.addWidget(self.create_prefix_button) - self.tabs.addTab(self.prefix_tab, "Создать префикс") + self.add_tab(self.prefix_tab, "Создать префикс") self.arch_win32_radio.toggled.connect(self.clear_wine_version_selection) self.prefix_name_edit.textChanged.connect(self.update_create_prefix_button_state) @@ -1970,7 +1983,7 @@ class WineHelperGUI(QMainWindow): changelog_layout.addWidget(changelog_text) help_subtabs.addTab(changelog_tab, "История изменений") - self.tabs.addTab(help_tab, "Справка") + self.add_tab(help_tab, "Справка") def update_create_prefix_button_state(self): """Включает или выключает кнопку 'Создать префикс' в зависимости от заполнения полей."""