From 7e5137b317968f11a6196035532c54a16961fa1e Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 18 Jan 2026 18:19:11 +0100 Subject: [PATCH] feat(client/kcal): ui logic for kcal eval --- .../client/scenes/nutrition/NutritionDetailsCtrl.java | 2 +- .../java/client/scenes/recipe/RecipeDetailCtrl.java | 9 +++++++-- .../java/client/scenes/recipe/ScalableRecipeView.java | 10 ++++++++++ .../client/scenes/recipe/RecipeDetailView.fxml | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/client/src/main/java/client/scenes/nutrition/NutritionDetailsCtrl.java b/client/src/main/java/client/scenes/nutrition/NutritionDetailsCtrl.java index c7c968f..d8351f3 100644 --- a/client/src/main/java/client/scenes/nutrition/NutritionDetailsCtrl.java +++ b/client/src/main/java/client/scenes/nutrition/NutritionDetailsCtrl.java @@ -66,7 +66,7 @@ public class NutritionDetailsCtrl implements LocaleAware { this.proteinInputElement.textProperty().bindBidirectional(vm.proteinProperty(), new NumberStringConverter()); this.carbInputElement.textProperty().bindBidirectional(vm.carbsProperty(), new NumberStringConverter()); this.estimatedKcalLabel.textProperty().bind(Bindings.createStringBinding( - () -> String.format("Estimated energy value: %.1f", vm.getKcal()), vm.kcalProperty() + () -> String.format("Estimated energy value: %.1f kcal/100g", vm.getKcal()), vm.kcalProperty() )); }); this.nutritionValueContainer.addEventHandler(KeyEvent.KEY_RELEASED, event -> { diff --git a/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java b/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java index d072669..5c46720 100644 --- a/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java +++ b/client/src/main/java/client/scenes/recipe/RecipeDetailCtrl.java @@ -18,6 +18,8 @@ import java.nio.file.Path; import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Consumer; + +import javafx.beans.binding.Bindings; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; @@ -46,6 +48,7 @@ public class RecipeDetailCtrl implements LocaleAware { private final WebSocketDataService webSocketDataService; public Spinner scaleSpinner; + public Label inferredKcalLabel; @FXML private IngredientListCtrl ingredientListController; @@ -156,10 +159,12 @@ public class RecipeDetailCtrl implements LocaleAware { // Prevents issues from first startup if (scaleSpinner.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); - + // TODO i18n + inferredKcalLabel.textProperty().bind(Bindings.createStringBinding(() -> + String.format("Inferred %.1f kcal/100g for this recipe", this.recipeView.scaledKcalProperty().get()) + , this.recipeView.scaledKcalProperty())); // expose the scaled view to list controllers this.ingredientListController.refetchFromRecipe(this.recipeView.getScaled()); this.stepListController.refetchFromRecipe(this.recipeView.getScaled()); diff --git a/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java b/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java index db5de91..aa80a97 100644 --- a/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java +++ b/client/src/main/java/client/scenes/recipe/ScalableRecipeView.java @@ -12,6 +12,7 @@ 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(); public ScalableRecipeView( Recipe recipe, Double scale @@ -22,6 +23,7 @@ public class ScalableRecipeView { () -> Recipe.getScaled(this.recipe.get(), this.scale.get()), this.recipe, this.scale); this.scaled.bind(binding); + this.scaledKcal.bind(Bindings.createDoubleBinding(() -> this.scaled.get().kcal(), this.scaled)); } public double getScale() { @@ -36,6 +38,10 @@ public class ScalableRecipeView { return scaled.get(); } + public double getScaledKcal() { + return scaledKcal.get(); + } + public DoubleProperty scaleProperty() { return scale; } @@ -47,4 +53,8 @@ public class ScalableRecipeView { public ObjectProperty recipeProperty() { return recipe; } + + public SimpleDoubleProperty scaledKcalProperty() { + return scaledKcal; + } } diff --git a/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml b/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml index 127274c..0ebb01b 100644 --- a/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml +++ b/client/src/main/resources/client/scenes/recipe/RecipeDetailView.fxml @@ -37,4 +37,5 @@ +