minor cleanups and log improvements

This commit is contained in:
Max-Wilhelm Bruker 2009-08-05 16:50:16 +02:00
parent 52b8a5b0e7
commit 2148005bd1
18 changed files with 215 additions and 306 deletions

View file

@ -16,8 +16,8 @@ QT += network svg
#QTPLUGIN += qjpeg #QTPLUGIN += qjpeg
# Input # Input
HEADERS += src/counter.h src/gameselector.h src/dlg_creategame.h src/dlg_connect.h src/gamesmodel.h src/client.h src/window_main.h src/servergame.h src/servereventdata.h src/zonelist.h src/cardzone.h src/player.h src/cardlist.h src/carditem.h src/tablezone.h src/handzone.h src/playerlist.h src/game.h src/carddatabase.h src/gameview.h src/decklistmodel.h src/dlg_startgame.h src/cardinfowidget.h src/messagelogwidget.h src/serverzonecard.h src/zoneviewzone.h src/zoneviewwidget.h src/libraryzone.h src/pilezone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h src/decklist.h setsmodel.h src/window_sets.h src/abstractgraphicsitem.h src/dlg_settings.h HEADERS += src/counter.h src/gameselector.h src/dlg_creategame.h src/dlg_connect.h src/gamesmodel.h src/client.h src/window_main.h src/servergame.h src/servereventdata.h src/zonelist.h src/cardzone.h src/player.h src/cardlist.h src/carditem.h src/tablezone.h src/handzone.h src/playerlist.h src/game.h src/carddatabase.h src/gameview.h src/decklistmodel.h src/dlg_startgame.h src/cardinfowidget.h src/messagelogwidget.h src/serverzonecard.h src/zoneviewzone.h src/zoneviewwidget.h src/pilezone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h src/decklist.h setsmodel.h src/window_sets.h src/abstractgraphicsitem.h src/dlg_settings.h
SOURCES += src/counter.cpp src/gameselector.cpp src/dlg_creategame.cpp src/dlg_connect.cpp src/client.cpp src/main.cpp src/window_main.cpp src/servereventdata.cpp src/gamesmodel.cpp src/player.cpp src/cardzone.cpp src/zonelist.cpp src/cardlist.cpp src/carditem.cpp src/tablezone.cpp src/handzone.cpp src/playerlist.cpp src/game.cpp src/carddatabase.cpp src/gameview.cpp src/decklistmodel.cpp src/dlg_startgame.cpp src/cardinfowidget.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp src/libraryzone.cpp src/pilezone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp src/decklist.cpp src/setsmodel.cpp src/window_sets.cpp src/abstractgraphicsitem.cpp src/dlg_settings.cpp SOURCES += src/counter.cpp src/gameselector.cpp src/dlg_creategame.cpp src/dlg_connect.cpp src/client.cpp src/main.cpp src/window_main.cpp src/servereventdata.cpp src/gamesmodel.cpp src/player.cpp src/cardzone.cpp src/zonelist.cpp src/cardlist.cpp src/carditem.cpp src/tablezone.cpp src/handzone.cpp src/playerlist.cpp src/game.cpp src/carddatabase.cpp src/gameview.cpp src/decklistmodel.cpp src/dlg_startgame.cpp src/cardinfowidget.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp src/pilezone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp src/decklist.cpp src/setsmodel.cpp src/window_sets.cpp src/abstractgraphicsitem.cpp src/dlg_settings.cpp
TRANSLATIONS += \ TRANSLATIONS += \
translations/cockatrice_de.ts \ translations/cockatrice_de.ts \
translations/cockatrice_en.ts translations/cockatrice_en.ts

View file

@ -6,6 +6,7 @@
#include "cardzone.h" #include "cardzone.h"
#include "tablezone.h" #include "tablezone.h"
#include "player.h" #include "player.h"
#include "game.h"
CardItem::CardItem(CardDatabase *_db, const QString &_name, int _cardid, QGraphicsItem *parent) CardItem::CardItem(CardDatabase *_db, const QString &_name, int _cardid, QGraphicsItem *parent)
: AbstractGraphicsItem(parent), db(_db), info(db->getCard(_name)), name(_name), id(_cardid), tapped(false), attacking(false), facedown(false), counters(0), doesntUntap(false), dragItem(NULL) : AbstractGraphicsItem(parent), db(_db), info(db->getCard(_name)), name(_name), id(_cardid), tapped(false), attacking(false), facedown(false), counters(0), doesntUntap(false), dragItem(NULL)
@ -200,7 +201,7 @@ void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
void CardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void CardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{ {
((CardZone *) parentItem())->hoverCardEvent(this); ((Game *) ((CardZone *) parentItem())->getPlayer()->parent())->hoverCardEvent(this);
QGraphicsItem::hoverEnterEvent(event); QGraphicsItem::hoverEnterEvent(event);
} }

View file

