From e75c8370eba6559b45b8d3ffd68a1ed19f15dc80 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 8 Sep 2009 17:56:39 +0200 Subject: [PATCH] GameScene --- cockatrice/src/gamescene.cpp | 64 ++++++++++++++++++++++++++++++++++++ cockatrice/src/gamescene.h | 28 ++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 cockatrice/src/gamescene.cpp create mode 100644 cockatrice/src/gamescene.h diff --git a/cockatrice/src/gamescene.cpp b/cockatrice/src/gamescene.cpp new file mode 100644 index 00000000..7c04f583 --- /dev/null +++ b/cockatrice/src/gamescene.cpp @@ -0,0 +1,64 @@ +#include "gamescene.h" +#include "player.h" +#include "zoneviewlayout.h" + +GameScene::GameScene(ZoneViewLayout *_zvLayout, QObject *parent) + : QGraphicsScene(parent), zvLayout(_zvLayout) +{ + connect(zvLayout, SIGNAL(sizeChanged()), this, SLOT(updateSceneSize())); + addItem(zvLayout); +} + +void GameScene::updateSceneSize() +{ + int sceneWidth = 0; + int sceneHeight = 0; + for (int i = 0; i < players.size(); ++i) { + const QRectF br = players[i]->boundingRect(); + if (i) + sceneHeight += playerAreaSpacing; + sceneHeight += br.height(); + if (br.width() > sceneWidth) + sceneWidth = br.width(); + } + sceneWidth += zvLayout->size().width(); + qDebug(QString("updateSceneSize: w=%1 h=%2").arg(sceneWidth).arg(sceneHeight).toLatin1()); + setSceneRect(sceneRect().x(), sceneRect().y(), sceneWidth, sceneHeight); +} + +void GameScene::addPlayer(Player *player) +{ + players << player; + updateSceneSize(); + addItem(player); + rearrangePlayers(); +} + +void GameScene::removePlayer(Player *player) +{ + players.removeAt(players.indexOf(player)); + removeItem(player); + updateSceneSize(); + rearrangePlayers(); +} + +void GameScene::rearrangePlayers() +{ + QPointF base; + qreal maxWidth = 0; + Player *localPlayer = 0; + for (int i = 0; i < players.size(); ++i) { + QRectF br = players[i]->boundingRect(); + if (br.width() > maxWidth) + maxWidth = br.width(); + if (!players[i]->getLocal()) { + players[i]->setPos(base); + // Change this for better multiplayer support. + base += QPointF(0, br.height() + playerAreaSpacing); + } else + localPlayer = players[i]; + } + if (localPlayer) + localPlayer->setPos(base); + zvLayout->setPos(QPointF(maxWidth, 0)); +} diff --git a/cockatrice/src/gamescene.h b/cockatrice/src/gamescene.h new file mode 100644 index 00000000..4cf56a34 --- /dev/null +++ b/cockatrice/src/gamescene.h @@ -0,0 +1,28 @@ +#ifndef GAMESCENE_H +#define GAMESCENE_H + +#include +#include + +class Player; +class ZoneViewLayout; + +class GameScene : public QGraphicsScene { + Q_OBJECT +private: + static const int playerAreaSpacing = 5; + + QList players; + ZoneViewLayout *zvLayout; + + void rearrangePlayers(); +public: + GameScene(ZoneViewLayout *_zvLayout, QObject *parent = 0); +public slots: + void addPlayer(Player *player); + void removePlayer(Player *player); +private slots: + void updateSceneSize(); +}; + +#endif