@@ -55,16 +55,19 @@ bool MouseEventHandler::eventFilter(QObject *obj, QEvent *event)
55
55
forwardPointEvent (static_cast <QSinglePointEvent *>(event));
56
56
return true ;
57
57
58
- case QEvent::MouseButtonRelease:
58
+ case QEvent::MouseButtonRelease: {
59
59
emit mouseReleased ();
60
+ QQuickItem *oldClickedItem = m_clickedItem;
60
61
61
62
if (m_clickedItem) {
62
63
sendPointEventToItem (static_cast <QSinglePointEvent *>(event), m_clickedItem);
63
64
m_clickedItem = nullptr ;
64
- } else
65
- forwardPointEvent (static_cast <QSinglePointEvent *>(event));
65
+ }
66
+
67
+ forwardPointEvent (static_cast <QSinglePointEvent *>(event), oldClickedItem);
66
68
67
69
return true ;
70
+ }
68
71
69
72
default :
70
73
break ;
@@ -73,7 +76,7 @@ bool MouseEventHandler::eventFilter(QObject *obj, QEvent *event)
73
76
return QObject::eventFilter (obj, event);
74
77
}
75
78
76
- void MouseEventHandler::forwardPointEvent (QSinglePointEvent *event)
79
+ void MouseEventHandler::forwardPointEvent (QSinglePointEvent *event, QQuickItem *oldClickedItem )
77
80
{
78
81
Q_ASSERT (m_spriteRepeater);
79
82
@@ -97,22 +100,33 @@ void MouseEventHandler::forwardPointEvent(QSinglePointEvent *event)
97
100
// Sort the list by layer order
98
101
std::sort (sprites.begin (), sprites.end (), [](IRenderedTarget *t1, IRenderedTarget *t2) { return t1->scratchTarget ()->layerOrder () > t2->scratchTarget ()->layerOrder (); });
99
102
100
- // Send the event to the hovered sprite
103
+ // Find hovered sprite
104
+ QQuickItem *hoveredItem = nullptr ;
105
+
101
106
for (IRenderedTarget *sprite : sprites) {
102
107
// contains() expects position in the item's coordinate system
103
108
QPointF localPos = sprite->mapFromScene (event->scenePosition ());
104
109
105
110
if (sprite->contains (localPos)) {
106
- sendPointEventToItem (event, sprite) ;
107
- return ;
111
+ hoveredItem = sprite;
112
+ break ;
108
113
}
109
114
}
110
115
111
116
// If there wasn't any hovered sprite, send the event to the stage
112
- Q_ASSERT (m_stage);
117
+ if (!hoveredItem) {
118
+ hoveredItem = m_stage;
119
+ Q_ASSERT (m_stage);
120
+ }
113
121
114
- if (m_stage)
115
- sendPointEventToItem (event, m_stage);
122
+ // Send the event to the item
123
+ if (hoveredItem) {
124
+ // Since both the hovered item and previously clicked item should receive mouse release event,
125
+ // avoid duplicate events by checking whether the previously clicked item is the hovered item.
126
+ if (!(event->type () == QEvent::MouseButtonRelease && hoveredItem == oldClickedItem)) {
127
+ sendPointEventToItem (event, hoveredItem);
128
+ }
129
+ }
116
130
}
117
131
118
132
void MouseEventHandler::sendPointEventToItem (QSinglePointEvent *event, QQuickItem *item)
0 commit comments