package nordh.xyz; import java.io.IOException; import java.util.List; import java.util.stream.Collector; import java.util.stream.Collectors; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Alert; 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.RadioButton; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.scene.control.Alert.AlertType; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import nordh.xyz.Database.DatabaseConnection; import nordh.xyz.objects.Recepie; /** * Denna ska planera X rätter. (Default 5) Rätterna ska vara varierade, t.ex. 1 * pasta, 1 fisk, 1 gryta/soppa osv.. Den ska i framtiden hålla koll på om man * haft receptet tidigare och inte ge samma igen. Man ska kunna betygsätta * recepten i efterhand (barn, vuxen.. eller varje familjemedlem) * *

* == Kanske för en egen panel== *

*

* Det måste finna ett sätt att klassa maträtterna, och spara detta i en * databas. om det är Vegetariskt, Veganskt, pasta, fisk, soppa, efterrätt, * huvudrätt.. någon form av taggning. *

* */ public class PlannerController { @FXML Pane recepiePane; @FXML ListView generatedRecepiesListView; @FXML VBox generateSettingsVBox; protected boolean andSelected = true; @FXML public void initialize() { generatedRecepiesListView.getSelectionModel().selectedItemProperty().addListener((event) -> { updateRecepieView(generatedRecepiesListView.getSelectionModel().getSelectedItem()); }); generatedRecepiesListView.setCellFactory(param -> new ListCell() { protected void updateItem(RecepieListViewItem item, boolean empty) { super.updateItem(item, empty); if (empty || item == null) { // EMPTY } else { setGraphic(item.getGui()); } }; }); generateSettingsPanel(); } private void generateSettingsPanel() { List tags = DatabaseConnection.getInstance().getTags(); ToggleGroup buttonGroup = new ToggleGroup(); HBox buttonBox = new HBox(); buttonBox.setPadding(new Insets(10d)); RadioButton andRadiobutton = new RadioButton("AND"); RadioButton orRadiobutton = new RadioButton("OR"); andRadiobutton.setUserData("AND"); orRadiobutton.setUserData("OR"); andRadiobutton.setSelected(true); andRadiobutton.setToggleGroup(buttonGroup); orRadiobutton.setToggleGroup(buttonGroup); buttonBox.getChildren().addAll(andRadiobutton, orRadiobutton); generateSettingsVBox.getChildren().add(buttonBox); buttonGroup.selectedToggleProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, Toggle oldValue, Toggle newValue) { andSelected = newValue.getUserData().equals("AND"); } }); for (String tag : tags) { generateSettingsVBox.getChildren().add(new CheckBox(tag)); } } @FXML private void switchToMain() throws IOException { App.setRoot("main"); } @FXML private void GenerateRecepie() { ObservableList children = generateSettingsVBox.getChildren(); List selectedBoxs = children.stream().filter(p -> p instanceof CheckBox).map(m -> (CheckBox) m) .filter(p -> p.isSelected()).collect(Collectors.toList()); if (selectedBoxs.size() == 0) { addRandomRecepieToListView(); } else { addRandomRecepieToListView(selectedBoxs); } } private void addRandomRecepieToListView(List selectedBoxs) { List selectedTags = selectedBoxs.stream().map(m -> m.getText()).collect(Collectors.toList()); Recepie r = DatabaseConnection.getInstance().getRandomRecepie(selectedTags, andSelected); int counter = 100; boolean failed = false; if (r == null) { failed = true; showNoRecepiesAlert(); } else { while (generatedRecepiesListView.getItems().stream().map(ri -> ri.getRecepie().getName()) .collect(Collectors.toList()).contains(r.getName())) { r = DatabaseConnection.getInstance().getRandomRecepie(selectedTags, andSelected); if (r == null || counter-- <= 0) { showNoRecepiesAlert(); failed = true; break; } } } if (!failed) { generatedRecepiesListView.getItems().add(new RecepieListViewItem(r)); } } private void showNoRecepiesAlert() { Alert alert = new Alert(AlertType.INFORMATION); alert.setContentText("There are no more recepies"); alert.show(); } private void addRandomRecepieToListView() { Recepie r = DatabaseConnection.getInstance().getRandomRecepie(); int counter = 100; boolean failed = false; while (generatedRecepiesListView.getItems().stream().map(ri -> ri.getRecepie().getName()) .collect(Collectors.toList()).contains(r.getName())) { r = DatabaseConnection.getInstance().getRandomRecepie(); if (r == null || counter-- <= 0) { showNoRecepiesAlert(); failed = true; break; } } if (!failed) { generatedRecepiesListView.getItems().add(new RecepieListViewItem(r)); } } private void updateRecepieView(RecepieListViewItem r) { recepiePane.getChildren().clear(); if (r != null) { recepiePane.getChildren().add(r.getRecepie().getGui()); } } private class RecepieListViewItem { Recepie r; Button rerollButton; RecepieListViewItem(Recepie r) { this.r = r; rerollButton = new Button(); Image img = new Image("images/recycleArrowImageShrunk.jpg"); ImageView imgView = new ImageView(img); imgView.prefHeight(20); imgView.prefWidth(20); imgView.maxHeight(20); imgView.maxWidth(20); rerollButton.setGraphic(imgView); rerollButton.setOnMouseClicked((event) -> { generatedRecepiesListView.getItems().remove(this); GenerateRecepie(); }); } public Recepie getRecepie() { return r; } public Node getGui() { HBox result = new HBox(); if (r == null || r.getName() == null || r.getName().equals("")) { return result; } HBox.setHgrow(result, Priority.ALWAYS); Label recepieName = new Label(r.toString()); recepieName.setPrefWidth(150d); HBox.setHgrow(recepieName, Priority.ALWAYS); result.getChildren().addAll(recepieName, rerollButton); return result; } } }