aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Göthel <[email protected]>2024-02-05 12:20:44 +0100
committerSven Göthel <[email protected]>2024-02-05 12:20:44 +0100
commit6ec212e0348fc9028e2afc6a298c49890566bf2d (patch)
treefb991e7bc93fab31a985896355719352f4dbe1ae
parent347739f9589b1f846e2a0db33b554ff34b2ce984 (diff)
Bug 805: GraphUI Demos: Adopt changes to FontView01 + UIMediaGrid01, dropping UIMediaGrid00
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java93
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java258
-rw-r--r--src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java12
3 files changed, 43 insertions, 320 deletions
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java
index 2e7d3c6e3..4839f6a83 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/FontView01.java
@@ -56,7 +56,6 @@ import com.jogamp.graph.ui.shapes.GlyphShape;
import com.jogamp.graph.ui.shapes.Label;
import com.jogamp.graph.ui.shapes.Rectangle;
import com.jogamp.graph.ui.widgets.RangeSlider;
-import com.jogamp.graph.ui.widgets.RangeSlider.SliderListener;
import com.jogamp.graph.ui.widgets.RangedGroup;
import com.jogamp.graph.ui.widgets.RangedGroup.SliderParam;
import com.jogamp.math.FloatUtil;
@@ -219,7 +218,7 @@ public class FontView01 {
System.err.println("GlyphGrid[pgsz "+glyphGridSize+", totsz "+glyphGridTotalSize+", cellSz "+glyphGridCellSize+"]");
final Group mainView;
- final Shape.MouseGestureListener glyphMouseListener;
+ final Shape.PointerListener glyphPointerListener;
{
final Group glyphShapeBox = new Group( new BoxLayout( 1f, 1f, Alignment.FillCenter, new Margin(0.01f) ) );
final Group glyphShapeHolder = new Group();
@@ -233,50 +232,39 @@ public class FontView01 {
glyphInfoBox.addShape(glyphInfo);
glyphInfoBox.setRelayoutOnDirtyShapes(false); // avoid group re-validate on info text changes
- glyphMouseListener = new Shape.MouseGestureAdapter() {
- private void handleEvent(final MouseEvent e) {
- final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
- // System.err.println("ShapeEvent "+shapeEvent);
- final GlyphShape g0 = getGlyphShape(shapeEvent.shape);
-
- e.setConsumed(true);
-
- // Selected Glyph g0
- final boolean doScreenshot = e.isControlDown() && e.getButtonDownCount() > 0;
- scene.invoke(false, (final GLAutoDrawable d) -> {
- // Handle old one
- if( 1 == glyphShapeHolder.getShapeCount() ) {
- final GlyphShape old = (GlyphShape) glyphShapeHolder.getShapeByIdx(0);
- if( null != old ) {
- if( !doScreenshot && old.getGlyph().getCodepoint() == g0.getGlyph().getCodepoint() ) {
- // System.err.println("GlyphShape Same: "+old);
- return true; // abort - no change
- } else {
- glyphShapeHolder.removeShape(old);
- }
+ glyphPointerListener = (final Shape s, final Vec3f pos, final MouseEvent e) -> {
+ // System.err.println("ShapeEvent "+shapeEvent);
+ final GlyphShape g0 = getGlyphShape(s);
+
+ e.setConsumed(true);
+
+ // Selected Glyph g0
+ final boolean doScreenshot = e.isControlDown() && e.getButtonDownCount() > 0;
+ scene.invoke(false, (final GLAutoDrawable d) -> {
+ // Handle old one
+ if( 1 == glyphShapeHolder.getShapeCount() ) {
+ final GlyphShape old = (GlyphShape) glyphShapeHolder.getShapeByIdx(0);
+ if( null != old ) {
+ if( !doScreenshot && old.getGlyph().getCodepoint() == g0.getGlyph().getCodepoint() ) {
+ // System.err.println("GlyphShape Same: "+old);
+ return true; // abort - no change
} else {
- // System.err.println("GlyphShape Old: Null");
+ glyphShapeHolder.removeShape(old);
}
} else {
- // System.err.println("GlyphShape Old: None");
+ // System.err.println("GlyphShape Old: Null");
}
- // New Glyph
- glyphShapeHolder.addShape(g0);
- setGlyphInfo(fontStatus, glyphInfo, g0.getGlyph());
- if( doScreenshot ) {
- printScreenOnGLThread(scene, window.getChosenGLCapabilities(), font, g0.getGlyph().getCodepoint());
- }
- return true;
- });
- }
- @Override
- public void mouseMoved(final MouseEvent e) {
- handleEvent(e);
- }
- @Override
- public void mousePressed(final MouseEvent e) {
- handleEvent(e);
- }
+ } else {
+ // System.err.println("GlyphShape Old: None");
+ }
+ // New Glyph
+ glyphShapeHolder.addShape(g0);
+ setGlyphInfo(fontStatus, glyphInfo, g0.getGlyph());
+ if( doScreenshot ) {
+ printScreenOnGLThread(scene, window.getChosenGLCapabilities(), font, g0.getGlyph().getCodepoint());
+ }
+ return true;
+ });
};
final Group glyphInfoView = new Group(new GridLayout(2, 0f, 0f, Alignment.None));
@@ -285,7 +273,7 @@ public class FontView01 {
final Group glyphGrid = new Group(new GridLayout(gridDim.columns, glyphGridCellSize*0.9f, glyphGridCellSize*0.9f, Alignment.FillCenter,
new Gap(glyphGridCellSize*0.1f)));
glyphGrid.setInteractive(true).setDragAndResizable(false).setToggleable(false).setName("GlyphGrid");
- addGlyphs(reqCaps.getGLProfile(), font, glyphGrid, gridDim, showUnderline, showLabel, fontStatus, fontInfo, glyphMouseListener);
+ addGlyphs(reqCaps.getGLProfile(), font, glyphGrid, gridDim, showUnderline, showLabel, fontStatus, fontInfo, glyphPointerListener);
glyphGrid.setRelayoutOnDirtyShapes(false); // avoid group re-validate to ease load in Group.isShapeDirty() w/ thousands of glyphs
if( VERBOSE_UI ) {
glyphGrid.validate(reqCaps.getGLProfile());
@@ -303,15 +291,12 @@ public class FontView01 {
new SliderParam( new Vec2f(glyphGridCellSize/4f, glyphGridSize.y()), glyphGridCellSize/10f, true ) );
glyphView.getVertSlider().setColor(0.3f, 0.3f, 0.3f, 0.7f).setName("GlyphView");
if( VERBOSE_UI ) {
- glyphView.getVertSlider().addSliderListener(new SliderListener() {
- @Override
- public void dragged(final RangeSlider w, final float old_val, final float val, final float old_val_pct, final float val_pct) {
- final Vec2f minmax = w.getMinMax();
- final float row_f = val / glyphGridCellSize;
- System.err.println("VertSlider: row["+row_f+".."+(row_f+gridDim.rowsPerPage-1)+"]/"+gridDim.rows+
- ", val["+old_val+" -> "+val+"]/"+minmax.y()+", pct["+(100*old_val_pct)+"% -> "+(100*val_pct)+"%], cellSz "+glyphGridCellSize);
- System.err.println("VertSlider: "+w.getDescription());
- }
+ glyphView.getVertSlider().addSliderListener((final RangeSlider w, final float old_val, final float val, final float old_val_pct, final float val_pct) -> {
+ final Vec2f minmax = w.getMinMax();
+ final float row_f = val / glyphGridCellSize;
+ System.err.println("VertSlider: row["+row_f+".."+(row_f+gridDim.rowsPerPage-1)+"]/"+gridDim.rows+
+ ", val["+old_val+" -> "+val+"]/"+minmax.y()+", pct["+(100*old_val_pct)+"% -> "+(100*val_pct)+"%], cellSz "+glyphGridCellSize);
+ System.err.println("VertSlider: "+w.getDescription());
});
}
glyphView.getVertSlider().receiveKeyEvents(glyphGrid);
@@ -505,7 +490,7 @@ public class FontView01 {
*/
static void addGlyphs(final GLProfile glp, final Font font, final Group sink,
final GridDim gridDim, final boolean showUnderline, final boolean showLabel,
- final Font fontStatus, final Font fontInfo, final Shape.MouseGestureListener glyphMouseListener) {
+ final Font fontStatus, final Font fontInfo, final Shape.PointerListener glyphPointerListener) {
final AABBox tmpBox = new AABBox();
final long t0 = Clock.currentNanos();
@@ -532,7 +517,7 @@ public class FontView01 {
}
c1.addShape( c0 );
- c1.addMouseListener(glyphMouseListener);
+ c1.onHover(glyphPointerListener);
sink.receiveKeyEvents(c1);
// sink.receiveMouseEvents(c1);
c1.setToolTip( new TooltipShape(new Vec4f(1, 1, 1, 1), new Vec4f(0, 0, 0, 1), 0.01f,
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java
deleted file mode 100644
index fec507d3c..000000000
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid00.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/**
- * Copyright 2010-2023 JogAmp Community. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of JogAmp Community.
- */
-package com.jogamp.opengl.demos.graph.ui;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.jogamp.common.net.Uri;
-import com.jogamp.graph.curve.Region;
-import com.jogamp.graph.font.Font;
-import com.jogamp.graph.font.FontFactory;
-import com.jogamp.graph.font.FontScale;
-import com.jogamp.graph.ui.Group;
-import com.jogamp.graph.ui.Scene;
-import com.jogamp.graph.ui.Shape;
-import com.jogamp.graph.ui.layout.Alignment;
-import com.jogamp.graph.ui.layout.Gap;
-import com.jogamp.graph.ui.layout.GridLayout;
-import com.jogamp.graph.ui.shapes.Button;
-import com.jogamp.graph.ui.shapes.MediaButton;
-import com.jogamp.graph.ui.shapes.Rectangle;
-import com.jogamp.graph.ui.widgets.MediaPlayer;
-import com.jogamp.math.Vec2i;
-import com.jogamp.math.Vec3f;
-import com.jogamp.math.geom.AABBox;
-import com.jogamp.newt.event.KeyAdapter;
-import com.jogamp.newt.event.KeyEvent;
-import com.jogamp.newt.event.MouseEvent;
-import com.jogamp.newt.event.WindowAdapter;
-import com.jogamp.newt.event.WindowEvent;
-import com.jogamp.newt.opengl.GLWindow;
-import com.jogamp.opengl.GL;
-import com.jogamp.opengl.GLCapabilities;
-import com.jogamp.opengl.GLCapabilitiesImmutable;
-import com.jogamp.opengl.GLProfile;
-import com.jogamp.opengl.demos.util.CommandlineOptions;
-import com.jogamp.opengl.demos.util.MiscUtils;
-import com.jogamp.opengl.util.Animator;
-import com.jogamp.opengl.util.av.GLMediaPlayer;
-import com.jogamp.opengl.util.av.GLMediaPlayerFactory;
-
-import jogamp.graph.ui.TreeTool;
-
-/**
- * MediaButtons in a grid, filled by media files from a directory in different aspect ratios
- */
-public class UIMediaGrid00 {
- static CommandlineOptions options = new CommandlineOptions(1920, 1080, Region.VBAA_RENDERING_BIT);
-
- public static int aid = GLMediaPlayer.STREAM_ID_AUTO;
- public static boolean letterBox = true;
-
- public static void main(final String[] args) throws IOException {
- final List<Uri> mediaFiles = new ArrayList<Uri>();
- if( 0 != args.length ) {
- final int[] idx = { 0 };
- for (idx[0] = 0; idx[0] < args.length; ++idx[0]) {
- if( options.parse(args, idx) ) {
- continue;
- } else if (args[idx[0]].equals("-file")) {
- idx[0]++;
- final Uri u = Uri.tryUriOrFile( args[idx[0]] );
- if( null != u ) {
- mediaFiles.add(u);
- }
- } else if(args[idx[0]].equals("-aid")) {
- idx[0]++;
- aid = MiscUtils.atoi(args[idx[0]], aid);
- } else if(args[idx[0]].equals("-zoom")) {
- letterBox = false;
- }
- }
- }
- System.err.println(options);
- System.err.println("aid "+aid);
- System.err.println("letterBox "+letterBox);
-
- if( 0 == mediaFiles.size() ) {
- System.err.println("No media files, exit.");
- return;
- }
- for(final Uri uri : mediaFiles) {
- System.err.println("- "+uri);
- }
- final Vec2i gridDim = new Vec2i(4, mediaFiles.size());
-
- final GLCapabilities reqCaps = options.getGLCaps();
- System.out.println("Requested: " + reqCaps);
-
- final Animator animator = new Animator(0 /* w/o AWT */);
- animator.setUpdateFPSFrames(1*60, null); // System.err);
- final GLWindow window = GLWindow.create(reqCaps);
- window.setSize(options.surface_width, options.surface_height);
- window.setVisible(true);
- System.out.println("Chosen: " + window.getChosenGLCapabilities());
- window.setTitle(UIMediaGrid00.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight());
- window.addWindowListener(new WindowAdapter() {
- @Override
- public void windowResized(final WindowEvent e) {
- window.setTitle(UIMediaGrid00.class.getSimpleName()+": "+window.getSurfaceWidth()+" x "+window.getSurfaceHeight());
- }
- @Override
- public void windowDestroyNotify(final WindowEvent e) {
- animator.stop();
- }
- });
- animator.add(window);
-
- final Scene scene = new Scene(options.graphAASamples);
- scene.setClearParams(new float[] { 1f, 1f, 1f, 1f}, GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
- scene.setPMvCullingEnabled(true);
-
- scene.attachInputListenerTo(window);
- window.addGLEventListener(scene);
-
-
- final float[] ppmm = window.getPixelsPerMM(new float[2]);
- {
- final float[] dpi = FontScale.ppmmToPPI( new float[] { ppmm[0], ppmm[1] } );
- System.err.println("DPI "+dpi[0]+" x "+dpi[1]+", "+ppmm[0]+" x "+ppmm[1]+" pixel/mm");
-
- final float[] hasSurfacePixelScale1 = window.getCurrentSurfaceScale(new float[2]);
- System.err.println("HiDPI PixelScale: "+hasSurfacePixelScale1[0]+"x"+hasSurfacePixelScale1[1]+" (has)");
- }
- final Group mediaGrid;
- {
- final float cellWidth = 1f;
- final float cellHeight = 1f;
- mediaGrid = new Group(new GridLayout(gridDim.x(), cellWidth*0.9f, cellHeight*0.9f, Alignment.FillCenter, new Gap(cellHeight*0.1f, cellWidth*0.1f)));
- mediaGrid.setName("MediaGrid");
- mediaGrid.setRelayoutOnDirtyShapes(false);
- }
- addMedia(scene, reqCaps.getGLProfile(), mediaGrid, mediaFiles);
- mediaGrid.validate(reqCaps.getGLProfile());
- System.err.println("MediaGrid "+mediaGrid);
- System.err.println("MediaGrid "+mediaGrid.getLayout());
-
- final Group mainGrid = new Group(new GridLayout(1, 0f, 0f, Alignment.None));
- mainGrid.setName("MainGrid");
- mainGrid.addShape(mediaGrid);
- scene.addShape(mainGrid);
-
- window.addKeyListener(new KeyAdapter() {
- @Override
- public void keyReleased(final KeyEvent e) {
- final short keySym = e.getKeySymbol();
- if( keySym == KeyEvent.VK_S ) {
- printScreenOnGLThread(scene, window.getChosenGLCapabilities());
- } else if( keySym == KeyEvent.VK_DOWN ) {
- } else if( keySym == KeyEvent.VK_PAGE_DOWN ) {
- } else if( keySym == KeyEvent.VK_UP ) {
- } else if( keySym == KeyEvent.VK_PAGE_UP ) {
- } else if( keySym == KeyEvent.VK_F4 || keySym == KeyEvent.VK_ESCAPE || keySym == KeyEvent.VK_Q ) {
- MiscUtils.destroyWindow(window);
- }
- }
- });
-
- animator.start();
- scene.waitUntilDisplayed();
- {
- final AABBox sceneBox = scene.getBounds();
- final AABBox mainGridBox = mainGrid.getBounds();
- final float sx = sceneBox.getWidth() / mainGridBox.getWidth();
- final float sy = sceneBox.getHeight() / mainGridBox.getHeight();
- final float sxy = Math.min(sx, sy);
- System.err.println("SceneBox "+sceneBox);
- System.err.println("MainGridBox "+mainGridBox);
- System.err.println("scale sx "+sx+", sy "+sy+", sxy "+sxy);
- // scale, moveTo origin bottom-left, then move up to top-left corner.
- mainGrid.scale(sxy, sxy, 1f).moveTo(sceneBox.getLow()).move(0, sceneBox.getHeight()-mainGridBox.getHeight()*sxy, 0);
- }
- printScreenOnGLThread(scene, window.getChosenGLCapabilities());
- // stay open ..
- }
- static void printScreenOnGLThread(final Scene scene, final GLCapabilitiesImmutable caps) {
- scene.screenshot(true, scene.nextScreenshotFile(null, UIMediaGrid00.class.getSimpleName(), options.renderModes, caps, "media"));
- }
-
-
- static void addMedia(final Scene scene, final GLProfile glp, final Group grid, final List<Uri> mediaFiles) {
- final float zoomSize = 0.95f;
- for(final Uri medium : mediaFiles) {
- final GLMediaPlayer mPlayer = GLMediaPlayerFactory.createDefault();
- if( printNativeInfoOnce ) {
- mPlayer.printNativeInfo(System.err);
- printNativeInfoOnce = false;
- }
- // mPlayer.setTextureMinMagFilter( new int[] { GL.GL_NEAREST, GL.GL_NEAREST } );
- mPlayer.setTextureMinMagFilter( new int[] { GL.GL_LINEAR, GL.GL_LINEAR } );
- mPlayer.setTextureUnit(1);
-
- final List<Shape> customCtrls = new ArrayList<Shape>();
- {
- final Font fontSymbols = FontFactory.getSymbolsFont();
- if( null == fontSymbols ) {
- grid.addShape( new Rectangle(options.renderModes, 16f/9f, 1, 0.10f) );
- return;
- }
- final Button button = new Button(options.renderModes, fontSymbols,
- fontSymbols.getUTF16String("reset_tv"), MediaPlayer.CtrlButtonWidth, MediaPlayer.CtrlButtonHeight, scene.getZEpsilon(16));
- button.setName("reset");
- button.setSpacing(MediaPlayer.SymSpacing, MediaPlayer.FixedSymSize).setPerp().setColor(MediaPlayer.CtrlCellCol);
- button.onClicked((final Shape s0, final Vec3f pos, final MouseEvent e) -> {
- TreeTool.forAll(scene, (final Shape s1) -> {
- System.err.println("- "+s1.getName());
- if( s1 instanceof MediaButton ) {
- final MediaButton mb = (MediaButton)s1;
- final GLMediaPlayer mp = mb.getGLMediaPlayer();
- mp.seek(0);
- mp.setPlaySpeed(1f);
- mp.setAudioVolume( 0f );
- }
- if( s1.getName().equals("muteLabel") ) {
- s1.setVisible(true);
- }
- if( s1.getName().equals("MediaGrid") ) {
- s1.markShapeDirty();
- System.err.println("Reset: "+s1);
- }
- return false;
- });
- });
- customCtrls.add(button);
- }
- grid.addShape( new MediaPlayer(options.renderModes, scene, mPlayer, medium, 16f/9f, letterBox, zoomSize, customCtrls) );
- mPlayer.playStream(medium, GLMediaPlayer.STREAM_ID_AUTO, aid, GLMediaPlayer.STREAM_ID_NONE, GLMediaPlayer.TEXTURE_COUNT_DEFAULT);
- }
- }
- private static boolean printNativeInfoOnce = true;
-
-}
diff --git a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java
index 9dfbca91c..dd841f3f9 100644
--- a/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java
+++ b/src/demos/com/jogamp/opengl/demos/graph/ui/UIMediaGrid01.java
@@ -54,7 +54,6 @@ import com.jogamp.graph.ui.shapes.MediaButton;
import com.jogamp.graph.ui.shapes.Rectangle;
import com.jogamp.graph.ui.widgets.MediaPlayer;
import com.jogamp.graph.ui.widgets.RangeSlider;
-import com.jogamp.graph.ui.widgets.RangeSlider.SliderListener;
import com.jogamp.graph.ui.widgets.RangedGroup;
import com.jogamp.graph.ui.widgets.RangedGroup.SliderParam;
import com.jogamp.math.Vec2f;
@@ -280,13 +279,10 @@ public class UIMediaGrid01 {
mediaView.getVertSlider().setColor(0.3f, 0.3f, 0.3f, 0.7f).setName("MediaView");
// mediaView.setRelayoutOnDirtyShapes(false); // avoid group re-validate to ease load in Group.isShapeDirty() w/ thousands of glyphs
if( VERBOSE_UI ) {
- mediaView.getVertSlider().addSliderListener(new SliderListener() {
- @Override
- public void dragged(final RangeSlider w, final float old_val, final float val, final float old_val_pct, final float val_pct) {
- final Vec2f minmax = w.getMinMax();
- final float row_f = val / mediaCellHeight;
- System.err.println("VertSlider: row "+row_f+", val["+old_val+" -> "+val+"], pct["+(100*old_val_pct)+"% -> "+(100*val_pct)+"%], minmax "+minmax);
- }
+ mediaView.getVertSlider().addSliderListener((final RangeSlider w, final float old_val, final float val, final float old_val_pct, final float val_pct) -> {
+ final Vec2f minmax = w.getMinMax();
+ final float row_f = val / mediaCellHeight;
+ System.err.println("VertSlider: row "+row_f+", val["+old_val+" -> "+val+"], pct["+(100*old_val_pct)+"% -> "+(100*val_pct)+"%], minmax "+minmax);
});
}
if( VERBOSE_UI ) {