From be28d50997ebb3ae78a7e81ab54d7af80c6230d5 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Fri, 21 Mar 2025 01:25:20 +0100 Subject: [PATCH] Revert "Use native hover events (#5722)" (#5757) This reverts commit e4f40a82a2f26ac22c27d1d08365624613d118e2. This change had unintended consequences in the hover behavior, reverting for now. --- .../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, 77 insertions(+), 27 deletions(-) diff --git a/cockatrice/src/game/cards/abstract_card_item.cpp b/cockatrice/src/game/cards/abstract_card_item.cpp index 28ed493e7..05e19d3b3 100644 --- a/cockatrice/src/game/cards/abstract_card_item.cpp +++ b/cockatrice/src/game/cards/abstract_card_item.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, @@ -19,7 +18,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), realZValue(0) + tapAngle(0), bgColor(Qt::transparent), isHovered(false), realZValue(0) { setCursor(Qt::OpenHandCursor); setFlag(ItemIsSelectable); @@ -27,8 +26,6 @@ AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, connect(&SettingsCache::instance(), &SettingsCache::displayCardNamesChanged, this, [this] { update(); }); refreshCardInfo(); - - setAcceptHoverEvents(true); } AbstractCardItem::~AbstractCardItem() @@ -160,7 +157,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(); @@ -169,7 +166,6 @@ 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) @@ -212,24 +208,17 @@ void AbstractCardItem::setProviderId(const QString &_providerId) refreshCardInfo(); } -void AbstractCardItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +void AbstractCardItem::setHovered(bool _hovered) { - Q_UNUSED(event); + if (isHovered == _hovered) + return; - 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); + 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); update(); } @@ -325,6 +314,11 @@ 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 cc13fe993..51b345267 100644 --- a/cockatrice/src/game/cards/abstract_card_item.h +++ b/cockatrice/src/game/cards/abstract_card_item.h @@ -24,6 +24,7 @@ protected: QColor bgColor; private: + bool isHovered; qreal realZValue; private slots: void pixmapUpdated(); @@ -85,6 +86,7 @@ public: return realZValue; } void setRealZValue(qreal _zValue); + void setHovered(bool _hovered); QString getColor() const { return color; @@ -100,6 +102,7 @@ public: return facedown; } void setFaceDown(bool _facedown); + void processHoverEvent(); void deleteCardInfoPopup() { emit deleteCardInfoPopup(name); @@ -111,9 +114,6 @@ 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 44a7c0880..f5426a60f 100644 --- a/cockatrice/src/game/cards/card_item.cpp +++ b/cockatrice/src/game/cards/card_item.cpp @@ -469,6 +469,7 @@ 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 bbc25ef6a..a9bd08051 100644 --- a/cockatrice/src/game/deckview/deck_view.cpp +++ b/cockatrice/src/game/deckview/deck_view.cpp @@ -158,6 +158,12 @@ 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 14c8f9da1..777298714 100644 --- a/cockatrice/src/game/deckview/deck_view.h +++ b/cockatrice/src/game/deckview/deck_view.h @@ -37,6 +37,7 @@ 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 53851e31a..e649bbb2a 100644 --- a/cockatrice/src/game/game_scene.cpp +++ b/cockatrice/src/game/game_scene.cpp @@ -253,6 +253,51 @@ 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 e580f1e33..801acacee 100644 --- a/cockatrice/src/game/game_scene.h +++ b/cockatrice/src/game/game_scene.h @@ -30,9 +30,11 @@ 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); @@ -63,6 +65,7 @@ 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 3c31f1f83..629074dc8 100644 --- a/cockatrice/src/game/player/player.cpp +++ b/cockatrice/src/game/player/player.cpp @@ -2386,6 +2386,7 @@ 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 b2645bd6a..08ee3d28e 100644 --- a/cockatrice/src/game/zones/pile_zone.cpp +++ b/cockatrice/src/game/zones/pile_zone.cpp @@ -131,7 +131,6 @@ void PileZone::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) void PileZone::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { if (!cards.isEmpty()) - emit cards[0]->hovered(cards[0]); - + cards[0]->processHoverEvent(); QGraphicsItem::hoverEnterEvent(event); }