| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- 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)
- *
- * <p>
- * == Kanske för en egen panel==
- * </p>
- * <p>
- * 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.
- * </p>
- *
- */
- public class PlannerController {
- @FXML
- Pane recepiePane;
- @FXML
- ListView<RecepieListViewItem> 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<RecepieListViewItem>() {
- 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<String> 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<Toggle>() {
- @Override
- public void changed(ObservableValue<? extends Toggle> 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<Node> children = generateSettingsVBox.getChildren();
- List<CheckBox> 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<CheckBox> selectedBoxs) {
- List<String> 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;
- }
- }
- }
|