package nl.tudelft.lifetiles.graph.controller; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.geometry.Orientation; import javafx.scene.control.Button; import javafx.scene.control.Slider; import javafx.scene.control.ToolBar; /** * Creates a new Toolbar with two buttons and a slider. * The buttons will adjust the slider and you can get the value of the slider. * * @author AC Langerak * */ public class Zoombar { /** * The javafx toolbar. */ private final ToolBar toolbar; /** * Integer which holds the current selected zoomlevel. * Can be listened to. */ private final IntegerProperty zoomLevel; /** * The maximal amount of zooming. */ private final int maxzoom; /** * The slider on the zoombar. */ private Slider slider; /** * Create a new Toolbar. * * @param currentZoom * the current starting zoom level. * @param maxZoom * the maximal value of the zoom. */ public Zoombar(final int currentZoom, final int maxZoom) { maxzoom = maxZoom; zoomLevel = new SimpleIntegerProperty(); zoomLevel.set(currentZoom); slider = createSlider(); slider.getStyleClass().add("slider"); slider.valueProperty().addListener( (obserVal, oldVal, newVal) -> { if (oldVal.intValue() != newVal.intValue() && newVal.intValue() <= maxzoom) { zoomLevel.set(newVal.intValue()); } }); Button plus = new Button("+"); plus.getStyleClass().add("plusButton"); plus.setOnMouseClicked((event) -> { slider.setValue(slider.getValue() - slider.getMajorTickUnit()); }); Button minus = new Button("-"); minus.getStyleClass().add("minusButton"); minus.setOnMouseClicked((event) -> { slider.setValue(slider.getValue() + slider.getMajorTickUnit()); }); toolbar = new ToolBar(); toolbar.getStyleClass().add("toolbar"); toolbar.getItems().addAll(minus, slider, plus); toolbar.setOrientation(Orientation.VERTICAL); } /** * * @return javafx toolbar that is constructed */ public ToolBar getToolBar() { return toolbar; } /** * Increment the zoom level by 1. */ public final void incrementZoom() { int zoom = zoomLevel.get(); if (zoom > 0) { zoomLevel.set(zoom + 1); slider.setValue(slider.getValue() - slider.getMajorTickUnit()); } } /** * Decrease the zoom level by 1. */ public final void decrementZoom() { int zoom = zoomLevel.get(); if (zoom < maxzoom) { zoomLevel.set(zoom - 1); slider.setValue(slider.getValue() + slider.getMajorTickUnit()); } } /** * @return the zoomlevel property */ public IntegerProperty getZoomlevel() { return zoomLevel; } /** * Create a new Slider which runs from 0 to MAXZOOM. * The labeling will be in the opposite direction so MAXZOOM to 0 * * @return the new slider */ private Slider createSlider() { final CustomLabelSlider slider = new CustomLabelSlider(value -> Math .abs(value - maxzoom)); slider.setOrientation(Orientation.VERTICAL); slider.setMin(0); slider.setValue(zoomLevel.intValue()); slider.setMax(maxzoom); slider.setMajorTickUnit(1); slider.setMinorTickCount(0); slider.setShowTickMarks(true); slider.setShowTickLabels(true); slider.setSnapToTicks(true); slider.setMinHeight(Slider.USE_PREF_SIZE); slider.valueChangingProperty().addListener( observable -> slider.setValue(Math.round(slider.getValue()))); return slider; } }