Skip to content

Commit e8fd067

Browse files
committed
Make Slider UI elements larger when widget size increases
1 parent d8ff574 commit e8fd067

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ScaledSliderRepresentation.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
import javafx.beans.value.ObservableValue;
1111
import javafx.geometry.Insets;
1212
import javafx.geometry.Orientation;
13+
import javafx.scene.Node;
1314
import javafx.scene.control.Slider;
15+
import javafx.scene.control.skin.SliderSkin;
1416
import javafx.scene.input.KeyEvent;
1517
import javafx.scene.input.MouseButton;
1618
import javafx.scene.input.MouseEvent;
@@ -35,6 +37,7 @@
3537

3638
import java.text.DecimalFormat;
3739
import java.time.Instant;
40+
import java.util.concurrent.atomic.AtomicBoolean;
3841
import java.util.logging.Level;
3942

4043
import static org.csstudio.display.builder.representation.ToolkitRepresentation.logger;
@@ -72,6 +75,8 @@ public class ScaledSliderRepresentation extends RegionBaseRepresentation<GridPan
7275
private final Slider slider;
7376
private final SliderMarkers markers;
7477

78+
private final AtomicBoolean isHorizontal = new AtomicBoolean(true);
79+
7580
/** Constructor */
7681
public ScaledSliderRepresentation()
7782
{
@@ -232,6 +237,7 @@ private void orientationChanged(final WidgetProperty<Boolean> prop, final Boolea
232237
model_widget.propWidth().setValue(h);
233238
model_widget.propHeight().setValue(w);
234239
}
240+
isHorizontal.set(horizontal);
235241
layoutChanged(prop, old, horizontal);
236242
}
237243

@@ -552,6 +558,8 @@ else if (newval > max)
552558
active = false;
553559
}
554560
}
561+
562+
adjustSizes();
555563
jfx_node.layout();
556564
}
557565

@@ -566,4 +574,32 @@ private void openConfigurationPanel()
566574
else
567575
config_popover.show(slider);
568576
}
577+
578+
/**
579+
* Adjusts knob, track and major tick sizes when widget size increases. Making the widget larger is
580+
* a workaround for visibility issues when the JavaFX native {@link Slider} is rendered on a
581+
* high-resolution monitor.
582+
* <p>
583+
* Applied sizes are based on the height (horizontal) or width (vertical), and
584+
* clamped between the default size and an upper ad-hoc determined limit.
585+
* </p>
586+
*/
587+
private void adjustSizes(){
588+
SliderSkin skin = (SliderSkin) slider.getSkin();
589+
if (skin != null) {
590+
double size = isHorizontal.get() ? jfx_node.getHeight() : jfx_node.getWidth();
591+
for (Node node : skin.getChildren()) {
592+
if (node.getStyleClass().contains("thumb")) {
593+
// 7.6 seems to be default padding
594+
node.setStyle("-fx-padding: " + Math.clamp(size * 0.3, 7.6, 20));
595+
} else if (node.getStyleClass().contains("track")) {
596+
// 3.3 seems to be default padding
597+
node.setStyle("-fx-padding: " + Math.clamp(size * 0.2, 3.3, 13));
598+
} else if (node.getStyleClass().contains("axis")) {
599+
// 8 seems to be default major tick length
600+
node.setStyle("-fx-tick-length: " + Math.clamp(size * 0.1, 8, 20));
601+
}
602+
}
603+
}
604+
}
569605
}

0 commit comments

Comments
 (0)