This repository has been archived on 2025-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
desktop_app/app/ui/views/yobble_home_view.py
2025-09-26 04:23:37 +03:00

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