Skip to content
Snippets Groups Projects
Commit 23db68de authored by Robert Goldmann's avatar Robert Goldmann
Browse files

Fixed #26, Fixed #25 with custom colorpicker (colorPick from Tools)

parent 4c0b3273
Branches
Tags
No related merge requests found
......@@ -3,20 +3,30 @@ package de.deadlocker8.budgetmaster.ui;
import java.util.ArrayList;
import java.util.function.Consumer;
import de.deadlocker8.budgetmaster.ui.colorPick.ColorPickController;
import fontAwesome.FontIcon;
import fontAwesome.FontIconType;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.control.ColorPicker;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Modality;
import javafx.stage.Stage;
import logger.LogLevel;
import logger.Logger;
import tools.ConvertTo;
public class ColorView extends GridPane
{
private Node lastSelectedNode;
private Color colorPickerColor;
private Button buttonColorPicker;
private FontIcon icon;
public ColorView(Color startColor, ArrayList<Color> colors, NewCategoryController controller, Consumer<Color> finish)
{
......@@ -33,6 +43,8 @@ public class ColorView extends GridPane
setHgap(5);
setPadding(new Insets(5));
colorPickerColor = Color.WHITE;
int index = 0;
for(int y = 0; y < iSize; y++)
{
......@@ -44,40 +56,54 @@ public class ColorView extends GridPane
if(color == Color.TRANSPARENT)
{
StackPane stackPane = new StackPane();
ColorPicker picker = new ColorPicker();
picker.setPrefHeight(40);
picker.setPrefWidth(40);
picker.setMaxWidth(40);
updateColorPickerCSS(picker, false, Color.TRANSPARENT);
stackPane.getChildren().add(picker);
buttonColorPicker = new Button();
buttonColorPicker.setPrefHeight(40);
buttonColorPicker.setPrefWidth(40);
if(!colors.contains(startColor))
{
picker.setValue(startColor);
updateColorPickerCSS(picker, true, startColor);
colorPickerColor = startColor;
updateColorPickerCSS(buttonColorPicker, true, startColor);
}
FontIcon icon = new FontIcon(FontIconType.PLUS);
icon = new FontIcon(FontIconType.PLUS);
icon.setSize(20);
icon.setStyle("-fx-text-fill: " + ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(picker.getValue())));
stackPane.getChildren().add(icon);
icon.setStyle("-fx-text-fill: " + ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(colorPickerColor)));
buttonColorPicker.setGraphic(icon);
buttonColorPicker.setOnAction((event)->{
try
{
FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("de/deadlocker8/budgetmaster/ui/colorPick/ColorPickGUI.fxml"));
Parent root = (Parent)loader.load();
Scene scene = new Scene(root, 500, 225);
Stage stage = new Stage();
picker.valueProperty().addListener((observable, oldValue, newValue)->{
updateColorPickerCSS(picker, true, newValue);
((ColorPickController)loader.getController()).init(stage, (finishColor)->{
colorPickerColor = finishColor;
updateColorPickerCSS(buttonColorPicker, true, finishColor);
if(lastSelectedNode instanceof Rectangle)
{
((Rectangle)lastSelectedNode).getStrokeDashArray().clear();
}
lastSelectedNode = picker;
icon.setStyle("-fx-text-fill: " + ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(newValue)));
finish.accept(newValue);
lastSelectedNode = buttonColorPicker;
icon.setStyle("-fx-text-fill: " + ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(finishColor)));
finish.accept(finishColor);
});
icon.setOnMouseClicked((e)-> picker.show());
stage.setResizable(false);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setScene(scene);
stage.show();
}
catch(Exception e)
{
Logger.log(LogLevel.ERROR, Logger.exceptionToString(e));
}
});
add(stackPane, x, y);
add(buttonColorPicker, x, y);
}
else
{
......@@ -91,7 +117,8 @@ public class ColorView extends GridPane
}
else
{
updateColorPickerCSS(lastSelectedNode, false, ((ColorPicker)lastSelectedNode).getValue());
updateColorPickerCSS(buttonColorPicker, false, Color.WHITE);
icon.setStyle("-fx-text-fill: " + ConvertTo.toRGBHex(ConvertTo.getAppropriateTextColor(Color.WHITE)));
}
rectangle.getStrokeDashArray().add(3.0);
lastSelectedNode = rectangle;
......@@ -104,6 +131,8 @@ public class ColorView extends GridPane
}
}
}
updateColorPickerCSS(buttonColorPicker, true, colorPickerColor);
}
private Rectangle createRectangle(Color startColor, Color color)
......@@ -122,7 +151,7 @@ public class ColorView extends GridPane
return rectangle;
}
private void updateColorPickerCSS(Node colorPicker, boolean dashed, Color backgroundColor)
private void updateColorPickerCSS(Node button, boolean dashed, Color backgroundColor)
{
String css = "-fx-background-radius: 4; -fx-border-width: 1.8; -fx-border-color: black; -fx-border-radius: 4; -fx-background-color: " + ConvertTo.toRGBHex(backgroundColor) + ";";
if(dashed)
......@@ -130,6 +159,6 @@ public class ColorView extends GridPane
css += " -fx-border-style: dashed;";
}
colorPicker.setStyle(css);
button.setStyle(css);
}
}
\ No newline at end of file
package de.deadlocker8.budgetmaster.ui.colorPick;
import java.util.function.Consumer;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import tools.ConvertTo;
public class ColorPickController
{
@FXML private Label labelColor;
@FXML private Slider sliderRed;
@FXML private TextField textFieldRed;
@FXML private Slider sliderGreen;
@FXML private TextField textFieldGreen;
@FXML private Slider sliderBlue;
@FXML private TextField textFieldBlue;
@FXML private TextField textFieldHex;
@FXML private Button buttonSave;
@FXML private Button buttonCancel;
private Stage stage;
private Consumer<Color> finish;
public void init(Stage stage, Consumer<Color> finish)
{
this.stage = stage;
this.finish = finish;
initializeSliderAndTextField(sliderRed, textFieldRed);
initializeSliderAndTextField(sliderGreen, textFieldGreen);
initializeSliderAndTextField(sliderBlue, textFieldBlue);
initializeTextFieldHex();
updatePreview();
}
private void initializeSliderAndTextField(Slider slider, TextField textField)
{
initializeSlider(slider, textField);
initializeTextField(slider, textField);
}
private void initializeSlider(Slider slider, TextField textField)
{
slider.valueProperty().addListener((observer, oldValue, newValue)->{
textField.setText(String.valueOf(newValue.intValue()));
textFieldHex.setText(ConvertTo.toRGBHexWithoutOpacity(getColor()));
updatePreview();
});
}
private void initializeTextField(Slider slider, TextField textField)
{
textField.setTextFormatter(new TextFormatter<>(c -> {
if(c.getControlNewText().isEmpty())
{
return c;
}
if(c.getControlNewText().matches("[0-9]*"))
{
if(Double.parseDouble(c.getControlNewText()) > 255)
{
return null;
}
else
{
return c;
}
}
else
{
return null;
}
}));
textField.textProperty().addListener((observer, oldValue, newValue)->{
double value;
if(newValue.isEmpty())
{
value = 0;
}
else
{
value = Double.parseDouble(newValue);
}
slider.setValue(value);
textFieldHex.setText(ConvertTo.toRGBHexWithoutOpacity(getColor()));
});
}
private void initializeTextFieldHex()
{
textFieldHex.textProperty().addListener((observer, oldValue, newValue)->{
try
{
Color hexColor = Color.web(newValue);
sliderRed.setValue((int)(hexColor.getRed()*255));
sliderGreen.setValue((int)(hexColor.getGreen()*255));
sliderBlue.setValue((int)(hexColor.getBlue()*255));
}
catch(Exception e)
{
}
});
}
private Color getColor()
{
return Color.rgb((int)sliderRed.getValue(), (int)sliderGreen.getValue(), (int)sliderBlue.getValue());
}
private void updatePreview()
{
labelColor.setStyle("-fx-border-color: #000000; -fx-border-width: 1; -fx-background-color: " + ConvertTo.toRGBHex(getColor()));
}
@FXML
void cancel(ActionEvent event)
{
stage.close();
}
@FXML
void save(ActionEvent event)
{
finish.accept(getColor());
stage.close();
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmaster.ui.colorPick.ColorPickController">
<children>
<HBox layoutX="273.0" layoutY="81.0" spacing="30.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0">
<children>
<Label fx:id="labelColor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" HBox.hgrow="ALWAYS" />
<VBox prefHeight="205.0" prefWidth="313.0">
<children>
<HBox alignment="CENTER" prefHeight="0.0" prefWidth="299.0">
<children>
<Label prefHeight="25.0" prefWidth="47.0" text="Rot:">
<font>
<Font name="System Bold" size="16.0" />
</font>
</Label>
<Slider fx:id="sliderRed" blockIncrement="1.0" max="255.0" prefHeight="14.0" prefWidth="103.0" value="255.0" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets right="20.0" />
</HBox.margin></Slider>
<TextField fx:id="textFieldRed" prefHeight="30.0" prefWidth="45.0" text="255">
<font>
<Font name="System Bold" size="14.0" />
</font>
</TextField>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="0.0" prefWidth="299.0">
<children>
<Label prefHeight="25.0" prefWidth="47.0" text="Grün:">
<font>
<Font name="System Bold" size="16.0" />
</font>
</Label>
<Slider fx:id="sliderGreen" blockIncrement="1.0" max="255.0" prefHeight="14.0" prefWidth="103.0" value="255.0" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets right="20.0" />
</HBox.margin></Slider>
<TextField fx:id="textFieldGreen" prefHeight="30.0" prefWidth="45.0" text="255">
<font>
<Font name="System Bold" size="14.0" />
</font>
</TextField>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="0.0" prefWidth="299.0">
<children>
<Label prefHeight="25.0" prefWidth="47.0" text="Blau:">
<font>
<Font name="System Bold" size="16.0" />
</font>
</Label>
<Slider fx:id="sliderBlue" blockIncrement="1.0" max="255.0" prefHeight="14.0" prefWidth="103.0" value="255.0" HBox.hgrow="ALWAYS">
<HBox.margin>
<Insets right="20.0" />
</HBox.margin></Slider>
<TextField fx:id="textFieldBlue" prefHeight="30.0" prefWidth="45.0" text="255">
<font>
<Font name="System Bold" size="14.0" />
</font>
</TextField>
</children>
</HBox>
<HBox alignment="CENTER_LEFT" prefHeight="0.0" prefWidth="299.0" spacing="25.0">
<children>
<Label prefHeight="25.0" prefWidth="74.0" text="Hex:">
<font>
<Font name="System Bold" size="16.0" />
</font>
</Label>
<TextField fx:id="textFieldHex" prefHeight="30.0" prefWidth="77.0" text="#FFFFFF">
<font>
<Font name="System Bold" size="14.0" />
</font>
</TextField>
</children>
<VBox.margin>
<Insets top="25.0" />
</VBox.margin>
</HBox>
<HBox alignment="BOTTOM_CENTER" prefHeight="0.0" prefWidth="299.0" spacing="25.0" VBox.vgrow="ALWAYS">
<children>
<Button fx:id="buttonSave" mnemonicParsing="false" onAction="#save" text="Speichern">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Button>
<Button fx:id="buttonCancel" mnemonicParsing="false" onAction="#cancel" text="Abbrechen">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Button>
</children>
<VBox.margin>
<Insets />
</VBox.margin>
</HBox>
</children>
<HBox.margin>
<Insets />
</HBox.margin>
</VBox>
</children>
</HBox>
</children>
</AnchorPane>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment