changing the tab display in the main window

This commit is contained in:
Sergey Palcheh
2025-08-25 13:03:36 +06:00
parent a4f01e7340
commit cefb3c8d5a

View File

@@ -10,7 +10,7 @@ import time
import json import json
import hashlib import hashlib
from functools import partial 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, QTextEdit, QFileDialog, QMessageBox, QLineEdit, QCheckBox, QStackedWidget, QScrollArea, QFormLayout, QGroupBox, QRadioButton, QComboBox,
QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser) QListWidget, QListWidgetItem, QGridLayout, QFrame, QDialog, QTextBrowser)
from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve from PyQt5.QtCore import Qt, QProcess, QSize, QTimer, QProcessEnvironment, QPropertyAnimation, QEasingCurve
@@ -1275,19 +1275,26 @@ class WineHelperGUI(QMainWindow):
# Создаем главный виджет и layout # Создаем главный виджет и layout
self.main_widget = QWidget() self.main_widget = QWidget()
self.setCentralWidget(self.main_widget) self.setCentralWidget(self.main_widget)
self.main_layout = QHBoxLayout() self.main_layout = QVBoxLayout()
self.main_widget.setLayout(self.main_layout) self.main_widget.setLayout(self.main_layout)
# Создаем табы # Создаем кастомную панель вкладок и виджет со страницами
self.tabs = QTabWidget() self.tab_bar = QTabBar()
self.main_layout.addWidget(self.tabs, stretch=1) 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.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) self.info_panel.setMinimumWidth(415)
# Вкладки # Вкладки
@@ -1304,9 +1311,10 @@ class WineHelperGUI(QMainWindow):
self.update_installed_apps() 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): def activate(self):
""" """
@@ -1319,6 +1327,11 @@ class WineHelperGUI(QMainWindow):
self.raise_() self.raise_()
self.activateWindow() 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): def _reset_info_panel_to_default(self, tab_name):
"""Сбрасывает правую панель в состояние по умолчанию для указанной вкладки.""" """Сбрасывает правую панель в состояние по умолчанию для указанной вкладки."""
if tab_name == "Автоматическая установка": if tab_name == "Автоматическая установка":
@@ -1360,7 +1373,7 @@ class WineHelperGUI(QMainWindow):
def on_tab_changed(self, index): 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: if previous_widget:
# Ищем QLineEdit в дочерних элементах # Ищем QLineEdit в дочерних элементах
search_edit = previous_widget.findChild(QLineEdit) search_edit = previous_widget.findChild(QLineEdit)
@@ -1370,7 +1383,7 @@ class WineHelperGUI(QMainWindow):
# Обновляем индекс предыдущей вкладки для следующего переключения # Обновляем индекс предыдущей вкладки для следующего переключения
self.previous_tab_index = index self.previous_tab_index = index
current_tab_text = self.tabs.tabText(index) current_tab_text = self.tab_bar.tabText(index)
# Сбрасываем растяжение к состоянию по умолчанию: # Сбрасываем растяжение к состоянию по умолчанию:
# растягивается виджет с описанием (индекс 1), а не виджет с действиями (индекс 4) # растягивается виджет с описанием (индекс 1), а не виджет с действиями (индекс 4)
@@ -1738,7 +1751,7 @@ class WineHelperGUI(QMainWindow):
buttons_list = [] buttons_list = []
self._populate_install_grid(grid_layout, scripts, script_folder, 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 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( installed_tab, self.installed_scroll_layout, self.installed_search_edit, self.installed_scroll_area = self._create_searchable_grid_tab(
"Поиск установленной программы...", self.filter_installed_buttons "Поиск установленной программы...", self.filter_installed_buttons
) )
self.tabs.addTab(installed_tab, "Установленные") self.add_tab(installed_tab, "Установленные")
def open_wine_version_dialog(self): def open_wine_version_dialog(self):
"""Открывает диалог выбора версии Wine.""" """Открывает диалог выбора версии Wine."""
@@ -1846,7 +1859,7 @@ class WineHelperGUI(QMainWindow):
self.create_prefix_button.clicked.connect(self.start_prefix_creation) self.create_prefix_button.clicked.connect(self.start_prefix_creation)
layout.addWidget(self.create_prefix_button) 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.arch_win32_radio.toggled.connect(self.clear_wine_version_selection)
self.prefix_name_edit.textChanged.connect(self.update_create_prefix_button_state) self.prefix_name_edit.textChanged.connect(self.update_create_prefix_button_state)
@@ -1970,7 +1983,7 @@ class WineHelperGUI(QMainWindow):
changelog_layout.addWidget(changelog_text) changelog_layout.addWidget(changelog_text)
help_subtabs.addTab(changelog_tab, "История изменений") help_subtabs.addTab(changelog_tab, "История изменений")
self.tabs.addTab(help_tab, "Справка") self.add_tab(help_tab, "Справка")
def update_create_prefix_button_state(self): def update_create_prefix_button_state(self):
"""Включает или выключает кнопку 'Создать префикс' в зависимости от заполнения полей.""" """Включает или выключает кнопку 'Создать префикс' в зависимости от заполнения полей."""