diff --git a/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java b/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java index cdf5724..f1eeb5d 100644 --- a/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java +++ b/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java @@ -49,6 +49,8 @@ public class RecipeDetailCtrl implements LocaleAware { public Spinner scaleSpinner; public Label inferredKcalLabel; + public Spinner servingsSpinner; + public Label inferredServeSizeLabel; @FXML private IngredientListCtrl ingredientListController; @@ -157,7 +159,7 @@ public class RecipeDetailCtrl implements LocaleAware { // If there is a scale // Prevents issues from first startup - if (scaleSpinner.getValue() != null) { + if (scaleSpinner.getValue() != null && servingsSpinner.getValue() != null) { Double scale = scaleSpinner.getValue(); // see impl. creates a scaled context for the recipe such that its non-scaled value is kept as a reference. this.recipeView = new ScalableRecipeView(recipe, scale); @@ -167,6 +169,10 @@ public class RecipeDetailCtrl implements LocaleAware { Double.isNaN(this.recipeView.scaledKcalProperty().get()) ? 0.0 : this.recipeView.scaledKcalProperty().get()) , this.recipeView.scaledKcalProperty())); + recipeView.servingsProperty().set(servingsSpinner.getValue()); + inferredServeSizeLabel.textProperty().bind(Bindings.createStringBinding( + () -> String.format("Inferred size per serving: %.1f g", recipeView.servingSizeProperty().get()), + recipeView.servingSizeProperty())); // expose the scaled view to list controllers this.ingredientListController.refetchFromRecipe(this.recipeView.getScaled()); this.stepListController.refetchFromRecipe(this.recipeView.getScaled()); @@ -402,6 +408,14 @@ public class RecipeDetailCtrl implements LocaleAware { // triggers a UI update each time the spinner changes to a different value. setCurrentlyViewedRecipe(recipe); }); + servingsSpinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(1, Integer.MAX_VALUE, 1)); + servingsSpinner.setEditable(true); + servingsSpinner.valueProperty().addListener((observable, oldValue, newValue) -> { + if (newValue == null) { + return; + } + setCurrentlyViewedRecipe(recipe); + }); langSelector.getItems().addAll("en", "nl", "pl", "tok"); } } diff --git a/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java b/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java index aa80a97..e9192ab 100644 --- a/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java +++ b/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java @@ -4,15 +4,19 @@ import commons.Recipe; import javafx.beans.binding.Bindings; import javafx.beans.binding.ObjectBinding; import javafx.beans.property.DoubleProperty; +import javafx.beans.property.IntegerProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; public class ScalableRecipeView { private final ObjectProperty recipe = new SimpleObjectProperty<>(); private final ObjectProperty scaled = new SimpleObjectProperty<>(); private final DoubleProperty scale = new SimpleDoubleProperty(); - private final SimpleDoubleProperty scaledKcal = new SimpleDoubleProperty(); + private final DoubleProperty scaledKcal = new SimpleDoubleProperty(); + private final IntegerProperty servings = new SimpleIntegerProperty(); + private final DoubleProperty servingSize = new SimpleDoubleProperty(); public ScalableRecipeView( Recipe recipe, Double scale @@ -24,10 +28,10 @@ public class ScalableRecipeView { this.recipe, this.scale); this.scaled.bind(binding); this.scaledKcal.bind(Bindings.createDoubleBinding(() -> this.scaled.get().kcal(), this.scaled)); - } - - public double getScale() { - return scale.get(); + this.servingSize.bind(Bindings.createDoubleBinding( + () -> this.scaled.get().weight() * ( 1.0 / this.servings.get()), + this.servings) + ); } public Recipe getRecipe() { @@ -38,23 +42,14 @@ public class ScalableRecipeView { return scaled.get(); } - public double getScaledKcal() { - return scaledKcal.get(); - } - - public DoubleProperty scaleProperty() { - return scale; - } - - public ObjectProperty scaledProperty() { - return scaled; - } - - public ObjectProperty recipeProperty() { - return recipe; - } - - public SimpleDoubleProperty scaledKcalProperty() { + public DoubleProperty scaledKcalProperty() { return scaledKcal; } + + public IntegerProperty servingsProperty() { + return servings; + } + public DoubleProperty servingSizeProperty() { + return servingSize; + } } diff --git a/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml b/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml index 0ebb01b..28ba793 100644 --- a/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml +++ b/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml @@ -25,11 +25,15 @@