Compare commits

..

No commits in common. "4102c73124ec8d87e76f6b4ce6ffeccb5622a3d6" and "2b306562f8f69d446fe32daa5ccc12a38abc564f" have entirely different histories.

View File

@ -1,11 +1,9 @@
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFrame, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFrame,
QStackedWidget, QSpacerItem, QSizePolicy, QGraphicsDropShadowEffect QStackedWidget, QSpacerItem, QSizePolicy
) )
from PySide6.QtCore import Qt, QSize from PySide6.QtCore import Qt, QSize
from PySide6.QtGui import QIcon, QColor from PySide6.QtGui import QIcon
from app.core.theme import theme_manager
class YobbleHomeView(QWidget): class YobbleHomeView(QWidget):
def __init__(self, username: str): def __init__(self, username: str):
@ -19,39 +17,33 @@ class YobbleHomeView(QWidget):
main_layout.setSpacing(0) main_layout.setSpacing(0)
# 1. Верхняя панель # 1. Верхняя панель
self.top_bar = self.create_top_bar() top_bar = self.create_top_bar()
main_layout.addWidget(self.top_bar) main_layout.addWidget(top_bar)
# 2. Центральная область контента # 2. Центральная область контента
self.content_stack = QStackedWidget() self.content_stack = QStackedWidget()
self.setup_content_pages() self.setup_content_pages()
main_layout.addWidget(self.content_stack, 1) main_layout.addWidget(self.content_stack)
# 3. Нижняя панель навигации # 3. Нижняя панель навигации
self.bottom_bar = self.create_bottom_bar() bottom_bar = self.create_bottom_bar()
main_layout.addWidget(self.bottom_bar) main_layout.addWidget(bottom_bar)
self.update_styles() # Применяем стили при инициализации
# Подключаемся к сигналу смены темы
theme_manager.theme_changed.connect(self.update_styles)
def update_styles(self):
"""Обновляет стили компонента при смене темы."""
self.setStyleSheet(self.get_stylesheet()) self.setStyleSheet(self.get_stylesheet())
def create_top_bar(self): def create_top_bar(self):
"""Создает верхнюю панель с меню и заголовком.""" """Создает верхнюю панель с меню и заголовком."""
top_bar_widget = QWidget() top_bar_widget = QWidget()
top_bar_widget.setObjectName("TopBar")
top_bar_layout = QHBoxLayout(top_bar_widget) top_bar_layout = QHBoxLayout(top_bar_widget)
top_bar_layout.setContentsMargins(10, 5, 10, 5) top_bar_layout.setContentsMargins(10, 5, 10, 5)
# Кнопка "Бургер"
self.burger_menu_button = QPushButton("") self.burger_menu_button = QPushButton("")
self.burger_menu_button.setObjectName("BurgerMenuButton") self.burger_menu_button.setObjectName("BurgerMenuButton")
top_bar_layout.addWidget(self.burger_menu_button) top_bar_layout.addWidget(self.burger_menu_button)
self.title_label = QLabel("Чаты") # Заголовок
self.title_label = QLabel("Чаты") # Начальный заголовок
self.title_label.setObjectName("TitleLabel") self.title_label.setObjectName("TitleLabel")
top_bar_layout.addWidget(self.title_label) top_bar_layout.addWidget(self.title_label)
top_bar_layout.addStretch() top_bar_layout.addStretch()
@ -59,40 +51,44 @@ class YobbleHomeView(QWidget):
return top_bar_widget return top_bar_widget
def create_bottom_bar(self): def create_bottom_bar(self):
"""Создает нижнюю панель навигации в стиле SwiftUI.""" """Создает нижнюю панель навигации."""
bottom_bar_widget = QWidget() bottom_bar_widget = QWidget()
bottom_bar_widget.setObjectName("BottomBar") bottom_bar_widget.setObjectName("BottomBar")
# Устанавливаем высоту и убираем лишние отступы, чтобы текст не обрезался
bottom_bar_layout = QHBoxLayout(bottom_bar_widget) bottom_bar_layout = QHBoxLayout(bottom_bar_widget)
bottom_bar_layout.setContentsMargins(10, 0, 10, 0) bottom_bar_layout.setContentsMargins(10, 0, 10, 5) # Уменьшаем верхний и нижний отступы
bottom_bar_layout.setSpacing(10) bottom_bar_layout.setSpacing(10)
btn_feed = self.create_tab_button("", "Лента", 0) # Создаем кнопки
btn_feed = self.create_tab_button("📄", "Лента", 0)
btn_search = self.create_tab_button("🔍", "Поиск", 1) btn_search = self.create_tab_button("🔍", "Поиск", 1)
btn_create = self.create_create_button()
btn_chats = self.create_tab_button("💬", "Чаты", 2) btn_chats = self.create_tab_button("💬", "Чаты", 2)
btn_profile = self.create_tab_button("👤", "Лицо", 3) 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_feed)
bottom_bar_layout.addWidget(btn_search) bottom_bar_layout.addWidget(btn_search)
bottom_bar_layout.addWidget(btn_create) bottom_bar_layout.addWidget(btn_create)
bottom_bar_layout.addWidget(btn_chats) bottom_bar_layout.addWidget(btn_chats)
bottom_bar_layout.addWidget(btn_profile) 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) # Устанавливаем начальную активную вкладку
self.update_tab_selection(2) # Чаты по умолчанию
return bottom_bar_widget return bottom_bar_widget
def create_tab_button(self, icon_text, text, index): def create_tab_button(self, icon_text, text, index):
"""Фабричный метод для создания кнопок вкладок."""
button = QPushButton() button = QPushButton()
button.setObjectName("TabButton") button.setObjectName("TabButton")
button.setCursor(Qt.PointingHandCursor)
layout = QVBoxLayout(button) layout = QVBoxLayout(button)
layout.setContentsMargins(0, 5, 0, 5) layout.setContentsMargins(0, 5, 0, 5)
layout.setSpacing(4) layout.setSpacing(2)
icon_label = QLabel(icon_text) icon_label = QLabel(icon_text)
icon_label.setAlignment(Qt.AlignCenter) icon_label.setAlignment(Qt.AlignCenter)
@ -109,125 +105,90 @@ class YobbleHomeView(QWidget):
button.clicked.connect(lambda: self.on_tab_button_clicked(index)) button.clicked.connect(lambda: self.on_tab_button_clicked(index))
return button 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)
return button
def setup_content_pages(self): 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("Контент Поиска"))
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): def on_tab_button_clicked(self, index):
"""Обрабатывает нажатие на кнопку вкладки."""
self.content_stack.setCurrentIndex(index) self.content_stack.setCurrentIndex(index)
self.update_tab_selection(index) self.update_tab_selection(index)
# Обновляем заголовок
titles = ["Лента", "Поиск", "Чаты", "Лицо"] titles = ["Лента", "Поиск", "Чаты", "Лицо"]
self.title_label.setText(titles[index]) self.title_label.setText(titles[index])
def update_tab_selection(self, selected_index): def update_tab_selection(self, selected_index):
if not hasattr(self, 'bottom_bar'): return """Обновляет визуальное состояние кнопок вкладок."""
bottom_bar = self.findChild(QWidget, "BottomBar")
for button in self.bottom_bar.findChildren(QPushButton): if not bottom_bar: return
is_tab_button = button.property("tab_index") is not None
if is_tab_button: for button in bottom_bar.findChildren(QPushButton):
button.setProperty("selected", button.property("tab_index") == selected_index) if button.property("tab_index") == selected_index:
button.style().unpolish(button) button.setProperty("selected", True)
button.style().polish(button) else:
button.setProperty("selected", False)
# Обновляем стиль, чтобы изменения применились
button.style().unpolish(button)
button.style().polish(button)
def get_stylesheet(self): def get_stylesheet(self):
"""Возвращает QSS стили для компонента в зависимости от темы.""" """Возвращает QSS стили для компонента."""
is_dark = theme_manager.is_dark() return """
YobbleHomeView {
# Цветовая палитра background-color: white; /* Фон для основного виджета */
bg_color = "#1c1c1e" if is_dark else "white" }
bar_bg_color = "#2c2c2e" if is_dark else "#f8f8f8"
bar_border_color = "#3c3c3c" if is_dark else "#e7e7e7"
text_color = "#8e8e93" if is_dark else "#888888"
title_color = "white" if is_dark else "black"
active_color = "#0A84FF"
top_bar_bg = "#2c2c2e" if is_dark else "#f5f5f5"
top_bar_border = "#3c3c3c" if is_dark else "#e0e0e0"
return f"""
YobbleHomeView {{
background-color: {bg_color};
}}
/* Верхняя панель */ /* Верхняя панель */
#TopBar {{ #TopBar {
background-color: {top_bar_bg}; background-color: #f5f5f5;
border-bottom: 1px solid {top_bar_border}; border-bottom: 1px solid #e0e0e0;
}} }
#BurgerMenuButton {{ #BurgerMenuButton {
font-size: 24px; font-size: 24px;
border: none; border: none;
padding: 5px; padding: 5px;
color: {title_color}; }
}} #TitleLabel {
#TitleLabel {{
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
color: {title_color}; }
}}
/* Нижняя панель */ /* Нижняя панель */
#BottomBar {{ #BottomBar {
background-color: {bar_bg_color}; background-color: #f5f5f5;
border-top: 1px solid {bar_border_color}; border-top: 1px solid #e0e0e0;
padding-top: 5px; }
padding-bottom: 15px;
}}
/* Кнопки вкладок */ /* Кнопки вкладок */
#TabButton {{ #TabButton {
background-color: transparent; background-color: transparent;
border: none; border: none;
padding: 5px; padding: 5px;
}} color: #888;
#TabButton #TabIcon {{ color: {text_color}; }} }
#TabButton #TabText {{ color: {text_color}; }} #TabButton[selected="true"] #TabText {
color: #007AFF; /* Яркий синий для активной вкладки */
#TabButton[selected="true"] #TabIcon, }
#TabButton[selected="true"] #TabText {{ #TabButton[selected="true"] #TabIcon {
color: {active_color}; color: #007AFF;
}} }
#TabIcon {{ font-size: 22px; }} #TabIcon { font-size: 22px; }
#TabText {{ font-size: 12px; }} #TabText { font-size: 12px; }
/* Центральная кнопка "Создать" */ /* Центральная кнопка "Создать" */
#CreateButton {{ #CreateButton {
background-color: #007AFF;
color: white; color: white;
font-size: 30px; font-size: 24px;
font-weight: 300; font-weight: bold;
border: none; border: none;
border-radius: 28px; border-radius: 25px; /* Делает ее круглой */
background-color: qlineargradient( }
x1: 0, y1: 0, x2: 0, y2: 1, #CreateButton:hover {
stop: 0 #007AFF, stop: 1 #0056b3 background-color: #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
);
}}
""" """