@ -5,8 +5,8 @@
#include "client.h" #include "client.h"
#include "zoneviewzone.h" #include "zoneviewzone.h"
CardZone::CardZone(Player *_p, const QString &_name, bool _hasCardAttr, bool _isShufflable, QGraphicsItem *parent, bool isView) CardZone::CardZone(Player *_p, const QString &_name, bool _hasCardAttr, bool _isShufflable, bool _contentsKnown, QGraphicsItem *parent, bool isView)
: AbstractGraphicsItem(parent), player(_p), name(_name), cards(NULL), view(NULL), menu(NULL), doubleClickAction(0), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable) : AbstractGraphicsItem(parent), player(_p), name(_name), cards(_contentsKnown), view(NULL), menu(NULL), doubleClickAction(0), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable)
{ {
if (!isView) if (!isView)
player->addZone(this); player->addZone(this);
@ -17,14 +17,13 @@ CardZone::~CardZone()
qDebug(QString("CardZone destructor: %1").arg(name).toLatin1()); qDebug(QString("CardZone destructor: %1").arg(name).toLatin1());
delete view; delete view;
clearContents(); clearContents();
delete cards;
} }
void CardZone::clearContents() void CardZone::clearContents()
{ {
for (int i = 0; i < cards->size(); i++) for (int i = 0; i < cards.size(); i++)
delete cards->at(i); delete cards.at(i);
cards->clear(); cards.clear();
} }
void CardZone::mouseDoubleClickEvent(QGraphicsSceneMouseEvent */*event*/) void CardZone::mouseDoubleClickEvent(QGraphicsSceneMouseEvent */*event*/)
@ -58,7 +57,7 @@ void CardZone::addCard(CardItem *card, bool reorganize, int x, int y)
CardItem *CardZone::getCard(int cardId, const QString &cardName) CardItem *CardZone::getCard(int cardId, const QString &cardName)
{ {
CardItem *c = cards->findCard(cardId, false); CardItem *c = cards.findCard(cardId, false);
// If the card's id is -1, this zone is invisible, // If the card's id is -1, this zone is invisible,
// so we need to give the card an id and a name as it comes out. // so we need to give the card an id and a name as it comes out.
// It can be assumed that in an invisible zone, all cards are equal. // It can be assumed that in an invisible zone, all cards are equal.
@ -71,9 +70,9 @@ CardItem *CardZone::getCard(int cardId, const QString &cardName)
CardItem *CardZone::takeCard(int position, int cardId, const QString &cardName) CardItem *CardZone::takeCard(int position, int cardId, const QString &cardName)
{ {
Q_ASSERT(position < cards->size()); Q_ASSERT(position < cards.size());
CardItem *c = cards->takeAt(position); CardItem *c = cards.takeAt(position);
if (view) if (view)
view->removeCard(position); view->removeCard(position);
@ -91,11 +90,6 @@ void CardZone::setCardAttr(int cardId, const QString &aname, const QString &aval
player->client->setCardAttr(name, cardId, aname, avalue); player->client->setCardAttr(name, cardId, aname, avalue);
} }
void CardZone::hoverCardEvent(CardItem *card)
{
player->hoverCardEvent(card);
}
void CardZone::setView(ZoneViewZone *_view) void CardZone::setView(ZoneViewZone *_view)
{ {
view = _view; view = _view;
@ -105,6 +99,6 @@ void CardZone::moveAllToZone(const QString &targetZone, int targetX)
{ {
// Cards need to be moved in reverse order so that the other // Cards need to be moved in reverse order so that the other
// cards' list index doesn't change // cards' list index doesn't change
for (int i = cards->size() - 1; i >= 0; i--) for (int i = cards.size() - 1; i >= 0; i--)
player->client->moveCard(cards->at(i)->getId(), getName(), targetZone, targetX); player->client->moveCard(cards.at(i)->getId(), getName(), targetZone, targetX);
} }

View file

@ -16,7 +16,7 @@ class CardZone : public AbstractGraphicsItem {
protected: protected:
Player *player; Player *player;
QString name; QString name;
CardList *cards; CardList cards;
ZoneViewZone *view; ZoneViewZone *view;
QMenu *menu; QMenu *menu;
QAction *doubleClickAction; QAction *doubleClickAction;
@ -29,7 +29,7 @@ public:
enum { Type = typeZone }; enum { Type = typeZone };
int type() const { return Type; } int type() const { return Type; }
virtual void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) = 0; virtual void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) = 0;
CardZone(Player *_player, const QString &_name, bool _hasCardAttr, bool _isShufflable, QGraphicsItem *parent = 0, bool isView = false); CardZone(Player *_player, const QString &_name, bool _hasCardAttr, bool _isShufflable, bool _contentsKnown, QGraphicsItem *parent = 0, bool isView = false);
~CardZone(); ~CardZone();
void clearContents(); void clearContents();
bool getHasCardAttr() const { return hasCardAttr; } bool getHasCardAttr() const { return hasCardAttr; }
@ -38,15 +38,14 @@ public:
void setMenu(QMenu *_menu, QAction *_doubleClickAction = 0) { menu = _menu; doubleClickAction = _doubleClickAction; } void setMenu(QMenu *_menu, QAction *_doubleClickAction = 0) { menu = _menu; doubleClickAction = _doubleClickAction; }
QString getName() const { return name; } QString getName() const { return name; }
Player *getPlayer() const { return player; } Player *getPlayer() const { return player; }
bool contentsKnown() const { return cards->getContentsKnown(); } bool contentsKnown() const { return cards.getContentsKnown(); }
CardList *getCards() const { return cards; } const CardList &getCards() const { return cards; }
void addCard(CardItem *card, bool reorganize, int x, int y = -1); void addCard(CardItem *card, bool reorganize, int x, int y = -1);
// getCard() finds a card by id. // getCard() finds a card by id.
CardItem *getCard(int cardId, const QString &cardName); CardItem *getCard(int cardId, const QString &cardName);
// takeCard() finds a card by position and removes it from the zone and from all of its views. // takeCard() finds a card by position and removes it from the zone and from all of its views.
CardItem *takeCard(int position, int cardId, const QString &cardName); CardItem *takeCard(int position, int cardId, const QString &cardName);
void setCardAttr(int cardId, const QString &aname, const QString &avalue); void setCardAttr(int cardId, const QString &aname, const QString &avalue);
void hoverCardEvent(CardItem *card);
ZoneViewZone *getView() const { return view; } ZoneViewZone *getView() const { return view; }
void setView(ZoneViewZone *_view); void setView(ZoneViewZone *_view);
virtual void reorganizeCards() = 0; virtual void reorganizeCards() = 0;

View file

@ -136,14 +136,13 @@ Player *Game::addPlayer(int playerId, const QString &playerName, QPointF base, b
{ {
Player *newPlayer = new Player(playerName, playerId, base, local, db, client, scene, this); Player *newPlayer = new Player(playerName, playerId, base, local, db, client, scene, this);
connect(newPlayer, SIGNAL(hoverCard(QString)), this, SIGNAL(hoverCard(QString)));
connect(newPlayer, SIGNAL(sigShowCardMenu(QPoint)), this, SLOT(showCardMenu(QPoint))); connect(newPlayer, SIGNAL(sigShowCardMenu(QPoint)), this, SLOT(showCardMenu(QPoint)));
connect(newPlayer, SIGNAL(logMoveCard(QString, QString, QString, QString)), this, SIGNAL(logMoveCard(QString, QString, QString, QString))); connect(newPlayer, SIGNAL(logMoveCard(Player *, QString, QString, QString)), this, SIGNAL(logMoveCard(Player *, QString, QString, QString)));
connect(newPlayer, SIGNAL(logCreateToken(QString, QString)), this, SIGNAL(logCreateToken(QString, QString))); connect(newPlayer, SIGNAL(logCreateToken(Player *, QString)), this, SIGNAL(logCreateToken(Player *, QString)));
connect(newPlayer, SIGNAL(logSetCardCounters(QString, QString, int, int)), this, SIGNAL(logSetCardCounters(QString, QString, int, int))); connect(newPlayer, SIGNAL(logSetCardCounters(Player *, QString, int, int)), this, SIGNAL(logSetCardCounters(Player *, QString, int, int)));
connect(newPlayer, SIGNAL(logSetTapped(QString, QString, bool)), this, SIGNAL(logSetTapped(QString, QString, bool))); connect(newPlayer, SIGNAL(logSetTapped(Player *, QString, bool)), this, SIGNAL(logSetTapped(Player *, QString, bool)));
connect(newPlayer, SIGNAL(logSetCounter(QString, QString, int, int)), this, SIGNAL(logSetCounter(QString, QString, int, int))); connect(newPlayer, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SIGNAL(logSetCounter(Player *, QString, int, int)));
connect(newPlayer, SIGNAL(logSetDoesntUntap(QString, QString, bool)), this, SIGNAL(logSetDoesntUntap(QString, QString, bool))); connect(newPlayer, SIGNAL(logSetDoesntUntap(Player *, QString, bool)), this, SIGNAL(logSetDoesntUntap(Player *, QString, bool)));
players << newPlayer; players << newPlayer;
emit playerAdded(newPlayer); emit playerAdded(newPlayer);
@ -192,21 +191,21 @@ void Game::gameEvent(const ServerEventData &msg)
switch(msg.getEventType()) { switch(msg.getEventType()) {
case eventSay: case eventSay:
emit logSay(p->getName(), msg.getEventData()[0]); emit logSay(p, msg.getEventData()[0]);
break; break;
case eventJoin: { case eventJoin: {
emit logJoin(msg.getPlayerName()); emit logJoin(p);
addPlayer(msg.getPlayerId(), msg.getPlayerName(), QPointF(0, 0), false); addPlayer(msg.getPlayerId(), msg.getPlayerName(), QPointF(0, 0), false);
break; break;
} }
case eventLeave: case eventLeave:
emit logLeave(msg.getPlayerName()); emit logLeave(p);
// XXX Spieler natürlich noch rauswerfen // XXX Spieler natürlich noch rauswerfen
break; break;
case eventReadyStart: case eventReadyStart:
if (started) { if (started) {
started = false; started = false;
emit logReadyStart(p->getName()); emit logReadyStart(p);
if (!p->getLocal()) if (!p->getLocal())
restartGameDialog(); restartGameDialog();
} }
@ -216,13 +215,13 @@ void Game::gameEvent(const ServerEventData &msg)
emit logGameStart(); emit logGameStart();
break; break;
case eventShuffle: case eventShuffle:
emit logShuffle(p->getName()); emit logShuffle(p);
break; break;
case eventRollDice: { case eventRollDice: {
QStringList data = msg.getEventData(); QStringList data = msg.getEventData();
int sides = data[0].toInt(); int sides = data[0].toInt();
int roll = data[1].toInt(); int roll = data[1].toInt();
emit logRollDice(p->getName(), sides, roll); emit logRollDice(p, sides, roll);
break; break;
} }
case eventSetActivePlayer: case eventSetActivePlayer:
@ -243,7 +242,7 @@ void Game::gameEvent(const ServerEventData &msg)
} }
case eventDumpZone: { case eventDumpZone: {
QStringList data = msg.getEventData(); QStringList data = msg.getEventData();
emit logDumpZone(p->getName(), data[1], players.findPlayer(data[0].toInt())->getName(), data[2].toInt()); emit logDumpZone(p, data[1], players.findPlayer(data[0].toInt())->getName(), data[2].toInt());
break; break;
} }
case eventMoveCard: { case eventMoveCard: {
@ -253,7 +252,7 @@ void Game::gameEvent(const ServerEventData &msg)
break; break;
} }
case eventDraw: { case eventDraw: {
emit logDraw(p->getName(), msg.getEventData()[0].toInt()); emit logDraw(p, msg.getEventData()[0].toInt());
if (msg.getPlayerId() == localPlayer->getId()) if (msg.getPlayerId() == localPlayer->getId())
break; break;
p->gameEvent(msg); p->gameEvent(msg);
@ -402,3 +401,8 @@ void Game::actSayMessage()
QAction *a = qobject_cast<QAction *>(sender()); QAction *a = qobject_cast<QAction *>(sender());
client->say(a->text()); client->say(a->text());
} }
void Game::hoverCardEvent(CardItem *card)
{
emit hoverCard(card->getName());
}

View file

@ -10,6 +10,7 @@ class Client;
class ServerEventData; class ServerEventData;
class CardDatabase; class CardDatabase;
class DlgStartGame; class DlgStartGame;
class CardItem;
class Game : public QObject { class Game : public QObject {
Q_OBJECT Q_OBJECT
@ -61,26 +62,27 @@ signals:
// Log events // Log events
void logPlayerListReceived(QStringList players); void logPlayerListReceived(QStringList players);
void logJoin(QString playerName); void logJoin(Player *player);
void logLeave(QString playerName); void logLeave(Player *player);
void logReadyStart(QString playerName); void logReadyStart(Player *player);
void logGameStart(); void logGameStart();
void logSay(QString playerName, QString text); void logSay(Player *player, QString text);
void logShuffle(QString playerName); void logShuffle(Player *player);
void logRollDice(QString playerName, int sides, int roll); void logRollDice(Player *player, int sides, int roll);
void logDraw(QString playerName, int number); void logDraw(Player *player, int number);
void logMoveCard(QString playerName, QString cardName, QString startZone, QString targetZone); void logMoveCard(Player *player, QString cardName, QString startZone, QString targetZone);
void logCreateToken(QString playerName, QString cardName); void logCreateToken(Player *player, QString cardName);
void logSetCardCounters(QString playerName, QString cardName, int value, int oldValue); void logSetCardCounters(Player *player, QString cardName, int value, int oldValue);
void logSetTapped(QString playerName, QString cardName, bool tapped); void logSetTapped(Player *player, QString cardName, bool tapped);
void logSetCounter(QString playerName, QString counterName, int value, int oldValue); void logSetCounter(Player *player, QString counterName, int value, int oldValue);
void logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap); void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
void logDumpZone(QString playerName, QString zoneName, QString zoneOwner, int numberCards); void logDumpZone(Player *player, QString zoneName, QString zoneOwner, int numberCards);
public: public:
Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_actionsMenu, QMenu *_cardMenu, int playerId, const QString &playerName, QObject *parent = 0); Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_actionsMenu, QMenu *_cardMenu, int playerId, const QString &playerName, QObject *parent = 0);
~Game(); ~Game();
Player *getLocalPlayer() const { return localPlayer; } Player *getLocalPlayer() const { return localPlayer; }
void restartGameDialog(); void restartGameDialog();
void hoverCardEvent(CardItem *card);
}; };
#endif #endif

View file

@ -4,9 +4,10 @@
#include "client.h" #include "client.h"
HandZone::HandZone(Player *_p, QGraphicsItem *parent) HandZone::HandZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "hand", false, false, parent) : CardZone(_p, "hand", false, false, _p->getLocal(), parent)
{ {
cards = new CardList(player->getLocal()); setCacheMode(DeviceCoordinateCache);
setAcceptsHoverEvents(true); // Awkwardly, this is needed to repaint the cached item after it has been corrupted by buggy rubberband drag.
} }
QRectF HandZone::boundingRect() const QRectF HandZone::boundingRect() const
@ -21,20 +22,20 @@ void HandZone::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option
void HandZone::reorganizeCards() void HandZone::reorganizeCards()
{ {
if (cards->isEmpty()) if (cards.isEmpty())
return; return;
int cardCount = cards->size(); const int cardCount = cards.size();
qreal totalWidth = boundingRect().width(); qreal totalWidth = boundingRect().width();
qreal totalHeight = boundingRect().height(); qreal totalHeight = boundingRect().height();
qreal cardWidth = cards->at(0)->boundingRect().width(); qreal cardWidth = cards.at(0)->boundingRect().width();
qreal cardHeight = cards->at(0)->boundingRect().height(); qreal cardHeight = cards.at(0)->boundingRect().height();
qreal xspace = 5; qreal xspace = 5;
qreal x1 = xspace; qreal x1 = xspace;
qreal x2 = totalWidth - xspace - cardWidth; qreal x2 = totalWidth - xspace - cardWidth;
for (int i = 0; i < cardCount; i++) { for (int i = 0; i < cardCount; i++) {
CardItem *c = cards->at(i); CardItem *c = cards.at(i);
qreal x = i % 2 ? x2 : x1; qreal x = i % 2 ? x2 : x1;
// If the total height of the cards is smaller than the available height, // If the total height of the cards is smaller than the available height,
// the cards do not need to overlap and are displayed in the center of the area. // the cards do not need to overlap and are displayed in the center of the area.
@ -49,10 +50,10 @@ void HandZone::reorganizeCards()
void HandZone::addCardImpl(CardItem *card, int x, int /*y*/) void HandZone::addCardImpl(CardItem *card, int x, int /*y*/)
{ {
if (x == -1) if (x == -1)
x = cards->size(); x = cards.size();
cards->insert(x, card); cards.insert(x, card);
if (!cards->getContentsKnown()) { if (!cards.getContentsKnown()) {
card->setId(-1); card->setId(-1);
card->setName(); card->setName();
} }
@ -64,5 +65,5 @@ void HandZone::addCardImpl(CardItem *card, int x, int /*y*/)
void HandZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/) void HandZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/)
{ {
player->client->moveCard(cardId, startZone->getName(), getName(), cards->size(), 0); player->client->moveCard(cardId, startZone->getName(), getName(), cards.size(), 0);
} }

View file

@ -1,87 +0,0 @@
#include <QtGui>
#include "libraryzone.h"
#include "player.h"
#include "client.h"
#include "carddatabase.h"
#include "carddragitem.h"
#include "zoneviewzone.h"
LibraryZone::LibraryZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "deck", false, true, parent)
{
cards = new CardList(false);
setCacheMode(DeviceCoordinateCache); // Do not move this line to the parent constructor!
setCursor(Qt::OpenHandCursor);
}
QRectF LibraryZone::boundingRect() const
{
return QRectF(0, 0, CARD_WIDTH, CARD_HEIGHT);
}
void LibraryZone::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/)
{
QSizeF translatedSize = option->matrix.mapRect(boundingRect()).size();
QPixmap *translatedPixmap = player->getDb()->getCard()->getPixmap(translatedSize.toSize());
painter->save();
painter->resetTransform();
painter->drawPixmap(translatedPixmap->rect(), *translatedPixmap, translatedPixmap->rect());
painter->restore();
paintNumberEllipse(cards->size(), painter);
}
void LibraryZone::addCardImpl(CardItem *card, int x, int /*y*/)
{
cards->insert(x, card);
card->setId(-1);
card->setName(QString());
card->setPos(0, 0);
card->setVisible(false);
card->resetState();
card->setParentItem(this);
}
void LibraryZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/)
{
player->client->moveCard(cardId, startZone->getName(), getName(), 0, 0);
}
void LibraryZone::reorganizeCards()
{
update();
}
void LibraryZone::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
CardZone::mousePressEvent(event);
if (event->isAccepted())
return;
if (event->button() == Qt::LeftButton) {
setCursor(Qt::ClosedHandCursor);
event->accept();
} else
event->ignore();
}
void LibraryZone::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < QApplication::startDragDistance())
return;
if (cards->empty())
return;
bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier);
CardItem *card = cards->at(0);
CardDragItem *drag = card->createDragItem(0, event->pos(), event->scenePos(), faceDown);
drag->grabMouse();
setCursor(Qt::OpenHandCursor);
}
void LibraryZone::mouseReleaseEvent(QGraphicsSceneMouseEvent */*event*/)
{
setCursor(Qt::OpenHandCursor);
}

