ZoneView improvements

This commit is contained in:
Max-Wilhelm Bruker 2009-04-10 16:07:27 +02:00
parent 88829d0f66
commit 939ab62273
19 changed files with 90 additions and 63 deletions

View file

@ -12,5 +12,5 @@ QT += network
#QTPLUGIN += qjpeg
# Input
HEADERS += src/counter.h src/dlg_games.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/serverresponse.h src/pendingcommand.h src/zonelist.h src/counterlist.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/gravezone.h src/rfgzone.h src/sideboardzone.h src/carddragitem.h src/zoneclosebutton.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h
SOURCES += src/counter.cpp src/dlg_games.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/counterlist.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/gravezone.cpp src/rfgzone.cpp src/sideboardzone.cpp src/carddragitem.cpp src/zoneclosebutton.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp
HEADERS += src/counter.h src/dlg_games.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/serverresponse.h src/pendingcommand.h src/zonelist.h src/counterlist.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/gravezone.h src/rfgzone.h src/sideboardzone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h
SOURCES += src/counter.cpp src/dlg_games.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/counterlist.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/gravezone.cpp src/rfgzone.cpp src/sideboardzone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp

View file

@ -5,8 +5,8 @@
#include "client.h"
#include "zoneviewzone.h"
CardZone::CardZone(Player *_p, const QString &_name, QGraphicsItem *parent, bool isView)
: QGraphicsItem(parent), player(_p), name(_name), cards(NULL), menu(NULL), hasCardAttr(false)
CardZone::CardZone(Player *_p, const QString &_name, bool _hasCardAttr, bool _isShufflable, QGraphicsItem *parent, bool isView)
: QGraphicsItem(parent), player(_p), name(_name), cards(NULL), menu(NULL), hasCardAttr(_hasCardAttr), isShufflable(_isShufflable)
{
if (!isView)
player->addZone(this);

View file

@ -17,15 +17,17 @@ protected:
QList<ZoneViewZone *> views;
QMenu *menu;
bool hasCardAttr;
bool isShufflable;
void mousePressEvent(QGraphicsSceneMouseEvent *event);
public:
enum { Type = typeZone };
int type() const { return Type; }
virtual void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) = 0;
CardZone(Player *_player, const QString &_name, QGraphicsItem *parent = 0, bool isView = false);
CardZone(Player *_player, const QString &_name, bool _hasCardAttr, bool _isShufflable, QGraphicsItem *parent = 0, bool isView = false);
~CardZone();
void clearContents();
bool getHasCardAttr() const { return hasCardAttr; }
bool getIsShufflable() const { return isShufflable; }
QMenu *getMenu() const { return menu; }
void setMenu(QMenu *_menu) { menu = _menu; }
QString getName() const { return name; }

View file

@ -6,7 +6,7 @@
#include "zoneviewzone.h"
GraveZone::GraveZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "grave", parent)
: CardZone(_p, "grave", false, false, parent)
{
cards = new CardList(true);
}

View file

@ -4,7 +4,7 @@
#include "client.h"
HandZone::HandZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "hand", parent)
: CardZone(_p, "hand", false, false, parent)
{
cards = new CardList(player->getLocal());
}

View file

@ -7,7 +7,7 @@
#include "zoneviewzone.h"
LibraryZone::LibraryZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "deck", parent)
: CardZone(_p, "deck", false, true, parent)
{
cards = new CardList(false);
setCursor(Qt::OpenHandCursor);

View file

@ -6,7 +6,7 @@
#include "zoneviewzone.h"
RfgZone::RfgZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "rfg", parent)
: CardZone(_p, "rfg", false, false, parent)
{
cards = new CardList(true);
}

View file

@ -5,7 +5,7 @@
#include "zoneviewzone.h"
SideboardZone::SideboardZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "sb", parent)
: CardZone(_p, "sb", false, false, parent)
{
cards = new CardList(false);
}

View file

@ -4,10 +4,9 @@
#include "client.h"
TableZone::TableZone(Player *_p, QGraphicsItem *parent)
: CardZone(_p, "table", parent), width(720), height(510)
: CardZone(_p, "table", true, false, parent), width(720), height(510)
{
cards = new CardList(true);
hasCardAttr = true;
}
QRectF TableZone::boundingRect() const

View file

