From 939ab62273857704cafd3cac763df1288a4119f1 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Fri, 10 Apr 2009 16:07:27 +0200 Subject: [PATCH] ZoneView improvements --- cockatrice/cockatrice.pro | 4 +-- cockatrice/src/cardzone.cpp | 4 +-- cockatrice/src/cardzone.h | 4 ++- cockatrice/src/gravezone.cpp | 2 +- cockatrice/src/handzone.cpp | 2 +- cockatrice/src/libraryzone.cpp | 2 +- cockatrice/src/rfgzone.cpp | 2 +- cockatrice/src/sideboardzone.cpp | 2 +- cockatrice/src/tablezone.cpp | 3 +-- cockatrice/src/window_main.cpp | 10 ++++++-- cockatrice/src/window_main.h | 1 + cockatrice/src/zoneclosebutton.cpp | 18 ------------- cockatrice/src/zoneclosebutton.h | 17 ------------- cockatrice/src/zoneviewlayout.cpp | 26 ++++++++++++++++--- cockatrice/src/zoneviewlayout.h | 1 + cockatrice/src/zoneviewwidget.cpp | 41 +++++++++++++++++++++++++----- cockatrice/src/zoneviewwidget.h | 8 +++++- cockatrice/src/zoneviewzone.cpp | 4 +-- cockatrice/src/zoneviewzone.h | 2 ++ 19 files changed, 90 insertions(+), 63 deletions(-) delete mode 100644 cockatrice/src/zoneclosebutton.cpp delete mode 100644 cockatrice/src/zoneclosebutton.h diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index 5edf5941..2e593fc4 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -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 diff --git a/cockatrice/src/cardzone.cpp b/cockatrice/src/cardzone.cpp index 4f3aa920..87514e72 100644 --- a/cockatrice/src/cardzone.cpp +++ b/cockatrice/src/cardzone.cpp @@ -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); diff --git a/cockatrice/src/cardzone.h b/cockatrice/src/cardzone.h index b0064550..3ff6df6d 100644 --- a/cockatrice/src/cardzone.h +++ b/cockatrice/src/cardzone.h @@ -17,15 +17,17 @@ protected: QList 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; } diff --git a/cockatrice/src/gravezone.cpp b/cockatrice/src/gravezone.cpp index 12c7a956..9289b7ee 100644 --- a/cockatrice/src/gravezone.cpp +++ b/cockatrice/src/gravezone.cpp @@ -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); } diff --git a/cockatrice/src/handzone.cpp b/cockatrice/src/handzone.cpp index 1e6609d2..5e15e4ad 100644 --- a/cockatrice/src/handzone.cpp +++ b/cockatrice/src/handzone.cpp @@ -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()); } diff --git a/cockatrice/src/libraryzone.cpp b/cockatrice/src/libraryzone.cpp index 672f4519..288a0e43 100644 --- a/cockatrice/src/libraryzone.cpp +++ b/cockatrice/src/libraryzone.cpp @@ -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); diff --git a/cockatrice/src/rfgzone.cpp b/cockatrice/src/rfgzone.cpp index c276bf8d..b50ba2e0 100644 --- a/cockatrice/src/rfgzone.cpp +++ b/cockatrice/src/rfgzone.cpp @@ -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); } diff --git a/cockatrice/src/sideboardzone.cpp b/cockatrice/src/sideboardzone.cpp index 8a613889..2523507f 100644 --- a/cockatrice/src/sideboardzone.cpp +++ b/cockatrice/src/sideboardzone.cpp @@ -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); } diff --git a/cockatrice/src/tablezone.cpp b/cockatrice/src/tablezone.cpp index 0281b74b..2d8dee25 100644 --- a/cockatrice/src/tablezone.cpp +++ b/cockatrice/src/tablezone.cpp @@ -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 diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index f70abacd..bebbafd5 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -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) diff --git a/cockatrice/src/window_main.h b/cockatrice/src/window_main.h index bd70121a..386bee28 100644 --- a/cockatrice/src/window_main.h +++ b/cockatrice/src/window_main.h @@ -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; diff --git a/cockatrice/src/zoneclosebutton.cpp b/cockatrice/src/zoneclosebutton.cpp deleted file mode 100644 index 831c6b79..00000000 --- a/cockatrice/src/zoneclosebutton.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#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); -} diff --git a/cockatrice/src/zoneclosebutton.h b/cockatrice/src/zoneclosebutton.h deleted file mode 100644 index 5f3b852e..00000000 --- a/cockatrice/src/zoneclosebutton.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef ZONECLOSEBUTTON_H -#define ZONECLOSEBUTTON_H - -#include - -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 diff --git a/cockatrice/src/zoneviewlayout.cpp b/cockatrice/src/zoneviewlayout.cpp index 04e1285a..fd5f1d8d 100644 --- a/cockatrice/src/zoneviewlayout.cpp +++ b/cockatrice/src/zoneviewlayout.cpp @@ -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(); +} diff --git a/cockatrice/src/zoneviewlayout.h b/cockatrice/src/zoneviewlayout.h index 8e7da1d3..38d5edbc 100644 --- a/cockatrice/src/zoneviewlayout.h +++ b/cockatrice/src/zoneviewlayout.h @@ -20,6 +20,7 @@ public: public slots: void addItem(Player *player, const QString &zoneName, int numberCards = 0); void removeItem(ZoneViewWidget *item); + void closeMostRecentZoneView(); }; #endif diff --git a/cockatrice/src/zoneviewwidget.cpp b/cockatrice/src/zoneviewwidget.cpp index f50c5b04..6b266f4d 100644 --- a/cockatrice/src/zoneviewwidget.cpp +++ b/cockatrice/src/zoneviewwidget.cpp @@ -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)), this, SLOT(zoneDumpReceived(int, QList))); cmdId = player->client->dumpZone(player->getId(), _origZone->getName(), numberCards); @@ -39,7 +62,11 @@ void ZoneViewWidget::zoneDumpReceived(int commandId, QList car zone->reorganizeCards(); } -void ZoneViewWidget::slotClosePressed() +void ZoneViewWidget::closeEvent(QCloseEvent *event) { + if (shuffleCheckBox) + if (shuffleCheckBox->isChecked()) + player->client->shuffle(); emit closePressed(this); + event->accept(); } diff --git a/cockatrice/src/zoneviewwidget.h b/cockatrice/src/zoneviewwidget.h index c6391b97..dc214352 100644 --- a/cockatrice/src/zoneviewwidget.h +++ b/cockatrice/src/zoneviewwidget.h @@ -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 cards); - void slotClosePressed(); public: ZoneViewWidget(CardDatabase *_db, Player *_player, CardZone *_origZone, int numberCards = 0, QGraphicsItem *parent = 0); +protected: + void closeEvent(QCloseEvent *event); }; #endif diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index f2e37f60..1c6d692e 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -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) diff --git a/cockatrice/src/zoneviewzone.h b/cockatrice/src/zoneviewzone.h index cdf6732f..48a31052 100644 --- a/cockatrice/src/zoneviewzone.h +++ b/cockatrice/src/zoneviewzone.h @@ -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