Cockatrice 2026-09-01-Development-3.1.0-beta.10
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 "../../interface/widgets/server/game_type_map.h"
5#include "user_list_painter.h"
6
7#include <QFrame>
8#include <QListView>
9#include <QMap>
10#include <QPixmap>
11#include <QStandardItemModel>
12#include <functional>
14#include <libcockatrice/protocol/pb/response.pb.h>
15#include <libcockatrice/protocol/pb/serverinfo_game.pb.h>
16#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
17
18class AbstractClient;
19class QLabel;
20class QPushButton;
21class TabSupervisor;
22
23// ── Roles ─────────────────────────────────────────────────────────────────────
24
25namespace PopupRoles
26{
27constexpr int GameData = Qt::UserRole + 10;
28}
29
30// Popup theme
31
38{
39 bool dark = false;
40 QColor bg;
41 QColor border;
42 QColor text;
43 QColor subText;
44 QColor buttonBg;
49 QColor closeBg;
50 QColor closeHover;
51 QColor gamesRow;
54 QColor statusText;
55
56 static PopupTheme fromPalette(const QPalette &palette, bool dark);
57};
58
59// ── Header widget ─────────────────────────────────────────────────────────────
60
71class UserInfoHeaderWidget : public QWidget
72{
73 Q_OBJECT
74
75 static constexpr int HeaderHeight = 130;
76 static constexpr int AvatarSize = 68;
77 static constexpr int AvatarPawnSize = 46;
78 static constexpr int LeftPad = 14;
79 static constexpr int AvatarToTextGap = 10;
80
81public:
82 explicit UserInfoHeaderWidget(QWidget *parent = nullptr);
83
84 void setUserData(const ServerInfo_User &_user,
85 bool _online,
86 const QPixmap &_avatar,
87 const QPixmap &_cardArt,
88 const CardArtParams &_params);
89
90protected:
91 void paintEvent(QPaintEvent *e) override;
92
93private:
95 bool online = false;
96 QPixmap avatar;
97 QPixmap cardArt;
99 QString attribution;
100};
101
102// ── Main popup ────────────────────────────────────────────────────────────────
103
120class UserInfoPopup : public QFrame
121{
122 Q_OBJECT
123
124 static constexpr int PopupWidth = 316;
125
126public:
127 explicit UserInfoPopup(TabSupervisor *_ts,
128 AbstractClient *_client,
129 const QMap<QString, QPixmap> *_avatarCache,
130 const QMap<QString, QPixmap> *_cardArtCache,
131 const QMap<QString, CardArtParams> *_cardArtParamsMap,
132 QWidget *parent);
133
138 void
139 showForUser(const QString &userName, const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored);
140 void fetchGames();
141
142 [[nodiscard]] QString getCurrentUser() const
143 {
144 return currentUser;
145 }
146
148 void updateActionButtons(const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored);
149
151 void refreshHeader();
152
159 void setGameInviteAvailable(std::function<bool(const QString &userName)> available)
160 {
161 gameInviteAvailable = std::move(available);
162 }
163
164signals:
168
170 void joinGameRequested(int gameId, int roomId, bool asSpectator);
171
172 // ── Action signals — connect to UserContextMenu::exec*() ──────────────────
173 void chatRequested(const QString &userName);
174 void inviteRequested(const QString &userName);
175 void detailsRequested(const QString &userName);
176 void showGamesRequested(const QString &userName);
177 void addBuddyRequested(const QString &userName);
178 void removeBuddyRequested(const QString &userName);
179 void addIgnoreRequested(const QString &userName);
180 void removeIgnoreRequested(const QString &userName);
181 void banRequested(const QString &userName);
182 void warnRequested(const QString &userName);
183 void banHistoryRequested(const QString &userName);
184 void warnHistoryRequested(const QString &userName);
185 void adminNotesRequested(const QString &userName);
186 void promoteToModRequested(const QString &userName);
187 void demoteFromModRequested(const QString &userName);
188 void promoteToJudgeRequested(const QString &userName);
189 void demoteFromJudgeRequested(const QString &userName);
190
191protected:
192 void enterEvent(QEnterEvent *e) override;
193 void leaveEvent(QEvent *e) override;
194
195private slots:
196 void refreshGames();
197 void onGamesReceived(const Response &r, const QString &forUser);
198 void onGamesContextMenu(const QPoint &pos);
199
200private:
201 void buildUi();
202 void applyTheme();
203 void rebuildActionButtons(const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored);
204
207 const QMap<QString, QPixmap> *avatarCache;
208 const QMap<QString, QPixmap> *cardArtCache;
209 const QMap<QString, CardArtParams> *cardArtParamsMap;
210
212
213 QString currentUser;
215 bool currentOnline = false;
216 std::function<bool(const QString &userName)> gameInviteAvailable;
217
219 QWidget *actionArea;
220 QLabel *gamesLabel;
221 QFrame *separator;
222 QListView *gamesView;
223 QStandardItemModel *gamesModel;
224 QLabel *gamesStatus;
225 QPushButton *closeBtn;
226 QPushButton *refreshBtn;
227};
228
229#endif // COCKATRICE_USER_INFO_POPUP_H
Definition abstract_client.h:57
Definition tab_supervisor.h:84
Paints the enlarged banner card art + circular avatar section at the top of the UserInfoPopup.
Definition user_info_popup.h:72
bool online
Definition user_info_popup.h:95
static constexpr int AvatarToTextGap
Definition user_info_popup.h:79
static constexpr int HeaderHeight
Definition user_info_popup.h:75
void setUserData(const ServerInfo_User &_user, bool _online, const QPixmap &_avatar, const QPixmap &_cardArt, const CardArtParams &_params)
Definition user_info_popup.cpp:145
QPixmap cardArt
Definition user_info_popup.h:97
static constexpr int AvatarSize
Definition user_info_popup.h:76
CardArtParams params
Definition user_info_popup.h:98
UserInfoHeaderWidget(QWidget *parent=nullptr)
Definition user_info_popup.cpp:139
static constexpr int AvatarPawnSize
Definition user_info_popup.h:77
static constexpr int LeftPad
Definition user_info_popup.h:78
void paintEvent(QPaintEvent *e) override
Definition user_info_popup.cpp:169
QPixmap avatar
Definition user_info_popup.h:96
QString attribution
Definition user_info_popup.h:99
ServerInfo_User user
Definition user_info_popup.h:94
QString getCurrentUser() const
Definition user_info_popup.h:142
QLabel * gamesStatus
Definition user_info_popup.h:224
void warnHistoryRequested(const QString &userName)
QFrame * separator
Definition user_info_popup.h:221
void warnRequested(const QString &userName)
QString currentUser
Definition user_info_popup.h:213
void setGameInviteAvailable(std::function< bool(const QString &userName)> available)
Definition user_info_popup.h:159
ServerInfo_User currentUserInfo
Definition user_info_popup.h:214
std::function< bool(const QString &userName)> gameInviteAvailable
Definition user_info_popup.h:216
void enterEvent(QEnterEvent *e) override
Definition user_info_popup.cpp:773
const QMap< QString, CardArtParams > * cardArtParamsMap
Definition user_info_popup.h:209
QListView * gamesView
Definition user_info_popup.h:222
bool currentOnline
Definition user_info_popup.h:215
static constexpr int PopupWidth
Definition user_info_popup.h:124
QStandardItemModel * gamesModel
Definition user_info_popup.h:223
void banHistoryRequested(const QString &userName)
void applyTheme()
Definition user_info_popup.cpp:423
const QMap< QString, QPixmap > * avatarCache
Definition user_info_popup.h:207
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:343
void leaveEvent(QEvent *e) override
Definition user_info_popup.cpp:778
void onGamesContextMenu(const QPoint &pos)
Definition user_info_popup.cpp:613
void refreshGames()
Definition user_info_popup.cpp:762
QLabel * gamesLabel
Definition user_info_popup.h:220
AbstractClient * client
Definition user_info_popup.h:206
void onGamesReceived(const Response &r, const QString &forUser)
Definition user_info_popup.cpp:718
void refreshHeader()
Definition user_info_popup.cpp:655
void removeIgnoreRequested(const QString &userName)
void buildUi()
Definition user_info_popup.cpp:363
QPushButton * refreshBtn
Definition user_info_popup.h:226
PopupTheme theme
Definition user_info_popup.h:211
UserInfoHeaderWidget * header
Definition user_info_popup.h:218
QPushButton * closeBtn
Definition user_info_popup.h:225
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:607
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:205
void fetchGames()
Definition user_info_popup.cpp:702
void showForUser(const QString &userName, const ServerInfo_User &userInfo, bool online, bool isBuddy, bool isIgnored)
Definition user_info_popup.cpp:670
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:219
void addBuddyRequested(const QString &userName)
const QMap< QString, QPixmap > * cardArtCache
Definition user_info_popup.h:208
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:482
Definition user_info_popup.h:26
constexpr int GameData
Definition user_info_popup.h:27
Definition user_list_painter.h:20
Definition user_info_popup.h:38
QColor gamesSeparator
Definition user_info_popup.h:53
QColor closeBg
Definition user_info_popup.h:49
static PopupTheme fromPalette(const QPalette &palette, bool dark)
Definition user_info_popup.cpp:34
QColor buttonHover
Definition user_info_popup.h:46
QColor bg
Definition user_info_popup.h:40
QColor gamesSelected
Definition user_info_popup.h:52
QColor statusText
Definition user_info_popup.h:54
QColor buttonDisabled
Definition user_info_popup.h:48
QColor buttonBorder
Definition user_info_popup.h:45
QColor border
Definition user_info_popup.h:41
QColor buttonPressed
Definition user_info_popup.h:47
QColor gamesRow
Definition user_info_popup.h:51
bool dark
Definition user_info_popup.h:39
QColor buttonBg
Definition user_info_popup.h:44
QColor closeHover
Definition user_info_popup.h:50
QColor subText
Definition user_info_popup.h:43
QColor text
Definition user_info_popup.h:42
Definition response.proto:11
Definition serverinfo_user.proto:2