Cockatrice 2026-10-19-Development-3.1.2-beta.2
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
10#include "libcockatrice/protocol/pb/serverinfo_user.pb.h"
11
12#include <QGroupBox>
13#include <QList>
14#include <QMap>
15#include <QSet>
16#include <QString>
17#include <QStyledItemDelegate>
18#include <QTreeWidgetItem>
19#include <functional>
20#include <qtmetamacros.h>
21#include <utility>
22
23class AbstractClient;
24class TabSupervisor;
25class UserContextMenu;
26class UserListWidget;
27class QModelIndex;
28class QPixmap;
29class QPoint;
30class QTimer;
31class QWidget;
34class UserInfoPopup;
35class UserListManager;
36struct CardArtParams;
37struct GameInviteOption;
38
39class UserListItemDelegate : public QStyledItemDelegate
40{
41 QTreeWidget *tree;
46
47public:
49 QTreeWidget *tree,
53 bool editorEvent(QEvent *event,
54 QAbstractItemModel *model,
55 const QStyleOptionViewItem &option,
56 const QModelIndex &index) override;
57 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
58 QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
59};
60
61class UserListTWI : public QTreeWidgetItem
62{
63private:
65
66public:
67 explicit UserListTWI(const ServerInfo_User &_userInfo);
69 {
70 return userInfo;
71 }
72 void setUserInfo(const ServerInfo_User &_userInfo);
73 void setOnline(bool online);
74 bool operator<(const QTreeWidgetItem &other) const override;
75};
76
77class UserListWidget : public QGroupBox
78{
79 Q_OBJECT
80public:
88 enum class Section
89 {
90 Buddy,
91 Online,
92 Ignore
93 };
94
95private:
100 // ── Hover popup ───────────────────────────────────────────────────────────
102 QTimer *showPopupTimer = nullptr;
103 QTimer *hidePopupTimer = nullptr;
104 QString hoveredUser;
105 bool popupPinned = false;
106 bool bulkLoading = false;
107 bool hasUserInfoPopup = true;
108 std::function<bool(const QString &userName, bool online)> userFilter;
109
115 void showPopupForUser(UserListTWI *item);
116 void hidePopup(bool immediate = false);
117 void positionPopup(UserListTWI *item);
118 void connectPopupSignals();
120 bool isPressInsideListUi(const QWidget *widget) const;
122 bool isItemNearViewport(const UserListTWI *item) const;
124
125 // Sectioned mode (single tree with inline dividers)
126 bool sectioned = false;
129 // One row per (section, user): a user that is online AND a buddy appears in
130 // both the "Online" and the "Buddies" sections, so the same user can own
131 // several rows, each hanging off its section's divider.
134 void createSectionItems();
135 QTreeWidgetItem *createSectionItem(Section section);
136 [[nodiscard]] QString sectionTitle(Section section) const;
137 void updateSectionDivider(Section section);
138 void handleSectionExpansion(QTreeWidgetItem *item, bool expanded);
139 void setExpandedProgrammatically(QTreeWidgetItem *item, bool expanded);
140 void handleOnlineChange(const ServerInfo_User &user);
141 void handleOnlineChangeLeft(const QString &userName);
142 void handleListAdd(Section section, const ServerInfo_User &user);
143 void handleListRemove(Section section, const QString &userName);
145 UserListTWI *ensureSectionMembership(Section section, const ServerInfo_User &user, bool online);
147 bool dropSectionMembership(Section section, const QString &userName);
150 void updateCardArtParams(const ServerInfo_User &user, const QString &userName);
151 void processUserInfo(Section section, const ServerInfo_User &user, bool online);
152
157 QTreeWidget *userTree = nullptr;
161 QString titleStr;
162 QString filterText;
163 bool showTitle = true;
164 void updateCount();
165 void applyFilter();
166 void refreshPopupButtons(const QString &userName);
167private slots:
168 void userClicked(QTreeWidgetItem *item, int column);
169 void refreshVisibleUserHeader(const QString &name);
170signals:
171 void openMessageDialog(const QString &userName, bool focus);
172 void addBuddy(const QString &userName);
173 void removeBuddy(const QString &userName);
174 void addIgnore(const QString &userName);
175 void removeIgnore(const QString &userName);
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:73
Definition remote_connection_controller.h:20
Definition game.h:18
Definition dlg_manage_sets.h:29
Definition tab_supervisor.h:92
Definition user_avatar_provider.h:14
Definition user_card_art_provider.h:16
Definition user_context_menu.h:32
Floating panel showing an enlarged user card, quick action buttons, and a live scrollable games list.
Definition user_info_popup.h:126
Definition user_list_widget.h:40
UserListWidget * owner
Definition user_list_widget.h:42
const QMap< QString, QPixmap > * cardArtCache
Definition user_list_widget.h:44
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
Definition user_list_widget.cpp:115
const QMap< QString, QPixmap > * avatarCache
Definition user_list_widget.h:43
QTreeWidget * tree
Definition user_list_widget.h:41
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
Definition user_list_widget.cpp:86
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
Definition user_list_widget.cpp:104
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:76
const QMap< QString, CardArtParams > * cardArtParamsMap
Definition user_list_widget.h:45
Definition user_list_manager.h:31
Definition user_list_widget.h:62
bool operator<(const QTreeWidgetItem &other) const override
Definition user_list_widget.cpp:274
void setOnline(bool online)
Definition user_list_widget.cpp:253
ServerInfo_User userInfo
Definition user_list_widget.h:64
void setUserInfo(const ServerInfo_User &_userInfo)
Definition user_list_widget.cpp:239
const ServerInfo_User & getUserInfo() const
Definition user_list_widget.h:68
UserListTWI(const ServerInfo_User &_userInfo)
Definition user_list_widget.cpp:234
Definition user_list_widget.h:78
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:1660
bool showTitle
Definition user_list_widget.h:163
UserCardArtProvider * cardArtProvider
Definition user_list_widget.h:98
void userClicked(QTreeWidgetItem *item, int column)
Definition user_list_widget.cpp:1381
void setGameInviteLinkProvider(std::function< QList< GameInviteOption >()> provider)
Definition user_list_widget.cpp:1742
QString filterText
Definition user_list_widget.h:162
QTreeWidget * userTree
Definition user_list_widget.h:157
UserAvatarProvider * avatarProvider
Definition user_list_widget.h:97
QTimer * hidePopupTimer
Definition user_list_widget.h:103
bool getHasUserInfoPopup() const
Definition user_list_widget.h:211
void setExpandedProgrammatically(QTreeWidgetItem *item, bool expanded)
Definition user_list_widget.cpp:1582
void currentUserChanged(const QString &userName)
void createSectionItems()
Definition user_list_widget.cpp:1480
void handleListRemove(Section section, const QString &userName)
Definition user_list_widget.cpp:1651
QString sectionTitle(Section section) const
Definition user_list_widget.cpp:1515
void bind(UserListManager *mgr)
Definition user_list_widget.cpp:532
UserListWidget(TabSupervisor *_tabSupervisor, AbstractClient *_client, UserListType _type, QWidget *parent=nullptr, bool hasUserInfoPopup=true)
Definition user_list_widget.cpp:320
Section
Definition user_list_widget.h:89
void handleSectionExpansion(QTreeWidgetItem *item, bool expanded)
Definition user_list_widget.cpp:1558
void applyFilter()
Definition user_list_widget.cpp:1324
TabSupervisor * tabSupervisor
Definition user_list_widget.h:154
bool dropSectionMembership(Section section, const QString &userName)
Definition user_list_widget.cpp:1702
UserListManager * manager
Definition user_list_widget.h:96
QMap< QString, CardArtParams > cardArtParamsMap
Definition user_list_widget.h:99
UserListType type
Definition user_list_widget.h:156
void connectPopupSignals()
Definition user_list_widget.cpp:700
bool hasUserInfoPopup
Definition user_list_widget.h:107
void setSectioned(const QList< Section > &ids)
Definition user_list_widget.cpp:1449
void setFilterText(const QString &text)
Definition user_list_widget.cpp:1315
void setSectionExpanded(Section section, bool expanded)
Definition user_list_widget.cpp:1588
void applyDisplayMode()
Definition user_list_widget.cpp:670
std::function< bool(const QString &userName, bool online)> userFilter
Definition user_list_widget.h:108
void rebuild()
Definition user_list_widget.cpp:1082
bool sectioned
Definition user_list_widget.h:126
int onlineCount
Definition user_list_widget.h:160
void openMessageDialog(const QString &userName, bool focus)
void refreshVisibleUserHeader(const QString &name)
Definition user_list_widget.cpp:620
QSet< Section > expandedSections
Definition user_list_widget.h:133
void handleOnlineChange(const ServerInfo_User &user)
Definition user_list_widget.cpp:1608
void removeBuddy(const QString &userName)
QList< Section > sectionIds
Definition user_list_widget.h:127
void handleOnlineChangeLeft(const QString &userName)
Definition user_list_widget.cpp:1623
void showContextMenu(const QPoint &pos, const QModelIndex &index)
Definition user_list_widget.cpp:1420
QMap< Section, QMap< QString, UserListTWI * > > sectionUsers
Definition user_list_widget.h:132
void setShowTitle(bool showTitle)
Definition user_list_widget.cpp:1309
bool bulkLoading
Definition user_list_widget.h:106
void updateCardArtParams(const ServerInfo_User &user, const QString &userName)
Definition user_list_widget.cpp:1143
void setUserOnline(const QString &userName, bool online)
Definition user_list_widget.cpp:1243
void userListChanged()
void removeIgnore(const QString &userName)
void sectionExpanded(Section section, bool expanded)
void refreshPopupButtons(const QString &userName)
Definition user_list_widget.cpp:631
QString titleStr
Definition user_list_widget.h:161
void updateSectionDivider(Section section)
Definition user_list_widget.cpp:1528
UserContextMenu * userContextMenu
Definition user_list_widget.h:159
void endBulkLoad()
Definition user_list_widget.cpp:1031
UserListItemDelegate * itemDelegate
Definition user_list_widget.h:158
void addBuddy(const QString &userName)
void retranslateUi()
Definition user_list_widget.cpp:1006
void processUserInfo(Section section, const ServerInfo_User &user, bool online)
Definition user_list_widget.cpp:1196
void finishSectionedMutation()
Definition user_list_widget.cpp:1732
void requestVisibleItemResources()
Definition user_list_widget.cpp:1049
UserInfoPopup * userInfoPopup
Definition user_list_widget.h:101
QMap< QString, UserListTWI * > users
Definition user_list_widget.h:153
QMap< Section, QTreeWidgetItem * > sectionItems
Definition user_list_widget.h:128
QTreeWidgetItem * createSectionItem(Section section)
Definition user_list_widget.cpp:1491
void setUserFilter(std::function< bool(const QString &userName, bool online)> filter)
Definition user_list_widget.h:206
UserListType
Definition user_list_widget.h:82
@ AllUsersList
Definition user_list_widget.h:83
@ RoomList
Definition user_list_widget.h:84
@ BuddyList
Definition user_list_widget.h:85
@ IgnoreList
Definition user_list_widget.h:86
void hidePopup(bool immediate=false)
Definition user_list_widget.cpp:962
const QList< Section > & getSectionIds() const
Definition user_list_widget.h:215
QString hoveredUser
Definition user_list_widget.h:104
void showPopupForUser(UserListTWI *item)
Definition user_list_widget.cpp:840
void beginBulkLoad()
Definition user_list_widget.cpp:1026
void showEvent(QShowEvent *e) override
Definition user_list_widget.cpp:661
void positionPopup(UserListTWI *item)
Definition user_list_widget.cpp:905
bool eventFilter(QObject *obj, QEvent *event) override
Definition user_list_widget.cpp:751
bool isItemNearViewport(const UserListTWI *item) const
Definition user_list_widget.cpp:1040
bool popupPinned
Definition user_list_widget.h:105
void handleListAdd(Section section, const ServerInfo_User &user)
Definition user_list_widget.cpp:1638
void addIgnore(const QString &userName)
void hideEvent(QHideEvent *e) override
Definition user_list_widget.cpp:650
bool deleteUser(const QString &userName)
Definition user_list_widget.cpp:1206
void userActivated(const QString &userName)
bool isPressInsideListUi(const QWidget *widget) const
Definition user_list_widget.cpp:987
int visibleUserRowCount() const
Definition user_list_widget.cpp:1394
void sortItems()
Definition user_list_widget.cpp:1434
AbstractClient * client
Definition user_list_widget.h:155
void clearSelectionAndClosePopup()
Definition user_list_widget.cpp:999
void updateCount()
Definition user_list_widget.cpp:1287
QTimer * showPopupTimer
Definition user_list_widget.h:102
Definition user_list_painter.h:23
Definition game_link.h:32
Definition serverinfo_user.proto:2