From 2ce855aa3df0d4a33f470bcb5c25440ecb05a7ee Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Thu, 4 Dec 2025 17:31:34 +0100 Subject: [PATCH] feat: integrate ingredient list updates --- client/src/main/java/client/MyModule.java | 3 +- .../client/scenes/FoodpalApplicationCtrl.java | 32 ++++++++++++++++--- .../scenes/recipe/IngredientListCtrl.java | 22 ++++++------- .../client/scenes/FoodpalApplication.fxml | 10 +----- .../client/scenes/recipe/IngredientList.fxml | 2 +- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/client/src/main/java/client/MyModule.java b/client/src/main/java/client/MyModule.java index f0d95ed..9f27a8c 100644 --- a/client/src/main/java/client/MyModule.java +++ b/client/src/main/java/client/MyModule.java @@ -16,6 +16,7 @@ package client; import client.scenes.FoodpalApplicationCtrl; +import client.scenes.recipe.IngredientListCtrl; import client.utils.LocaleManager; import com.google.inject.Binder; import com.google.inject.Module; @@ -31,7 +32,7 @@ public class MyModule implements Module { binder.bind(MainCtrl.class).in(Scopes.SINGLETON); binder.bind(AddNameCtrl.class).in(Scopes.SINGLETON); binder.bind(FoodpalApplicationCtrl.class).in(Scopes.SINGLETON); - + binder.bind(IngredientListCtrl.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 e2b8abf..7fcf49b 100644 --- a/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java +++ b/client/src/main/java/client/scenes/FoodpalApplicationCtrl.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Locale; import client.exception.UpdateException; +import client.scenes.recipe.IngredientListCtrl; import client.utils.DefaultRecipeFactory; import client.utils.LocaleAware; import client.utils.LocaleManager; @@ -31,6 +32,7 @@ public class FoodpalApplicationCtrl implements LocaleAware { private final MainCtrl mainCtrl; private final ServerUtils server; private final LocaleManager localeManager; + private final IngredientListCtrl ingredientListCtrl; public VBox detailsScreen; public HBox editableTitleArea; @@ -93,14 +95,35 @@ public class FoodpalApplicationCtrl implements LocaleAware { private Button addPreparationStepButton; @Inject - public FoodpalApplicationCtrl(MainCtrl mainCtrl, ServerUtils server, LocaleManager localeManager) { + public FoodpalApplicationCtrl( + MainCtrl mainCtrl, + ServerUtils server, + LocaleManager localeManager, + IngredientListCtrl ingredientListCtrl + ) { this.mainCtrl = mainCtrl; this.server = server; this.localeManager = localeManager; + this.ingredientListCtrl = ingredientListCtrl; } @Override public void initializeComponents() { + // Initialize callback for ingredient list updates + this.ingredientListCtrl.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.setIngredients(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 @@ -140,10 +163,10 @@ public class FoodpalApplicationCtrl implements LocaleAware { printRecipeButton.setText(getLocaleString("menu.button.print")); recipesLabel.setText(getLocaleString("menu.label.recipes")); - ingredientsLabel.setText(getLocaleString("menu.label.ingredients")); + // ingredientsLabel.setText(getLocaleString("menu.label.ingredients")); preparationLabel.setText(getLocaleString("menu.label.preparation")); - addIngredientButton.setText(getLocaleString("menu.button.add.ingredient")); + // addIngredientButton.setText(getLocaleString("menu.button.add.ingredient")); addPreparationStepButton.setText(getLocaleString("menu.button.add.step")); } @@ -154,12 +177,11 @@ public class FoodpalApplicationCtrl implements LocaleAware { private void showRecipeDetails(Recipe recipe) { if (recipe == null) { - ingredientsListView.getItems().clear(); preparationListView.getItems().clear(); return; } showName(recipe.getName()); - ingredientsListView.getItems().setAll(recipe.getIngredients()); + ingredientListCtrl.refetchFromRecipe(recipe); preparationListView.getItems().setAll(recipe.getPreparationSteps()); } diff --git a/client/src/main/java/client/scenes/recipe/IngredientListCtrl.java b/client/src/main/java/client/scenes/recipe/IngredientListCtrl.java index 74193e6..a772913 100644 --- a/client/src/main/java/client/scenes/recipe/IngredientListCtrl.java +++ b/client/src/main/java/client/scenes/recipe/IngredientListCtrl.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 IngredientListCtrl implements Initializable { * As the ingredient 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,15 +38,15 @@ public class IngredientListCtrl implements Initializable { /** * A callback function that is called when the ingredient list is updated. */ - private Function, Void> updateCallback; + private Consumer> updateCallback; @FXML - ListView ingredientListView; + public ListView ingredientListView; @FXML - Button addIngredientButton; + public Button addIngredientButton; @FXML - Button deleteIngredientButton; + public Button deleteIngredientButton; /** * Set the recipe and refetch data from it. @@ -59,6 +59,7 @@ public class IngredientListCtrl implements Initializable { if (recipe == null) { this.ingredients = FXCollections.observableArrayList(new ArrayList<>()); } else { + System.out.println("refetched"); List ingredientList = recipe.getIngredients(); this.ingredients = FXCollections.observableArrayList(ingredientList); } @@ -72,7 +73,7 @@ public class IngredientListCtrl 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 +92,7 @@ public class IngredientListCtrl implements Initializable { private void handleIngredientAdd(ActionEvent event) { this.ingredients.add("Ingredient " + (this.ingredients.size() + 1)); this.refresh(); - this.updateCallback.apply(this.ingredients); + this.updateCallback.accept(this.ingredients); var select = this.ingredientListView.getSelectionModel(); select.select(this.ingredients.size() - 1); @@ -108,7 +109,7 @@ public class IngredientListCtrl implements Initializable { this.ingredients.set(index, newValue); this.refresh(); - this.updateCallback.apply(this.ingredients); + this.updateCallback.accept(this.ingredients); } /** @@ -126,7 +127,7 @@ public class IngredientListCtrl implements Initializable { this.ingredients.remove(selectedIndex); this.refresh(); - this.updateCallback.apply(this.ingredients); + this.updateCallback.accept(this.ingredients); } @FXML @@ -134,7 +135,6 @@ public class IngredientListCtrl implements Initializable { // TODO: set up communication with the server // this would probably be best done with the callback (so this class doesn't // interact with the server at all) - this.ingredientListView.setEditable(true); this.ingredientListView.setCellFactory( list -> { diff --git a/client/src/main/resources/client/scenes/FoodpalApplication.fxml b/client/src/main/resources/client/scenes/FoodpalApplication.fxml index 9599c90..8fe9bc9 100644 --- a/client/src/main/resources/client/scenes/FoodpalApplication.fxml +++ b/client/src/main/resources/client/scenes/FoodpalApplication.fxml @@ -116,15 +116,7 @@ - - - -