aboutsummaryrefslogtreecommitdiffstats
path: root/src/graphui/classes/com/jogamp/graph
diff options
context:
space:
mode:
authorSven Göthel <[email protected]>2024-01-26 05:15:13 +0100
committerSven Göthel <[email protected]>2024-01-26 05:15:13 +0100
commit3d409f9ddde495f6a2cccbd06e4552acf134cbd7 (patch)
tree14f12c3d49ad531e149c98ba770100a28a6d42a4 /src/graphui/classes/com/jogamp/graph
parent4ef4dea6eee5873f1185ecfb283a4eff059b22c7 (diff)
GraphUI MediaPlayer: Cleanup infoLabel layout; Add sticky HUD (always-on) button; Fix tooltip help; Make slower-speed reduce by half if <= 1
Diffstat (limited to 'src/graphui/classes/com/jogamp/graph')
-rw-r--r--src/graphui/classes/com/jogamp/graph/ui/widgets/MediaPlayer.java117
1 files changed, 77 insertions, 40 deletions
diff --git a/src/graphui/classes/com/jogamp/graph/ui/widgets/MediaPlayer.java b/src/graphui/classes/com/jogamp/graph/ui/widgets/MediaPlayer.java
index 1d381215c..f3294e671 100644
--- a/src/graphui/classes/com/jogamp/graph/ui/widgets/MediaPlayer.java
+++ b/src/graphui/classes/com/jogamp/graph/ui/widgets/MediaPlayer.java
@@ -81,6 +81,12 @@ public class MediaPlayer extends Widget {
public static final float CtrlButtonWidth = 1f;
public static final float CtrlButtonHeight = 1f;
public static final Vec4f CtrlCellCol = new Vec4f(0, 0, 0, 0);
+ private static final float BorderSz = 0.01f;
+ private static final float BorderSzS = 0.03f;
+ private static final Vec4f BorderColor = new Vec4f(0, 0, 0, 0.5f);
+ private static final Vec4f BorderColorA = new Vec4f(0, 0, 0.5f, 0.5f);
+ private static final float AlphaBlend = 0.3f;
+ private static final float KnobScale = 3f;
/**
* Constructs a {@link MediaPlayer}, i.e. its shapes and controls.
@@ -103,30 +109,23 @@ public class MediaPlayer extends Widget {
if( null == fontInfo || null == fontSymbols ) {
return;
}
- final float borderSz = 0.01f;
- final float borderSzS = 0.03f;
- final Vec4f borderColor = new Vec4f(0, 0, 0, 0.5f);
- final Vec4f borderColorA = new Vec4f(0, 0, 0.5f, 0.5f);
- final float alphaBlend = 0.3f;
-
final float zEpsilon = scene.getZEpsilon(16);
final float ctrlZOffset = zEpsilon * 20f;
final int ctrlCellsInt = 9;
final int ctrlCells = Math.max(customCtrls.size() + ctrlCellsInt, 13);
- final float ctrlCellWidth = (aratio-2*borderSzS)/ctrlCells;
+ final float ctrlCellWidth = (aratio-2*BorderSzS)/ctrlCells;
final float ctrlCellHeight = ctrlCellWidth;
final float ctrlSliderHeightMin = ctrlCellHeight/15f; // bar-height
- final float ctrlSliderHeightMax = 3f * ctrlSliderHeightMin; // knob-height
- final float infoGroupHeight = 1/7f;
+ final float ctrlSliderHeightMax = KnobScale * ctrlSliderHeightMin; // knob-height
final AtomicReference<Shape> zoomReplacement = new AtomicReference<Shape>();
final AtomicReference<Vec3f> zoomOrigScale = new AtomicReference<Vec3f>();
final AtomicReference<Vec3f> zoomOrigPos = new AtomicReference<Vec3f>();
this.setName("mp.container");
- this.setBorderColor(borderColor).setBorder(borderSz);
+ this.setBorderColor(BorderColor).setBorder(BorderSz);
this.setInteractive(true).setFixedARatioResize(true);
final MediaButton mButton = new MediaButton(renderModes, aratio, 1, mPlayer);
@@ -202,6 +201,8 @@ public class MediaPlayer extends Widget {
Shape ctrlBlend;
final Label muteLabel, infoLabel;
final Button timeLabel;
+ final float infoGroupHeight;
+ final boolean[] hud_sticky = { false };
{
muteLabel = new Label(renderModes, fontSymbols, aratio/6f, fontSymbols.getUTF16String("music_off")); // volume_mute, headset_off
muteLabel.setName("mp.mute");
@@ -219,21 +220,33 @@ public class MediaPlayer extends Widget {
infoGroup.setName("mp.info").setInteractive(false);
this.addShape( infoGroup.setVisible(false) );
{
+ final String text = "88:88 / 88:88 (88 %), playing (8.88x, vol 8.88), A/R 8.88\n"+
+ "JogAmp's GraphUI Full-Feature Media Player Widget Rocks!";
+ final AABBox textBounds = fontInfo.getGlyphBounds(text);
+ final float lineHeight = textBounds.getHeight()/2f; // fontInfo.getLineHeight();
+ final float sxy = aratio/(2f*textBounds.getWidth()); // add 100%
+ infoLabel = new Label(renderModes, fontInfo, text);
+ infoLabel.setName("mp.info.label");
+ infoLabel.setInteractive(false);
+ infoLabel.setColor(1, 1, 1, 0.9f);
+ infoLabel.scale(sxy, sxy, 1f);
+
+ final float dy = 0.5f*lineHeight*sxy;
+ infoGroupHeight = 2.5f*dy + textBounds.getHeight()*sxy;
+ if( DEBUG ) {
+ System.err.println("XXX: sxy "+sxy+", b "+textBounds);
+ System.err.println("XXX: GroupHeight "+infoGroupHeight+", dy "+dy+", lineHeight*sxy "+(lineHeight*sxy));
+ System.err.println("XXX: b.getHeight() * sxy "+(textBounds.getHeight() * sxy));
+ System.err.println("XXX: (1f-GroupHeight+dy)/sxy "+((1f-infoGroupHeight+dy)/sxy));
+ }
+ infoLabel.setPaddding(new Padding(0, 0, (1f-infoGroupHeight+dy)/sxy, 0.5f));
+
final Rectangle rect = new Rectangle(renderModes & ~Region.AA_RENDERING_MASK, aratio, infoGroupHeight, 0);
rect.setName("mp.info.blend").setInteractive(false);
- rect.setColor(0, 0, 0, alphaBlend);
+ rect.setColor(0, 0, 0, AlphaBlend);
rect.setPaddding(new Padding(0, 0, 1f-infoGroupHeight, 0));
+
infoGroup.addShape(rect);
- }
- {
- final int lines = 3;
- final String text = getInfo(Clock.currentMillis(), mPlayer, false);
- infoLabel = new Label(renderModes, fontInfo, aratio/40f, text);
- infoLabel.setName("mp.info.label");
- final float szw = aratio/40f;
- infoLabel.setPaddding(new Padding(0, 0, 1f-szw*lines, szw));
- infoLabel.setInteractive(false);
- infoLabel.setColor(1, 1, 1, 1);
infoGroup.addShape(infoLabel);
}
{
@@ -290,17 +303,18 @@ public class MediaPlayer extends Widget {
ctrlBlend = new Rectangle(renderModes & ~Region.AA_RENDERING_MASK, aratio, ctrlCellHeight, 0);
ctrlBlend.setName("ctrl.blend").setInteractive(false);
- ctrlBlend.setColor(0, 0, 0, alphaBlend);
+ ctrlBlend.setColor(0, 0, 0, AlphaBlend);
this.addShape( ctrlBlend.setVisible(false) );
final float toolTipScaleY = 0.6f;
ctrlGroup = new Group(new GridLayout(ctrlCellWidth, ctrlCellHeight, Alignment.FillCenter, Gap.None, 1));
ctrlGroup.setName("ctrlGroup").setInteractive(false);
- ctrlGroup.setPaddding(new Padding(0, borderSzS, 0, borderSzS));
+ ctrlGroup.setPaddding(new Padding(0, BorderSzS, 0, BorderSzS));
this.addShape( ctrlGroup.move(0, 0, ctrlZOffset).setVisible(false) );
{ // 1
playButton.onToggle((final Shape s) -> {
if( s.isToggleOn() ) {
+ mPlayer.setPlaySpeed(1);
mPlayer.resume();
} else {
mPlayer.pause(false);
@@ -308,7 +322,7 @@ public class MediaPlayer extends Widget {
});
playButton.setToggle(true); // on == play
ctrlGroup.addShape(playButton);
- playButton.setToolTip(new TooltipText("Play", fontInfo, toolTipScaleY));
+ playButton.setToolTip(new TooltipText("Play/Pause", fontInfo, toolTipScaleY));
}
{ // 2
final Button button = new Button(renderModes, fontSymbols,
@@ -324,24 +338,34 @@ public class MediaPlayer extends Widget {
{ // 3
final Button button = new Button(renderModes, fontSymbols,
fontSymbols.getUTF16String("fast_rewind"), CtrlButtonWidth, CtrlButtonHeight, zEpsilon);
- button.setName("frev");
+ button.setName("rv-");
button.setSpacing(SymSpacing, FixedSymSize).setPerp().setColor(CtrlCellCol);
button.onClicked((final Shape s) -> {
- mPlayer.setPlaySpeed(mPlayer.getPlaySpeed() - 0.5f);
+ final float v = mPlayer.getPlaySpeed();
+ if( v <= 1.0f ) {
+ mPlayer.setPlaySpeed(v / 2.0f);
+ } else {
+ mPlayer.setPlaySpeed(v - 0.5f);
+ }
});
ctrlGroup.addShape(button);
- button.setToolTip(new TooltipText("Fast-Rewind", fontInfo, toolTipScaleY));
+ button.setToolTip(new TooltipText("replay speed: v <= 1 ? v/2 : v-0.5", fontInfo, toolTipScaleY));
}
{ // 4
final Button button = new Button(renderModes, fontSymbols,
fontSymbols.getUTF16String("fast_forward"), CtrlButtonWidth, CtrlButtonHeight, zEpsilon);
- button.setName("ffwd");
+ button.setName("rv+");
button.setSpacing(SymSpacing, FixedSymSize).setPerp().setColor(CtrlCellCol);
button.onClicked((final Shape s) -> {
- mPlayer.setPlaySpeed(mPlayer.getPlaySpeed() + 0.5f);
+ final float v = mPlayer.getPlaySpeed();
+ if( 1f > v && v + 0.5f > 1f ) {
+ mPlayer.setPlaySpeed(1); // reset while crossing over 1
+ } else {
+ mPlayer.setPlaySpeed(v + 0.5f);
+ }
});
ctrlGroup.addShape(button);
- button.setToolTip(new TooltipText("Fast-Forward", fontInfo, toolTipScaleY));
+ button.setToolTip(new TooltipText("replay speed: v+0.5", fontInfo, toolTipScaleY));
}
{ // 5
final Button button = new Button(renderModes, fontSymbols,
@@ -412,7 +436,7 @@ public class MediaPlayer extends Widget {
{ // 8
ctrlGroup.addShape(timeLabel);
}
- for(int i=8; i<ctrlCells-1-customCtrls.size(); ++i) {
+ for(int i=8; i<ctrlCells-2-customCtrls.size(); ++i) {
final Button button = new Button(renderModes, fontInfo, " ", CtrlButtonWidth, CtrlButtonHeight, zEpsilon);
button.setName("ctrl_"+i);
button.setSpacing(SymSpacing, FixedSymSize).setPerp().setColor(CtrlCellCol);
@@ -420,6 +444,18 @@ public class MediaPlayer extends Widget {
}
{ // -1
final Button button = new Button(renderModes, fontSymbols,
+ fontSymbols.getUTF16String("visibility"), fontSymbols.getUTF16String("visibility_off"), CtrlButtonWidth, CtrlButtonHeight, zEpsilon);
+ button.setName("hud");
+ button.setSpacing(SymSpacing, FixedSymSize).setPerp().setColor(CtrlCellCol);
+ button.onToggle( (final Shape s) -> {
+ hud_sticky[0] = s.isToggleOn();
+ });
+ button.setToggle( false );
+ ctrlGroup.addShape(button);
+ button.setToolTip(new TooltipText("HUD", fontInfo, toolTipScaleY));
+ }
+ { // -2
+ final Button button = new Button(renderModes, fontSymbols,
fontSymbols.getUTF16String("zoom_out_map"), fontSymbols.getUTF16String("zoom_in_map"), CtrlButtonWidth, CtrlButtonHeight, zEpsilon);
button.setName("zoom");
button.setSpacing(SymSpacing, FixedSymSize).setPerp().setColor(CtrlCellCol);
@@ -499,13 +535,14 @@ public class MediaPlayer extends Widget {
this.addActivationListener( (final Shape s) -> {
if( this.isActive() ) {
- this.setBorderColor(borderColorA);
+ this.setBorderColor(BorderColorA);
} else {
- this.setBorderColor(borderColor);
- ctrlSlider.setVisible(false);
- ctrlBlend.setVisible(false);
- ctrlGroup.setVisible(false);
- infoGroup.setVisible(false);
+ final boolean hud_on = hud_sticky[0];
+ this.setBorderColor(BorderColor);
+ ctrlSlider.setVisible(hud_on);
+ ctrlBlend.setVisible(hud_on);
+ ctrlGroup.setVisible(hud_on);
+ infoGroup.setVisible(hud_on);
}
});
this.addMouseListener(new Shape.MouseGestureAdapter() {
@@ -513,7 +550,7 @@ public class MediaPlayer extends Widget {
public void mouseMoved(final MouseEvent e) {
final Shape.EventInfo shapeEvent = (Shape.EventInfo) e.getAttachment();
final Vec3f p = shapeEvent.objPos;
- final boolean c = ( ctrlCellHeight + ctrlSliderHeightMax ) > p.y() || p.y() > ( 1f - infoGroupHeight );
+ final boolean c = hud_sticky[0] || ( ctrlCellHeight + ctrlSliderHeightMax ) > p.y() || p.y() > ( 1f - infoGroupHeight );
ctrlSlider.setVisible(c);
ctrlBlend.setVisible(c);
ctrlGroup.setVisible(c);
@@ -582,7 +619,7 @@ public class MediaPlayer extends Widget {
final float aspect = (float)mPlayer.getWidth() / (float)mPlayer.getHeight();
final float pct = (float)ptsMS / (float)durationMS;
if( full ) {
- final String text1 = String.format("%s / %s (%.0f %%), %s (%01.1fx, vol %1.2f), A/R %0.2f, fps %02.1f",
+ final String text1 = String.format("%s / %s (%.0f %%), %s (%01.2fx, vol %1.2f), A/R %0.2f, fps %02.1f",
PTS.millisToTimeStr(ptsMS, false), PTS.millisToTimeStr(durationMS, false), pct*100,
mPlayer.getState().toString().toLowerCase(), mPlayer.getPlaySpeed(), mPlayer.getAudioVolume(), aspect, mPlayer.getFramerate());
final String text2 = String.format("audio: id %d, kbps %d, codec %s",
@@ -591,7 +628,7 @@ public class MediaPlayer extends Widget {
mPlayer.getVID(), mPlayer.getVideoBitrate()/1000, mPlayer.getVideoCodec());
return text1+"\n"+text2+"\n"+text3+"\n"+name+chapter;
} else {
- final String text1 = String.format("%s / %s (%.0f %%), %s (%01.1fx, vol %1.2f), A/R %.2f",
+ final String text1 = String.format("%s / %s (%.0f %%), %s (%01.2fx, vol %1.2f), A/R %.2f",
PTS.millisToTimeStr(ptsMS, false), PTS.millisToTimeStr(durationMS, false), pct*100,
mPlayer.getState().toString().toLowerCase(), mPlayer.getPlaySpeed(), mPlayer.getAudioVolume(), aspect);
return text1+"\n"+name+chapter;