View file

@ -1,21 +0,0 @@
#ifndef LIBRARYZONE_H
#define LIBRARYZONE_H
#include "cardzone.h"
class LibraryZone : public CardZone {
private:
public:
LibraryZone(Player *_p, QGraphicsItem *parent = 0);
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void reorganizeCards();
void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void addCardImpl(CardItem *card, int x, int y);
};
#endif

View file

@ -1,160 +1,168 @@
#include "messagelogwidget.h" #include "messagelogwidget.h"
#include "game.h" #include "game.h"
#include <QScrollBar> #include "player.h"
QString MessageLogWidget::sanitizeHtml(QString dirty)
{
return dirty
.replace("&", "&amp;")
.replace("<", "&lt;")
.replace(">", "&gt;");
}
void MessageLogWidget::logConnecting(QString hostname) void MessageLogWidget::logConnecting(QString hostname)
{ {
appendPlainText(tr("Connecting to %1...").arg(hostname)); append(tr("Connecting to %1...").arg(sanitizeHtml(hostname)));
} }
void MessageLogWidget::logConnected(const QStringList WelcomeMsg) void MessageLogWidget::logConnected(const QStringList WelcomeMsg)
{ {
appendPlainText(tr("Connected.")); append(tr("Connected."));
QStringListIterator i(WelcomeMsg); QStringListIterator i(WelcomeMsg);
while (i.hasNext()) while (i.hasNext())
appendPlainText(i.next()); append(i.next());
} }
void MessageLogWidget::logDisconnected() void MessageLogWidget::logDisconnected()
{ {
appendPlainText(tr("Disconnected from server.")); append(tr("Disconnected from server."));
} }
void MessageLogWidget::logSocketError(const QString &errorString) void MessageLogWidget::logSocketError(const QString &errorString)
{ {
appendPlainText(errorString); append(sanitizeHtml(errorString));
} }
void MessageLogWidget::logServerError(ServerResponse response) void MessageLogWidget::logServerError(ServerResponse response)
{ {
switch (response) { switch (response) {
case RespPassword: appendPlainText(tr("Invalid password.")); break; case RespPassword: append(tr("Invalid password.")); break;
default: ; default: ;
} }
} }
void MessageLogWidget::logPlayerListReceived(QStringList players) void MessageLogWidget::logPlayerListReceived(QStringList players)
{ {
appendPlainText("---"); append("---");
appendPlainText(tr("You have joined the game. Player list:")); append(tr("You have joined the game. Player list:"));
for (int i = 0; i < players.size(); i++) for (int i = 0; i < players.size(); i++)
appendPlainText(players.at(i)); append(sanitizeHtml(players.at(i)));
appendPlainText("---"); append("---");
} }
void MessageLogWidget::logJoin(QString playerName) void MessageLogWidget::logJoin(Player *player)
{ {
appendPlainText(tr("%1 has joined the game").arg(playerName)); append(tr("%1 has joined the game").arg(sanitizeHtml(player->getName())));
} }
void MessageLogWidget::logLeave(QString playerName) void MessageLogWidget::logLeave(Player *player)
{ {
appendPlainText(tr("%1 has left the game").arg(playerName)); append(tr("%1 has left the game").arg(sanitizeHtml(player->getName())));
} }
void MessageLogWidget::logReadyStart(QString playerName) void MessageLogWidget::logReadyStart(Player *player)
{ {
appendPlainText(tr("%1 is ready to start a new game.").arg(playerName)); append(tr("%1 is ready to start a new game.").arg(sanitizeHtml(player->getName())));
} }
void MessageLogWidget::logGameStart() void MessageLogWidget::logGameStart()
{ {
appendPlainText(tr("Game has started.")); append(tr("Game has started."));
} }
void MessageLogWidget::logSay(QString playerName, QString message) void MessageLogWidget::logSay(Player *player, QString message)
{ {
appendHtml(QString("<font color=\"red\">%1:</font> %2").arg(playerName).arg(message)); append(QString("<font color=\"red\">%1:</font> %2").arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(message)));
} }
void MessageLogWidget::logShuffle(QString playerName) void MessageLogWidget::logShuffle(Player *player)
{ {
appendPlainText(tr("%1 shuffles his/her library").arg(playerName)); append(tr("%1 shuffles his/her library").arg(sanitizeHtml(player->getName())));
} }
void MessageLogWidget::logRollDice(QString playerName, int sides, int roll) void MessageLogWidget::logRollDice(Player *player, int sides, int roll)
{ {
appendPlainText(tr("%1 rolled a %2 with a %3-sided dice").arg(playerName).arg(roll).arg(sides)); append(tr("%1 rolled a %2 with a %3-sided dice").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides));
} }
void MessageLogWidget::logDraw(QString playerName, int number) void MessageLogWidget::logDraw(Player *player, int number)
{ {
if (number == 1) if (number == 1)
appendPlainText(tr("%1 draws a card").arg(playerName)); append(tr("%1 draws a card").arg(sanitizeHtml(player->getName())));
else else
appendPlainText(tr("%1 draws %2 cards").arg(playerName).arg(number)); append(tr("%1 draws %2 cards").arg(sanitizeHtml(player->getName())).arg(number));
} }
void MessageLogWidget::logMoveCard(QString playerName, QString cardName, QString startZone, QString targetZone) void MessageLogWidget::logMoveCard(Player *player, QString cardName, QString startZone, QString targetZone)
{ {
appendPlainText(tr("%1 moves %2 from %3 to %4").arg(playerName).arg(cardName).arg(startZone).arg(targetZone)); append(tr("%1 moves <font color=\"blue\">%2</font> from %3 to %4").arg(sanitizeHtml(player->getName())).arg(cardName).arg(startZone).arg(targetZone));
} }
void MessageLogWidget::logCreateToken(QString playerName, QString cardName) void MessageLogWidget::logCreateToken(Player *player, QString cardName)
{ {
appendPlainText(tr("%1 creates token: %2").arg(playerName).arg(cardName)); append(tr("%1 creates token: <font color=\"blue\">%2</font>").arg(sanitizeHtml(player->getName())).arg(cardName));
} }
void MessageLogWidget::logSetCardCounters(QString playerName, QString cardName, int value, int oldValue) void MessageLogWidget::logSetCardCounters(Player *player, QString cardName, int value, int oldValue)
{ {
if (value > oldValue) if (value > oldValue)
appendPlainText(tr("%1 places %2 counters on %3 (now %4)").arg(playerName).arg(value - oldValue).arg(cardName).arg(value)); append(tr("%1 places %2 counters on <font color=\"blue\">%3</font> (now %4)").arg(sanitizeHtml(player->getName())).arg(value - oldValue).arg(cardName).arg(value));
else else
appendPlainText(tr("%1 removes %2 counters from %3 (now %4)").arg(playerName).arg(oldValue - value).arg(cardName).arg(value)); append(tr("%1 removes %2 counters from <font color=\"blue\">%3</font> (now %4)").arg(sanitizeHtml(player->getName())).arg(oldValue - value).arg(cardName).arg(value));
} }
void MessageLogWidget::logSetTapped(QString playerName, QString cardName, bool tapped) void MessageLogWidget::logSetTapped(Player *player, QString cardName, bool tapped)
{ {
if (cardName == "-1") if (cardName == "-1")
cardName = tr("his permanents"); cardName = tr("his permanents");
appendPlainText(tr("%1 %2 %3").arg(playerName).arg(tapped ? "taps" : "untaps").arg(cardName)); append(tr("%1 %2 <font color=\"blue\">%3</blue>").arg(sanitizeHtml(player->getName())).arg(tapped ? "taps" : "untaps").arg(cardName));
} }
void MessageLogWidget::logSetCounter(QString playerName, QString counterName, int value, int oldValue) void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue)
{ {
appendPlainText(tr("%1 sets counter \"%2\" to %3 (%4%5)").arg(playerName).arg(counterName).arg(value).arg(value > oldValue ? "+" : "").arg(value - oldValue)); append(tr("%1 sets counter \"%2\" to %3 (%4%5)").arg(sanitizeHtml(player->getName())).arg(counterName).arg(value).arg(value > oldValue ? "+" : "").arg(value - oldValue));
} }
void MessageLogWidget::logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap) void MessageLogWidget::logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap)
{ {
if (doesntUntap) if (doesntUntap)
appendPlainText(tr("%1 sets %2 to not untap normally.").arg(playerName).arg(cardName)); append(tr("%1 sets <font color=\"blue\">%2</font> to not untap normally.").arg(sanitizeHtml(player->getName())).arg(cardName));
else else
appendPlainText(tr("%1 sets %2 to untap normally.").arg(playerName).arg(cardName)); append(tr("%1 sets <font color=\"blue\">%2</font> to untap normally.").arg(sanitizeHtml(player->getName())).arg(cardName));
} }
void MessageLogWidget::logDumpZone(QString playerName, QString zoneName, QString zoneOwner, int numberCards) void MessageLogWidget::logDumpZone(Player *player, QString zoneName, QString zoneOwner, int numberCards)
{ {
if (numberCards) if (numberCards)
appendPlainText(tr("%1 is looking at the top %2 cards of %3's %4").arg(playerName).arg(numberCards).arg(zoneOwner).arg(zoneName)); append(tr("%1 is looking at the top %2 cards of %3's %4").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zoneOwner).arg(zoneName));
else else
appendPlainText(tr("%1 is looking at %2's %3").arg(playerName).arg(zoneOwner).arg(zoneName)); append(tr("%1 is looking at %2's %3").arg(sanitizeHtml(player->getName())).arg(zoneOwner).arg(zoneName));
} }
void MessageLogWidget::connectToGame(Game *game) void MessageLogWidget::connectToGame(Game *game)
{ {
connect(game, SIGNAL(logPlayerListReceived(QStringList)), this, SLOT(logPlayerListReceived(QStringList))); connect(game, SIGNAL(logPlayerListReceived(QStringList)), this, SLOT(logPlayerListReceived(QStringList)));
connect(game, SIGNAL(logJoin(QString)), this, SLOT(logJoin(QString))); connect(game, SIGNAL(logJoin(Player *)), this, SLOT(logJoin(Player *)));
connect(game, SIGNAL(logLeave(QString)), this, SLOT(logLeave(QString))); connect(game, SIGNAL(logLeave(Player *)), this, SLOT(logLeave(Player *)));
connect(game, SIGNAL(logReadyStart(QString)), this, SLOT(logReadyStart(QString))); connect(game, SIGNAL(logReadyStart(Player *)), this, SLOT(logReadyStart(Player *)));
connect(game, SIGNAL(logGameStart()), this, SLOT(logGameStart())); connect(game, SIGNAL(logGameStart()), this, SLOT(logGameStart()));
connect(game, SIGNAL(logSay(QString, QString)), this, SLOT(logSay(QString, QString))); connect(game, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString)));
connect(game, SIGNAL(logShuffle(QString)), this, SLOT(logShuffle(QString))); connect(game, SIGNAL(logShuffle(Player *)), this, SLOT(logShuffle(Player *)));
connect(game, SIGNAL(logRollDice(QString, int, int)), this, SLOT(logRollDice(QString, int, int))); connect(game, SIGNAL(logRollDice(Player *, int, int)), this, SLOT(logRollDice(Player *, int, int)));
connect(game, SIGNAL(logDraw(QString, int)), this, SLOT(logDraw(QString, int))); connect(game, SIGNAL(logDraw(Player *, int)), this, SLOT(logDraw(Player *, int)));
connect(game, SIGNAL(logMoveCard(QString, QString, QString, QString)), this, SLOT(logMoveCard(QString, QString, QString, QString))); connect(game, SIGNAL(logMoveCard(Player *, QString, QString, QString)), this, SLOT(logMoveCard(Player *, QString, QString, QString)));
connect(game, SIGNAL(logCreateToken(QString, QString)), this, SLOT(logCreateToken(QString, QString))); connect(game, SIGNAL(logCreateToken(Player *, QString)), this, SLOT(logCreateToken(Player *, QString)));
connect(game, SIGNAL(logSetCardCounters(QString, QString, int, int)), this, SLOT(logSetCardCounters(QString, QString, int, int))); connect(game, SIGNAL(logSetCardCounters(Player *, QString, int, int)), this, SLOT(logSetCardCounters(Player *, QString, int, int)));
connect(game, SIGNAL(logSetTapped(QString, QString, bool)), this, SLOT(logSetTapped(QString, QString, bool))); connect(game, SIGNAL(logSetTapped(Player *, QString, bool)), this, SLOT(logSetTapped(Player *, QString, bool)));
connect(game, SIGNAL(logSetCounter(QString, QString, int, int)), this, SLOT(logSetCounter(QString, QString, int, int))); connect(game, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SLOT(logSetCounter(Player *, QString, int, int)));
connect(game, SIGNAL(logSetDoesntUntap(QString, QString, bool)), this, SLOT(logSetDoesntUntap(QString, QString, bool))); connect(game, SIGNAL(logSetDoesntUntap(Player *, QString, bool)), this, SLOT(logSetDoesntUntap(Player *, QString, bool)));
connect(game, SIGNAL(logDumpZone(QString, QString, QString, int)), this, SLOT(logDumpZone(QString, QString, QString, int))); connect(game, SIGNAL(logDumpZone(Player *, QString, QString, int)), this, SLOT(logDumpZone(Player *, QString, QString, int)));
} }
MessageLogWidget::MessageLogWidget(QWidget *parent) MessageLogWidget::MessageLogWidget(QWidget *parent)
: QPlainTextEdit(parent) : QTextEdit(parent)
{ {
setReadOnly(true); setReadOnly(true);
QFont f; QFont f;

View file

@ -6,9 +6,12 @@
#include "client.h" #include "client.h"
class Game; class Game;
class Player;
class MessageLogWidget : public QPlainTextEdit { class MessageLogWidget : public QTextEdit {
Q_OBJECT Q_OBJECT
private:
QString sanitizeHtml(QString dirty);
public slots: public slots:
void logConnecting(QString hostname); void logConnecting(QString hostname);
void logConnected(const QStringList WelcomeMsg); void logConnected(const QStringList WelcomeMsg);
@ -17,21 +20,21 @@ public slots:
void logServerError(ServerResponse response); void logServerError(ServerResponse response);
private slots: private slots:
void logPlayerListReceived(QStringList players); void logPlayerListReceived(QStringList players);
void logJoin(QString playerName); void logJoin(Player *player);
void logLeave(QString playerName); void logLeave(Player *player);
void logReadyStart(QString playerName); void logReadyStart(Player *player);
void logGameStart(); void logGameStart();
void logSay(QString playerName, QString message); void logSay(Player *player, QString message);
void logShuffle(QString playerName); void logShuffle(Player *player);
void logRollDice(QString playerName, int sides, int roll); void logRollDice(Player *player, int sides, int roll);
void logDraw(QString playerName, int number); void logDraw(Player *player, int number);
void logMoveCard(QString playerName, QString cardName, QString startZone, QString targetZone); void logMoveCard(Player *player, QString cardName, QString startZone, QString targetZone);
void logCreateToken(QString playerName, QString cardName); void logCreateToken(Player *player, QString cardName);
void logSetCardCounters(QString playerName, QString cardName, int value, int oldValue); void logSetCardCounters(Player *player, QString cardName, int value, int oldValue);
void logSetTapped(QString playerName, QString cardName, bool tapped); void logSetTapped(Player *player, QString cardName, bool tapped);
void logSetCounter(QString playerName, QString counterName, int value, int oldValue); void logSetCounter(Player *player, QString counterName, int value, int oldValue);
void logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap); void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
void logDumpZone(QString playerName, QString zoneName, QString zoneOwner, int numberCards); void logDumpZone(Player *player, QString zoneName, QString zoneOwner, int numberCards);
public: public:
void connectToGame(Game *game); void connectToGame(Game *game);
MessageLogWidget(QWidget *parent = 0); MessageLogWidget(QWidget *parent = 0);

View file

@ -1,15 +1,16 @@
#include <QtGui> #include <QtGui>
#include "pilezone.h" #include "pilezone.h"
#include "player.h" #include "player.h"
#include "game.h"
#include "client.h" #include "client.h"
#include "carddragitem.h" #include "carddragitem.h"
#include "zoneviewzone.h" #include "zoneviewzone.h"
PileZone::PileZone(Player *_p, const QString &_name, QGraphicsItem *parent) PileZone::PileZone(Player *_p, const QString &_name, bool _contentsKnown, QGraphicsItem *parent)
: CardZone(_p, _name, false, false, parent) : CardZone(_p, _name, false, false, _contentsKnown, parent)
{ {
cards = new CardList(true);
setCacheMode(DeviceCoordinateCache); // Do not move this line to the parent constructor! setCacheMode(DeviceCoordinateCache); // Do not move this line to the parent constructor!
setAcceptsHoverEvents(true);
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
} }
@ -21,20 +22,24 @@ QRectF PileZone::boundingRect() const
void PileZone::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void PileZone::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{ {
qDebug("PileZone::paint"); qDebug("PileZone::paint");
if (!cards->isEmpty()) { if (!cards.isEmpty()) {
painter->save(); painter->save();
cards->at(0)->paint(painter, option, widget); cards.at(0)->paint(painter, option, widget);
painter->restore(); painter->restore();
} }
paintNumberEllipse(cards->size(), painter); paintNumberEllipse(cards.size(), painter);
painter->drawRect(QRectF(0.5, 0.5, CARD_WIDTH - 1, CARD_HEIGHT - 1)); painter->drawRect(QRectF(0.5, 0.5, CARD_WIDTH - 1, CARD_HEIGHT - 1));
} }
void PileZone::addCardImpl(CardItem *card, int x, int /*y*/) void PileZone::addCardImpl(CardItem *card, int x, int /*y*/)
{ {
cards->insert(x, card); cards.insert(x, card);
card->setPos(0, 0); card->setPos(0, 0);
if (!contentsKnown()) {
card->setName(QString());
card->setId(-1);
}
card->setVisible(false); card->setVisible(false);
card->resetState(); card->resetState();
card->setParentItem(this); card->setParentItem(this);
@ -69,12 +74,13 @@ void PileZone::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < QApplication::startDragDistance()) if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < QApplication::startDragDistance())
return; return;
if (cards->empty()) if (cards.isEmpty())
return; return;
bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier); bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier);
CardItem *card = cards->at(0); CardItem *card = cards.at(0);
CardDragItem *drag = card->createDragItem(card->getId(), event->pos(), event->scenePos(), faceDown); const int cardid = contentsKnown() ? card->getId() : 0;
CardDragItem *drag = card->createDragItem(cardid, event->pos(), event->scenePos(), faceDown);
drag->grabMouse(); drag->grabMouse();
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
} }
@ -83,3 +89,10 @@ void PileZone::mouseReleaseEvent(QGraphicsSceneMouseEvent */*event*/)
{ {
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
} }
void PileZone::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
if (!cards.isEmpty())
((Game *) player->parent())->hoverCardEvent(cards.at(0));
QGraphicsItem::hoverEnterEvent(event);
}

