from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFrame, QStackedWidget, QSpacerItem, QSizePolicy, QGraphicsDropShadowEffect ) from PySide6.QtCore import Qt, QSize from PySide6.QtGui import QIcon, QColor 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, 1) # Растягиваем контент # 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): """Создает нижнюю панель навигации в стиле SwiftUI.""" bottom_bar_widget = QWidget() bottom_bar_widget.setObjectName("BottomBar") bottom_bar_layout = QHBoxLayout(bottom_bar_widget) bottom_bar_layout.setContentsMargins(10, 0, 10, 0) bottom_bar_layout.setSpacing(10) # Создаем кнопки btn_feed = self.create_tab_button("☰", "Лента", 0) btn_search = self.create_tab_button("🔍", "Поиск", 1) btn_create = self.create_create_button() btn_chats = self.create_tab_button("💬", "Чаты", 2) btn_profile = self.create_tab_button("👤", "Лицо", 3) # Добавляем кнопки в макет 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) # Устанавливаем политику размеров, чтобы кнопки вкладок растягивались for btn in [btn_feed, btn_search, btn_chats, btn_profile]: btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) # Устанавливаем начальную активную вкладку self.update_tab_selection(2) # Чаты по умолчанию return bottom_bar_widget def create_tab_button(self, icon_text, text, index): """Фабричный метод для создания кнопок вкладок.""" button = QPushButton() button.setObjectName("TabButton") button.setCursor(Qt.PointingHandCursor) layout = QVBoxLayout(button) layout.setContentsMargins(0, 5, 0, 5) layout.setSpacing(4) 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 create_create_button(self): """Создает центральную кнопку 'Создать'.""" button = QPushButton("+") button.setObjectName("CreateButton") button.setFixedSize(56, 56) button.setCursor(Qt.PointingHandCursor) # Эффект тени shadow = QGraphicsDropShadowEffect(self) shadow.setBlurRadius(18) shadow.setColor(QColor(0, 0, 0, 100)) shadow.setOffset(0, 3) button.setGraphicsEffect(shadow) # button.clicked.connect(self.on_create_clicked) # Подключите свой слот 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): is_tab_button = button.property("tab_index") is not None if is_tab_button: 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: #f8f8f8; border-top: 1px solid #e7e7e7; padding-top: 5px; padding-bottom: 15px; /* Место для тени и отступа */ } /* Кнопки вкладок */ #TabButton { background-color: transparent; border: none; padding: 5px; } #TabButton #TabIcon { color: #888888; } #TabButton #TabText { color: #888888; } #TabButton[selected="true"] #TabIcon, #TabButton[selected="true"] #TabText { color: #007AFF; } #TabIcon { font-size: 22px; } #TabText { font-size: 12px; } /* Центральная кнопка "Создать" */ #CreateButton { color: white; font-size: 30px; font-weight: 300; border: none; border-radius: 28px; /* 56px / 2 */ background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #007AFF, stop: 1 #0056b3 ); /* "Приподнимаем" кнопку */ margin-bottom: 20px; } #CreateButton:hover { background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #0088FF, stop: 1 #0066c3 ); } #CreateButton:pressed { background-color: qlineargradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #0056b3, stop: 1 #004493 ); } """