PlannerController.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package nordh.xyz;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import java.util.stream.Collector;
  5. import java.util.stream.Collectors;
  6. import javafx.beans.value.ChangeListener;
  7. import javafx.beans.value.ObservableValue;
  8. import javafx.collections.ObservableList;
  9. import javafx.fxml.FXML;
  10. import javafx.geometry.Insets;
  11. import javafx.scene.Node;
  12. import javafx.scene.control.Alert;
  13. import javafx.scene.control.Button;
  14. import javafx.scene.control.CheckBox;
  15. import javafx.scene.control.Label;
  16. import javafx.scene.control.ListCell;
  17. import javafx.scene.control.ListView;
  18. import javafx.scene.control.RadioButton;
  19. import javafx.scene.control.Toggle;
  20. import javafx.scene.control.ToggleButton;
  21. import javafx.scene.control.ToggleGroup;
  22. import javafx.scene.control.Alert.AlertType;
  23. import javafx.scene.image.Image;
  24. import javafx.scene.image.ImageView;
  25. import javafx.scene.layout.HBox;
  26. import javafx.scene.layout.Pane;
  27. import javafx.scene.layout.Priority;
  28. import javafx.scene.layout.VBox;
  29. import nordh.xyz.Database.DatabaseConnection;
  30. import nordh.xyz.objects.Recepie;
  31. /**
  32. * Denna ska planera X rätter. (Default 5) Rätterna ska vara varierade, t.ex. 1
  33. * pasta, 1 fisk, 1 gryta/soppa osv.. Den ska i framtiden hålla koll på om man
  34. * haft receptet tidigare och inte ge samma igen. Man ska kunna betygsätta
  35. * recepten i efterhand (barn, vuxen.. eller varje familjemedlem)
  36. *
  37. * <p>
  38. * == Kanske för en egen panel==
  39. * </p>
  40. * <p>
  41. * Det måste finna ett sätt att klassa maträtterna, och spara detta i en
  42. * databas. om det är Vegetariskt, Veganskt, pasta, fisk, soppa, efterrätt,
  43. * huvudrätt.. någon form av taggning.
  44. * </p>
  45. *
  46. */
  47. public class PlannerController {
  48. @FXML
  49. Pane recepiePane;
  50. @FXML
  51. ListView<RecepieListViewItem> generatedRecepiesListView;
  52. @FXML
  53. VBox generateSettingsVBox;
  54. protected boolean andSelected = true;
  55. @FXML
  56. public void initialize() {
  57. generatedRecepiesListView.getSelectionModel().selectedItemProperty().addListener((event) -> {
  58. updateRecepieView(generatedRecepiesListView.getSelectionModel().getSelectedItem());
  59. });
  60. generatedRecepiesListView.setCellFactory(param -> new ListCell<RecepieListViewItem>() {
  61. protected void updateItem(RecepieListViewItem item, boolean empty) {
  62. super.updateItem(item, empty);
  63. if (empty || item == null) {
  64. // EMPTY
  65. } else {
  66. setGraphic(item.getGui());
  67. }
  68. };
  69. });
  70. generateSettingsPanel();
  71. }
  72. private void generateSettingsPanel() {
  73. List<String> tags = DatabaseConnection.getInstance().getTags();
  74. ToggleGroup buttonGroup = new ToggleGroup();
  75. HBox buttonBox = new HBox();
  76. buttonBox.setPadding(new Insets(10d));
  77. RadioButton andRadiobutton = new RadioButton("AND");
  78. RadioButton orRadiobutton = new RadioButton("OR");
  79. andRadiobutton.setUserData("AND");
  80. orRadiobutton.setUserData("OR");
  81. andRadiobutton.setSelected(true);
  82. andRadiobutton.setToggleGroup(buttonGroup);
  83. orRadiobutton.setToggleGroup(buttonGroup);
  84. buttonBox.getChildren().addAll(andRadiobutton, orRadiobutton);
  85. generateSettingsVBox.getChildren().add(buttonBox);
  86. buttonGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
  87. @Override
  88. public void changed(ObservableValue<? extends Toggle> ov, Toggle oldValue, Toggle newValue) {
  89. andSelected = newValue.getUserData().equals("AND");
  90. }
  91. });
  92. for (String tag : tags) {
  93. generateSettingsVBox.getChildren().add(new CheckBox(tag));
  94. }
  95. }
  96. @FXML
  97. private void switchToMain() throws IOException {
  98. App.setRoot("main");
  99. }
  100. @FXML
  101. private void GenerateRecepie() {
  102. ObservableList<Node> children = generateSettingsVBox.getChildren();
  103. List<CheckBox> selectedBoxs = children.stream().filter(p -> p instanceof CheckBox).map(m -> (CheckBox) m)
  104. .filter(p -> p.isSelected()).collect(Collectors.toList());
  105. if (selectedBoxs.size() == 0) {
  106. addRandomRecepieToListView();
  107. } else {
  108. addRandomRecepieToListView(selectedBoxs);
  109. }
  110. }
  111. private void addRandomRecepieToListView(List<CheckBox> selectedBoxs) {
  112. List<String> selectedTags = selectedBoxs.stream().map(m -> m.getText()).collect(Collectors.toList());
  113. Recepie r = DatabaseConnection.getInstance().getRandomRecepie(selectedTags, andSelected);
  114. int counter = 100;
  115. boolean failed = false;
  116. if (r == null) {
  117. failed = true;
  118. showNoRecepiesAlert();
  119. } else {
  120. while (generatedRecepiesListView.getItems().stream().map(ri -> ri.getRecepie().getName())
  121. .collect(Collectors.toList()).contains(r.getName())) {
  122. r = DatabaseConnection.getInstance().getRandomRecepie(selectedTags, andSelected);
  123. if (r == null || counter-- <= 0) {
  124. showNoRecepiesAlert();
  125. failed = true;
  126. break;
  127. }
  128. }
  129. }
  130. if (!failed) {
  131. generatedRecepiesListView.getItems().add(new RecepieListViewItem(r));
  132. }
  133. }
  134. private void showNoRecepiesAlert() {
  135. Alert alert = new Alert(AlertType.INFORMATION);
  136. alert.setContentText("There are no more recepies");
  137. alert.show();
  138. }
  139. private void addRandomRecepieToListView() {
  140. Recepie r = DatabaseConnection.getInstance().getRandomRecepie();
  141. int counter = 100;
  142. boolean failed = false;
  143. while (generatedRecepiesListView.getItems().stream().map(ri -> ri.getRecepie().getName())
  144. .collect(Collectors.toList()).contains(r.getName())) {
  145. r = DatabaseConnection.getInstance().getRandomRecepie();
  146. if (r == null || counter-- <= 0) {
  147. showNoRecepiesAlert();
  148. failed = true;
  149. break;
  150. }
  151. }
  152. if (!failed) {
  153. generatedRecepiesListView.getItems().add(new RecepieListViewItem(r));
  154. }
  155. }
  156. private void updateRecepieView(RecepieListViewItem r) {
  157. recepiePane.getChildren().clear();
  158. if (r != null) {
  159. recepiePane.getChildren().add(r.getRecepie().getGui());
  160. }
  161. }
  162. private class RecepieListViewItem {
  163. Recepie r;
  164. Button rerollButton;
  165. RecepieListViewItem(Recepie r) {
  166. this.r = r;
  167. rerollButton = new Button();
  168. Image img = new Image("images/recycleArrowImageShrunk.jpg");
  169. ImageView imgView = new ImageView(img);
  170. imgView.prefHeight(20);
  171. imgView.prefWidth(20);
  172. imgView.maxHeight(20);
  173. imgView.maxWidth(20);
  174. rerollButton.setGraphic(imgView);
  175. rerollButton.setOnMouseClicked((event) -> {
  176. generatedRecepiesListView.getItems().remove(this);
  177. GenerateRecepie();
  178. });
  179. }
  180. public Recepie getRecepie() {
  181. return r;
  182. }
  183. public Node getGui() {
  184. HBox result = new HBox();
  185. if (r == null || r.getName() == null || r.getName().equals("")) {
  186. return result;
  187. }
  188. HBox.setHgrow(result, Priority.ALWAYS);
  189. Label recepieName = new Label(r.toString());
  190. recepieName.setPrefWidth(150d);
  191. HBox.setHgrow(recepieName, Priority.ALWAYS);
  192. result.getChildren().addAll(recepieName, rerollButton);
  193. return result;
  194. }
  195. }
  196. }