package net.querz.mcaselector.ui; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.Slider; import javafx.scene.layout.Background; import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.BorderPane; import javafx.scene.layout.CornerRadii; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import net.querz.mcaselector.text.Translation; import java.util.Optional; public class ColorPicker extends TransparentStage { private final Slider red = createSlider(0, 255, 1, 0); private final Slider green = createSlider(0, 255, 1, 0); private final Slider blue = createSlider(0, 255, 1, 0); private final Slider opacity = createSlider(0, 255, 1, 0); private final StackPane preview = new StackPane(); private final Button ok = UIFactory.button(Translation.BUTTON_OK); private final Button cancel = UIFactory.button(Translation.BUTTON_CANCEL); private Color result; public ColorPicker(javafx.stage.Window stage, Color color) { super(stage); cancel.setOnAction(e -> { result = null; close(); }); ok.setOnAction(e -> close()); red.setValue(color.getRed() * 255); green.setValue(color.getGreen() * 255); blue.setValue(color.getBlue() * 255); opacity.setValue(color.getOpacity() * 255); red.valueProperty().addListener((l, o, n) -> onValueChange()); green.valueProperty().addListener((l, o, n) -> onValueChange()); blue.valueProperty().addListener((l, o, n) -> onValueChange()); opacity.valueProperty().addListener((l, o, n) -> onValueChange()); preview.getStyleClass().add("color-picker-preview"); GridPane grid = new GridPane(); grid.getStyleClass().add("color-picker-sliders"); grid.add(label("R", "color-picker-slider-label"), 0, 0, 1, 1); grid.add(label("G", "color-picker-slider-label"), 0, 1, 1, 1); grid.add(label("B", "color-picker-slider-label"), 0, 2, 1, 1); grid.add(label("A", "color-picker-slider-label"), 0, 3, 1, 1); grid.add(red, 1, 0, 1, 1); grid.add(green, 1, 1, 1, 1); grid.add(blue, 1, 2, 1, 1); grid.add(opacity, 1, 3, 1, 1); grid.add(UIFactory.attachTextFieldToSlider(red), 2, 0, 1, 1); grid.add(UIFactory.attachTextFieldToSlider(green), 2, 1, 1, 1); grid.add(UIFactory.attachTextFieldToSlider(blue), 2, 2, 1, 1); grid.add(UIFactory.attachTextFieldToSlider(opacity), 2, 3, 1, 1); HBox buttonBox = new HBox(); buttonBox.getChildren().addAll(ok, cancel); buttonBox.getStyleClass().add("color-picker-button-box"); BorderPane borderPane = new BorderPane(); borderPane.getStyleClass().add("color-picker"); borderPane.setTop(grid); borderPane.setCenter(preview); borderPane.setBottom(buttonBox); borderPane.setLeft(borderElement("border-element-vertical")); borderPane.setRight(borderElement("border-element-vertical")); setContent(borderPane); } public Optional<Color> showColorPicker() { showAndWait(); return Optional.ofNullable(result); } private Label label(String name, String styleClass) { Label label = new Label(name); label.getStyleClass().add(styleClass); return label; } private Region borderElement(String styleClass) { Region border = new Region(); border.getStyleClass().add(styleClass); return border; } private void onValueChange() { result = new Color(red.getValue() / 255, green.getValue() / 255, blue.getValue() / 255, opacity.getValue() / 255); preview.setBackground(new Background(new BackgroundFill(result, CornerRadii.EMPTY, Insets.EMPTY))); } private Slider createSlider(int min, int max, int steps, int init) { Slider slider = new Slider(min, max, init); slider.setMajorTickUnit(steps); slider.setMinorTickCount(0); slider.setBlockIncrement(steps); return slider; } }