mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-24 10:23:02 -07:00
[UserList] Add invite button to hover popup (#7144)
Some checks failed
CodeQL / Analyze (cpp) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Build Desktop / Configure (push) Has been cancelled
Build Docker / Servatrice (arm) (push) Has been cancelled
Build Docker / Servatrice (x86) (push) Has been cancelled
Build Desktop / Debian 13 (push) Has been cancelled
Build Desktop / Debian 12 (push) Has been cancelled
Build Desktop / Fedora 44 (push) Has been cancelled
Build Desktop / Fedora 43 (push) Has been cancelled
Build Desktop / Servatrice_Debian 12 (push) Has been cancelled
Build Desktop / Ubuntu 26.04 (push) Has been cancelled
Build Desktop / Ubuntu 24.04 (push) Has been cancelled
Build Desktop / Arch (push) Has been cancelled
Build Desktop / macOS 13 Intel (push) Has been cancelled
Build Desktop / macOS 14 (push) Has been cancelled
Build Desktop / macOS 15 (push) Has been cancelled
Build Desktop / macOS 26 Debug (push) Has been cancelled
Build Desktop / Windows 10 (push) Has been cancelled
Build Docker / Publish multi-platform Servatrice image (push) Has been cancelled
Some checks failed
CodeQL / Analyze (cpp) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Build Desktop / Configure (push) Has been cancelled
Build Docker / Servatrice (arm) (push) Has been cancelled
Build Docker / Servatrice (x86) (push) Has been cancelled
Build Desktop / Debian 13 (push) Has been cancelled
Build Desktop / Debian 12 (push) Has been cancelled
Build Desktop / Fedora 44 (push) Has been cancelled
Build Desktop / Fedora 43 (push) Has been cancelled
Build Desktop / Servatrice_Debian 12 (push) Has been cancelled
Build Desktop / Ubuntu 26.04 (push) Has been cancelled
Build Desktop / Ubuntu 24.04 (push) Has been cancelled
Build Desktop / Arch (push) Has been cancelled
Build Desktop / macOS 13 Intel (push) Has been cancelled
Build Desktop / macOS 14 (push) Has been cancelled
Build Desktop / macOS 15 (push) Has been cancelled
Build Desktop / macOS 26 Debug (push) Has been cancelled
Build Desktop / Windows 10 (push) Has been cancelled
Build Docker / Publish multi-platform Servatrice image (push) Has been cancelled
* [Client] Send game invites from the user context menu via a private message The user context menu gains an "Invite to Game" submenu listing the inviteable games in the room (the inviter's own games, honoring the buddy-only setting). Picking one opens a private message to the target user with a cockatrice://joingame link naming the game, so the target gets a clickable invite instead of a raw URL. Multi-game rooms offer a picker; a single inviteable game sends directly. Sending a message to an offline user no longer swallows the draft — it reports that the user is offline and keeps the typed text. Took 30 seconds Took 1 minute * [Client] Open the invite dialog taller by default without enforcing a minimum size --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
6f86c45ea8
commit
68e4fa054d
5 changed files with 31 additions and 1 deletions
|
|
@ -525,6 +525,13 @@ void UserInfoPopup::rebuildActionButtons(const ServerInfo_User &userInfo, bool o
|
||||||
connect(games, &QPushButton::clicked, this, [this, name] { emit showGamesRequested(name); });
|
connect(games, &QPushButton::clicked, this, [this, name] { emit showGamesRequested(name); });
|
||||||
add(games);
|
add(games);
|
||||||
|
|
||||||
|
// ── Invite (only while the inviter has a joinable game for this user) ────
|
||||||
|
if (!isSelf && online && gameInviteAvailable && gameInviteAvailable(name)) {
|
||||||
|
auto *invite = makeBtn(tr("Invite"), tr("Invite to your game"), actionArea, theme);
|
||||||
|
connect(invite, &QPushButton::clicked, this, [this, name] { emit inviteRequested(name); });
|
||||||
|
add(invite);
|
||||||
|
}
|
||||||
|
|
||||||
// ── Buddy / ignore (registered users only) ────────────────────────────────
|
// ── Buddy / ignore (registered users only) ────────────────────────────────
|
||||||
if (!isSelf && isReg) {
|
if (!isSelf && isReg) {
|
||||||
if (isBuddy) {
|
if (isBuddy) {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
|
#include <functional>
|
||||||
#include <libcockatrice/network/server/remote/user_level.h>
|
#include <libcockatrice/network/server/remote/user_level.h>
|
||||||
#include <libcockatrice/protocol/pb/response.pb.h>
|
#include <libcockatrice/protocol/pb/response.pb.h>
|
||||||
#include <libcockatrice/protocol/pb/serverinfo_game.pb.h>
|
#include <libcockatrice/protocol/pb/serverinfo_game.pb.h>
|
||||||
|
|
@ -149,6 +150,17 @@ public:
|
||||||
/** Re-pulls the avatar/card art for the currently shown user (e.g. after it loads). */
|
/** Re-pulls the avatar/card art for the currently shown user (e.g. after it loads). */
|
||||||
void refreshHeader();
|
void refreshHeader();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a predicate evaluated on every action-button rebuild. It receives
|
||||||
|
* the name of the user the popup currently shows; when it returns true an
|
||||||
|
* "Invite" button is shown. The popup itself never resolves the invite
|
||||||
|
* link, it just forwards the request.
|
||||||
|
*/
|
||||||
|
void setGameInviteAvailable(std::function<bool(const QString &userName)> available)
|
||||||
|
{
|
||||||
|
gameInviteAvailable = std::move(available);
|
||||||
|
}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void mouseEnteredPopup();
|
void mouseEnteredPopup();
|
||||||
void mouseLeftPopup();
|
void mouseLeftPopup();
|
||||||
|
|
@ -159,6 +171,7 @@ signals:
|
||||||
|
|
||||||
// ── Action signals — connect to UserContextMenu::exec*() ──────────────────
|
// ── Action signals — connect to UserContextMenu::exec*() ──────────────────
|
||||||
void chatRequested(const QString &userName);
|
void chatRequested(const QString &userName);
|
||||||
|
void inviteRequested(const QString &userName);
|
||||||
void detailsRequested(const QString &userName);
|
void detailsRequested(const QString &userName);
|
||||||
void showGamesRequested(const QString &userName);
|
void showGamesRequested(const QString &userName);
|
||||||
void addBuddyRequested(const QString &userName);
|
void addBuddyRequested(const QString &userName);
|
||||||
|
|
@ -200,6 +213,7 @@ private:
|
||||||
QString currentUser;
|
QString currentUser;
|
||||||
ServerInfo_User currentUserInfo;
|
ServerInfo_User currentUserInfo;
|
||||||
bool currentOnline = false;
|
bool currentOnline = false;
|
||||||
|
std::function<bool(const QString &userName)> gameInviteAvailable;
|
||||||
|
|
||||||
UserInfoHeaderWidget *header;
|
UserInfoHeaderWidget *header;
|
||||||
QWidget *actionArea; ///< rebuilt per user
|
QWidget *actionArea; ///< rebuilt per user
|
||||||
|
|
|
||||||
|
|
@ -345,6 +345,11 @@ UserListWidget::UserListWidget(TabSupervisor *_tabSupervisor,
|
||||||
&cardArtProvider->cache(), &cardArtParamsMap,
|
&cardArtProvider->cache(), &cardArtParamsMap,
|
||||||
window()); // parented to main window so it floats above siblings
|
window()); // parented to main window so it floats above siblings
|
||||||
|
|
||||||
|
// The invite availability is scoped to the room this list belongs to,
|
||||||
|
// and gated on the room's buddy-only setting for the hovered user.
|
||||||
|
userInfoPopup->setGameInviteAvailable(
|
||||||
|
[this](const QString &userName) { return userContextMenu->hasGameInviteLink(userName); });
|
||||||
|
|
||||||
userInfoPopup->hide();
|
userInfoPopup->hide();
|
||||||
userInfoPopup->setWindowOpacity(0.0);
|
userInfoPopup->setWindowOpacity(0.0);
|
||||||
userInfoPopup->installEventFilter(this);
|
userInfoPopup->installEventFilter(this);
|
||||||
|
|
@ -662,6 +667,8 @@ void UserListWidget::connectPopupSignals()
|
||||||
|
|
||||||
// Wire all action signals to UserContextMenu::exec*()
|
// Wire all action signals to UserContextMenu::exec*()
|
||||||
connect(userInfoPopup, &UserInfoPopup::chatRequested, userContextMenu, &UserContextMenu::execChat);
|
connect(userInfoPopup, &UserInfoPopup::chatRequested, userContextMenu, &UserContextMenu::execChat);
|
||||||
|
connect(userInfoPopup, &UserInfoPopup::inviteRequested, this,
|
||||||
|
[this](const QString &userName) { userContextMenu->execInvite(userName); });
|
||||||
connect(userInfoPopup, &UserInfoPopup::detailsRequested, userContextMenu, &UserContextMenu::execDetails);
|
connect(userInfoPopup, &UserInfoPopup::detailsRequested, userContextMenu, &UserContextMenu::execDetails);
|
||||||
connect(userInfoPopup, &UserInfoPopup::showGamesRequested, userContextMenu, &UserContextMenu::execShowGames);
|
connect(userInfoPopup, &UserInfoPopup::showGamesRequested, userContextMenu, &UserContextMenu::execShowGames);
|
||||||
connect(userInfoPopup, &UserInfoPopup::addBuddyRequested, userContextMenu, &UserContextMenu::execAddToBuddy);
|
connect(userInfoPopup, &UserInfoPopup::addBuddyRequested, userContextMenu, &UserContextMenu::execAddToBuddy);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#include <QTextEdit>
|
#include <QTextEdit>
|
||||||
#include <QTreeWidgetItem>
|
#include <QTreeWidgetItem>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <libcockatrice/network/server/remote/user_level.h>
|
||||||
#include <libcockatrice/protocol/pb/moderator_commands.pb.h>
|
#include <libcockatrice/protocol/pb/moderator_commands.pb.h>
|
||||||
|
|
||||||
class QTreeWidget;
|
class QTreeWidget;
|
||||||
|
|
|
||||||
|
|
@ -1091,7 +1091,8 @@ QList<GameInviteOption> TabSupervisor::getGameInviteLinksForRoom(int roomId) con
|
||||||
// The inviter may be in several games of the same room (hosting one and
|
// The inviter may be in several games of the same room (hosting one and
|
||||||
// spectating another, for example). Return every game so the caller can
|
// spectating another, for example). Return every game so the caller can
|
||||||
// let the user choose which one to invite to.
|
// let the user choose which one to invite to.
|
||||||
for (TabGame *tab : gameTabs) {
|
for (auto it = gameTabs.cbegin(); it != gameTabs.cend(); ++it) {
|
||||||
|
TabGame *tab = it.value();
|
||||||
GameMetaInfo *metaInfo = tab->getGame()->getGameMetaInfo();
|
GameMetaInfo *metaInfo = tab->getGame()->getGameMetaInfo();
|
||||||
if (metaInfo->proto().room_id() != roomId) {
|
if (metaInfo->proto().room_id() != roomId) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue