from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFrame, QStackedWidget, QSpacerItem, QSizePolicy ) from PySide6.QtCore import Qt, QSize from PySide6.QtGui import QIcon class YobbleHomeView(QWidget): def __init__(self, username: str): super().__init__() self.username = username self.setWindowTitle(f"Yobble Home - {username}") # --- Основной макет --- main_layout = QVBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.setSpacing(0) # 1. Верхняя панель top_bar = self.create_top_bar() main_layout.addWidget(top_bar) # 2. Центральная область контента self.content_stack = QStackedWidget() self.setup_content_pages() main_layout.addWidget(self.content_stack) # 3. Нижняя панель навигации bottom_bar = self.create_bottom_bar() main_layout.addWidget(bottom_bar) self.setStyleSheet(self.get_stylesheet()) def create_top_bar(self): """Создает верхнюю панель с меню и заголовком.""" top_bar_widget = QWidget() top_bar_layout = QHBoxLayout(top_bar_widget) top_bar_layout.setContentsMargins(10, 5, 10, 5) # Кнопка "Бургер" self.burger_menu_button = QPushButton("☰") self.burger_menu_button.setObjectName("BurgerMenuButton") top_bar_layout.addWidget(self.burger_menu_button) # Заголовок self.title_label = QLabel("Чаты") # Начальный заголовок self.title_label.setObjectName("TitleLabel") top_bar_layout.addWidget(self.title_label) top_bar_layout.addStretch() return top_bar_widget def create_bottom_bar(self): """Создает нижнюю панель навигации.""" bottom_bar_widget = QWidget() bottom_bar_widget.setObjectName("BottomBar") # Устанавливаем высоту и убираем лишние отступы, чтобы текст не обрезался bottom_bar_layout = QHBoxLayout(bottom_bar_widget) bottom_bar_layout.setContentsMargins(10, 0, 10, 5) # Уменьшаем верхний и нижний отступы bottom_bar_layout.setSpacing(10) # Создаем кнопки btn_feed = self.create_tab_button("📄", "Лента", 0) btn_search = self.create_tab_button("🔍", "Поиск", 1) btn_chats = self.create_tab_button("💬", "Чаты", 2) btn_profile = self.create_tab_button("👤", "Лицо", 3) # Центральная кнопка "Создать" btn_create = QPushButton("+") btn_create.setObjectName("CreateButton") btn_create.setFixedSize(50, 50) # Добавляем кнопки в макет bottom_bar_layout.addWidget(btn_feed) bottom_bar_layout.addWidget(btn_search) bottom_bar_layout.addWidget(btn_create) bottom_bar_layout.addWidget(btn_chats) bottom_bar_layout.addWidget(btn_profile) # Устанавливаем начальную активную вкладку self.update_tab_selection(2) # Чаты по умолчанию return bottom_bar_widget def create_tab_button(self, icon_text, text, index): """Фабричный метод для создания кнопок вкладок.""" button = QPushButton() button.setObjectName("TabButton") layout = QVBoxLayout(button) layout.setContentsMargins(0, 5, 0, 5) layout.setSpacing(2) icon_label = QLabel(icon_text) icon_label.setAlignment(Qt.AlignCenter) icon_label.setObjectName("TabIcon") text_label = QLabel(text) text_label.setAlignment(Qt.AlignCenter) text_label.setObjectName("TabText") layout.addWidget(icon_label) layout.addWidget(text_label) button.setProperty("tab_index", index) button.clicked.connect(lambda: self.on_tab_button_clicked(index)) return button def setup_content_pages(self): """Создает страницы-заглушки для QStackedWidget.""" self.content_stack.addWidget(QLabel("Контент Ленты")) self.content_stack.addWidget(QLabel("Контент Поиска")) self.content_stack.addWidget(QLabel("Контент Чатов")) self.content_stack.addWidget(QLabel("Контент Профиля")) def on_tab_button_clicked(self, index): """Обрабатывает нажатие на кнопку вкладки.""" self.content_stack.setCurrentIndex(index) self.update_tab_selection(index) # Обновляем заголовок titles = ["Лента", "Поиск", "Чаты", "Лицо"] self.title_label.setText(titles[index]) def update_tab_selection(self, selected_index): """Обновляет визуальное состояние кнопок вкладок.""" bottom_bar = self.findChild(QWidget, "BottomBar") if not bottom_bar: return for button in bottom_bar.findChildren(QPushButton): if button.property("tab_index") == selected_index: button.setProperty("selected", True) else: button.setProperty("selected", False) # Обновляем стиль, чтобы изменения применились button.style().unpolish(button) button.style().polish(button) def get_stylesheet(self): """Возвращает QSS стили для компонента.""" return """ YobbleHomeView { background-color: white; /* Фон для основного виджета */ } /* Верхняя панель */ #TopBar { background-color: #f5f5f5; border-bottom: 1px solid #e0e0e0; } #BurgerMenuButton { font-size: 24px; border: none; padding: 5px; } #TitleLabel { font-size: 18px; font-weight: bold; } /* Нижняя панель */ #BottomBar { background-color: #f5f5f5; border-top: 1px solid #e0e0e0; } /* Кнопки вкладок */ #TabButton { background-color: transparent; border: none; padding: 5px; color: #888; } #TabButton[selected="true"] #TabText { color: #007AFF; /* Яркий синий для активной вкладки */ } #TabButton[selected="true"] #TabIcon { color: #007AFF; } #TabIcon { font-size: 22px; } #TabText { font-size: 12px; } /* Центральная кнопка "Создать" */ #CreateButton { background-color: #007AFF; color: white; font-size: 24px; font-weight: bold; border: none; border-radius: 25px; /* Делает ее круглой */ } #CreateButton:hover { background-color: #0056b3; } """