From e4f40a82a2f26ac22c27d1d08365624613d118e2 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sat, 15 Mar 2025 20:07:51 +0100 Subject: [PATCH] Use native hover events (#5722) * Use native hover events * Update cockatrice/src/game/cards/abstract_card_item.cpp * Reorder --------- Co-authored-by: Zach H --- .../src/game/cards/abstract_card_item.cpp | 38 +++++++++------- .../src/game/cards/abstract_card_item.h | 6 +-- cockatrice/src/game/cards/card_item.cpp | 1 - cockatrice/src/game/deckview/deck_view.cpp | 6 --- cockatrice/src/game/deckview/deck_view.h | 1 - cockatrice/src/game/game_scene.cpp | 45 ------------------- cockatrice/src/game/game_scene.h | 3 -- cockatrice/src/game/player/player.cpp | 1 - cockatrice/src/game/zones/pile_zone.cpp | 3 +- 9 files changed, 27 insertions(+), 77 deletions(-) diff --git a/cockatrice/src/game/cards/abstract_card_item.cpp b/cockatrice/src/game/cards/abstract_card_item.cpp index 15dcc7e71..b071caca9 100644 --- a/cockatrice/src/game/cards/abstract_card_item.cpp +++ b/cockatrice/src/game/cards/abstract_card_item.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, @@ -18,7 +19,7 @@ AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, Player *_owner, int _id) : ArrowTarget(_owner, parent), id(_id), name(_name), providerId(_providerId), tapped(false), facedown(false), - tapAngle(0), bgColor(Qt::transparent), isHovered(false), realZValue(0) + tapAngle(0), bgColor(Qt::transparent), realZValue(0) { setCursor(Qt::OpenHandCursor); setFlag(ItemIsSelectable); @@ -26,6 +27,8 @@ AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, connect(&SettingsCache::instance(), &SettingsCache::displayCardNamesChanged, this, [this] { update(); }); refreshCardInfo(); + + setAcceptHoverEvents(true); } AbstractCardItem::~AbstractCardItem() @@ -157,7 +160,7 @@ void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedS painter->restore(); } -void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) +void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget * /*widget*/) { painter->save(); @@ -166,6 +169,7 @@ void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * painter->setRenderHint(QPainter::Antialiasing, false); + bool isHovered = option->state.testFlag(QStyle::State_MouseOver); if (isSelected() || isHovered) { QPen pen; if (isHovered) @@ -208,17 +212,24 @@ void AbstractCardItem::setProviderId(const QString &_providerId) refreshCardInfo(); } -void AbstractCardItem::setHovered(bool _hovered) +void AbstractCardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { - if (isHovered == _hovered) - return; + Q_UNUSED(event); - if (_hovered) - processHoverEvent(); - isHovered = _hovered; - setZValue(_hovered ? 2000000004 : realZValue); - setScale(_hovered && SettingsCache::instance().getScaleCards() ? 1.1 : 1); - setTransformOriginPoint(_hovered ? CARD_WIDTH / 2 : 0, _hovered ? CARD_HEIGHT / 2 : 0); + emit hovered(this); + setZValue(2000000004); + setScale(SettingsCache::instance().getScaleCards() ? 1.1 : 1); + setTransformOriginPoint(CARD_WIDTH / 2, CARD_HEIGHT / 2); + update(); +} + +void AbstractCardItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + Q_UNUSED(event); + + setZValue(realZValue); + setScale(1); + setTransformOriginPoint(0, 0); update(); } @@ -314,11 +325,6 @@ void AbstractCardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) event->accept(); } -void AbstractCardItem::processHoverEvent() -{ - emit hovered(this); -} - QVariant AbstractCardItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == ItemSelectedHasChanged) { diff --git a/cockatrice/src/game/cards/abstract_card_item.h b/cockatrice/src/game/cards/abstract_card_item.h index 51b345267..cc13fe993 100644 --- a/cockatrice/src/game/cards/abstract_card_item.h +++ b/cockatrice/src/game/cards/abstract_card_item.h @@ -24,7 +24,6 @@ protected: QColor bgColor; private: - bool isHovered; qreal realZValue; private slots: void pixmapUpdated(); @@ -86,7 +85,6 @@ public: return realZValue; } void setRealZValue(qreal _zValue); - void setHovered(bool _hovered); QString getColor() const { return color; @@ -102,7 +100,6 @@ public: return facedown; } void setFaceDown(bool _facedown); - void processHoverEvent(); void deleteCardInfoPopup() { emit deleteCardInfoPopup(name); @@ -114,6 +111,9 @@ protected: void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override; void cacheBgColor(); + + void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; }; #endif diff --git a/cockatrice/src/game/cards/card_item.cpp b/cockatrice/src/game/cards/card_item.cpp index 19cff1df1..67515e978 100644 --- a/cockatrice/src/game/cards/card_item.cpp +++ b/cockatrice/src/game/cards/card_item.cpp @@ -470,7 +470,6 @@ bool CardItem::animationEvent() .translate(CARD_WIDTH_HALF, CARD_HEIGHT_HALF) .rotate(tapAngle) .translate(-CARD_WIDTH_HALF, -CARD_HEIGHT_HALF)); - setHovered(false); update(); return animationIncomplete; diff --git a/cockatrice/src/game/deckview/deck_view.cpp b/cockatrice/src/game/deckview/deck_view.cpp index 920703d63..2f01361db 100644 --- a/cockatrice/src/game/deckview/deck_view.cpp +++ b/cockatrice/src/game/deckview/deck_view.cpp @@ -158,12 +158,6 @@ void DeckView::mouseDoubleClickEvent(QMouseEvent *event) } } -void DeckViewCard::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - event->accept(); - processHoverEvent(); -} - DeckViewCardContainer::DeckViewCardContainer(const QString &_name) : QGraphicsItem(), name(_name), width(0), height(0) { setCacheMode(DeviceCoordinateCache); diff --git a/cockatrice/src/game/deckview/deck_view.h b/cockatrice/src/game/deckview/deck_view.h index 777298714..14c8f9da1 100644 --- a/cockatrice/src/game/deckview/deck_view.h +++ b/cockatrice/src/game/deckview/deck_view.h @@ -37,7 +37,6 @@ public: protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; }; class DeckViewCardDragItem : public AbstractCardDragItem diff --git a/cockatrice/src/game/game_scene.cpp b/cockatrice/src/game/game_scene.cpp index e649bbb2a..53851e31a 100644 --- a/cockatrice/src/game/game_scene.cpp +++ b/cockatrice/src/game/game_scene.cpp @@ -253,51 +253,6 @@ void GameScene::processViewSizeChange(const QSize &newSize) } } -void GameScene::updateHover(const QPointF &scenePos) -{ - QList itemList = - items(scenePos, Qt::IntersectsItemBoundingRect, Qt::DescendingOrder, getViewTransform()); - - // 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; - } else if (card->getZone() != zone) - continue; - - if (card->getRealZValue() > maxZ) { - maxZ = card->getRealZValue(); - maxZCard = card; - } - } - } - 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); diff --git a/cockatrice/src/game/game_scene.h b/cockatrice/src/game/game_scene.h index 801acacee..e580f1e33 100644 --- a/cockatrice/src/game/game_scene.h +++ b/cockatrice/src/game/game_scene.h @@ -30,11 +30,9 @@ private: QList> playersByColumn; QList zoneViews; QSize viewSize; - QPointer hoveredCard; QBasicTimer *animationTimer; QSet cardsToAnimate; int playerRotation; - void updateHover(const QPointF &scenePos); public: explicit GameScene(PhasesToolbar *_phasesToolbar, QObject *parent = nullptr); @@ -65,7 +63,6 @@ public slots: void rearrange(); protected: - bool event(QEvent *event) override; void timerEvent(QTimerEvent *event) override; signals: void sigStartRubberBand(const QPointF &selectionOrigin); diff --git a/cockatrice/src/game/player/player.cpp b/cockatrice/src/game/player/player.cpp index bcd18d23a..e94342bd2 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -2392,7 +2392,6 @@ void Player::eventMoveCard(const Event_MoveCard &event, const GameEventContext & card->setFaceDown(event.face_down()); if (startZone != targetZone) { card->setBeingPointedAt(false); - card->setHovered(false); const QList &attachedCards = card->getAttachedCards(); for (auto attachedCard : attachedCards) { diff --git a/cockatrice/src/game/zones/pile_zone.cpp b/cockatrice/src/game/zones/pile_zone.cpp index 08ee3d28e..b2645bd6a 100644 --- a/cockatrice/src/game/zones/pile_zone.cpp +++ b/cockatrice/src/game/zones/pile_zone.cpp @@ -131,6 +131,7 @@ void PileZone::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) void PileZone::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { if (!cards.isEmpty()) - cards[0]->processHoverEvent(); + emit cards[0]->hovered(cards[0]); + QGraphicsItem::hoverEnterEvent(event); }