patch home
This commit is contained in:
parent
9d995480a6
commit
4102c73124
@ -5,6 +5,8 @@ from PySide6.QtWidgets import (
|
||||
from PySide6.QtCore import Qt, QSize
|
||||
from PySide6.QtGui import QIcon, QColor
|
||||
|
||||
from app.core.theme import theme_manager
|
||||
|
||||
class YobbleHomeView(QWidget):
|
||||
def __init__(self, username: str):
|
||||
super().__init__()
|
||||
@ -17,33 +19,39 @@ class YobbleHomeView(QWidget):
|
||||
main_layout.setSpacing(0)
|
||||
|
||||
# 1. Верхняя панель
|
||||
top_bar = self.create_top_bar()
|
||||
main_layout.addWidget(top_bar)
|
||||
self.top_bar = self.create_top_bar()
|
||||
main_layout.addWidget(self.top_bar)
|
||||
|
||||
# 2. Центральная область контента
|
||||
self.content_stack = QStackedWidget()
|
||||
self.setup_content_pages()
|
||||
main_layout.addWidget(self.content_stack, 1) # Растягиваем контент
|
||||
main_layout.addWidget(self.content_stack, 1)
|
||||
|
||||
# 3. Нижняя панель навигации
|
||||
bottom_bar = self.create_bottom_bar()
|
||||
main_layout.addWidget(bottom_bar)
|
||||
self.bottom_bar = self.create_bottom_bar()
|
||||
main_layout.addWidget(self.bottom_bar)
|
||||
|
||||
self.update_styles() # Применяем стили при инициализации
|
||||
|
||||
# Подключаемся к сигналу смены темы
|
||||
theme_manager.theme_changed.connect(self.update_styles)
|
||||
|
||||
def update_styles(self):
|
||||
"""Обновляет стили компонента при смене темы."""
|
||||
self.setStyleSheet(self.get_stylesheet())
|
||||
|
||||
def create_top_bar(self):
|
||||
"""Создает верхнюю панель с меню и заголовком."""
|
||||
top_bar_widget = QWidget()
|
||||
top_bar_widget.setObjectName("TopBar")
|
||||
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 = QLabel("Чаты")
|
||||
self.title_label.setObjectName("TitleLabel")
|
||||
top_bar_layout.addWidget(self.title_label)
|
||||
top_bar_layout.addStretch()
|
||||
@ -59,30 +67,25 @@ class YobbleHomeView(QWidget):
|
||||
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) # Чаты по умолчанию
|
||||
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)
|
||||
@ -107,124 +110,124 @@ class YobbleHomeView(QWidget):
|
||||
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):
|
||||
if not hasattr(self, 'bottom_bar'): return
|
||||
|
||||
for button in self.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.setProperty("selected", button.property("tab_index") == selected_index)
|
||||
button.style().unpolish(button)
|
||||
button.style().polish(button)
|
||||
|
||||
def get_stylesheet(self):
|
||||
"""Возвращает QSS стили для компонента."""
|
||||
return """
|
||||
YobbleHomeView {
|
||||
background-color: white;
|
||||
}
|
||||
"""Возвращает QSS стили для компонента в зависимости от темы."""
|
||||
is_dark = theme_manager.is_dark()
|
||||
|
||||
# Цветовая палитра
|
||||
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 {
|
||||
background-color: #f5f5f5;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
}
|
||||
#BurgerMenuButton {
|
||||
#TopBar {{
|
||||
background-color: {top_bar_bg};
|
||||
border-bottom: 1px solid {top_bar_border};
|
||||
}}
|
||||
#BurgerMenuButton {{
|
||||
font-size: 24px;
|
||||
border: none;
|
||||
padding: 5px;
|
||||
}
|
||||
#TitleLabel {
|
||||
color: {title_color};
|
||||
}}
|
||||
#TitleLabel {{
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
color: {title_color};
|
||||
}}
|
||||
|
||||
/* Нижняя панель */
|
||||
#BottomBar {
|
||||
background-color: #f8f8f8;
|
||||
border-top: 1px solid #e7e7e7;
|
||||
#BottomBar {{
|
||||
background-color: {bar_bg_color};
|
||||
border-top: 1px solid {bar_border_color};
|
||||
padding-top: 5px;
|
||||
padding-bottom: 15px; /* Место для тени и отступа */
|
||||
}
|
||||
padding-bottom: 15px;
|
||||
}}
|
||||
|
||||
/* Кнопки вкладок */
|
||||
#TabButton {
|
||||
#TabButton {{
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
padding: 5px;
|
||||
}
|
||||
#TabButton #TabIcon { color: #888888; }
|
||||
#TabButton #TabText { color: #888888; }
|
||||
}}
|
||||
#TabButton #TabIcon {{ color: {text_color}; }}
|
||||
#TabButton #TabText {{ color: {text_color}; }}
|
||||
|
||||
#TabButton[selected="true"] #TabIcon,
|
||||
#TabButton[selected="true"] #TabText {
|
||||
color: #007AFF;
|
||||
}
|
||||
#TabIcon { font-size: 22px; }
|
||||
#TabText { font-size: 12px; }
|
||||
#TabButton[selected="true"] #TabText {{
|
||||
color: {active_color};
|
||||
}}
|
||||
#TabIcon {{ font-size: 22px; }}
|
||||
#TabText {{ font-size: 12px; }}
|
||||
|
||||
/* Центральная кнопка "Создать" */
|
||||
#CreateButton {
|
||||
#CreateButton {{
|
||||
color: white;
|
||||
font-size: 30px;
|
||||
font-weight: 300;
|
||||
border: none;
|
||||
border-radius: 28px; /* 56px / 2 */
|
||||
border-radius: 28px;
|
||||
background-color: qlineargradient(
|
||||
x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 #007AFF, stop: 1 #0056b3
|
||||
);
|
||||
/* "Приподнимаем" кнопку */
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
#CreateButton:hover {
|
||||
}}
|
||||
#CreateButton:hover {{
|
||||
background-color: qlineargradient(
|
||||
x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 #0088FF, stop: 1 #0066c3
|
||||
);
|
||||
}
|
||||
#CreateButton:pressed {
|
||||
}}
|
||||
#CreateButton:pressed {{
|
||||
background-color: qlineargradient(
|
||||
x1: 0, y1: 0, x2: 0, y2: 1,
|
||||
stop: 0 #0056b3, stop: 1 #004493
|
||||
);
|
||||
}
|
||||
"""
|
||||
}}
|
||||
"""
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user