Cockatrice 2026-10-19-Development-3.1.2-beta.2
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
user_info_popup.h
Go to the documentation of this file.
1#ifndef COCKATRICE_USER_INFO_POPUP_H
2#define COCKATRICE_USER_INFO_POPUP_H
3
4#include "user_list_painter.h"
5
6#include <QColor>
7#include <QFrame>
8#include <QPalette>
9#include <QPixmap>
10#include <QString>
11#include <QWidget>
12#include <functional>
13#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
14#include <qnamespace.h>
15#include <qtmetamacros.h>
16#include <utility>
17
18class AbstractClient;
19class QLabel;
20class QPushButton;
21class TabSupervisor;
22class QListView;
23class QPoint;
24class QStandardItemModel;
25class Response;
26template <class Key, class T> class QMap;
27
28// ── Roles ─────────────────────────────────────────────────────────────────────
29
30namespace PopupRoles
31{
32constexpr int GameData = Qt::UserRole + 10;
33}
34
35// Popup theme
36
43{
44 bool dark = false;
45 QColor bg;
46 QColor border;
47 QColor text;
48 QColor subText;
49 QColor buttonBg;
54 QColor closeBg;
55 QColor closeHover;
56 QColor gamesRow;
59 QColor statusText;
60
61 static PopupTheme fromPalette(const QPalette &palette, bool dark);
62};
63
64// ── Header widget ─────────────────────────────────────────────────────────────
65
76class UserInfoHeaderWidget : public QWidget
77{
78 Q_OBJECT
79
80 static constexpr int HeaderHeight = 130;
81 static constexpr int AvatarSize = 68;
82 static constexpr int AvatarPawnSize = 46;
83 static constexpr int LeftPad = 14;
84 static constexpr int AvatarToTextGap = 10;
85
86public:
87 explicit UserInfoHeaderWidget(QWidget *parent = nullptr);
88
89 void setUserData(const ServerInfo_User &_user,
90 bool _online,
91 const QPixmap &_avatar,
92 const QPixmap &_cardArt,
93 const CardArtParams &_params);
94
95protected:
96 void paintEvent(QPaintEvent *e) override;
97
98private:
100 bool online = false;
101 QPixmap avatar;
102 QPixmap cardArt;
104 QString attribution;
105};
106
107// ── Main popup ────────────────────────────────────────────────────────────────
108
125class UserInfoPopup : public QFrame
126{
127 Q_OBJECT
128
129 static constexpr int PopupWidth = 316;
130
131public:
132 explicit UserInfoPopup(TabSupervisor *_ts,
133 AbstractClient *_client,
134 const QMap<QString, QPixmap> *_avatarCache,
135 const QMap<QString, QPixmap> *_cardArtCache,
136 const QMap<QString, CardArtParams> *_cardArtParamsMap,
137 QWidget *parent);
138
143 void
144 showForUser(const QString &userName, const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored);
145 void fetchGames();
146
147 [[nodiscard]] QString getCurrentUser() const
148 {
149 return currentUser;
150 }
151
153 void updateActionButtons(const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored);
154
156 void refreshHeader();
157
164 void setGameInviteAvailable(std::function<bool(const QString &userName)> available)
165 {
166 gameInviteAvailable = std::move(available);
167 }
168
169signals:
173
175 void joinGameRequested(int gameId, int roomId, bool asSpectator);
176
177 // ── Action signals — connect to UserContextMenu::exec*() ──────────────────
178 void chatRequested(const QString &userName);
179 void inviteRequested(const QString &userName);
180 void detailsRequested(const QString &userName);
181 void showGamesRequested(const QString &userName);
182 void addBuddyRequested(const QString &userName);
183 void removeBuddyRequested(const QString &userName);
184 void addIgnoreRequested(const QString &userName);
185 void removeIgnoreRequested(const QString &userName);
186 void banRequested(const QString &userName);
187 void warnRequested(const QString &userName);
188 void banHistoryRequested(const QString &userName);
189 void warnHistoryRequested(const QString &userName);
190 void adminNotesRequested(const QString &userName);
191 void promoteToModRequested(const QString &userName);
192 void demoteFromModRequested(const QString &userName);
193 void promoteToJudgeRequested(const QString &userName);
194 void demoteFromJudgeRequested(const QString &userName);
195
196protected:
197 void enterEvent(QEnterEvent *e) override;
198 void leaveEvent(QEvent *e) override;
199
200private slots:
201 void refreshGames();
202 void onGamesReceived(const Response &r, const QString &forUser);
203 void onGamesContextMenu(const QPoint &pos);
204
205private:
206 void buildUi();
207 void applyTheme();
208 void rebuildActionButtons(const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored);
209
215
217
218 QString currentUser;
220 bool currentOnline = false;
221 std::function<bool(const QString &userName)> gameInviteAvailable;
222
224 QWidget *actionArea;
225 QLabel *gamesLabel;
226 QFrame *separator;
227 QListView *gamesView;
228 QStandardItemModel *gamesModel;
229 QLabel *gamesStatus;
230 QPushButton *closeBtn;
231 QPushButton *refreshBtn;
232};
233
234#endif // COCKATRICE_USER_INFO_POPUP_H
Definition abstract_client.h:73
Definition game.h:18
Definition tab_supervisor.h:92
Paints the enlarged banner card art + circular avatar section at the top of the UserInfoPopup.
Definition user_info_popup.h:77
bool online
Definition user_info_popup.h:100
static constexpr int AvatarToTextGap
Definition user_info_popup.h:84
static constexpr int HeaderHeight
Definition user_info_popup.h:80
void setUserData(const ServerInfo_User &_user, bool _online, const QPixmap &_avatar, const QPixmap &_cardArt, const CardArtParams &_params)
Definition user_info_popup.cpp:180
QPixmap cardArt
Definition user_info_popup.h:102
static constexpr int AvatarSize
Definition user_info_popup.h:81
CardArtParams params
Definition user_info_popup.h:103
UserInfoHeaderWidget(QWidget *parent=nullptr)
Definition user_info_popup.cpp:174
static constexpr int AvatarPawnSize
Definition user_info_popup.h:82
static constexpr int LeftPad
Definition user_info_popup.h:83
void paintEvent(QPaintEvent *e) override
Definition user_info_popup.cpp:204
QPixmap avatar
Definition user_info_popup.h:101
QString attribution
Definition user_info_popup.h:104
ServerInfo_User user
Definition user_info_popup.h:99
QString getCurrentUser() const
Definition user_info_popup.h:147
QLabel * gamesStatus
Definition user_info_popup.h:229
void warnHistoryRequested(const QString &userName)
QFrame * separator
Definition user_info_popup.h:226
void warnRequested(const QString &userName)
QString currentUser
Definition user_info_popup.h:218
void setGameInviteAvailable(std::function< bool(const QString &userName)> available)
Definition user_info_popup.h:164
ServerInfo_User currentUserInfo
Definition user_info_popup.h:219
std::function< bool(const QString &userName)> gameInviteAvailable
Definition user_info_popup.h:221
void enterEvent(QEnterEvent *e) override
Definition user_info_popup.cpp:814
const QMap< QString, CardArtParams > * cardArtParamsMap
Definition user_info_popup.h:214
QListView * gamesView
Definition user_info_popup.h:227
bool currentOnline
Definition user_info_popup.h:220
static constexpr int PopupWidth
Definition user_info_popup.h:129
QStandardItemModel * gamesModel
Definition user_info_popup.h:228
void banHistoryRequested(const QString &userName)
void applyTheme()
Definition user_info_popup.cpp:463
const QMap< QString, QPixmap > * avatarCache
Definition user_info_popup.h:212
UserInfoPopup(TabSupervisor *_ts, AbstractClient *_client, const QMap< QString, QPixmap > *_avatarCache, const QMap< QString, QPixmap > *_cardArtCache, const QMap< QString, CardArtParams > *_cardArtParamsMap, QWidget *parent)
Definition user_info_popup.cpp:383
void leaveEvent(QEvent *e) override
Definition user_info_popup.cpp:819
void onGamesContextMenu(const QPoint &pos)
Definition user_info_popup.cpp:653
void refreshGames()
Definition user_info_popup.cpp:803
QLabel * gamesLabel
Definition user_info_popup.h:225
AbstractClient * client
Definition user_info_popup.h:211
void onGamesReceived(const Response &r, const QString &forUser)
Definition user_info_popup.cpp:759
void refreshHeader()
Definition user_info_popup.cpp:696
void removeIgnoreRequested(const QString &userName)
void buildUi()
Definition user_info_popup.cpp:403
QPushButton * refreshBtn
Definition user_info_popup.h:231
PopupTheme theme
Definition user_info_popup.h:216
UserInfoHeaderWidget * header
Definition user_info_popup.h:223
QPushButton * closeBtn
Definition user_info_popup.h:230
void chatRequested(const QString &userName)
void banRequested(const QString &userName)
void inviteRequested(const QString &userName)
void updateActionButtons(const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored)
Definition user_info_popup.cpp:647
void demoteFromJudgeRequested(const QString &userName)
void promoteToModRequested(const QString &userName)
void adminNotesRequested(const QString &userName)
void detailsRequested(const QString &userName)
void demoteFromModRequested(const QString &userName)
void addIgnoreRequested(const QString &userName)
void mouseLeftPopup()
TabSupervisor * ts
Definition user_info_popup.h:210
void fetchGames()
Definition user_info_popup.cpp:743
void showForUser(const QString &userName, const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored)
Definition user_info_popup.cpp:711
void mouseEnteredPopup()
void joinGameRequested(int gameId, int roomId, bool asSpectator)
void removeBuddyRequested(const QString &userName)
QWidget * actionArea
rebuilt per user
Definition user_info_popup.h:224
void addBuddyRequested(const QString &userName)
const QMap< QString, QPixmap > * cardArtCache
Definition user_info_popup.h:213
void promoteToJudgeRequested(const QString &userName)
void showGamesRequested(const QString &userName)
void closeRequested()
void rebuildActionButtons(const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored)
Definition user_info_popup.cpp:522
Definition user_info_popup.h:31
constexpr int GameData
Definition user_info_popup.h:32
Definition user_list_painter.h:23
Definition user_info_popup.h:43
QColor gamesSeparator
Definition user_info_popup.h:58
QColor closeBg
Definition user_info_popup.h:54
static PopupTheme fromPalette(const QPalette &palette, bool dark)
Definition user_info_popup.cpp:69
QColor buttonHover
Definition user_info_popup.h:51
QColor bg
Definition user_info_popup.h:45
QColor gamesSelected
Definition user_info_popup.h:57
QColor statusText
Definition user_info_popup.h:59
QColor buttonDisabled
Definition user_info_popup.h:53
QColor buttonBorder
Definition user_info_popup.h:50
QColor border
Definition user_info_popup.h:46
QColor buttonPressed
Definition user_info_popup.h:52
QColor gamesRow
Definition user_info_popup.h:56
bool dark
Definition user_info_popup.h:44
QColor buttonBg
Definition user_info_popup.h:49
QColor closeHover
Definition user_info_popup.h:55
QColor subText
Definition user_info_popup.h:48
QColor text
Definition user_info_popup.h:47
Definition response.proto:11
Definition serverinfo_user.proto:2