From c33ed622b6d3205af1c33e72e725298870bc8147 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Thu, 28 Sep 2017 18:58:14 +0200 Subject: [PATCH] prepared ui for #186 --- .../ui/controller/SearchController.java | 118 +++++++++++++++++- .../budgetmaster/ui/fxml/SearchGUI.fxml | 86 +++++++++---- 2 files changed, 178 insertions(+), 26 deletions(-) diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/SearchController.java b/src/de/deadlocker8/budgetmaster/ui/controller/SearchController.java index e0d12ca5c..510448aa2 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/SearchController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/SearchController.java @@ -2,6 +2,8 @@ package de.deadlocker8.budgetmaster.ui.controller; import java.util.ArrayList; +import org.controlsfx.control.RangeSlider; + import de.deadlocker8.budgetmaster.logic.payment.Payment; import de.deadlocker8.budgetmaster.logic.search.SearchPreferences; import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; @@ -15,14 +17,18 @@ import fontAwesome.FontIconType; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.fxml.FXML; +import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.TextField; +import javafx.scene.control.TextFormatter; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseEvent; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; import javafx.scene.paint.Color; import javafx.stage.Modality; import javafx.stage.Stage; @@ -39,6 +45,12 @@ public class SearchController extends BaseController implements Styleable @FXML private CheckBox checkBoxCategoryName; @FXML private CheckBox checkBoxTags; @FXML private TextField textFieldSearch; + @FXML private CheckBox checkBoxSearchByAmount; + @FXML private TextField textFieldAmountMin; + @FXML private TextField textFieldAmountMax; + @FXML private HBox hboxRangeSlider; + @FXML private Label labelSeparator; + @FXML private HBox hboxSearchByAmount; @FXML private Button buttonCancel; @FXML private Button buttonSearch; @FXML private ListView<Payment> listView; @@ -65,7 +77,7 @@ public class SearchController extends BaseController implements Styleable stage.setMinWidth(500); stage.setMinHeight(500); stage.setWidth(650); - } + } @Override public void init() @@ -107,6 +119,93 @@ public class SearchController extends BaseController implements Styleable } }); + checkBoxSearchByAmount.selectedProperty().addListener((a, b, c)->{ + hboxSearchByAmount.setDisable(!c); + }); + + hboxSearchByAmount.setDisable(true); + + //TODO get max from server + int maximum = 3500; + + RangeSlider rangeSlider = new RangeSlider(); + rangeSlider.setMin(0); + rangeSlider.setMax(maximum); + rangeSlider.setLowValue(rangeSlider.getMin()); + rangeSlider.setHighValue(rangeSlider.getMax()); + rangeSlider.setShowTickMarks(true); + rangeSlider.setShowTickLabels(true); + rangeSlider.setMajorTickUnit(getMayorTickUnit(maximum)); + rangeSlider.setMinorTickCount(0); + rangeSlider.lowValueProperty().addListener((a, b, c)->{ + textFieldAmountMin.setText(String.valueOf(c.intValue())); + }); + rangeSlider.highValueProperty().addListener((a, b, c)->{ + textFieldAmountMax.setText(String.valueOf(c.intValue())); + }); + hboxRangeSlider.getChildren().add(rangeSlider); + hboxRangeSlider.setAlignment(Pos.CENTER); + HBox.setHgrow(rangeSlider, Priority.ALWAYS); + + textFieldAmountMin.setTextFormatter(new TextFormatter<>(c -> { + if(c.getControlNewText().isEmpty()) + { + return c; + } + + if(c.getControlNewText().matches("[0-9]*")) + { + return c; + } + else + { + return null; + } + })); + + textFieldAmountMax.setTextFormatter(new TextFormatter<>(c -> { + if(c.getControlNewText().isEmpty()) + { + return c; + } + + if(c.getControlNewText().matches("[0-9]*")) + { + return c; + } + else + { + return null; + } + })); + + textFieldAmountMin.setOnKeyReleased((event)->{ + if(event.getCode() == KeyCode.ENTER) + { + String text = textFieldAmountMin.getText(); + if(text != null && !text.equals("")) + { + rangeSlider.setLowValue(Integer.parseInt(text)); + } + } + }); + + textFieldAmountMax.setOnKeyReleased((event)->{ + if(event.getCode() == KeyCode.ENTER) + { + String text = textFieldAmountMax.getText(); + if(text != null && !text.equals("")) + { + rangeSlider.setHighValue(Integer.parseInt(text)); + } + } + }); + + textFieldAmountMin.setText("0"); + textFieldAmountMax.setText(String.valueOf(maximum)); + + //TODO save search by amount to SearchPreferences + //prefill if(controller.getSearchPreferences() != null) { @@ -120,6 +219,19 @@ public class SearchController extends BaseController implements Styleable applyStyle(); } + + private int getMayorTickUnit(int maximum) + { + if(maximum < 10) + return 1; + + if(maximum < 100) + return 5; + + int length = String.valueOf(maximum).length(); + return (int)Math.pow(10, length-2); + } + public void search() { String query = textFieldSearch.getText().trim(); @@ -188,6 +300,10 @@ public class SearchController extends BaseController implements Styleable @Override public void applyStyle() { + labelSeparator.setStyle("-fx-background-color: #CCCCCC;"); + labelSeparator.setMinHeight(1); + labelSeparator.setMaxHeight(1); + buttonCancel.setGraphic(Helpers.getFontIcon(FontIconType.TIMES, 17, Color.WHITE)); buttonSearch.setGraphic(Helpers.getFontIcon(FontIconType.SEARCH, 17, Color.WHITE)); diff --git a/src/de/deadlocker8/budgetmaster/ui/fxml/SearchGUI.fxml b/src/de/deadlocker8/budgetmaster/ui/fxml/SearchGUI.fxml index 16a180976..dbc0176ec 100644 --- a/src/de/deadlocker8/budgetmaster/ui/fxml/SearchGUI.fxml +++ b/src/de/deadlocker8/budgetmaster/ui/fxml/SearchGUI.fxml @@ -20,36 +20,72 @@ <Font name="System Bold" size="18.0" /> </font> </Label> - <TextField fx:id="textFieldSearch" /> - <HBox prefHeight="10.0" prefWidth="422.0" spacing="25.0"> + <VBox spacing="15.0"> <children> - <Label text="%search.by"> + <HBox spacing="25.0"> + <children> + <VBox spacing="20.0" HBox.hgrow="ALWAYS"> + <children> + <TextField fx:id="textFieldSearch" /> + <HBox spacing="15.0"> + <children> + <Label text="%search.by"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Label> + <CheckBox fx:id="checkBoxName" mnemonicParsing="false" text="%search.by.name"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <CheckBox fx:id="checkBoxDescription" mnemonicParsing="false" text="%search.by.description"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <CheckBox fx:id="checkBoxCategoryName" mnemonicParsing="false" text="%search.by.category.name"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <CheckBox fx:id="checkBoxTags" mnemonicParsing="false" text="%search.by.tags"> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + </children> + </HBox> + </children> + </VBox> + </children> + </HBox> + <Label fx:id="labelSeparator" maxWidth="1.7976931348623157E308"> <font> - <Font name="System Bold" size="14.0" /> + <Font size="1.0" /> </font> </Label> - <CheckBox fx:id="checkBoxName" mnemonicParsing="false" text="%search.by.name"> - <font> - <Font size="14.0" /> - </font> - </CheckBox> - <CheckBox fx:id="checkBoxDescription" mnemonicParsing="false" text="%search.by.description"> - <font> - <Font size="14.0" /> - </font> - </CheckBox> - <CheckBox fx:id="checkBoxCategoryName" mnemonicParsing="false" text="%search.by.category.name"> - <font> - <Font size="14.0" /> - </font> - </CheckBox> - <CheckBox fx:id="checkBoxTags" mnemonicParsing="false" text="%search.by.tags"> - <font> - <Font size="14.0" /> - </font> - </CheckBox> + <HBox alignment="CENTER_LEFT" prefHeight="32.0" prefWidth="377.0" spacing="10.0"> + <children> + <CheckBox fx:id="checkBoxSearchByAmount" mnemonicParsing="false" text="Betrag eingrenzen"> + <HBox.margin> + <Insets right="25.0" /> + </HBox.margin> + <font> + <Font size="14.0" /> + </font> + </CheckBox> + <HBox fx:id="hboxSearchByAmount" alignment="CENTER" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <TextField fx:id="textFieldAmountMin" prefHeight="25.0" prefWidth="55.0" /> + <HBox fx:id="hboxRangeSlider" prefHeight="32.0" prefWidth="123.0" /> + <TextField fx:id="textFieldAmountMax" prefHeight="25.0" prefWidth="55.0" /> + </children> + </HBox> + </children> + </HBox> </children> - </HBox> + </VBox> <ListView fx:id="listView" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" /> <HBox alignment="CENTER" prefHeight="30.0" prefWidth="465.0" spacing="10.0"> <children> -- GitLab