diff options
author | Sven Gothel <[email protected]> | 2023-09-24 02:39:26 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-09-24 02:39:26 +0200 |
commit | f29347ff72a13fa8344d21dc3589af3ff8b370cf (patch) | |
tree | e2ad080a31d4abb8991216568bd90dd083f3adb2 /src/graphui/classes/com/jogamp/graph | |
parent | 9f900c7f88d70808e24ed8b48087126dad0c3188 (diff) |
Bug 1459 - GraphUI Shape: Add active (pointer over/left) state and callback Listener
We already track this state within Scene, i.e. a shape is marked active when pointer is over it and released from active-duty when pointer left.
Scene shall notify the Shape so it can track this state locally
and also forward this event to the user via the typical Shape.Listener callback.
Diffstat (limited to 'src/graphui/classes/com/jogamp/graph')
-rw-r--r-- | src/graphui/classes/com/jogamp/graph/ui/Scene.java | 14 | ||||
-rw-r--r-- | src/graphui/classes/com/jogamp/graph/ui/Shape.java | 44 |
2 files changed, 52 insertions, 6 deletions
diff --git a/src/graphui/classes/com/jogamp/graph/ui/Scene.java b/src/graphui/classes/com/jogamp/graph/ui/Scene.java index 16e650124..2822ddc09 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Scene.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Scene.java @@ -916,11 +916,14 @@ public final class Scene implements Container, GLEventListener { } public void releaseActiveShape() { - if( null != activeShape && !FloatUtil.isZero(lastActiveZOffset) ) { - activeShape.move(0, 0, -lastActiveZOffset); - lastActiveZOffset = 0f; + if( null != activeShape ) { + if( !FloatUtil.isZero(lastActiveZOffset) ) { + activeShape.move(0, 0, -lastActiveZOffset); + lastActiveZOffset = 0f; + } + activeShape.setActive(false); + activeShape = null; } - activeShape = null; } private void setActiveShape(final Shape shape) { if( activeShape != shape ) { @@ -930,6 +933,9 @@ public final class Scene implements Container, GLEventListener { shape.move(0, 0, +lastActiveZOffset); } } + if( null != shape ) { + shape.setActive(true); + } activeShape = shape; } private float lastActiveZOffset = 0f; diff --git a/src/graphui/classes/com/jogamp/graph/ui/Shape.java b/src/graphui/classes/com/jogamp/graph/ui/Shape.java index db7d7d9c2..6b15e3afd 100644 --- a/src/graphui/classes/com/jogamp/graph/ui/Shape.java +++ b/src/graphui/classes/com/jogamp/graph/ui/Shape.java @@ -156,6 +156,7 @@ public abstract class Shape { private boolean draggable = true; private boolean resizable = true; private boolean interactive = true; + private boolean active = false; private boolean enabled = true; private float borderThickness = 0f; private Padding padding = null; @@ -165,6 +166,7 @@ public abstract class Shape { private ListenerBool onInitListener = null; private Listener onMoveListener = null; private Listener onToggleListener = null; + private Listener onActivationListener = null; private Listener onClickedListener = null; /** @@ -279,8 +281,34 @@ public abstract class Shape { * @param l callback, which shall return true signaling user initialization is done */ public final void onInit(final ListenerBool l) { onInitListener = l; } + /** + * Set user callback to be notified when shape is {@link #move(Vec3f)}'ed. + */ public final void onMove(final Listener l) { onMoveListener = l; } + /** + * Set user callback to be notified when shape {@link #toggle()}'ed. + * <p> + * This is usually the case when clicked, see {@link #onClicked(Listener)}. + * </p> + * <p> + * Use {@link #isToggleOn()} to retrieve the state. + * </p> + */ public final void onToggle(final Listener l) { onToggleListener = l; } + /** + * Set user callback to be notified when shape is activated (pointer-over and/or click) or de-activated (pointer left). + * <p> + * Use {@link #isActive()} to retrieve the state. + * </p> + */ + public final void onActivation(final Listener l) { onActivationListener = l; } + /** + * Set user callback to be notified when shape is clicked. + * <p> + * Usually shape is {@link #toggle()}'ed when clicked, see {@link #onToggle(Listener)}. + * However, in case shape is not {@link #isToggleable()} this is the last resort. + * </p> + */ public final void onClicked(final Listener l) { onClickedListener = l; } /** Move to scaled position. Position ends up in PMVMatrix4f unmodified. */ @@ -1101,10 +1129,11 @@ public abstract class Shape { } else { rotateS = ""; } + final String activeS = active ? ", active" : ""; final String ps = hasPadding() ? padding.toString()+", " : ""; final String bs = hasBorder() ? "border[l "+getBorderThickness()+", c "+getBorderColor()+"], " : ""; - return getDirtyString()+", id "+name+", enabled "+enabled+", toggle[able "+toggleable+", state "+toggle+ - "], able[iactive "+isInteractive()+", resize "+isResizable()+", move "+this.isDraggable()+ + return getDirtyString()+", id "+name+", enabled "+enabled+activeS+", toggle "+toggle+ + ", able[toggle "+toggleable+", iactive "+isInteractive()+", resize "+isResizable()+", move "+this.isDraggable()+ "], pos["+position+"], "+pivotS+scaleS+rotateS+ ps+bs+"box"+box; } @@ -1155,8 +1184,19 @@ public abstract class Shape { } return this; } + /** Returns true this shape's toggle state. */ public boolean isToggleOn() { return toggle; } + protected void setActive(final boolean v) { + active = v; + if( null != onActivationListener ) { + onActivationListener.run(this); + } + } + + /** Returns true of this shape is active */ + public boolean isActive() { return active; } + /** * Set whether this shape is interactive, * i.e. any user interaction like |