Add zoom in/out option to quick config menu
This commit is contained in:
parent
13563c6118
commit
a75982482a
@ -3,6 +3,9 @@ package atlantafx.sampler.page;
|
|||||||
|
|
||||||
import atlantafx.base.controls.Spacer;
|
import atlantafx.base.controls.Spacer;
|
||||||
import atlantafx.sampler.theme.ThemeManager;
|
import atlantafx.sampler.theme.ThemeManager;
|
||||||
|
import javafx.beans.binding.Bindings;
|
||||||
|
import javafx.beans.property.IntegerProperty;
|
||||||
|
import javafx.beans.property.SimpleIntegerProperty;
|
||||||
import javafx.css.PseudoClass;
|
import javafx.css.PseudoClass;
|
||||||
import javafx.geometry.HorizontalDirection;
|
import javafx.geometry.HorizontalDirection;
|
||||||
import javafx.scene.Node;
|
import javafx.scene.Node;
|
||||||
@ -13,9 +16,9 @@ import javafx.scene.layout.HBox;
|
|||||||
import javafx.scene.layout.Pane;
|
import javafx.scene.layout.Pane;
|
||||||
import javafx.scene.layout.StackPane;
|
import javafx.scene.layout.StackPane;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
|
import org.kordamp.ikonli.feather.Feather;
|
||||||
import org.kordamp.ikonli.javafx.FontIcon;
|
import org.kordamp.ikonli.javafx.FontIcon;
|
||||||
import org.kordamp.ikonli.material2.Material2AL;
|
import org.kordamp.ikonli.material2.Material2AL;
|
||||||
import org.kordamp.ikonli.material2.Material2MZ;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -27,6 +30,9 @@ import static javafx.geometry.Pos.CENTER_LEFT;
|
|||||||
import static org.kordamp.ikonli.material2.Material2AL.ARROW_BACK;
|
import static org.kordamp.ikonli.material2.Material2AL.ARROW_BACK;
|
||||||
import static org.kordamp.ikonli.material2.Material2AL.ARROW_FORWARD;
|
import static org.kordamp.ikonli.material2.Material2AL.ARROW_FORWARD;
|
||||||
|
|
||||||
|
// This should really be refactored to more generic control someday.
|
||||||
|
// - the whole component to PopoverMenu, that reuses JavaFX MenuItem API
|
||||||
|
// - font size switcher to flat SpinnerMenuItem
|
||||||
public class QuickConfigMenu extends StackPane {
|
public class QuickConfigMenu extends StackPane {
|
||||||
|
|
||||||
private static final PseudoClass SELECTED = PseudoClass.getPseudoClass("selected");
|
private static final PseudoClass SELECTED = PseudoClass.getPseudoClass("selected");
|
||||||
@ -97,6 +103,11 @@ public class QuickConfigMenu extends StackPane {
|
|||||||
private static class MainMenu extends VBox {
|
private static class MainMenu extends VBox {
|
||||||
|
|
||||||
private static final String ID = "MainMenu";
|
private static final String ID = "MainMenu";
|
||||||
|
private static final List<Integer> FONT_SCALE = List.of(
|
||||||
|
50, 75, 80, 90, 100, 110, 125, 150, 175, 200
|
||||||
|
);
|
||||||
|
|
||||||
|
private final IntegerProperty fontScale = new SimpleIntegerProperty(100);
|
||||||
|
|
||||||
public MainMenu(Consumer<String> navHandler) {
|
public MainMenu(Consumer<String> navHandler) {
|
||||||
super();
|
super();
|
||||||
@ -108,20 +119,43 @@ public class QuickConfigMenu extends StackPane {
|
|||||||
|
|
||||||
// ~
|
// ~
|
||||||
|
|
||||||
var zoomInBtn = new Button("", new FontIcon(Material2MZ.MINUS));
|
var zoomInBtn = new Button("", new FontIcon(Feather.ZOOM_IN));
|
||||||
zoomInBtn.getStyleClass().addAll(BUTTON_CIRCLE, BUTTON_ICON, FLAT);
|
zoomInBtn.getStyleClass().addAll(BUTTON_CIRCLE, BUTTON_ICON, FLAT);
|
||||||
|
zoomInBtn.setOnAction(e -> {
|
||||||
|
int idx = FONT_SCALE.indexOf(fontScale.get());
|
||||||
|
if (idx < FONT_SCALE.size() - 1) { fontScale.set(FONT_SCALE.get(idx + 1)); }
|
||||||
|
});
|
||||||
|
zoomInBtn.disableProperty().bind(Bindings.createBooleanBinding(
|
||||||
|
() -> FONT_SCALE.indexOf(fontScale.get()) >= FONT_SCALE.size() - 1, fontScale)
|
||||||
|
);
|
||||||
|
|
||||||
var zoomOutBtn = new Button("", new FontIcon(Material2MZ.PLUS));
|
var zoomOutBtn = new Button("", new FontIcon(Feather.ZOOM_OUT));
|
||||||
zoomOutBtn.getStyleClass().addAll(BUTTON_CIRCLE, BUTTON_ICON, FLAT);
|
zoomOutBtn.getStyleClass().addAll(BUTTON_CIRCLE, BUTTON_ICON, FLAT);
|
||||||
|
zoomOutBtn.setOnAction(e -> {
|
||||||
|
int idx = FONT_SCALE.indexOf(fontScale.get());
|
||||||
|
if (idx >= 1) { fontScale.set(FONT_SCALE.get(idx - 1)); }
|
||||||
|
});
|
||||||
|
zoomOutBtn.disableProperty().bind(Bindings.createBooleanBinding(
|
||||||
|
() -> FONT_SCALE.indexOf(fontScale.get()) <= 0, fontScale)
|
||||||
|
);
|
||||||
|
|
||||||
var zoomLabel = new Label("100%");
|
var zoomLabel = new Label();
|
||||||
|
zoomLabel.textProperty().bind(Bindings.createStringBinding(() -> fontScale.get() + "%", fontScale));
|
||||||
|
|
||||||
var zoomBox = new HBox(zoomInBtn, new Spacer(), zoomLabel, new Spacer(), zoomOutBtn);
|
var zoomBox = new HBox(zoomOutBtn, new Spacer(), zoomLabel, new Spacer(), zoomInBtn);
|
||||||
zoomBox.setAlignment(CENTER_LEFT);
|
zoomBox.setAlignment(CENTER_LEFT);
|
||||||
zoomBox.getStyleClass().addAll("row");
|
zoomBox.getStyleClass().addAll("row");
|
||||||
zoomBox.setDisable(true); // not yet implemented
|
|
||||||
|
|
||||||
// !
|
final var tm = ThemeManager.getInstance();
|
||||||
|
fontScale.addListener((obs, old, val) -> {
|
||||||
|
if (val != null) {
|
||||||
|
double fontSize = ThemeManager.DEFAULT_FONT_SIZE / 100.0 * val.intValue();
|
||||||
|
tm.setFontSize((int) Math.ceil(fontSize));
|
||||||
|
tm.reloadCustomCSS();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// ~
|
||||||
|
|
||||||
getChildren().setAll(themeSelectionMenu, new Separator(), zoomBox);
|
getChildren().setAll(themeSelectionMenu, new Separator(), zoomBox);
|
||||||
}
|
}
|
||||||
@ -137,7 +171,7 @@ public class QuickConfigMenu extends StackPane {
|
|||||||
super();
|
super();
|
||||||
|
|
||||||
Objects.requireNonNull(navHandler);
|
Objects.requireNonNull(navHandler);
|
||||||
var tm = ThemeManager.getInstance();
|
final var tm = ThemeManager.getInstance();
|
||||||
|
|
||||||
var mainMenu = menu("Theme", HorizontalDirection.LEFT);
|
var mainMenu = menu("Theme", HorizontalDirection.LEFT);
|
||||||
mainMenu.setOnMouseClicked(e -> navHandler.accept(MainMenu.ID));
|
mainMenu.setOnMouseClicked(e -> navHandler.accept(MainMenu.ID));
|
||||||
|
@ -65,6 +65,10 @@ public class TypographyPage extends AbstractPage {
|
|||||||
textColorSample().getRoot(),
|
textColorSample().getRoot(),
|
||||||
textFlowSample().getRoot()
|
textFlowSample().getRoot()
|
||||||
);
|
);
|
||||||
|
quickConfigBtn.setVisible(false);
|
||||||
|
quickConfigBtn.setManaged(false);
|
||||||
|
sourceCodeToggleBtn.setVisible(false);
|
||||||
|
sourceCodeToggleBtn.setManaged(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ComboBox<String> fontFamilyChooser() {
|
private ComboBox<String> fontFamilyChooser() {
|
||||||
|
@ -19,7 +19,9 @@ public final class ThemeManager {
|
|||||||
|
|
||||||
private static final String DUMMY_STYLESHEET = Resources.getResource("assets/styles/empty.css").toString();
|
private static final String DUMMY_STYLESHEET = Resources.getResource("assets/styles/empty.css").toString();
|
||||||
private static final PseudoClass USER_CUSTOM = PseudoClass.getPseudoClass("user-custom");
|
private static final PseudoClass USER_CUSTOM = PseudoClass.getPseudoClass("user-custom");
|
||||||
|
|
||||||
public static final String DEFAULT_FONT_FAMILY_NAME = "Inter";
|
public static final String DEFAULT_FONT_FAMILY_NAME = "Inter";
|
||||||
|
public static final int DEFAULT_FONT_SIZE = 14;
|
||||||
|
|
||||||
// KEY | VALUE
|
// KEY | VALUE
|
||||||
// -fx-property | value;
|
// -fx-property | value;
|
||||||
@ -30,7 +32,7 @@ public final class ThemeManager {
|
|||||||
private Scene scene;
|
private Scene scene;
|
||||||
private Theme currentTheme = null;
|
private Theme currentTheme = null;
|
||||||
private String fontFamily = DEFAULT_FONT_FAMILY_NAME;
|
private String fontFamily = DEFAULT_FONT_FAMILY_NAME;
|
||||||
private int fontSize = 14;
|
private int fontSize = DEFAULT_FONT_SIZE;
|
||||||
|
|
||||||
public Scene getScene() {
|
public Scene getScene() {
|
||||||
return scene;
|
return scene;
|
||||||
|
Loading…
Reference in New Issue
Block a user