@ -181,6 +181,11 @@ void MainWindow::createActions()
connect(aDeckEditor, SIGNAL(triggered()), this, SLOT(actDeckEditor()));
aExit = new QAction(tr("&Exit"), this);
connect(aExit, SIGNAL(triggered()), this, SLOT(actExit()));
aCloseMostRecentZoneView = new QAction(tr("Close most recent zone view"), this);
aCloseMostRecentZoneView->setShortcut(tr("Esc"));
connect(aCloseMostRecentZoneView, SIGNAL(triggered()), zoneLayout, SLOT(closeMostRecentZoneView()));
addAction(aCloseMostRecentZoneView);
}
void MainWindow::createMenus()
@ -208,8 +213,6 @@ MainWindow::MainWindow(QWidget *parent)
// setWindowState(windowState() | Qt::WindowFullScreen);
QPixmapCache::setCacheLimit(200000);
createActions();
createMenus();
db = new CardDatabase;
int cardCount = db->loadFromFile("../cards.dat");
@ -262,6 +265,9 @@ MainWindow::MainWindow(QWidget *parent)
connect(client, SIGNAL(welcomeMsgReceived(const QStringList)), messageLog, SLOT(logConnected(const QStringList)));
connect(this, SIGNAL(logDisconnected()), messageLog, SLOT(logDisconnected()));
connect(client, SIGNAL(logSocketError(const QString &)), messageLog, SLOT(logSocketError(const QString &)));
createActions();
createMenus();
}
void MainWindow::closeEvent(QCloseEvent *event)

View file

@ -66,6 +66,7 @@ private:
void createMenus();
QMenu *gameMenu, *actionsMenu, *cardMenu;
QAction *aConnect, *aDisconnect, *aGames, *aRestartGame, *aLeaveGame, *aDeckEditor, *aExit;
QAction *aCloseMostRecentZoneView;
CardInfoWidget *cardInfo;
MessageLogWidget *messageLog;

View file

@ -1,18 +0,0 @@
#include <QtGui>
#include "zoneclosebutton.h"
void ZoneCloseButton::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
emit triggered();
}
void ZoneCloseButton::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->fillRect(rect(), QColor("red"));
}
ZoneCloseButton::ZoneCloseButton(QGraphicsItem *parent)
: QGraphicsWidget(parent)
{
resize(20, 20);
}

View file

@ -1,17 +0,0 @@
#ifndef ZONECLOSEBUTTON_H
#define ZONECLOSEBUTTON_H
#include <QGraphicsWidget>
class ZoneCloseButton : public QGraphicsWidget {
Q_OBJECT
signals:
void triggered();
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
ZoneCloseButton(QGraphicsItem *parent = 0);
};
#endif

View file

@ -11,10 +11,22 @@ ZoneViewLayout::ZoneViewLayout(CardDatabase *_db, QGraphicsItem *parent)
void ZoneViewLayout::reorganize()
{
qDebug(QString("ZoneViewLayout: activate: count=%1").arg(views.size()).toLatin1());
resize(views.size() * 150, 1000);
for (int i = 0; i < views.size(); i++) {
views.at(i)->setPos(i * 150, 0);
if (views.isEmpty()) {
resize(0, 0);
emit sizeChanged();
return;
}
qreal x, y;
views.at(0)->getWindowFrameMargins(&x, &y, 0, 0);
qreal totalWidth = x;
for (int i = 0; i < views.size(); i++) {
QRectF viewSize = views.at(i)->windowFrameRect();
qreal w = viewSize.right() - viewSize.left();
qreal h = viewSize.bottom() - viewSize.top();
views.at(i)->setPos(totalWidth, y);
totalWidth += w;
}
resize(totalWidth, scene()->sceneRect().height());
emit sizeChanged();
}
@ -31,6 +43,12 @@ void ZoneViewLayout::removeItem(ZoneViewWidget *item)
qDebug("ZoneViewLayout::removeItem");
views.removeAt(views.indexOf(item));
scene()->removeItem(item);
delete item;
reorganize();
}
void ZoneViewLayout::closeMostRecentZoneView()
{
if (views.isEmpty())
return;
views.at(views.size() - 1)->close();
}

View file

@ -20,6 +20,7 @@ public:
public slots:
void addItem(Player *player, const QString &zoneName, int numberCards = 0);
void removeItem(ZoneViewWidget *item);
void closeMostRecentZoneView();
};
#endif

View file