View file

@ -4,9 +4,8 @@
#include "cardzone.h" #include "cardzone.h"
class PileZone : public CardZone { class PileZone : public CardZone {
private:
public: public:
PileZone(Player *_p, const QString &_name, QGraphicsItem *parent = 0); PileZone(Player *_p, const QString &_name, bool _contentsKnown, QGraphicsItem *parent = 0);
QRectF boundingRect() const; QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void reorganizeCards(); void reorganizeCards();
@ -15,6 +14,7 @@ protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void addCardImpl(CardItem *card, int x, int y); void addCardImpl(CardItem *card, int x, int y);
}; };

View file

@ -125,7 +125,7 @@ void Player::setCardAttrHelper(CardItem *card, const QString &aname, const QStri
bool tapped = avalue == "1"; bool tapped = avalue == "1";
if (!(!tapped && card->getDoesntUntap() && allCards)) { if (!(!tapped && card->getDoesntUntap() && allCards)) {
if (!allCards) if (!allCards)
emit logSetTapped(name, card->getName(), tapped); emit logSetTapped(this, card->getName(), tapped);
card->setTapped(tapped); card->setTapped(tapped);
} }
} else if (aname == "attacking") } else if (aname == "attacking")
@ -134,13 +134,13 @@ void Player::setCardAttrHelper(CardItem *card, const QString &aname, const QStri
card->setFaceDown(avalue == "1"); card->setFaceDown(avalue == "1");
else if (aname == "counters") { else if (aname == "counters") {
int value = avalue.toInt(); int value = avalue.toInt();
emit logSetCardCounters(name, card->getName(), value, card->getCounters()); emit logSetCardCounters(this, card->getName(), value, card->getCounters());
card->setCounters(value); card->setCounters(value);
} else if (aname == "annotation") } else if (aname == "annotation")
card->setAnnotation(avalue); card->setAnnotation(avalue);
else if (aname == "doesnt_untap") { else if (aname == "doesnt_untap") {
bool value = (avalue == "1"); bool value = (avalue == "1");
emit logSetDoesntUntap(name, card->getName(), value); emit logSetDoesntUntap(this, card->getName(), value);
card->setDoesntUntap(value); card->setDoesntUntap(value);
} }
} }
@ -230,7 +230,7 @@ void Player::gameEvent(const ServerEventData &event)
// The log event has to be sent before the card is added to the target zone // The log event has to be sent before the card is added to the target zone
// because the addCard function can modify the card object. // because the addCard function can modify the card object.
emit logMoveCard(name, card->getName(), startZone->getName(), targetZone->getName()); emit logMoveCard(this, card->getName(), startZone->getName(), targetZone->getName());
targetZone->addCard(card, true, x, y); targetZone->addCard(card, true, x, y);
@ -250,7 +250,7 @@ void Player::gameEvent(const ServerEventData &event)
CardItem *card = new CardItem(db, cardname, cardid); CardItem *card = new CardItem(db, cardname, cardid);
emit logCreateToken(name, card->getName()); emit logCreateToken(this, card->getName());
zone->addCard(card, true, x, y); zone->addCard(card, true, x, y);
break; break;
@ -266,11 +266,11 @@ void Player::gameEvent(const ServerEventData &event)
// XXX Fehlerbehandlung // XXX Fehlerbehandlung
if (cardId == -1) { if (cardId == -1) {
CardList *const cards = zone->getCards(); const CardList &cards = zone->getCards();
for (int i = 0; i < cards->size(); i++) for (int i = 0; i < cards.size(); i++)
setCardAttrHelper(cards->at(i), aname, avalue, true); setCardAttrHelper(cards.at(i), aname, avalue, true);
if (aname == "tapped") if (aname == "tapped")
emit logSetTapped(name, QString("-1"), avalue == "1"); emit logSetTapped(this, QString("-1"), avalue == "1");
} else { } else {
CardItem *card = zone->getCard(cardId, ""); CardItem *card = zone->getCard(cardId, "");
setCardAttrHelper(card, aname, avalue, false); setCardAttrHelper(card, aname, avalue, false);
@ -297,7 +297,7 @@ void Player::gameEvent(const ServerEventData &event)
Counter *c = area->getCounter(counterName); Counter *c = area->getCounter(counterName);
int oldValue = c->getValue(); int oldValue = c->getValue();
c->setValue(value); c->setValue(value);
emit logSetCounter(name, c->getName(), value, oldValue); emit logSetCounter(this, c->getName(), value, oldValue);
break; break;
} }
default: default:
@ -305,11 +305,6 @@ void Player::gameEvent(const ServerEventData &event)
} }
} }
void Player::hoverCardEvent(CardItem *card)
{
emit hoverCard(card->getName());
}
void Player::showCardMenu(const QPoint &p) void Player::showCardMenu(const QPoint &p)
{ {
emit sigShowCardMenu(p); emit sigShowCardMenu(p);

View file

@ -23,12 +23,12 @@ signals:
void toggleZoneView(Player *player, QString zoneName, int number); void toggleZoneView(Player *player, QString zoneName, int number);
void sigShowCardMenu(QPoint p); void sigShowCardMenu(QPoint p);
// Log events // Log events
void logMoveCard(QString playerName, QString cardName, QString startZone, QString targetZone); void logMoveCard(Player *player, QString cardName, QString startZone, QString targetZone);
void logCreateToken(QString playerName, QString cardName); void logCreateToken(Player *player, QString cardName);
void logSetCardCounters(QString playerName, QString cardName, int value, int oldValue); void logSetCardCounters(Player *player, QString cardName, int value, int oldValue);
void logSetTapped(QString playerName, QString cardName, bool tapped); void logSetTapped(Player *player, QString cardName, bool tapped);
void logSetCounter(QString playerName, QString counterName, int value, int oldValue); void logSetCounter(Player *player, QString counterName, int value, int oldValue);
void logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap); void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
private slots: private slots:
void actMoveHandToTopLibrary(); void actMoveHandToTopLibrary();
void actMoveHandToBottomLibrary(); void actMoveHandToBottomLibrary();
@ -66,7 +66,6 @@ public:
bool getLocal() const { return local; } bool getLocal() const { return local; }
const ZoneList *getZones() const { return &zones; } const ZoneList *getZones() const { return &zones; }
void gameEvent(const ServerEventData &event); void gameEvent(const ServerEventData &event);
void hoverCardEvent(CardItem *card);
CardDatabase *getDb() const { return db; } CardDatabase *getDb() const { return db; }
void showCardMenu(const QPoint &p); void showCardMenu(const QPoint &p);
}; };

