Skip to content
Snippets Groups Projects
RecipeViewController.java 4 KiB
Newer Older
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import mi.hdm.components.CategoryPreviewLabel;
import mi.hdm.components.IngredientLabel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.net.URL;
import java.util.stream.IntStream;

//TODO: display nutrition table in here (using "fxml/components/nutrition-table.fxml", see ViewComponent and MealPlan)
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;
    private final CategoryManager categoryManager;
    @FXML
    private Label recipeName;
    @FXML
    private Label recipeDescription;
    @FXML
    private Label recipePreparation;
    @FXML
    private VBox ingredientVBox;
    private ImageView recipeImage;
    public RecipeViewController(Recipe recipe, RecipeManager recipeManager, IngredientManager ingredientManager, CategoryManager categoryManager) {
        this.ingredientManager = ingredientManager;
        this.categoryManager = categoryManager;

        recipeName.setText(recipe.getName());
        recipeDescription.setText(recipe.getDescription());
        String preparation = IntStream.range(0, recipe.getPreparation().size())
                .mapToObj(idx -> String.format("%d. %s%n", idx + 1, recipe.getPreparation().get(idx)))
                .reduce("", String::concat);
        recipePreparation.setText(preparation);

        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());
        categoryManager.getCategoriesFromKeys(recipe.getCategoryCodes()).forEach(category -> {
            CategoryPreviewLabel label = new CategoryPreviewLabel(category);
            categoryHBox.getChildren().add(label);
        });

        //idea for solution from: https://stackoverflow.com/questions/22710053/how-can-i-show-an-image-using-the-imageview-component-in-javafx-and-fxml
        URL imageURL = recipe.getImageURL();
        if (imageURL != null) {
            log.debug("Trying to load image for recipe from '{}'", imageURL);
            recipeImage.setImage(new Image(imageURL.toString()));
            recipeImage.setPreserveRatio(true);
        } else {
            recipeImage.setImage(new Image(Recipe.class.getResource("/images/dish-fork-and-knife.png").toString()));
        }
Blersch Lara's avatar
Blersch Lara committed
        recipeImage.setFitHeight(180);
        putNutritionTable(nutritionTableContainer, recipe.getNutritionTable(), "Nutrition score for this recipe", 1);
    @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 handleEditRecipe() {
        log.info("User is trying to edit recipe");
        changeScene(View.RECIPE_EDITOR, recipe);
    @FXML
    public void handleDeleteRecipe() {
        log.info("User is trying to delete recipe");
        recipeManager.deleteRecipe(recipe);
        changeSceneToMain();
    }