Cockatrice 2026-09-01-Development-3.1.0-beta.10
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
user_list_widget.h
Go to the documentation of this file.
1
6
7#ifndef USERLIST_H
8#define USERLIST_H
9
11#include "../../interface/widgets/server/game_link.h"
14#include "user_info_popup.h"
15#include "user_list_manager.h"
16#include "user_list_painter.h"
17
18#include <QComboBox>
19#include <QGroupBox>
20#include <QSet>
21#include <QStyledItemDelegate>
22#include <QTextEdit>
23#include <QTreeWidgetItem>
24#include <functional>
26#include <libcockatrice/protocol/pb/moderator_commands.pb.h>
27
28class QTreeWidget;
29class ServerInfo_User;
30class AbstractClient;
31class TabSupervisor;
32class Response;
34class UserContextMenu;
35class UserListWidget;
36class QShowEvent;
37
38class UserListItemDelegate : public QStyledItemDelegate
39{
40 QTreeWidget *tree;
42 const QMap<QString, QPixmap> *avatarCache;
43 const QMap<QString, QPixmap> *cardArtCache;
44 const QMap<QString, CardArtParams> *cardArtParamsMap;
45
46public:
48 QTreeWidget *tree,
49 const QMap<QString, QPixmap> *avatarCache,
50 const QMap<QString, QPixmap> *cardArtCache,
51 const QMap<QString, CardArtParams> *cardArtParamsMap);
52 bool editorEvent(QEvent *event,
53 QAbstractItemModel *model,
54 const QStyleOptionViewItem &option,
55 const QModelIndex &index) override;
56 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
57 QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
58};
59
60class UserListTWI : public QTreeWidgetItem
61{
62private:
64
65public:
66 explicit UserListTWI(const ServerInfo_User &_userInfo);
68 {
69 return userInfo;
70 }
71 void setUserInfo(const ServerInfo_User &_userInfo);
72 void setOnline(bool online);
73 bool operator<(const QTreeWidgetItem &other) const override;
74};
75
76class UserListWidget : public QGroupBox
77{
78 Q_OBJECT
79public:
87 enum class Section
88 {
92 };
93
94private:
98 QMap<QString, CardArtParams> cardArtParamsMap;
99 // ── Hover popup ───────────────────────────────────────────────────────────
101 QTimer *showPopupTimer = nullptr;
102 QTimer *hidePopupTimer = nullptr;
103 QString hoveredUser;
104 bool popupPinned = false;
105 bool bulkLoading = false;
106 bool hasUserInfoPopup = true;
107 std::function<bool(const QString &userName, bool online)> userFilter;
108
114 void showPopupForUser(UserListTWI *item);
115 void hidePopup(bool immediate = false);
116 void positionPopup(UserListTWI *item);
117 void connectPopupSignals();
119 bool isPressInsideListUi(const QWidget *widget) const;
121 bool isItemNearViewport(const UserListTWI *item) const;
123
124 // Sectioned mode (single tree with inline dividers)
125 bool sectioned = false;
126 QList<Section> sectionIds;
127 QMap<Section, QTreeWidgetItem *> sectionItems;
128 // One row per (section, user): a user that is online AND a buddy appears in
129 // both the "Online" and the "Buddies" sections, so the same user can own
130 // several rows, each hanging off its section's divider.
131 QMap<Section, QMap<QString, UserListTWI *>> sectionUsers;
132 QSet<Section> expandedSections;
133 void createSectionItems();
134 QTreeWidgetItem *createSectionItem(Section section);
135 [[nodiscard]] QString sectionTitle(Section section) const;
136 void updateSectionDivider(Section section);
137 void handleSectionExpansion(QTreeWidgetItem *item, bool expanded);
138 void setExpandedProgrammatically(QTreeWidgetItem *item, bool expanded);
139 void handleOnlineChange(const ServerInfo_User &user);
140 void handleOnlineChangeLeft(const QString &userName);
141 void handleListAdd(Section section, const ServerInfo_User &user);
142 void handleListRemove(Section section, const QString &userName);
144 UserListTWI *ensureSectionMembership(Section section, const ServerInfo_User &user, bool online);
146 bool dropSectionMembership(Section section, const QString &userName);
149 void updateCardArtParams(const ServerInfo_User &user, const QString &userName);
150 void processUserInfo(Section section, const ServerInfo_User &user, bool online);
151
152 QMap<QString, UserListTWI *> users;
156 QTreeWidget *userTree = nullptr;
160 QString titleStr;
161 QString filterText;
162 bool showTitle = true;
163 void updateCount();
164 void applyFilter();
165 void refreshPopupButtons(const QString &userName);
166private slots:
167 void userClicked(QTreeWidgetItem *item, int column);
168 void refreshVisibleUserHeader(const QString &name);
169signals:
170 void openMessageDialog(const QString &userName, bool focus);
171 void addBuddy(const QString &userName);
172 void removeBuddy(const QString &userName);
173 void addIgnore(const QString &userName);
174 void removeIgnore(const QString &userName);
175 void joinGameRequested(int gameId, int roomId, bool asSpectator);
176 void sectionExpanded(Section section, bool expanded);
178 void userActivated(const QString &userName);
180 void currentUserChanged(const QString &userName);
183
184public:
185 UserListWidget(TabSupervisor *_tabSupervisor,
186 AbstractClient *_client,
187 UserListType _type,
188 QWidget *parent = nullptr,
189 bool hasUserInfoPopup = true);
190 ~UserListWidget() override;
191 void bind(UserListManager *mgr);
192 void applyDisplayMode();
193 void beginBulkLoad();
194 void endBulkLoad();
195 bool eventFilter(QObject *obj, QEvent *event) override;
196 void retranslateUi();
197 void rebuild();
198 void processUserInfo(const ServerInfo_User &user, bool online);
199 bool deleteUser(const QString &userName);
200 void setUserOnline(const QString &userName, bool online);
201 void setFilterText(const QString &text);
202 void setShowTitle(bool showTitle);
203 void setSectioned(const QList<Section> &ids);
204 void setSectionExpanded(Section section, bool expanded);
206 void setUserFilter(std::function<bool(const QString &userName, bool online)> filter)
207 {
208 userFilter = std::move(filter);
209 }
210 [[nodiscard]] int visibleUserRowCount() const;
211 [[nodiscard]] bool getHasUserInfoPopup() const
212 {
213 return hasUserInfoPopup;
214 }
215 [[nodiscard]] const QList<Section> &getSectionIds() const
216 {
217 return sectionIds;
218 }
219 [[nodiscard]] const QMap<QString, UserListTWI *> &getUsers() const
220 {
221 return users;
222 }
223 void showContextMenu(const QPoint &pos, const QModelIndex &index);
224 void sortItems();
225 void setGameInviteLinkProvider(std::function<QList<GameInviteOption>()> provider);
226
227protected:
228 void hideEvent(QHideEvent *e) override;
229 void showEvent(QShowEvent *e) override;
230};
231
232#endif
Definition abstract_client.h:57
Definition tab_supervisor.h:84
Definition user_avatar_provider.h:12
Definition user_card_art_provider.h:11
Definition user_context_menu.h:29
Floating panel showing an enlarged user card, quick action buttons, and a live scrollable games list.
Definition user_info_popup.h:121
Definition user_list_widget.h:39
UserListWidget * owner
Definition user_list_widget.h:41
const QMap< QString, QPixmap > * cardArtCache
Definition user_list_widget.h:43
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
Definition user_list_widget.cpp:69
const QMap< QString, QPixmap > * avatarCache
Definition user_list_widget.h:42
QTreeWidget * tree
Definition user_list_widget.h:40
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
Definition user_list_widget.cpp:40
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
Definition user_list_widget.cpp:58
UserListItemDelegate(UserListWidget *owner, QTreeWidget *tree, const QMap< QString, QPixmap > *avatarCache, const QMap< QString, QPixmap > *cardArtCache, const QMap< QString, CardArtParams > *cardArtParamsMap)
Definition user_list_widget.cpp:30
const QMap< QString, CardArtParams > * cardArtParamsMap
Definition user_list_widget.h:44
Definition user_list_manager.h:27
Definition user_list_widget.h:61
bool operator<(const QTreeWidgetItem &other) const override
Definition user_list_widget.cpp:227
void setOnline(bool online)
Definition user_list_widget.cpp:207
ServerInfo_User userInfo
Definition user_list_widget.h:63
void setUserInfo(const ServerInfo_User &_userInfo)
Definition user_list_widget.cpp:193
const ServerInfo_User & getUserInfo() const
Definition user_list_widget.h:67
UserListTWI(const ServerInfo_User &_userInfo)
Definition user_list_widget.cpp:188
Definition user_list_widget.h:77
const QMap< QString, UserListTWI * > & getUsers() const
Definition user_list_widget.h:219
UserListTWI * ensureSectionMembership(Section section, const ServerInfo_User &user, bool online)
Definition user_list_widget.cpp:1604
bool showTitle
Definition user_list_widget.h:162
UserCardArtProvider * cardArtProvider
Definition user_list_widget.h:97
void userClicked(QTreeWidgetItem *item, int column)
Definition user_list_widget.cpp:1325
~UserListWidget() override
Definition user_list_widget.cpp:482
void setGameInviteLinkProvider(std::function< QList< GameInviteOption >()> provider)
Definition user_list_widget.cpp:1686
QString filterText
Definition user_list_widget.h:161
QTreeWidget * userTree
Definition user_list_widget.h:156
UserAvatarProvider * avatarProvider
Definition user_list_widget.h:96
QTimer * hidePopupTimer
Definition user_list_widget.h:102
bool getHasUserInfoPopup() const
Definition user_list_widget.h:211
void setExpandedProgrammatically(QTreeWidgetItem *item, bool expanded)
Definition user_list_widget.cpp:1526
void currentUserChanged(const QString &userName)
void createSectionItems()
Definition user_list_widget.cpp:1424
void handleListRemove(Section section, const QString &userName)
Definition user_list_widget.cpp:1595
QString sectionTitle(Section section) const
Definition user_list_widget.cpp:1459
void bind(UserListManager *mgr)
Definition user_list_widget.cpp:487
UserListWidget(TabSupervisor *_tabSupervisor, AbstractClient *_client, UserListType _type, QWidget *parent=nullptr, bool hasUserInfoPopup=true)
Definition user_list_widget.cpp:272
Section
Definition user_list_widget.h:88
@ Online
Definition user_list_widget.h:90
@ Buddy
Definition user_list_widget.h:89
@ Ignore
Definition user_list_widget.h:91
void handleSectionExpansion(QTreeWidgetItem *item, bool expanded)
Definition user_list_widget.cpp:1502
void applyFilter()
Definition user_list_widget.cpp:1268
TabSupervisor * tabSupervisor
Definition user_list_widget.h:153
bool dropSectionMembership(Section section, const QString &userName)
Definition user_list_widget.cpp:1646
UserListManager * manager
Definition user_list_widget.h:95
QMap< QString, CardArtParams > cardArtParamsMap
Definition user_list_widget.h:98
UserListType type
Definition user_list_widget.h:155
void connectPopupSignals()
Definition user_list_widget.cpp:655
bool hasUserInfoPopup
Definition user_list_widget.h:106
void setSectioned(const QList< Section > &ids)
Definition user_list_widget.cpp:1393
void setFilterText(const QString &text)
Definition user_list_widget.cpp:1259
void setSectionExpanded(Section section, bool expanded)
Definition user_list_widget.cpp:1532
void applyDisplayMode()
Definition user_list_widget.cpp:625
std::function< bool(const QString &userName, bool online)> userFilter
Definition user_list_widget.h:107
void rebuild()
Definition user_list_widget.cpp:1026
bool sectioned
Definition user_list_widget.h:125
int onlineCount
Definition user_list_widget.h:159
void openMessageDialog(const QString &userName, bool focus)
void refreshVisibleUserHeader(const QString &name)
Definition user_list_widget.cpp:575
QSet< Section > expandedSections
Definition user_list_widget.h:132
void handleOnlineChange(const ServerInfo_User &user)
Definition user_list_widget.cpp:1552
void removeBuddy(const QString &userName)
QList< Section > sectionIds
Definition user_list_widget.h:126
void handleOnlineChangeLeft(const QString &userName)
Definition user_list_widget.cpp:1567
void showContextMenu(const QPoint &pos, const QModelIndex &index)
Definition user_list_widget.cpp:1364
QMap< Section, QMap< QString, UserListTWI * > > sectionUsers
Definition user_list_widget.h:131
void setShowTitle(bool showTitle)
Definition user_list_widget.cpp:1253
bool bulkLoading
Definition user_list_widget.h:105
void updateCardArtParams(const ServerInfo_User &user, const QString &userName)
Definition user_list_widget.cpp:1087
void setUserOnline(const QString &userName, bool online)
Definition user_list_widget.cpp:1187
void userListChanged()
void removeIgnore(const QString &userName)
void sectionExpanded(Section section, bool expanded)
void refreshPopupButtons(const QString &userName)
Definition user_list_widget.cpp:586
QString titleStr
Definition user_list_widget.h:160
void updateSectionDivider(Section section)
Definition user_list_widget.cpp:1472
UserContextMenu * userContextMenu
Definition user_list_widget.h:158
void endBulkLoad()
Definition user_list_widget.cpp:975
UserListItemDelegate * itemDelegate
Definition user_list_widget.h:157
void addBuddy(const QString &userName)
void retranslateUi()
Definition user_list_widget.cpp:950
void processUserInfo(Section section, const ServerInfo_User &user, bool online)
Definition user_list_widget.cpp:1140
void finishSectionedMutation()
Definition user_list_widget.cpp:1676
void requestVisibleItemResources()
Definition user_list_widget.cpp:993
UserInfoPopup * userInfoPopup
Definition user_list_widget.h:100
QMap< QString, UserListTWI * > users
Definition user_list_widget.h:152
QMap< Section, QTreeWidgetItem * > sectionItems
Definition user_list_widget.h:127
QTreeWidgetItem * createSectionItem(Section section)
Definition user_list_widget.cpp:1435
void setUserFilter(std::function< bool(const QString &userName, bool online)> filter)
Definition user_list_widget.h:206
UserListType
Definition user_list_widget.h:81
@ AllUsersList
Definition user_list_widget.h:82
@ RoomList
Definition user_list_widget.h:83
@ BuddyList
Definition user_list_widget.h:84
@ IgnoreList
Definition user_list_widget.h:85
void hidePopup(bool immediate=false)
Definition user_list_widget.cpp:906
const QList< Section > & getSectionIds() const
Definition user_list_widget.h:215
QString hoveredUser
Definition user_list_widget.h:103
void showPopupForUser(UserListTWI *item)
Definition user_list_widget.cpp:784
void beginBulkLoad()
Definition user_list_widget.cpp:970
void showEvent(QShowEvent *e) override
Definition user_list_widget.cpp:616
void positionPopup(UserListTWI *item)
Definition user_list_widget.cpp:849
bool eventFilter(QObject *obj, QEvent *event) override
Definition user_list_widget.cpp:695
void joinGameRequested(int gameId, int roomId, bool asSpectator)
bool isItemNearViewport(const UserListTWI *item) const
Definition user_list_widget.cpp:984
bool popupPinned
Definition user_list_widget.h:104
void handleListAdd(Section section, const ServerInfo_User &user)
Definition user_list_widget.cpp:1582
void addIgnore(const QString &userName)
void hideEvent(QHideEvent *e) override
Definition user_list_widget.cpp:605
bool deleteUser(const QString &userName)
Definition user_list_widget.cpp:1150
void userActivated(const QString &userName)
bool isPressInsideListUi(const QWidget *widget) const
Definition user_list_widget.cpp:931
int visibleUserRowCount() const
Definition user_list_widget.cpp:1338
void sortItems()
Definition user_list_widget.cpp:1378
AbstractClient * client
Definition user_list_widget.h:154
void clearSelectionAndClosePopup()
Definition user_list_widget.cpp:943
void updateCount()
Definition user_list_widget.cpp:1231
QTimer * showPopupTimer
Definition user_list_widget.h:101
Definition commands.proto:7
Definition response.proto:11
Definition serverinfo_user.proto:2