profile patch
This commit is contained in:
parent
a38f39ca63
commit
705d96511d
46
app/ui/views/profile_view.py
Normal file
46
app/ui/views/profile_view.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
from PySide6.QtCore import Qt, Signal
|
||||||
|
from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout, QScrollArea
|
||||||
|
|
||||||
|
|
||||||
|
class ProfileView(QWidget):
|
||||||
|
start_chat_clicked = Signal(dict) # payload with user data
|
||||||
|
follow_clicked = Signal(dict)
|
||||||
|
|
||||||
|
def __init__(self, user: dict, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.user = user or {}
|
||||||
|
|
||||||
|
root = QVBoxLayout(self)
|
||||||
|
root.setContentsMargins(16, 12, 16, 12)
|
||||||
|
root.setSpacing(8)
|
||||||
|
|
||||||
|
# Header info
|
||||||
|
login = self.user.get("login") or "user"
|
||||||
|
full_name = self.user.get("full_name") or self.user.get("custom_name") or ""
|
||||||
|
bio = (self.user.get("profile") or {}).get("bio") if isinstance(self.user.get("profile"), dict) else None
|
||||||
|
|
||||||
|
self.login_label = QLabel(f"@{login}")
|
||||||
|
self.login_label.setObjectName("ProfileLogin")
|
||||||
|
self.name_label = QLabel(full_name)
|
||||||
|
self.name_label.setObjectName("ProfileName")
|
||||||
|
|
||||||
|
root.addWidget(self.login_label)
|
||||||
|
if full_name:
|
||||||
|
root.addWidget(self.name_label)
|
||||||
|
|
||||||
|
if bio:
|
||||||
|
bio_label = QLabel(str(bio))
|
||||||
|
bio_label.setWordWrap(True)
|
||||||
|
root.addWidget(bio_label)
|
||||||
|
|
||||||
|
# Actions
|
||||||
|
actions = QHBoxLayout()
|
||||||
|
self.message_btn = QPushButton("Написать сообщение")
|
||||||
|
self.follow_btn = QPushButton("Подписаться")
|
||||||
|
actions.addWidget(self.message_btn)
|
||||||
|
actions.addWidget(self.follow_btn)
|
||||||
|
root.addLayout(actions)
|
||||||
|
|
||||||
|
self.message_btn.clicked.connect(lambda: self.start_chat_clicked.emit(self.user))
|
||||||
|
self.follow_btn.clicked.connect(lambda: self.follow_clicked.emit(self.user))
|
||||||
|
|
||||||
@ -39,7 +39,17 @@ class SearchResultsView(QWidget):
|
|||||||
for u in users:
|
for u in users:
|
||||||
title = u.login
|
title = u.login
|
||||||
subtitle = u.full_name or u.custom_name or "Пользователь"
|
subtitle = u.full_name or u.custom_name or "Пользователь"
|
||||||
self._add_chat_like_item(title, subtitle, timestamp="", payload={"type": "user", "user_id": str(u.user_id)})
|
payload = {
|
||||||
|
"type": "user",
|
||||||
|
"user": {
|
||||||
|
"user_id": str(u.user_id),
|
||||||
|
"login": u.login,
|
||||||
|
"full_name": getattr(u, 'full_name', None),
|
||||||
|
"custom_name": getattr(u, 'custom_name', None),
|
||||||
|
"profile": getattr(u, 'profile', None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self._add_chat_like_item(title, subtitle, timestamp="", payload=payload)
|
||||||
|
|
||||||
# Groups
|
# Groups
|
||||||
groups = groups
|
groups = groups
|
||||||
|
|||||||
@ -14,6 +14,7 @@ from app.core.dialogs import show_themed_messagebox
|
|||||||
from app.ui.views.side_menu_view import SideMenuView
|
from app.ui.views.side_menu_view import SideMenuView
|
||||||
from app.ui.views.chat_list_view import ChatListView
|
from app.ui.views.chat_list_view import ChatListView
|
||||||
from app.ui.views.search_results_view import SearchResultsView
|
from app.ui.views.search_results_view import SearchResultsView
|
||||||
|
from app.ui.views.profile_view import ProfileView
|
||||||
from app.core.services.auth_service import get_user_role
|
from app.core.services.auth_service import get_user_role
|
||||||
from app.core.database import get_current_access_token
|
from app.core.database import get_current_access_token
|
||||||
from app.core.localizer import localizer
|
from app.core.localizer import localizer
|
||||||
@ -252,7 +253,7 @@ class YobbleHomeView(QWidget):
|
|||||||
self.back_button.setObjectName("BackButton")
|
self.back_button.setObjectName("BackButton")
|
||||||
self.back_button.setFocusPolicy(Qt.NoFocus)
|
self.back_button.setFocusPolicy(Qt.NoFocus)
|
||||||
self.back_button.setCursor(Qt.PointingHandCursor)
|
self.back_button.setCursor(Qt.PointingHandCursor)
|
||||||
self.back_button.clicked.connect(self.close_chat_view)
|
self.back_button.clicked.connect(self.on_back_clicked)
|
||||||
self.back_button.hide()
|
self.back_button.hide()
|
||||||
top_bar_layout.addWidget(self.back_button)
|
top_bar_layout.addWidget(self.back_button)
|
||||||
|
|
||||||
@ -414,6 +415,7 @@ class YobbleHomeView(QWidget):
|
|||||||
# Страница результатов поиска
|
# Страница результатов поиска
|
||||||
self.search_results_view = SearchResultsView()
|
self.search_results_view = SearchResultsView()
|
||||||
self.content_stack.addWidget(self.search_results_view)
|
self.content_stack.addWidget(self.search_results_view)
|
||||||
|
self.search_results_view.result_selected.connect(self.on_search_result_selected)
|
||||||
|
|
||||||
def update_chat_list(self, chat_data):
|
def update_chat_list(self, chat_data):
|
||||||
"""
|
"""
|
||||||
@ -714,6 +716,7 @@ class YobbleHomeView(QWidget):
|
|||||||
groups_cnt = len(getattr(data, 'groups', []) or [])
|
groups_cnt = len(getattr(data, 'groups', []) or [])
|
||||||
channels_cnt = len(getattr(data, 'channels', []) or [])
|
channels_cnt = len(getattr(data, 'channels', []) or [])
|
||||||
messages_cnt = len(getattr(data, 'messages', []) or [])
|
messages_cnt = len(getattr(data, 'messages', []) or [])
|
||||||
|
print("data", data)
|
||||||
# self.show_notification(localizer.translate(
|
# self.show_notification(localizer.translate(
|
||||||
# f"Найдено: пользователи {users_cnt}, беседы {groups_cnt}, паблики {channels_cnt}, сообщения {messages_cnt}"
|
# f"Найдено: пользователи {users_cnt}, беседы {groups_cnt}, паблики {channels_cnt}, сообщения {messages_cnt}"
|
||||||
# ))
|
# ))
|
||||||
@ -728,6 +731,37 @@ class YobbleHomeView(QWidget):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def on_search_result_selected(self, payload: dict):
|
||||||
|
t = (payload or {}).get("type")
|
||||||
|
if t == "user":
|
||||||
|
user = (payload or {}).get("user") or {}
|
||||||
|
return self.open_profile_view(user)
|
||||||
|
# TODO: handle group/channel/message
|
||||||
|
|
||||||
|
def open_profile_view(self, user: dict):
|
||||||
|
try:
|
||||||
|
self.profile_view = ProfileView(user)
|
||||||
|
self.bottom_bar.hide()
|
||||||
|
self.burger_menu_button.hide()
|
||||||
|
self.back_button.show()
|
||||||
|
self.content_stack.addWidget(self.profile_view)
|
||||||
|
self.content_stack.setCurrentWidget(self.profile_view)
|
||||||
|
except Exception as e:
|
||||||
|
self.show_notification(str(e), is_error=True)
|
||||||
|
|
||||||
|
def close_profile_view(self):
|
||||||
|
self.content_stack.setCurrentWidget(self.search_results_view)
|
||||||
|
self.bottom_bar.show()
|
||||||
|
self.burger_menu_button.show()
|
||||||
|
self.back_button.hide()
|
||||||
|
if hasattr(self, 'profile_view') and self.profile_view:
|
||||||
|
try:
|
||||||
|
self.content_stack.removeWidget(self.profile_view)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
self.profile_view.deleteLater()
|
||||||
|
self.profile_view = None
|
||||||
|
|
||||||
def handle_notification_click(self):
|
def handle_notification_click(self):
|
||||||
"""Пустышка для кнопки уведомлений."""
|
"""Пустышка для кнопки уведомлений."""
|
||||||
show_themed_messagebox(
|
show_themed_messagebox(
|
||||||
@ -737,6 +771,14 @@ class YobbleHomeView(QWidget):
|
|||||||
"🔔 Центр уведомлений пока в разработке."
|
"🔔 Центр уведомлений пока в разработке."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def on_back_clicked(self):
|
||||||
|
if getattr(self, 'profile_view', None):
|
||||||
|
self.close_profile_view()
|
||||||
|
return
|
||||||
|
if getattr(self, 'chat_view', None):
|
||||||
|
self.close_chat_view()
|
||||||
|
return
|
||||||
|
|
||||||
def get_stylesheet(self):
|
def get_stylesheet(self):
|
||||||
"""Возвращает QSS стили для компонента в зависимости от темы."""
|
"""Возвращает QSS стили для компонента в зависимости от темы."""
|
||||||
is_dark = theme_manager.is_dark()
|
is_dark = theme_manager.is_dark()
|
||||||
|
|||||||
Reference in New Issue
Block a user