@ -5,18 +5,41 @@
#include "zoneviewzone.h"
#include "player.h"
#include "client.h"
#include "zoneclosebutton.h"
ZoneViewWidget::ZoneViewWidget(CardDatabase *_db, Player *_player, CardZone *_origZone, int numberCards, QGraphicsItem *parent)
: QGraphicsWidget(parent), db(_db), player(_player)
: QGraphicsWidget(parent, Qt::Tool | Qt::CustomizeWindowHint | Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint), db(_db), player(_player)
{
ZoneCloseButton *closeButton = new ZoneCloseButton(this);
connect(closeButton, SIGNAL(triggered()), this, SLOT(slotClosePressed()));
setWindowTitle(QString("%1's %2").arg(player->getName()).arg(_origZone->getName()));
setAttribute(Qt::WA_DeleteOnClose);
resize(150, 1000);
qreal y = 10;
if (_origZone->getIsShufflable() && (numberCards == 0)) {
shuffleCheckBox = new QCheckBox("shuffle when closing");
shuffleCheckBox->setChecked(true);
QGraphicsProxyWidget *shuffleProxy = new QGraphicsProxyWidget(this);
shuffleProxy->setWidget(shuffleCheckBox);
y += shuffleProxy->y() + shuffleProxy->size().height();
} else
shuffleCheckBox = 0;
qreal left, top, right, bottom;
getWindowFrameMargins(&left, &top, &right, &bottom);
qreal h = scene()->sceneRect().height() - (top + bottom);
scrollBar = new QScrollBar(Qt::Vertical);
QGraphicsProxyWidget *scrollProxy = new QGraphicsProxyWidget(this);
scrollProxy->setWidget(scrollBar);
scrollProxy->setPos(138, y);
scrollProxy->resize(scrollProxy->size().width(), h - y);
qreal w = 138 + scrollProxy->size().width();
resize(w, h);
setMinimumSize(w, h);
setMaximumSize(w, h);
zone = new ZoneViewZone(player, _origZone, numberCards, this);
zone->setPos(0, 30);
zone->setPos(3, y);
zone->setHeight(h - y);
if (!zone->initializeCards()) {
connect(player->client, SIGNAL(zoneDumpReceived(int, QList<ServerZoneCard *>)), this, SLOT(zoneDumpReceived(int, QList<ServerZoneCard *>)));
cmdId = player->client->dumpZone(player->getId(), _origZone->getName(), numberCards);
@ -39,7 +62,11 @@ void ZoneViewWidget::zoneDumpReceived(int commandId, QList<ServerZoneCard *> car
zone->reorganizeCards();
}
void ZoneViewWidget::slotClosePressed()
void ZoneViewWidget::closeEvent(QCloseEvent *event)
{
if (shuffleCheckBox)
if (shuffleCheckBox->isChecked())
player->client->shuffle();
emit closePressed(this);
event->accept();
}

View file

@ -10,6 +10,8 @@ class CardZone;
class ZoneViewZone;
class Player;
class CardDatabase;
class QScrollBar;
class QCheckBox;
class ZoneViewWidget : public QGraphicsWidget {
Q_OBJECT
@ -17,15 +19,19 @@ private:
ZoneViewZone *zone;
int cmdId;
QScrollBar *scrollBar;
QCheckBox *shuffleCheckBox;
CardDatabase *db;
Player *player;
signals:
void closePressed(ZoneViewWidget *zv);
private slots:
void zoneDumpReceived(int commandId, QList<ServerZoneCard *> cards);
void slotClosePressed();
public:
ZoneViewWidget(CardDatabase *_db, Player *_player, CardZone *_origZone, int numberCards = 0, QGraphicsItem *parent = 0);
protected:
void closeEvent(QCloseEvent *event);
};
#endif

View file

@ -4,7 +4,7 @@
#include "client.h"
ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, QGraphicsItem *parent)
: CardZone(_p, _origZone->getName(), parent, true), numberCards(_numberCards), origZone(_origZone)
: CardZone(_p, _origZone->getName(), false, false, parent, true), height(0), numberCards(_numberCards), origZone(_origZone)
{
cards = new CardList(true);
origZone->addView(this);
@ -18,7 +18,7 @@ ZoneViewZone::~ZoneViewZone()
QRectF ZoneViewZone::boundingRect() const
{
return QRectF(0, 0, CARD_WIDTH * 1.75, scene()->sceneRect().height());
return QRectF(0, 0, CARD_WIDTH * 1.75, height);
}
void ZoneViewZone::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)

View file

@ -8,6 +8,7 @@ class ZoneViewWidget;
class ZoneViewZone : public CardZone {
private:
int height;
int numberCards;
void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown);
CardZone *origZone;
@ -22,6 +23,7 @@ public:
void reorganizeCards();
bool initializeCards();
void removeCard(int position);
void setHeight(int _height) { height = _height; }
};
#endif