Browse Source

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.
v6.1.6
reuk 3 years ago
parent
commit
e1a7fe671a
No known key found for this signature in database GPG Key ID: 9ADCD339CFC98A11
2 changed files with 41 additions and 6 deletions
  1. +24
    -0
      BREAKING-CHANGES.txt
  2. +17
    -6
      modules/juce_gui_basics/components/juce_Component.cpp

+ 24
- 0
BREAKING-CHANGES.txt View File

@@ -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


+ 17
- 6
modules/juce_gui_basics/components/juce_Component.cpp View File

@@ -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…
Cancel
Save