195 lines
7.5 KiB
Python
195 lines
7.5 KiB
Python
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;
|
||
}
|
||
"""
|