mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-26 00:23:55 -07:00
kick users out of games
This commit is contained in:
parent
d6083a85c7
commit
731dfcad5c
13 changed files with 263 additions and 86 deletions
|
|
@ -2,10 +2,37 @@
|
|||
#include "playerlistwidget.h"
|
||||
#include "protocol_datastructures.h"
|
||||
#include "pixmapgenerator.h"
|
||||
#include "abstractclient.h"
|
||||
#include "tab_game.h"
|
||||
#include "tab_supervisor.h"
|
||||
#include "tab_userlists.h"
|
||||
#include "protocol_items.h"
|
||||
#include "userlist.h"
|
||||
#include "userinfobox.h"
|
||||
#include <QDebug>
|
||||
#include <QMouseEvent>
|
||||
#include <QAction>
|
||||
#include <QMenu>
|
||||
|
||||
PlayerListWidget::PlayerListWidget(QWidget *parent)
|
||||
: QTreeWidget(parent), gameStarted(false)
|
||||
PlayerListItemDelegate::PlayerListItemDelegate(QObject *const parent)
|
||||
: QStyledItemDelegate(parent)
|
||||
{
|
||||
}
|
||||
|
||||
bool PlayerListItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
|
||||
{
|
||||
if ((event->type() == QEvent::MouseButtonPress) && index.isValid()) {
|
||||
QMouseEvent *const mouseEvent = static_cast<QMouseEvent *>(event);
|
||||
if (mouseEvent->button() == Qt::RightButton) {
|
||||
static_cast<PlayerListWidget *>(parent())->showContextMenu(mouseEvent->globalPos(), index);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return QStyledItemDelegate::editorEvent(event, model, option, index);
|
||||
}
|
||||
|
||||
PlayerListWidget::PlayerListWidget(TabSupervisor *_tabSupervisor, AbstractClient *_client, TabGame *_game, bool _gameCreator, QWidget *parent)
|
||||
: QTreeWidget(parent), tabSupervisor(_tabSupervisor), client(_client), game(_game), gameCreator(_gameCreator), gameStarted(false)
|
||||
{
|
||||
readyIcon = QIcon(":/resources/icon_ready_start.svg");
|
||||
notReadyIcon = QIcon(":/resources/icon_not_ready_start.svg");
|
||||
|
|
@ -13,23 +40,20 @@ PlayerListWidget::PlayerListWidget(QWidget *parent)
|
|||
playerIcon = QIcon(":/resources/icon_player.svg");
|
||||
spectatorIcon = QIcon(":/resources/icon_spectator.svg");
|
||||
|
||||
setMinimumHeight(100);
|
||||
itemDelegate = new PlayerListItemDelegate(this);
|
||||
setItemDelegate(itemDelegate);
|
||||
|
||||
setMinimumHeight(60);
|
||||
setIconSize(QSize(20, 15));
|
||||
setColumnCount(6);
|
||||
setHeaderHidden(true);
|
||||
setRootIsDecorated(false);
|
||||
setSelectionMode(NoSelection);
|
||||
header()->setResizeMode(QHeaderView::ResizeToContents);
|
||||
retranslateUi();
|
||||
}
|
||||
|
||||
void PlayerListWidget::retranslateUi()
|
||||
{
|
||||
headerItem()->setText(0, QString());
|
||||
headerItem()->setText(1, QString());
|
||||
headerItem()->setText(2, QString());
|
||||
headerItem()->setText(3, QString());
|
||||
headerItem()->setText(4, tr("Player name"));
|
||||
headerItem()->setText(5, tr("Deck"));
|
||||
}
|
||||
|
||||
void PlayerListWidget::addPlayer(ServerInfo_PlayerProperties *player)
|
||||
|
|
@ -52,13 +76,15 @@ void PlayerListWidget::updatePlayerProperties(ServerInfo_PlayerProperties *prop)
|
|||
player->setText(4, prop->getUserInfo()->getName());
|
||||
if (!prop->getUserInfo()->getCountry().isEmpty())
|
||||
player->setIcon(4, QIcon(CountryPixmapGenerator::generatePixmap(12, prop->getUserInfo()->getCountry())));
|
||||
player->setData(4, Qt::UserRole, prop->getUserInfo()->getName());
|
||||
player->setData(4, Qt::UserRole + 1, prop->getPlayerId());
|
||||
|
||||
QString deckText;
|
||||
if (!prop->getSpectator())
|
||||
switch (prop->getDeckId()) {
|
||||
case -2: deckText = tr("---"); break;
|
||||
case -1: deckText = tr("local"); break;
|
||||
default: deckText = tr("#%1").arg(prop->getDeckId());
|
||||
case -2: deckText = QString(); break;
|
||||
case -1: deckText = tr("local deck"); break;
|
||||
default: deckText = tr("deck #%1").arg(prop->getDeckId());
|
||||
}
|
||||
player->setText(5, deckText);
|
||||
}
|
||||
|
|
@ -100,3 +126,66 @@ void PlayerListWidget::setGameStarted(bool _gameStarted)
|
|||
twi->setIcon(2, gameStarted ? QIcon() : notReadyIcon);
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerListWidget::showContextMenu(const QPoint &pos, const QModelIndex &index)
|
||||
{
|
||||
const QString &userName = index.sibling(index.row(), 4).data(Qt::UserRole).toString();
|
||||
int playerId = index.sibling(index.row(), 4).data(Qt::UserRole + 1).toInt();
|
||||
|
||||
QAction *aUserName = new QAction(userName, this);
|
||||
aUserName->setEnabled(false);
|
||||
QAction *aDetails = new QAction(tr("User &details"), this);
|
||||
QAction *aChat = new QAction(tr("Direct &chat"), this);
|
||||
QAction *aAddToBuddyList = new QAction(tr("Add to &buddy list"), this);
|
||||
QAction *aRemoveFromBuddyList = new QAction(tr("Remove from &buddy list"), this);
|
||||
QAction *aAddToIgnoreList = new QAction(tr("Add to &ignore list"), this);
|
||||
QAction *aRemoveFromIgnoreList = new QAction(tr("Remove from &ignore list"), this);
|
||||
QAction *aKick = new QAction(tr("Kick from &game"), this);
|
||||
|
||||
QMenu *menu = new QMenu(this);
|
||||
menu->addAction(aUserName);
|
||||
menu->addSeparator();
|
||||
menu->addAction(aDetails);
|
||||
menu->addAction(aChat);
|
||||
menu->addSeparator();
|
||||
if (tabSupervisor->getUserListsTab()->getBuddyList()->userInList(userName))
|
||||
menu->addAction(aRemoveFromBuddyList);
|
||||
else
|
||||
menu->addAction(aAddToBuddyList);
|
||||
if (tabSupervisor->getUserListsTab()->getIgnoreList()->userInList(userName))
|
||||
menu->addAction(aRemoveFromIgnoreList);
|
||||
else
|
||||
menu->addAction(aAddToIgnoreList);
|
||||
if (gameCreator) {
|
||||
menu->addSeparator();
|
||||
menu->addAction(aKick);
|
||||
}
|
||||
|
||||
QAction *actionClicked = menu->exec(pos);
|
||||
if (actionClicked == aDetails) {
|
||||
UserInfoBox *infoWidget = new UserInfoBox(client, true, this, Qt::Dialog | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
|
||||
infoWidget->setAttribute(Qt::WA_DeleteOnClose);
|
||||
infoWidget->updateInfo(userName);
|
||||
} else if (actionClicked == aChat)
|
||||
emit openMessageDialog(userName, true);
|
||||
else if (actionClicked == aAddToBuddyList)
|
||||
client->sendCommand(new Command_AddToList("buddy", userName));
|
||||
else if (actionClicked == aRemoveFromBuddyList)
|
||||
client->sendCommand(new Command_RemoveFromList("buddy", userName));
|
||||
else if (actionClicked == aAddToIgnoreList)
|
||||
client->sendCommand(new Command_AddToList("ignore", userName));
|
||||
else if (actionClicked == aRemoveFromIgnoreList)
|
||||
client->sendCommand(new Command_RemoveFromList("ignore", userName));
|
||||
else if (actionClicked == aKick)
|
||||
game->sendGameCommand(new Command_KickFromGame(-1, playerId));
|
||||
|
||||
delete menu;
|
||||
delete aUserName;
|
||||
delete aDetails;
|
||||
delete aChat;
|
||||
delete aAddToBuddyList;
|
||||
delete aRemoveFromBuddyList;
|
||||
delete aAddToIgnoreList;
|
||||
delete aRemoveFromIgnoreList;
|
||||
delete aKick;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,17 +4,34 @@
|
|||
#include <QTreeWidget>
|
||||
#include <QMap>
|
||||
#include <QIcon>
|
||||
#include <QStyledItemDelegate>
|
||||
|
||||
class ServerInfo_PlayerProperties;
|
||||
class TabSupervisor;
|
||||
class AbstractClient;
|
||||
class TabGame;
|
||||
|
||||
class PlayerListItemDelegate : public QStyledItemDelegate {
|
||||
public:
|
||||
PlayerListItemDelegate(QObject *const parent);
|
||||
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
|
||||
};
|
||||
|
||||
class PlayerListWidget : public QTreeWidget {
|
||||
Q_OBJECT
|
||||
private:
|
||||
PlayerListItemDelegate *itemDelegate;
|
||||
QMap<int, QTreeWidgetItem *> players;
|
||||
TabSupervisor *tabSupervisor;
|
||||
AbstractClient *client;
|
||||
TabGame *game;
|
||||
bool gameCreator;
|
||||
QIcon readyIcon, notReadyIcon, concededIcon, playerIcon, spectatorIcon;
|
||||
bool gameStarted;
|
||||
signals:
|
||||
void openMessageDialog(const QString &userName, bool focus);
|
||||
public:
|
||||
PlayerListWidget(QWidget *parent = 0);
|
||||
PlayerListWidget(TabSupervisor *_tabSupervisor, AbstractClient *_client, TabGame *_game, bool _gameCreator, QWidget *parent = 0);
|
||||
void retranslateUi();
|
||||
void addPlayer(ServerInfo_PlayerProperties *player);
|
||||
void removePlayer(int playerId);
|
||||
|
|
@ -22,6 +39,7 @@ public:
|
|||
void updatePing(int playerId, int pingTime);
|
||||
void updatePlayerProperties(ServerInfo_PlayerProperties *prop);
|
||||
void setGameStarted(bool _gameStarted);
|
||||
void showContextMenu(const QPoint &pos, const QModelIndex &index);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -171,8 +171,10 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, QList<AbstractClient *> &_client
|
|||
gameView->hide();
|
||||
|
||||
cardInfo = new CardInfoWidget(CardInfoWidget::ModeGameTab);
|
||||
playerListWidget = new PlayerListWidget;
|
||||
playerListWidget = new PlayerListWidget(tabSupervisor, clients.first(), this, true);
|
||||
playerListWidget->setFocusPolicy(Qt::NoFocus);
|
||||
connect(playerListWidget, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
||||
|
||||
timeElapsedLabel = new QLabel;
|
||||
timeElapsedLabel->setAlignment(Qt::AlignCenter);
|
||||
messageLog = new MessageLogWidget;
|
||||
|
|
@ -397,8 +399,8 @@ void TabGame::processGameEventContainer(GameEventContainer *cont, AbstractClient
|
|||
|
||||
if (spectators.contains(event->getPlayerId())) {
|
||||
switch (event->getItemId()) {
|
||||
case ItemId_Event_Say: eventSpectatorSay(qobject_cast<Event_Say *>(event), context); break;
|
||||
case ItemId_Event_Leave: eventSpectatorLeave(qobject_cast<Event_Leave *>(event), context); break;
|
||||
case ItemId_Event_Say: eventSpectatorSay(static_cast<Event_Say *>(event), context); break;
|
||||
case ItemId_Event_Leave: eventSpectatorLeave(static_cast<Event_Leave *>(event), context); break;
|
||||
default: {
|
||||
qDebug() << "unhandled spectator game event";
|
||||
break;
|
||||
|
|
@ -410,14 +412,15 @@ void TabGame::processGameEventContainer(GameEventContainer *cont, AbstractClient
|
|||
continue;
|
||||
|
||||
switch (event->getItemId()) {
|
||||
case ItemId_Event_GameStateChanged: eventGameStateChanged(qobject_cast<Event_GameStateChanged *>(event), context); break;
|
||||
case ItemId_Event_PlayerPropertiesChanged: eventPlayerPropertiesChanged(qobject_cast<Event_PlayerPropertiesChanged *>(event), context); break;
|
||||
case ItemId_Event_Join: eventJoin(qobject_cast<Event_Join *>(event), context); break;
|
||||
case ItemId_Event_Leave: eventLeave(qobject_cast<Event_Leave *>(event), context); break;
|
||||
case ItemId_Event_GameClosed: eventGameClosed(qobject_cast<Event_GameClosed *>(event), context); break;
|
||||
case ItemId_Event_SetActivePlayer: eventSetActivePlayer(qobject_cast<Event_SetActivePlayer *>(event), context); break;
|
||||
case ItemId_Event_SetActivePhase: eventSetActivePhase(qobject_cast<Event_SetActivePhase *>(event), context); break;
|
||||
case ItemId_Event_Ping: eventPing(qobject_cast<Event_Ping *>(event), context); break;
|
||||
case ItemId_Event_GameStateChanged: eventGameStateChanged(static_cast<Event_GameStateChanged *>(event), context); break;
|
||||
case ItemId_Event_PlayerPropertiesChanged: eventPlayerPropertiesChanged(static_cast<Event_PlayerPropertiesChanged *>(event), context); break;
|
||||
case ItemId_Event_Join: eventJoin(static_cast<Event_Join *>(event), context); break;
|
||||
case ItemId_Event_Leave: eventLeave(static_cast<Event_Leave *>(event), context); break;
|
||||
case ItemId_Event_Kicked: eventKicked(static_cast<Event_Kicked *>(event), context); break;
|
||||
case ItemId_Event_GameClosed: eventGameClosed(static_cast<Event_GameClosed *>(event), context); break;
|
||||
case ItemId_Event_SetActivePlayer: eventSetActivePlayer(static_cast<Event_SetActivePlayer *>(event), context); break;
|
||||
case ItemId_Event_SetActivePhase: eventSetActivePhase(static_cast<Event_SetActivePhase *>(event), context); break;
|
||||
case ItemId_Event_Ping: eventPing(static_cast<Event_Ping *>(event), context); break;
|
||||
|
||||
default: {
|
||||
Player *player = players.value(event->getPlayerId(), 0);
|
||||
|
|
@ -642,6 +645,13 @@ void TabGame::eventLeave(Event_Leave *event, GameEventContext * /*context*/)
|
|||
emit userEvent();
|
||||
}
|
||||
|
||||
void TabGame::eventKicked(Event_Kicked * /*event*/, GameEventContext * /*context*/)
|
||||
{
|
||||
emit userEvent();
|
||||
QMessageBox::critical(this, tr("Kicked"), tr("You have been kicked out of the game."));
|
||||
deleteLater();
|
||||
}
|
||||
|
||||
void TabGame::eventGameClosed(Event_GameClosed * /*event*/, GameEventContext * /*context*/)
|
||||
{
|
||||
started = false;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ class Event_SetActivePlayer;
|
|||
class Event_SetActivePhase;
|
||||
class Event_Ping;
|
||||
class Event_Say;
|
||||
class Event_Kicked;
|
||||
class Player;
|
||||
class CardZone;
|
||||
class AbstractCardItem;
|
||||
|
|
@ -128,6 +129,7 @@ private:
|
|||
void eventPlayerPropertiesChanged(Event_PlayerPropertiesChanged *event, GameEventContext *context);
|
||||
void eventJoin(Event_Join *event, GameEventContext *context);
|
||||
void eventLeave(Event_Leave *event, GameEventContext *context);
|
||||
void eventKicked(Event_Kicked *event, GameEventContext *context);
|
||||
void eventGameClosed(Event_GameClosed *event, GameEventContext *context);
|
||||
Player *setActivePlayer(int id);
|
||||
void eventSetActivePlayer(Event_SetActivePlayer *event, GameEventContext *context);
|
||||
|
|
@ -140,6 +142,7 @@ signals:
|
|||
void playerRemoved(Player *player);
|
||||
void containerProcessingStarted(GameEventContext *context);
|
||||
void containerProcessingDone();
|
||||
void openMessageDialog(const QString &userName, bool focus);
|
||||
private slots:
|
||||
void newCardAdded(AbstractCardItem *card);
|
||||
void showCardInfoPopup(const QPoint &pos, const QString &cardName);
|
||||
|
|
|
|||
|
|
@ -155,6 +155,7 @@ void TabSupervisor::gameJoined(Event_GameJoined *event)
|
|||
{
|
||||
TabGame *tab = new TabGame(this, QList<AbstractClient *>() << client, event->getGameId(), event->getGameDescription(), event->getPlayerId(), event->getSpectator(), event->getSpectatorsCanTalk(), event->getSpectatorsSeeEverything(), event->getResuming());
|
||||
connect(tab, SIGNAL(gameClosing(TabGame *)), this, SLOT(gameLeft(TabGame *)));
|
||||
connect(tab, SIGNAL(openMessageDialog(const QString &, bool)), this, SLOT(addMessageTab(const QString &, bool)));
|
||||
myAddTab(tab);
|
||||
gameTabs.insert(event->getGameId(), tab);
|
||||
setCurrentWidget(tab);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue