package mi.hdm.controllers; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import mi.hdm.components.IngredientLabel; import mi.hdm.recipes.Ingredient; import mi.hdm.recipes.IngredientManager; import mi.hdm.recipes.Recipe; import mi.hdm.recipes.RecipeManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class RecipeViewController extends BaseController { private static final Logger log = LogManager.getLogger(RecipeViewController.class); private final Recipe recipe; private final RecipeManager recipeManager; private final IngredientManager ingredientManager; @FXML private AnchorPane parent; @FXML private Label recipeName; @FXML private Label recipeDescription; @FXML private Label recipePreparation; @FXML private VBox ingredientVBox; @FXML private ImageView recipeImage; public RecipeViewController(Recipe recipe, RecipeManager recipeManager, IngredientManager ingredientManager) { this.recipe = recipe; this.recipeManager = recipeManager; this.ingredientManager = ingredientManager; } @FXML public void changeSceneToMain() { try { changeScene(View.MAIN); } catch (Exception e) { e.printStackTrace(); log.error("Something went wrong when changing the scene."); } } @FXML public void initialize() { loadHeader(parent); recipeName.setText(recipe.getName()); recipeDescription.setText(recipe.getDescription()); recipePreparation.setText(String.join("\n", recipe.getPreparation())); recipe.getIngredients().forEach((code, amount) -> { Ingredient i = ingredientManager.getIngredient(code).orElseThrow(); IngredientLabel ingredientLabel = new IngredientLabel(amount, i); ingredientVBox.getChildren().add(ingredientLabel); log.debug("Added ingredient label with the following values: {}, {}, {}", i.getName(), amount, i.getMeasurement()); }); //idea for solution from: https://stackoverflow.com/questions/22710053/how-can-i-show-an-image-using-the-imageview-component-in-javafx-and-fxml log.debug("Trying to load image for recipe from '{}'", recipe.getImageURL()); Image image = new Image(recipe.getImageURL().toString()); recipeImage.setImage(image); recipeImage.setPreserveRatio(true); } @FXML public void handleEditRecipe() { log.info("User is trying to edit recipe"); changeScene(View.RECIPE_CREATOR); } @FXML public void handleDeleteRecipe() { log.info("User is trying to delete recipe"); recipeManager.deleteRecipe(recipe); changeSceneToMain(); } }