diff --git a/client/src/main/java/client/MyModule.java b/client/src/main/java/client/MyModule.java index 9f27a8c..a5dd197 100644 --- a/client/src/main/java/client/MyModule.java +++ b/client/src/main/java/client/MyModule.java @@ -17,6 +17,7 @@ package client; import client.scenes.FoodpalApplicationCtrl; import client.scenes.recipe.IngredientListCtrl; +import client.scenes.recipe.RecipeStepListCtrl; import client.utils.LocaleManager; import com.google.inject.Binder; import com.google.inject.Module; @@ -33,6 +34,7 @@ public class MyModule implements Module { binder.bind(AddNameCtrl.class).in(Scopes.SINGLETON); binder.bind(FoodpalApplicationCtrl.class).in(Scopes.SINGLETON); binder.bind(IngredientListCtrl.class).in(Scopes.SINGLETON); + binder.bind(RecipeStepListCtrl.class).in(Scopes.SINGLETON); binder.bind(LocaleManager.class).in(Scopes.SINGLETON); } } \ No newline at end of file diff --git a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java index 7fcf49b..c0aecfc 100644 --- a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java +++ b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java @@ -8,6 +8,7 @@ import java.util.Locale; import client.exception.UpdateException; import client.scenes.recipe.IngredientListCtrl; +import client.scenes.recipe.RecipeStepListCtrl; import client.utils.DefaultRecipeFactory; import client.utils.LocaleAware; import client.utils.LocaleManager; @@ -33,6 +34,7 @@ public class FoodpalApplicationCtrl implements LocaleAware { private final ServerUtils server; private final LocaleManager localeManager; private final IngredientListCtrl ingredientListCtrl; + private final RecipeStepListCtrl stepListCtrl; public VBox detailsScreen; public HBox editableTitleArea; @@ -99,16 +101,19 @@ public class FoodpalApplicationCtrl implements LocaleAware { MainCtrl mainCtrl, ServerUtils server, LocaleManager localeManager, - IngredientListCtrl ingredientListCtrl + IngredientListCtrl ingredientListCtrl, + RecipeStepListCtrl stepListCtrl ) { this.mainCtrl = mainCtrl; this.server = server; this.localeManager = localeManager; this.ingredientListCtrl = ingredientListCtrl; + this.stepListCtrl = stepListCtrl; } @Override public void initializeComponents() { + // TODO Reduce code duplication?? // Initialize callback for ingredient list updates this.ingredientListCtrl.setUpdateCallback(newList -> { Recipe focusedRecipe = recipeList.getFocusModel().getFocusedItem(); @@ -124,6 +129,20 @@ public class FoodpalApplicationCtrl implements LocaleAware { throw new UpdateException("Unable to update recipe to server for " + focusedRecipe); } }); + this.stepListCtrl.setUpdateCallback(newList -> { + Recipe focusedRecipe = recipeList.getFocusModel().getFocusedItem(); + if (focusedRecipe == null) { + // edge case error for NPE. + throw new NullPointerException("Null recipe whereas ingredients are edited"); + } + focusedRecipe.setPreparationSteps(newList); + try { + // propagate changes to server + server.updateRecipe(focusedRecipe); + } catch (IOException | InterruptedException e) { + throw new UpdateException("Unable to update recipe to server for " + focusedRecipe); + } + }); // Show recipe name in the list recipeList.setCellFactory(list -> new ListCell<>() { @Override @@ -163,11 +182,13 @@ public class FoodpalApplicationCtrl implements LocaleAware { printRecipeButton.setText(getLocaleString("menu.button.print")); recipesLabel.setText(getLocaleString("menu.label.recipes")); + + // TODO propagate ResourceBundle lang changes to nested controller // ingredientsLabel.setText(getLocaleString("menu.label.ingredients")); - preparationLabel.setText(getLocaleString("menu.label.preparation")); + // preparationLabel.setText(getLocaleString("menu.label.preparation")); // addIngredientButton.setText(getLocaleString("menu.button.add.ingredient")); - addPreparationStepButton.setText(getLocaleString("menu.button.add.step")); + // addPreparationStepButton.setText(getLocaleString("menu.button.add.step")); } @Override @@ -177,12 +198,11 @@ public class FoodpalApplicationCtrl implements LocaleAware { private void showRecipeDetails(Recipe recipe) { if (recipe == null) { - preparationListView.getItems().clear(); return; } showName(recipe.getName()); ingredientListCtrl.refetchFromRecipe(recipe); - preparationListView.getItems().setAll(recipe.getPreparationSteps()); + stepListCtrl.refetchFromRecipe(recipe); } // Button handlers diff --git a/client/src/main/java/client/scenes/recipe/RecipeStepListCtrl.java b/client/src/main/java/client/scenes/recipe/RecipeStepListCtrl.java index 7ed9c36..2839028 100644 --- a/client/src/main/java/client/scenes/recipe/RecipeStepListCtrl.java +++ b/client/src/main/java/client/scenes/recipe/RecipeStepListCtrl.java @@ -5,7 +5,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; -import java.util.function.Function; +import java.util.function.Consumer; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; @@ -29,7 +29,7 @@ public class RecipeStepListCtrl implements Initializable { * As the step list in {@link Recipe} is immutable, * this copies that list upon initialization to this mutable list. *
- * Please use the {@link #setUpdateCallback(Function)} function to listen for + * Please use the {@link #setUpdateCallback(Consumer)} function to listen for * changes and update the recipe accordingly. *

*/ @@ -38,7 +38,7 @@ public class RecipeStepListCtrl implements Initializable { /** * A callback function that is called when the step list is updated. */ - private Function, Void> updateCallback; + private Consumer> updateCallback; @FXML ListView recipeStepListView; @@ -72,7 +72,7 @@ public class RecipeStepListCtrl implements Initializable { * * @param callback The function to call upon each update. */ - public void setUpdateCallback(Function, Void> callback) { + public void setUpdateCallback(Consumer> callback) { this.updateCallback = callback; } @@ -91,7 +91,7 @@ public class RecipeStepListCtrl implements Initializable { private void handleIngredientAdd(ActionEvent event) { this.steps.add("Step " + (this.steps.size() + 1)); this.refresh(); - this.updateCallback.apply(this.steps); + this.updateCallback.accept(this.steps); var select = this.recipeStepListView.getSelectionModel(); select.select(this.steps.size() - 1); @@ -108,7 +108,7 @@ public class RecipeStepListCtrl implements Initializable { this.steps.set(index, newValue); this.refresh(); - this.updateCallback.apply(this.steps); + this.updateCallback.accept(this.steps); } /** @@ -126,7 +126,7 @@ public class RecipeStepListCtrl implements Initializable { this.steps.remove(selectedIndex); this.refresh(); - this.updateCallback.apply(this.steps); + this.updateCallback.accept(this.steps); } @FXML diff --git a/client/src/main/resources/client/scenes/FoodpalApplication.fxml b/client/src/main/resources/client/scenes/FoodpalApplication.fxml index 8fe9bc9..27b5bc2 100644 --- a/client/src/main/resources/client/scenes/FoodpalApplication.fxml +++ b/client/src/main/resources/client/scenes/FoodpalApplication.fxml @@ -116,27 +116,10 @@ - + - - -