View file

@ -2,7 +2,6 @@
#include "player.h" #include "player.h"
#include "tablezone.h" #include "tablezone.h"
#include "handzone.h" #include "handzone.h"
#include "libraryzone.h"
#include "pilezone.h" #include "pilezone.h"
#include "counter.h" #include "counter.h"
#include <QPainter> #include <QPainter>
@ -10,20 +9,22 @@
PlayerArea::PlayerArea(Player *_player, QGraphicsItem *parent) PlayerArea::PlayerArea(Player *_player, QGraphicsItem *parent)
: QGraphicsItem(parent), player(_player) : QGraphicsItem(parent), player(_player)
{ {
QPointF base = QPointF(55, 50); setCacheMode(DeviceCoordinateCache);
QPointF base = QPointF(55, 50);
LibraryZone *deck = new LibraryZone(_player, this); PileZone *deck = new PileZone(_player, "deck", false, this);
deck->setPos(base); deck->setPos(base);
qreal h = deck->boundingRect().height() + 20; qreal h = deck->boundingRect().height() + 20;
PileZone *grave = new PileZone(_player, "grave", this); PileZone *grave = new PileZone(_player, "grave", true, this);
grave->setPos(base + QPointF(0, h)); grave->setPos(base + QPointF(0, h));
PileZone *rfg = new PileZone(_player, "rfg", this); PileZone *rfg = new PileZone(_player, "rfg", true, this);
rfg->setPos(base + QPointF(0, 2 * h)); rfg->setPos(base + QPointF(0, 2 * h));
PileZone *sb = new PileZone(_player, "sb", this); PileZone *sb = new PileZone(_player, "sb", true, this);
sb->setVisible(false); sb->setVisible(false);
base = QPointF(deck->boundingRect().width() + 60, 0); base = QPointF(deck->boundingRect().width() + 60, 0);

View file

@ -4,10 +4,8 @@
#include "client.h" #include "client.h"
TableZone::TableZone(Player *_p, QGraphicsItem *parent) TableZone::TableZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "table", true, false, parent), width(864), height(578) : CardZone(_p, "table", true, false, true, parent), width(864), height(578)
{ {
cards = new CardList(true);
gridPoints << (QList<QPoint>() << QPoint(8, 12) gridPoints << (QList<QPoint>() << QPoint(8, 12)
<< QPoint(9, 13) << QPoint(9, 13)
<< QPoint(10, 14) << QPoint(10, 14)
@ -68,7 +66,7 @@ void TableZone::addCardImpl(CardItem *card, int _x, int _y)
qreal x = mapPoint.x(); qreal x = mapPoint.x();
qreal y = mapPoint.y(); qreal y = mapPoint.y();
cards->append(card); cards.append(card);
// if ((x != -1) && (y != -1)) { // if ((x != -1) && (y != -1)) {
if (!player->getLocal()) if (!player->getLocal())
y = height - CARD_HEIGHT - y; y = height - CARD_HEIGHT - y;
@ -108,9 +106,9 @@ void TableZone::toggleTapped()
CardItem *TableZone::getCardFromGrid(const QPoint &gridPoint) const CardItem *TableZone::getCardFromGrid(const QPoint &gridPoint) const
{ {
for (int i = 0; i < cards->size(); i++) for (int i = 0; i < cards.size(); i++)
if (cards->at(i)->getGridPoint() == gridPoint) if (cards.at(i)->getGridPoint() == gridPoint)
return cards->at(i); return cards.at(i);
return 0; return 0;
} }

View file

@ -4,9 +4,8 @@
#include "client.h" #include "client.h"
ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, QGraphicsItem *parent) ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, QGraphicsItem *parent)
: CardZone(_p, _origZone->getName(), false, false, parent, true), height(0), numberCards(_numberCards), origZone(_origZone) : CardZone(_p, _origZone->getName(), false, false, true, parent, true), height(0), numberCards(_numberCards), origZone(_origZone)
{ {
cards = new CardList(true);
origZone->setView(this); origZone->setView(this);
} }
@ -30,10 +29,10 @@ bool ZoneViewZone::initializeCards()
if (!origZone->contentsKnown()) if (!origZone->contentsKnown())
return false; return false;
CardList *const c = origZone->getCards(); const CardList &c = origZone->getCards();
int number = numberCards == 0 ? c->size() : (numberCards < c->size() ? numberCards : c->size()); int number = numberCards == 0 ? c.size() : (numberCards < c.size() ? numberCards : c.size());
for (int i = 0; i < number; i++) { for (int i = 0; i < number; i++) {
CardItem *card = c->at(i); CardItem *card = c.at(i);
addCard(new CardItem(player->getDb(), card->getName(), card->getId(), this), false, i); addCard(new CardItem(player->getDb(), card->getName(), card->getId(), this), false, i);
} }
reorganizeCards(); reorganizeCards();
@ -45,19 +44,19 @@ void ZoneViewZone::reorganizeCards()
{ {
qDebug("reorganizeCards"); qDebug("reorganizeCards");
if (cards->isEmpty()) if (cards.isEmpty())
return; return;
int cardCount = cards->size(); int cardCount = cards.size();
qreal totalWidth = boundingRect().width(); qreal totalWidth = boundingRect().width();
qreal totalHeight = boundingRect().height(); qreal totalHeight = boundingRect().height();
qreal cardWidth = cards->at(0)->boundingRect().width(); qreal cardWidth = cards.at(0)->boundingRect().width();
qreal cardHeight = cards->at(0)->boundingRect().height(); qreal cardHeight = cards.at(0)->boundingRect().height();
qreal x1 = 0; qreal x1 = 0;
qreal x2 = (totalWidth - cardWidth); qreal x2 = (totalWidth - cardWidth);
for (int i = 0; i < cardCount; i++) { for (int i = 0; i < cardCount; i++) {
CardItem *c = cards->at(i); CardItem *c = cards.at(i);
qreal x = i % 2 ? x2 : x1; qreal x = i % 2 ? x2 : x1;
// If the total height of the cards is smaller than the available height, // If the total height of the cards is smaller than the available height,
// the cards do not need to overlap and are displayed in the center of the area. // the cards do not need to overlap and are displayed in the center of the area.
@ -73,7 +72,7 @@ void ZoneViewZone::reorganizeCards()
void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/) void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/)
{ {
cards->insert(x, card); cards.insert(x, card);
card->setParentItem(this); card->setParentItem(this);
card->update(); card->update();
} }
@ -86,10 +85,10 @@ void ZoneViewZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint
void ZoneViewZone::removeCard(int position) void ZoneViewZone::removeCard(int position)
{ {
if (position >= cards->size()) if (position >= cards.size())
return; return;
CardItem *card = cards->takeAt(position); CardItem *card = cards.takeAt(position);
delete card; delete card;
reorganizeCards(); reorganizeCards();
} }