desktop_app/app/ui/views/yobble_home_view.py
2025-09-26 04:34:16 +03:00

230 lines
8.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
);
}
"""