diff --git a/src/main/java/mi/hdm/GuiController.java b/src/main/java/mi/hdm/GuiController.java index 45144fa75c0fb36aef454fb686fb99463fd222fc..71ad1f0a5dd0a1061cef8acb9894f235b3af1652 100644 --- a/src/main/java/mi/hdm/GuiController.java +++ b/src/main/java/mi/hdm/GuiController.java @@ -26,10 +26,12 @@ public class GuiController extends Application { e.printStackTrace(); System.exit(1); } + model.createRecipe(); launch(args); log.info("Shutting down application"); log.info("Saving all data"); - FileManager.serializeToFile(model); + //TODO: wieder einkommentieren + //FileManager.serializeToFile(model); } @Override diff --git a/src/main/java/mi/hdm/TastyPages.java b/src/main/java/mi/hdm/TastyPages.java index ea65bde8ab36b87b3674fb189c86ce13ea28ef7e..77f70921dfcc454e07cfa7f655c29dfc4d877ba8 100644 --- a/src/main/java/mi/hdm/TastyPages.java +++ b/src/main/java/mi/hdm/TastyPages.java @@ -1,13 +1,14 @@ package mi.hdm; import mi.hdm.mealPlan.MealPlan; -import mi.hdm.recipes.CategoryManager; -import mi.hdm.recipes.IngredientManager; -import mi.hdm.recipes.RecipeManager; +import mi.hdm.recipes.*; import mi.hdm.shoppingList.ShoppingList; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.List; +import java.util.Map; + /** * This class contains all the services in the application: recipe manager, ingredient manager, shopping list, * category manager and meal plan. @@ -73,4 +74,15 @@ public class TastyPages { public MealPlan getMealPlan() { return mealPlan; } + + public void createRecipe() { + //TODO: write correct default recipe for demo (create it in app and save it from there -> no need to search ingredient keys) + String name = "Something"; + Map<RecipeComponent, Integer> ingredients = Map.of(ingredientManager.getIngredient("i-1005353693").get(), 5); + String description = "10-Minuten-Rezept"; + List<String> preparation = List.of("Put it in a pan and heat it."); + List<Category> categories = List.of(); + Recipe recipe1 = new Recipe(name, ingredients, description, preparation, categories, 10); + recipeManager.addRecipe(recipe1); + } } diff --git a/src/main/java/mi/hdm/controllers/RecipeViewController.java b/src/main/java/mi/hdm/controllers/RecipeViewController.java index edeb67807f02e13e057be9c9543e7c7427a094f6..7a578e9f375f21107e9a7844da985d2affeb6cc7 100644 --- a/src/main/java/mi/hdm/controllers/RecipeViewController.java +++ b/src/main/java/mi/hdm/controllers/RecipeViewController.java @@ -1,25 +1,34 @@ 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.TilePane; +import mi.hdm.recipes.Recipe; import mi.hdm.recipes.RecipeManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.File; + public class RecipeViewController extends BaseController { private static final Logger log = LogManager.getLogger(RecipeViewController.class); - private final RecipeManager recipeManager; - - //TODO: Change TilePane to something else because there is no TilePane in the fxml file anymore - @FXML - private TilePane recipeTilePane; + private final Recipe recipe; @FXML private AnchorPane parent; + @FXML + private Label recipeDescription; + @FXML + private Label recipeName; + @FXML + private ImageView recipeImage; + + - public RecipeViewController(RecipeManager recipeManager) { - this.recipeManager = recipeManager; + public RecipeViewController(Recipe recipe) { + this.recipe = recipe; } @FXML @@ -35,6 +44,12 @@ public class RecipeViewController extends BaseController { @FXML public void initialize() { loadHeader(parent); - log.debug("Added {} recipes to GUI", recipeManager.getRecipes().size()); + + recipeName.setText(recipe.getName()); + recipeDescription.setText(recipe.getDescription()); + + //idea for solution from: https://stackoverflow.com/questions/22710053/how-can-i-show-an-image-using-the-imageview-component-in-javafx-and-fxml + Image image = new Image(recipe.getImage()); + recipeImage.setImage(image); } } diff --git a/src/main/java/mi/hdm/controllers/View.java b/src/main/java/mi/hdm/controllers/View.java index 20e12dd873c1fc520c4d58fa85ad1e2425fe0b32..2d20662d6a355a3960a4ea7bb3a29eb666993fed 100644 --- a/src/main/java/mi/hdm/controllers/View.java +++ b/src/main/java/mi/hdm/controllers/View.java @@ -4,10 +4,12 @@ import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import mi.hdm.GuiController; import mi.hdm.TastyPages; +import mi.hdm.recipes.Recipe; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; +import java.security.InvalidParameterException; public enum View { MAIN("/fxml/Tasty_Pages_Main_Page.fxml", "Tasty Pages"), @@ -25,7 +27,7 @@ public enum View { this.windowTitle = windowTitle; } - public Parent getScene() throws IOException { + public Parent getScene(Object... args) throws IOException { log.info("Loading FXML for '{}' view from: {}", windowTitle, path); final FXMLLoader loader = new FXMLLoader(getClass().getResource(path)); log.debug("Successfully retrieved resource from {}", path); @@ -37,8 +39,15 @@ public enum View { new MainPageController(model.getRecipeManager(), model.getIngredientManager(), model.getCategoryManager()) ); - case RECIPE_VIEW -> loader.setControllerFactory((callback) -> - new RecipeViewController(model.getRecipeManager()) + case RECIPE_VIEW -> loader.setControllerFactory((callback) -> { + if (args== null && args.length == 1 && args[0] instanceof Recipe recipe) { + return new RecipeViewController(recipe); + } else { + throw new InvalidParameterException(); + } + } + + ); case SHOPPINGLIST_VIEW -> loader.setControllerFactory((callback) -> diff --git a/src/main/java/mi/hdm/filesystem/FileManager.java b/src/main/java/mi/hdm/filesystem/FileManager.java index 1ffffe9ad3508907f3b37aa49d3d27df2831694e..1f9b9cb79e175eff9fe4ec2e8878a696f13ca202 100644 --- a/src/main/java/mi/hdm/filesystem/FileManager.java +++ b/src/main/java/mi/hdm/filesystem/FileManager.java @@ -53,7 +53,7 @@ public class FileManager { Path userPath = Path.of(PATH_TO_USER_DATA); if (userPath.toFile().mkdirs()) { //If .mkdirs() returns true, that means the folder has not existed before -> in this case, only load default ingredients! log.info("TastyPages folder has been created at {}", userPath); - IngredientManager deserializedIngredientManager = deserializeIngredientManager(getAbsolutePathFromResourceFolder()); + IngredientManager deserializedIngredientManager = deserializeIngredientManager(getAbsolutePathFromResourceFolder(FileManager.PATH_TO_DEFAULT_INGREDIENTS)); return new TastyPages(deserializedIngredientManager); } else { //otherwise, read user data log.info("Found TastyPages folder at {}, loading user data from there.", userPath); @@ -71,7 +71,7 @@ public class FileManager { ingredientManager = deserializeIngredientManager(toIngredients.toString()); } else { log.info("Could not find /ingredients.csv, falling back to default ingredients."); - ingredientManager = deserializeIngredientManager(getAbsolutePathFromResourceFolder()); + ingredientManager = deserializeIngredientManager(getAbsolutePathFromResourceFolder(FileManager.PATH_TO_DEFAULT_INGREDIENTS)); } } //Deserialize recipe manager @@ -303,10 +303,15 @@ public class FileManager { return gson.fromJson(json, Recipe.class); } - private static String getAbsolutePathFromResourceFolder() throws URISyntaxException { - URL resourceUrl = FileManager.class.getResource(FileManager.PATH_TO_DEFAULT_INGREDIENTS); - assert resourceUrl != null; - Path path = Paths.get(resourceUrl.toURI()); - return path.toFile().getAbsolutePath(); + public static String getAbsolutePathFromResourceFolder(String p) { + try { + URL resourceUrl = FileManager.class.getResource(p); + assert resourceUrl != null; + Path path = Paths.get(resourceUrl.toURI()); + return path.toFile().getAbsolutePath(); + } catch (URISyntaxException e) { + log.error("Absolute path for \"{}\" not found", p); + return null; + } } } diff --git a/src/main/java/mi/hdm/recipes/Recipe.java b/src/main/java/mi/hdm/recipes/Recipe.java index ad776536462635d0679eb9cc6bd937e74af93119..64a7e4ced5c485dc92b6ab1ccb7e621afca9a9d8 100644 --- a/src/main/java/mi/hdm/recipes/Recipe.java +++ b/src/main/java/mi/hdm/recipes/Recipe.java @@ -1,6 +1,7 @@ package mi.hdm.recipes; import mi.hdm.exceptions.InvalidRecipeException; +import mi.hdm.filesystem.FileManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -75,6 +76,8 @@ public class Recipe implements RecipeComponent { this.creationTime = LocalDateTime.now(); this.code = calculateUniqueCode(); + + filepathForImage = FileManager.getAbsolutePathFromResourceFolder("/images/dish-fork-and-knife.png"); } public Recipe( @@ -98,7 +101,7 @@ public class Recipe implements RecipeComponent { this.creationTime = creationTime; this.code = code; //TODO: fix filepath - filepathForImage = "C:\\Users\\Lara Blersch\\Documents\\Studium\\SE2\\tasty-pages\\src\\main\\resources\\images\\dish-fork-and-knife.png"; //path to default image which can be changed by the user later + filepathForImage = FileManager.getAbsolutePathFromResourceFolder("/images/dish-fork-and-knife.png"); } public void setName(String name) { @@ -226,6 +229,10 @@ public class Recipe implements RecipeComponent { filepathForImage = path; } + public String getImage() { + return filepathForImage; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/resources/fxml/recipe-view.fxml b/src/main/resources/fxml/recipe-view.fxml index 010f473d5493bb5e43a7601892c76af4af808487..6f53fca67379c868be8656c8e1b4dccf4544d509 100644 --- a/src/main/resources/fxml/recipe-view.fxml +++ b/src/main/resources/fxml/recipe-view.fxml @@ -92,7 +92,7 @@ <children> <Pane prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: transparent; -fx-border-color: d91c1c; -fx-border-radius: 10; -fx-border-width: 4;"> <children> - <ImageView fitHeight="200.0" fitWidth="338.0" pickOnBounds="true" preserveRatio="true" /> + <ImageView fx:id="recipeImage" fitHeight="200.0" fitWidth="338.0" pickOnBounds="true" preserveRatio="true" /> </children> <VBox.margin> <Insets bottom="10.0" />