From 64c3c0984e30ddec0efb67c7bb4ceb2c6c0d8707 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Mon, 7 Mar 2011 18:50:06 +0100 Subject: [PATCH] minor performance improvements, removed explicit font size setting --- cockatrice/src/abstractcarditem.cpp | 25 +------ cockatrice/src/abstractcarditem.h | 2 - cockatrice/src/cardinfowidget.cpp | 12 --- cockatrice/src/carditem.cpp | 17 +++++ cockatrice/src/carditem.h | 1 + cockatrice/src/gamescene.cpp | 109 ++++++++++++++++------------ cockatrice/src/gamescene.h | 13 ++++ cockatrice/src/messagelogwidget.cpp | 3 - 8 files changed, 95 insertions(+), 87 deletions(-) diff --git a/cockatrice/src/abstractcarditem.cpp b/cockatrice/src/abstractcarditem.cpp index d8e1adb1..0deed4ea 100644 --- a/cockatrice/src/abstractcarditem.cpp +++ b/cockatrice/src/abstractcarditem.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include "carddatabase.h" @@ -9,8 +8,8 @@ #include "abstractcarditem.h" #include "settingscache.h" #include "main.h" +#include "gamescene.h" #include -#include AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, QGraphicsItem *parent) : ArrowTarget(_owner, parent), infoWidget(0), name(_name), tapped(false), tapAngle(0), isHovered(false), realZValue(0) @@ -22,10 +21,6 @@ AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, QGraphi connect(db, SIGNAL(cardListChanged()), this, SLOT(cardInfoUpdated())); connect(settingsCache, SIGNAL(displayCardNamesChanged()), this, SLOT(callUpdate())); cardInfoUpdated(); - - animationTimer = new QTimer(this); - animationTimer->setSingleShot(false); - connect(animationTimer, SIGNAL(timeout()), this, SLOT(animationEvent())); } AbstractCardItem::~AbstractCardItem() @@ -160,22 +155,6 @@ void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * painter->restore(); } -void AbstractCardItem::animationEvent() -{ - int delta = 18; - if (!tapped) - delta *= -1; - - tapAngle += delta; - - setTransform(QTransform().translate((float) CARD_WIDTH / 2, (float) CARD_HEIGHT / 2).rotate(tapAngle).translate((float) -CARD_WIDTH / 2, (float) -CARD_HEIGHT / 2)); - setHovered(false); - update(); - - if ((tapped && (tapAngle >= 90)) || (!tapped && (tapAngle <= 0))) - animationTimer->stop(); -} - void AbstractCardItem::setName(const QString &_name) { disconnect(info, 0, this, 0); @@ -210,7 +189,7 @@ void AbstractCardItem::setTapped(bool _tapped, bool canAnimate) tapped = _tapped; if (settingsCache->getTapAnimation() && canAnimate) - animationTimer->start(25); + static_cast(scene())->registerAnimationItem(this); else { tapAngle = tapped ? 90 : 0; setTransform(QTransform().translate((float) CARD_WIDTH / 2, (float) CARD_HEIGHT / 2).rotate(tapAngle).translate((float) -CARD_WIDTH / 2, (float) -CARD_HEIGHT / 2)); diff --git a/cockatrice/src/abstractcarditem.h b/cockatrice/src/abstractcarditem.h index 34074ece..c1345564 100644 --- a/cockatrice/src/abstractcarditem.h +++ b/cockatrice/src/abstractcarditem.h @@ -21,11 +21,9 @@ protected: int tapAngle; QString color; private: - QTimer *animationTimer; bool isHovered; qreal realZValue; private slots: - void animationEvent(); void pixmapUpdated(); void cardInfoUpdated(); void callUpdate() { update(); } diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index 10bf1548..3e7268bf 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -21,32 +21,20 @@ CardInfoWidget::CardInfoWidget(ResizeMode _mode, QWidget *parent, Qt::WindowFlag cardPicture = new QLabel; cardPicture->setAlignment(Qt::AlignCenter); - QFont f; - f.setPixelSize(11); - nameLabel1 = new QLabel; - nameLabel1->setFont(f); nameLabel2 = new QLabel; nameLabel2->setWordWrap(true); - nameLabel2->setFont(f); manacostLabel1 = new QLabel; - manacostLabel1->setFont(f); manacostLabel2 = new QLabel; - manacostLabel2->setFont(f); manacostLabel2->setWordWrap(true); cardtypeLabel1 = new QLabel; - cardtypeLabel1->setFont(f); cardtypeLabel2 = new QLabel; - cardtypeLabel2->setFont(f); cardtypeLabel2->setWordWrap(true); powtoughLabel1 = new QLabel; - powtoughLabel1->setFont(f); powtoughLabel2 = new QLabel; - powtoughLabel2->setFont(f); textLabel = new QTextEdit(); textLabel->setReadOnly(true); - textLabel->setFont(f); QGridLayout *grid = new QGridLayout(this); int row = 0; diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 66e6df64..1371eda6 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -501,6 +501,23 @@ void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) event->accept(); } +bool CardItem::animationEvent() +{ + int delta = 18; + if (!tapped) + delta *= -1; + + tapAngle += delta; + + setTransform(QTransform().translate((float) CARD_WIDTH / 2, (float) CARD_HEIGHT / 2).rotate(tapAngle).translate((float) -CARD_WIDTH / 2, (float) -CARD_HEIGHT / 2)); + setHovered(false); + update(); + + if ((tapped && (tapAngle >= 90)) || (!tapped && (tapAngle <= 0))) + return false; + return true; +} + QVariant CardItem::itemChange(GraphicsItemChange change, const QVariant &value) { if ((change == ItemSelectedHasChanged) && owner) { diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index 78fbc2e1..88b19d6f 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -96,6 +96,7 @@ public: void processCardInfo(ServerInfo_Card *info); void updateCardMenu(); + bool animationEvent(); CardDragItem *createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); void deleteDragItem(); protected: diff --git a/cockatrice/src/gamescene.cpp b/cockatrice/src/gamescene.cpp index d65a0df7..7b62db5d 100644 --- a/cockatrice/src/gamescene.cpp +++ b/cockatrice/src/gamescene.cpp @@ -6,13 +6,20 @@ #include #include #include +#include GameScene::GameScene(PhasesToolbar *_phasesToolbar, QObject *parent) : QGraphicsScene(parent), phasesToolbar(_phasesToolbar) { + animationTimer = new QBasicTimer; addItem(phasesToolbar); } +GameScene::~GameScene() +{ + delete animationTimer; +} + void GameScene::retranslateUi() { for (int i = 0; i < views.size(); ++i) @@ -152,61 +159,69 @@ void GameScene::processViewSizeChange(const QSize &newSize) players[i]->processSceneSizeChange(sceneRect().size() - QSizeF(phasesToolbar->getWidth(), 0)); } -bool GameScene::event(QEvent *event) +void GameScene::updateHover(const QPointF &scenePos) { - if (event->type() == QEvent::GraphicsSceneMouseMove) { - QGraphicsSceneMouseEvent *mouseEvent = static_cast(event); - - QSet cardsToUnhover; - - QList oldItemList = items(mouseEvent->lastScenePos()); - for (int i = 0; i < oldItemList.size(); ++i) { - CardItem *card = qgraphicsitem_cast(oldItemList[i]); - if (card) - cardsToUnhover.insert(card); - } - - QList itemList = items(mouseEvent->scenePos()); - - // Search for the topmost zone and ignore all cards not belonging to that zone. - CardZone *zone = 0; - for (int i = 0; i < itemList.size(); ++i) - if ((zone = qgraphicsitem_cast(itemList[i]))) - break; - - if (zone) { - CardItem *maxZCard = 0; - qreal maxZ = -1; - for (int i = 0; i < itemList.size(); ++i) { - CardItem *card = qgraphicsitem_cast(itemList[i]); - if (!card) + QList itemList = items(scenePos); + + // Search for the topmost zone and ignore all cards not belonging to that zone. + CardZone *zone = 0; + for (int i = 0; i < itemList.size(); ++i) + if ((zone = qgraphicsitem_cast(itemList[i]))) + break; + + CardItem *maxZCard = 0; + if (zone) { + qreal maxZ = -1; + for (int i = 0; i < itemList.size(); ++i) { + CardItem *card = qgraphicsitem_cast(itemList[i]); + if (!card) + continue; + if (card->getAttachedTo()) { + if (card->getAttachedTo()->getZone() != zone) continue; - if (card->getAttachedTo()) { - if (card->getAttachedTo()->getZone() != zone) - continue; - } else if (card->getZone() != zone) - continue; - - if (card->getRealZValue() > maxZ) { - maxZ = card->getRealZValue(); - maxZCard = card; - } - cardsToUnhover.insert(card); + } else if (card->getZone() != zone) + continue; + + if (card->getRealZValue() > maxZ) { + maxZ = card->getRealZValue(); + maxZCard = card; } - if (maxZCard) { - cardsToUnhover.remove(maxZCard); - maxZCard->setHovered(true); - } - } - QSet::const_iterator i = cardsToUnhover.constBegin(); - while (i != cardsToUnhover.constEnd()) { - (*i)->setHovered(false); - ++i; } } + if (hoveredCard && (maxZCard != hoveredCard)) + hoveredCard->setHovered(false); + if (maxZCard && (maxZCard != hoveredCard)) + maxZCard->setHovered(true); + hoveredCard = maxZCard; +} + +bool GameScene::event(QEvent *event) +{ + if (event->type() == QEvent::GraphicsSceneMouseMove) + updateHover(static_cast(event)->scenePos()); + return QGraphicsScene::event(event); } +void GameScene::timerEvent(QTimerEvent * /*event*/) +{ + QMutableSetIterator i(cardsToAnimate); + while (i.hasNext()) { + i.next(); + if (!i.value()->animationEvent()) + i.remove(); + } + if (cardsToAnimate.isEmpty()) + animationTimer->stop(); +} + +void GameScene::registerAnimationItem(AbstractCardItem *card) +{ + cardsToAnimate.insert(static_cast(card)); + if (!animationTimer->isActive()) + animationTimer->start(50, this); +} + void GameScene::startRubberBand(const QPointF &selectionOrigin) { emit sigStartRubberBand(selectionOrigin); diff --git a/cockatrice/src/gamescene.h b/cockatrice/src/gamescene.h index 4c08316b..eee167be 100644 --- a/cockatrice/src/gamescene.h +++ b/cockatrice/src/gamescene.h @@ -3,12 +3,17 @@ #include #include +#include +#include class Player; class ZoneViewWidget; class CardZone; +class AbstractCardItem; +class CardItem; class ServerInfo_Card; class PhasesToolbar; +class QBasicTimer; class GameScene : public QGraphicsScene { Q_OBJECT @@ -20,8 +25,13 @@ private: QRectF playersRect; QList views; QSize viewSize; + QPointer hoveredCard; + QBasicTimer *animationTimer; + QSet cardsToAnimate; + void updateHover(const QPointF &scenePos); public: GameScene(PhasesToolbar *_phasesToolbar, QObject *parent = 0); + ~GameScene(); void retranslateUi(); const QRectF &getPlayersRect() const { return playersRect; } void processViewSizeChange(const QSize &newSize); @@ -29,6 +39,8 @@ public: void startRubberBand(const QPointF &selectionOrigin); void resizeRubberBand(const QPointF &cursorPoint); void stopRubberBand(); + + void registerAnimationItem(AbstractCardItem *item); public slots: void toggleZoneView(Player *player, const QString &zoneName, int numberCards); void addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList); @@ -40,6 +52,7 @@ public slots: void rearrange(); protected: bool event(QEvent *event); + void timerEvent(QTimerEvent *event); signals: void sigStartRubberBand(const QPointF &selectionOrigin); void sigResizeRubberBand(const QPointF &cursorPoint); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index a89127b2..e298301f 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -481,9 +481,6 @@ MessageLogWidget::MessageLogWidget(QWidget *parent) : QTextEdit(parent) { setReadOnly(true); - QFont f; - f.setPixelSize(11); - setFont(f); } void MessageLogWidget::enterEvent(QEvent * /*event*/)