mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Component: Make wheel/magnify behaviour more intuitive for disabled components
The previous implementation would pass the mouse wheel event up to the component's parent, as long as the parent was enabled. This meant that a wheel event on the innermost component of a hierarchy such as "[[disabled] enabled]" would send the event to the parent, but a wheel event on the innermost component of a hierarchy such as "[[[disabled] disabled] enabled]" would 'eat' the event and prevent it from propagating. After this change, unhandled mouse wheel events will always be passed to the nearest enabled parent. This behaviour is more consistent and intuitive.
This commit is contained in:
parent
c229d160f9
commit
e1a7fe671a
2 changed files with 41 additions and 6 deletions
|
|
@ -4,6 +4,30 @@ JUCE breaking changes
|
|||
develop
|
||||
=======
|
||||
|
||||
Change
|
||||
------
|
||||
Unhandled mouse wheel and magnify events will now be passed to the closest
|
||||
enclosing enabled ancestor component.
|
||||
|
||||
Possible Issues
|
||||
---------------
|
||||
Components that previously blocked mouse wheel events when in a disabled state
|
||||
may no longer block the events as expected.
|
||||
|
||||
Workaround
|
||||
----------
|
||||
If a component should explicitly prevent events from propagating when disabled,
|
||||
it should override mouseWheelMove() and mouseMagnify() to do nothing when the
|
||||
component is disabled.
|
||||
|
||||
Rationale
|
||||
---------
|
||||
Previously, unhandled wheel events would be passed to the parent component,
|
||||
but only if the parent was enabled. This meant that scrolling on a component
|
||||
nested inside a disabled component would have no effect by default. This
|
||||
behaviour was not intuitive.
|
||||
|
||||
|
||||
Change
|
||||
------
|
||||
The invalidPressure, invalidOrientation, invalidRotation, invalidTiltX and
|
||||
|
|
|
|||
|
|
@ -26,6 +26,17 @@
|
|||
namespace juce
|
||||
{
|
||||
|
||||
static Component* findFirstEnabledAncestor (Component* in)
|
||||
{
|
||||
if (in == nullptr)
|
||||
return nullptr;
|
||||
|
||||
if (in->isEnabled())
|
||||
return in;
|
||||
|
||||
return findFirstEnabledAncestor (in->getParentComponent());
|
||||
}
|
||||
|
||||
Component* Component::currentlyFocusedComponent = nullptr;
|
||||
|
||||
|
||||
|
|
@ -2269,16 +2280,16 @@ void Component::mouseDoubleClick (const MouseEvent&) {}
|
|||
|
||||
void Component::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel)
|
||||
{
|
||||
// the base class just passes this event up to its parent..
|
||||
if (parentComponent != nullptr && parentComponent->isEnabled())
|
||||
parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), wheel);
|
||||
// the base class just passes this event up to the nearest enabled ancestor
|
||||
if (auto* enabledComponent = findFirstEnabledAncestor (getParentComponent()))
|
||||
enabledComponent->mouseWheelMove (e.getEventRelativeTo (enabledComponent), wheel);
|
||||
}
|
||||
|
||||
void Component::mouseMagnify (const MouseEvent& e, float magnifyAmount)
|
||||
{
|
||||
// the base class just passes this event up to its parent..
|
||||
if (parentComponent != nullptr && parentComponent->isEnabled())
|
||||
parentComponent->mouseMagnify (e.getEventRelativeTo (parentComponent), magnifyAmount);
|
||||
// the base class just passes this event up to the nearest enabled ancestor
|
||||
if (auto* enabledComponent = findFirstEnabledAncestor (getParentComponent()))
|
||||
enabledComponent->mouseMagnify (e.getEventRelativeTo (enabledComponent), magnifyAmount);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue