1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

PopupMenu: Add mouse movement timeout back in

This reimplements similar functionality to that removed in
d39789b021.

Unlike the previous implementation, this version will still wait for the
mouse to move over the menu before the countdown timer is allowed to
start. This should avoid the situation where menu items are accidentally
triggered on mouse-up, after a menu opens under the pointer in response
to a mouse-down.
This commit is contained in:
reuk 2025-07-01 18:48:56 +01:00
parent 6091dc8807
commit ac2c863ffa
No known key found for this signature in database

View file

@ -1423,7 +1423,7 @@ public:
private: private:
Point<int> lastMousePos; Point<int> lastMousePos;
double scrollAcceleration = 0; double scrollAcceleration = 0;
uint32 lastScrollTime; uint32 lastScrollTime = 0, lastMoveTime = 0;
bool isDown = false; bool isDown = false;
// Although most mouse movements can be handled inside mouse event callbacks, scrolling of menus // Although most mouse movements can be handled inside mouse event callbacks, scrolling of menus
@ -1454,7 +1454,7 @@ private:
window.showSubMenuFor (window.currentChild); window.showSubMenuFor (window.currentChild);
} }
highlightItemUnderMouse (globalMousePos, localMousePos); highlightItemUnderMouse (globalMousePos, localMousePos, timeNow);
const bool overScrollArea = scrollIfNecessary (localMousePos, timeNow); const bool overScrollArea = scrollIfNecessary (localMousePos, timeNow);
const bool isOverAny = window.isOverAnyMenu(); const bool isOverAny = window.isOverAnyMenu();
@ -1498,19 +1498,25 @@ private:
} }
} }
void highlightItemUnderMouse (Point<int> globalMousePos, Point<int> localMousePos) void highlightItemUnderMouse (Point<int> globalMousePos, Point<int> localMousePos, uint32 timeNow)
{ {
const auto mouseTimedOut = lastMoveTime != 0 && 350 < (timeNow - lastMoveTime);
const auto mouseHasMoved = 2 < lastMousePos.getDistanceFrom (globalMousePos); const auto mouseHasMoved = 2 < lastMousePos.getDistanceFrom (globalMousePos);
if (! mouseHasMoved)
return;
const auto isMouseOver = window.reallyContains (localMousePos, true); const auto isMouseOver = window.reallyContains (localMousePos, true);
if (isMouseOver) if (mouseHasMoved && isMouseOver)
{
window.disableMouseMoves = false; window.disableMouseMoves = false;
lastMoveTime = timeNow;
}
if (window.disableMouseMoves || (window.activeSubMenu != nullptr && window.activeSubMenu->isOverChildren())) if (! mouseHasMoved && ! mouseTimedOut)
return;
if (window.disableMouseMoves)
return;
if (window.activeSubMenu != nullptr && window.activeSubMenu->isOverChildren())
return; return;
const auto isMovingTowardsMenu = isMouseOver const auto isMovingTowardsMenu = isMouseOver