From dfca9bf2ed1252b2f32efdb99d5d4a688db9ef78 Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Tue, 25 Nov 2025 23:19:56 -0500 Subject: [PATCH 01/11] Updated project name --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f5867b4..f764fd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "Meal Picker" +name = "NoteNook" version = "0.1.0" description = "An app designed to build, store, and select meals for shopping purposes." readme = "README.md" @@ -18,7 +18,7 @@ org = "codes.kalar" # project display name that is used as an app title on Android and iOS home screens, # shown in window titles and about app dialogs on desktop. -product = "Meal Picker" +product = "NoteNook" # company name to display in about app dialogs company = "Nick Kalar" From b137fcb0f95c26f9937503762f0c6cc1461c0ed3 Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Tue, 25 Nov 2025 23:20:25 -0500 Subject: [PATCH 02/11] minor filepath changes --- src/FileHandler.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/FileHandler.py b/src/FileHandler.py index 6a617af..2e83bd3 100644 --- a/src/FileHandler.py +++ b/src/FileHandler.py @@ -5,11 +5,13 @@ from dotenv import load_dotenv load_dotenv() -file_path = os.getenv("FILE_PATH") + "/checklist.md" if os.getenv("FILE_PATH") else "./checklist.md" +checklist_file_path = os.getenv("FILE_PATH") + "/checklist.md" if os.getenv("FILE_PATH") else "./checklist.md" + +ingredients_file_path = "./src/json/ingredients.json" def read_json() -> dict: try: - with open("./src/json/ingredients.json", "rt") as file: + with open(ingredients_file_path, "rt") as file: return json.load(file) except: print("Could not find or read file.") @@ -17,7 +19,7 @@ def read_json() -> dict: def update_json(meals: dict) -> None: try: - with open("./src/json/ingredients.json", "w") as file: + with open(ingredients_file_path, "w") as file: json.dump(meals, file, indent=4) except Exception as e: print(f"Unable to write data to file. {e}") @@ -44,7 +46,7 @@ def combine_ingredients(meals: dict) -> dict: def write_checklist(data: dict) -> None: try: - with open(file_path, 'w') as checklist: + with open(checklist_file_path, 'w') as checklist: for ingredient, details in data.items(): s = ingredient + " - " + str(details['quantity']) if details['units'] != None: From ff32de4ac02694f0236c238c322a74ebc7ac9d6b Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Tue, 25 Nov 2025 23:20:46 -0500 Subject: [PATCH 03/11] formatting changes --- src/main.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main.py b/src/main.py index 0427407..068aaaa 100644 --- a/src/main.py +++ b/src/main.py @@ -5,12 +5,14 @@ from models.MenuBar import create_menubar def main(page: ft.Page): + page.window.width = 750 + page.window.height = 900 + page.window.top = 10 page.appbar = create_menubar(page, selector, builder) + page.bgcolor = '#013328' - page.add(ft.Pagelet( - content = ft.Text("Welcome to Meal Picker! Please select an option from the menu above to get started.") - ) - ) + page.add(ft.Pagelet(content=ft.Text())) + selector(page) if __name__ == "__main__": ft.app(main) \ No newline at end of file From 8e9d57c5cb9e1c56b624555d0d25846fc6fe4214 Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Tue, 25 Nov 2025 23:20:57 -0500 Subject: [PATCH 04/11] formatting changes --- src/models/MenuBar.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/models/MenuBar.py b/src/models/MenuBar.py index 1b0c780..1c1d5ea 100644 --- a/src/models/MenuBar.py +++ b/src/models/MenuBar.py @@ -2,15 +2,17 @@ import flet as ft def create_menubar(page: ft.Page, selector, builder): menu = ft.AppBar( - title=ft.Text("Meal Picker"), - bgcolor=ft.Colors.GREEN_700, + title=ft.Text("NoteNook"), + bgcolor='#CC8B65', center_title=False, actions=[ ft.PopupMenuButton( items=[ ft.PopupMenuItem(text="Meal Selector", on_click=lambda e: selector(page)), ft.PopupMenuItem(text="Meal Builder", on_click=lambda e: builder(page)), - ] + ], + icon = ft.Icons.FASTFOOD_OUTLINED, + icon_color = '#E3DCD2' ) ] ) From 3f10d8049a099edc01d673d4d71ceb0fed904b3d Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Tue, 25 Nov 2025 23:21:11 -0500 Subject: [PATCH 05/11] hamburger --- src/assets/hamburger.png | Bin 0 -> 1149 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/assets/hamburger.png diff --git a/src/assets/hamburger.png b/src/assets/hamburger.png new file mode 100644 index 0000000000000000000000000000000000000000..b21f892da332d690d27f92e68d277b6391f5f32f GIT binary patch literal 1149 zcmV-@1cLjCP)D5D@GLZXnUtnh|pVaf8D5sSA<7AA-xabGq3#`LuSeJ8d>++gi@jyyx zJRZVSYz#xSwlhGDi#7(^aTk{7&J5(757}@umd1h$(XWwy%;|yi@d@6?-**);s!U^s0c~h3gstcoeT9#pF>TZ;2xqQ#DXGH=#B7hcT!w zFt5Ojh>3pf0HAjuoEYB|q92I+D|)S19Q?8f%nNWs2cV{5Rt-SN)?ijg04~MaN(3*c zTWlb1uaotu?7rseGchgro;adz&OE%-5rD;btdl!FrqOsM>W4NMpNO{FcQq9siwzo3 z&Ut;K@zB}PiAozo>hT!9r(xA?a9475kV&Z6Qt+{0^enS2a+X*@6a&_>o z5(Ce4=hlOoumVTnyo5LKX3qKEnnp?~<#0_`DWz1)`>S)#TT)6r6wi*udpYOL72Re$ zkFViJ+@$1zbMT0A9N%C$u2*vVQhcb~#?$iW*Gj! z*hAdi3HU%MC{r*gfIN;l7#VsuhFjac8v@)UEC|3)pl4NKNw{maQq4|P3epgzE;M02 zehx47uQM<*JabkxQ(~x6h|a);cruP=*nvzK=vFC7;vMCw)fUET*Jd}i1p16`F}+f3 z-U^*Bm0;Wxdi#|cvk7bQX&l9foO20^l+vge9GY|9sX`IW1C&}Yu)?3H1mAk}jTm`A zc_Z$q^t*D-f7Y$J0$=5v7u7Q1Z%Pn0tD~Ir{#dA8icKj!i|Mh;l{x3#^*V>3-b!Hq z{VGl=y@tv7sEdpITN!%3FSJHyUqMlHQbd0779Be#JH2V0<(_#*(VM-LF|n>1-uSZNn={PS|r8XMVhr zre`YG^ue6-z616;DtalUKFZI?WSpX8w0}ccNlYK$x!l2vs!Kno-AR7|Tem)*6;7O4 P00000NkvXXu0mjfXge6c literal 0 HcmV?d00001 From 290bed819878025e59b0b60836d465960a448698 Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Wed, 26 Nov 2025 23:18:48 -0500 Subject: [PATCH 06/11] formatting adjustments --- src/MealSelector.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/MealSelector.py b/src/MealSelector.py index 75ab051..569e730 100644 --- a/src/MealSelector.py +++ b/src/MealSelector.py @@ -13,14 +13,22 @@ def selector(page: ft.Page): selected_meals.pop(meal.label) else: selected_meals[meal.label] = meal_json[meal.label] - print(selected_meals) + if selected_meals == {}: + page.open(ft.SnackBar(ft.Text("Please select at least one meal."))) + return + write_checklist(combine_ingredients(selected_meals)) page.title = "Select Some Meals" meal_list = [] for name, _ in meal_json.items(): - meal_list.append(ft.Checkbox(label=name)) + meal_list.append(ft.Checkbox( + label = name, + active_color = '#6da0cd', + + ) + ) submit_button = ft.ElevatedButton(text="Make Shopping List", on_click=update_meal_selection) @@ -34,7 +42,7 @@ def selector(page: ft.Page): ), submit_button, ], - height = 500, + height = 700, expand = False, ) page.update() From c7faed05972d0a6d18b15c34cda0513c7752f01e Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Wed, 26 Nov 2025 23:19:29 -0500 Subject: [PATCH 07/11] formatting and snackbar --- src/MealBuilder.py | 77 +++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/src/MealBuilder.py b/src/MealBuilder.py index 73c781b..baaaf74 100644 --- a/src/MealBuilder.py +++ b/src/MealBuilder.py @@ -45,16 +45,16 @@ def builder(page): def create_ingredient_row(self, ingredient, details): row = [] - row.append(ft.TextField(label="Ingredient", value=ingredient, on_change=self.update_ingredient)) - row.append(ft.TextField(label="Quantity", value=details['quantity'], on_change=self.update_quantity)) - row.append(ft.TextField(label="Units (optional)", value=details['units'], on_change=self.update_units)) + row.append(ft.TextField(label="Ingredient", value=ingredient, on_change=self.update_ingredient, width=300)) + row.append(ft.TextField(label="Quantity", value=details['quantity'], on_change=self.update_quantity, width=200)) + row.append(ft.TextField(label="Units (optional)", value=details['units'], on_change=self.update_units, width=200)) return row def create_new_ingredient_row(self): row = [] - row.append(ft.TextField(label="Ingredient", value="")) - row.append(ft.TextField(label="Quantity", value="")) - row.append(ft.TextField(label="Units (optional)", value="")) + row.append(ft.TextField(label="Ingredient", value="", width=300)) + row.append(ft.TextField(label="Quantity", value="", width=200)) + row.append(ft.TextField(label="Units (optional)", value="", width=200)) return row def update_ingredients(self, name): @@ -78,26 +78,32 @@ def builder(page): def show_new_meal(self): self.new_meal = {} selector_body.controls = [ - ft.TextField(label="Meal", value="", autofocus=True), + ft.TextField(label="Meal", value="", autofocus=True, width=720), ft.ListView(controls=[ft.Row(self.create_new_ingredient_row(), - alignment=ft.MainAxisAlignment.SPACE_EVENLY, - width=300, - height=100, + alignment=ft.MainAxisAlignment.START, )], expand=True, - spacing=5, - padding=5, auto_scroll=False, ), - ft.ElevatedButton(text="Add Ingredient", on_click=lambda e: self.append_new_ingredient_row(selector_body)), - ft.ElevatedButton(text="Add Meal", on_click=lambda e: self.add_new_meal(selector_body)), - ft.ElevatedButton(text="Back", on_click=lambda e: self.show_meal_selection(selector_body, page)) + ft.Row(controls=[ + ft.ElevatedButton(text="Add Ingredient", on_click=lambda e: self.append_new_ingredient_row(selector_body)), + ft.ElevatedButton(text="Add Meal", on_click=lambda e: self.add_new_meal(selector_body)), + ft.ElevatedButton(text="Back", on_click=lambda e: self.show_meal_selection(selector_body, page)) + ] + ) + ] page.title = "Add New Meal" page.update() def append_new_ingredient_row(self, selector_body): + # Don't add a new row if the last one is blank + if selector_body.controls[1].controls[-1].controls[0].value == "" or \ + selector_body.controls[1].controls[-1].controls[1].value == "": + page.open(ft.SnackBar(ft.Text("Please fill in the current ingredient before adding a new one."))) + return + selector_body.controls[1].controls.append(ft.Row(self.create_new_ingredient_row(), alignment=ft.MainAxisAlignment.SPACE_EVENLY, width=300, @@ -108,6 +114,12 @@ def builder(page): def add_new_meal(self, selector_body): meal = selector_body.controls[0].value ing, qua, uni = [], [], [] + + if meal == "" or \ + selector_body.controls[1].controls.controls[0].value == "" or \ + selector_body.controls[1].controls.controls[1].value == "": + page.open(ft.SnackBar(ft.Text("Please fill out the meal information."))) + return for row in selector_body.controls[1].controls: #skip blank row @@ -127,6 +139,10 @@ def builder(page): def show_meal_details(self, selector_body, page): expanded_meal = [] + + if (selector_body.controls[0].controls[0].value == None): + page.open(ft.SnackBar(ft.Text("Please select a meal to update."))) + return meal_name = selector_body.controls[0].controls[0].value @@ -134,8 +150,6 @@ def builder(page): expanded_meal.append( ft.Row(self.create_ingredient_row(details[0], details[1]), alignment=ft.MainAxisAlignment.SPACE_EVENLY, - width=300, - height=100, ) ) @@ -144,13 +158,16 @@ def builder(page): ft.ListView( controls=expanded_meal, expand=True, - spacing=5, - padding=5, + spacing=10, + padding=10, auto_scroll=False, ), - ft.ElevatedButton(text="Update Meal", on_click=lambda e: self.update_ingredients(selector_body.controls[0].value)), - ft.ElevatedButton(text="Back", on_click=lambda e: self.show_meal_selection(selector_body, page)), - ] + ft.Row(controls=[ + ft.ElevatedButton(text="Save Changes", on_click=lambda e: self.update_ingredients(selector_body.controls[0].value)), + ft.ElevatedButton(text="Back", on_click=lambda e: self.show_meal_selection(selector_body, page)), + ] + ) + ] if page.title == "Create and Edit Meals!": page.title = f"Editing {meal_name}" page.update() @@ -164,14 +181,18 @@ def builder(page): self.get_meal_radios_group(), ], expand=True, - spacing=5, - padding=5, + spacing=10, + padding=10, auto_scroll=False, ), - ft.ElevatedButton(text="Update Meal", + ft.Row( + controls=[ + ft.ElevatedButton(text="Update Meal", on_click=lambda e: self.show_meal_details(selector_body, page)), - ft.ElevatedButton(text="Add Meal", on_click=lambda e: self.show_new_meal()) - ] + ft.ElevatedButton(text="Add Meal", on_click=lambda e: self.show_new_meal()) + ] + ) + ] if page.title != "Create and Edit Meals!": page.title = f"Create and Edit Meals!" @@ -186,7 +207,7 @@ def builder(page): selector_body = ft.Column( controls = [], - height = 500, + height = 700, expand = False, ) From 4a78a01ae38f08516d083ff4aaa8718f738756fd Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Wed, 17 Dec 2025 23:15:10 -0500 Subject: [PATCH 08/11] Updated Flet version --- .gitignore | 3 ++- pyproject.toml | 5 ++++- requirements.txt | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8e4cdee..bb8d2ae 100644 --- a/.gitignore +++ b/.gitignore @@ -165,4 +165,5 @@ storage/ # Custom ingredients.json checklist.md -.vscode/ \ No newline at end of file +.vscode/ +settings.json \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index f764fd1..e9758c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ authors = [ { name = "Nick Kalar", email = "nick@kalar.codes" } ] dependencies = [ - "flet==0.28.3" + "flet >=0.70.0.dev0", ] [tool.flet] @@ -29,6 +29,9 @@ copyright = "Copyright (C) 2025 by Nick Kalar" [tool.flet.app] path = "src" +[tool.flet.macos] +entitlement."com.apple.security.files.user-selected.read-write" = true + [tool.uv] dev-dependencies = [ "flet[all]==0.28.3", diff --git a/requirements.txt b/requirements.txt index c74be5b..12cfaa5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ python-dotenv -flet[all] \ No newline at end of file +'flet[all]>=0.70.0.dev0' \ No newline at end of file From 28fd5cba5e819fa989375ae6431492f81832fa84 Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Wed, 17 Dec 2025 23:16:29 -0500 Subject: [PATCH 09/11] Updated pathing --- src/FileHandler.py | 47 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/FileHandler.py b/src/FileHandler.py index 2e83bd3..db36fe7 100644 --- a/src/FileHandler.py +++ b/src/FileHandler.py @@ -1,20 +1,38 @@ -import os +from pathlib import Path import json -from dotenv import load_dotenv +working_directory = Path(__file__).parent -load_dotenv() +try: + with open(str(working_directory / "settings.json"), "rt") as settings_file: + settings = json.load(settings_file) + checklist_file_path = settings.get("checklist_storage_path", str(working_directory / "json")) + "/checklists.json" + ingredients_file_path = settings.get("meal_storage_path", str(working_directory / "json")) + "/ingredients.json" +except Exception as e: + print(e) + with open(str(working_directory / "settings.json"), "w") as settings_file: + settings = { + "meal_storage_path": str(working_directory / "json"), + "checklist_storage_path": str(working_directory / "json") + } + json.dump(settings, settings_file, indent=4) + checklist_file_path = settings["checklist_storage_path"] + "/checklists.json" + ingredients_file_path = settings["meal_storage_path"] + "/ingredients.json" -checklist_file_path = os.getenv("FILE_PATH") + "/checklist.md" if os.getenv("FILE_PATH") else "./checklist.md" - -ingredients_file_path = "./src/json/ingredients.json" - -def read_json() -> dict: +def read_ingredient_json() -> dict: try: with open(ingredients_file_path, "rt") as file: return json.load(file) except: - print("Could not find or read file.") + print("Could not find or read ingredients file.") + return {} + +def read_json_file(filename: str) -> dict: + try: + with open(filename, "rt") as file: + return json.load(file) + except: + print(f"Could not find or read file.\n{filename=}") return {} def update_json(meals: dict) -> None: @@ -24,8 +42,15 @@ def update_json(meals: dict) -> None: except Exception as e: print(f"Unable to write data to file. {e}") +def update_file(filename: str, content: dict) -> None: + try: + with open(filename, "w") as file: + json.dump(content, file, indent=4) + except Exception as e: + print(f"Unable to write data to file. {e}") + def get_selected_meals(meals: dict) -> dict: - meal_json = read_json() + meal_json = read_ingredient_json() selected_meals = {} if meal_json: for meal in meals: @@ -57,7 +82,7 @@ def write_checklist(data: dict) -> None: if __name__ == "__main__": - meals = read_json() + meals = read_ingredient_json() if meals: combined_ingredients = combine_ingredients(meals) write_checklist(combined_ingredients) \ No newline at end of file From 249723a2e0eea3ddac50a0565502b21621820370 Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Wed, 17 Dec 2025 23:16:54 -0500 Subject: [PATCH 10/11] Added Settings options --- src/Settings.py | 64 +++++++++++++++++++++++++++++++++++++++++++ src/models/MenuBar.py | 10 +++++-- 2 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/Settings.py diff --git a/src/Settings.py b/src/Settings.py new file mode 100644 index 0000000..cb0e55b --- /dev/null +++ b/src/Settings.py @@ -0,0 +1,64 @@ +import json +import flet as ft +from pathlib import Path +from FileHandler import update_file, read_json_file + +working_directory = Path(__file__).parent / 'settings.json' + +def settings(page): + file_picker = ft.FilePicker() + page.services.append(file_picker) + + def toggle_dark_mode(e): + if dark_mode_switch.value: + page.theme_mode = ft.ThemeMode.DARK + else: + page.theme_mode = ft.ThemeMode.LIGHT + page.update() + + async def set_meal_file_path(e): + meal_directory_path.value = await file_picker.get_directory_path() + if meal_directory_path.value: + settings_data["meal_storage_path"] = meal_directory_path.value + update_file(working_directory, settings_data) + + async def set_checklist_file_path(e): + checklist_directory_path.value = await file_picker.get_directory_path() + if checklist_directory_path.value: + settings_data["checklist_storage_path"] = checklist_directory_path.value + update_file(working_directory, settings_data) + + dark_mode_switch = ft.Switch( + label="Dark Mode", + value=False, + on_change=toggle_dark_mode + ) + + settings_data = read_json_file(working_directory) + + page.title = "Settings" + + page.controls[0].content = ft.Column( + controls=[ + dark_mode_switch, + ft.Row(controls=[ + ft.Button( + "Set Meal Storage Path", + icon=ft.Icons.FOLDER_OPEN, + on_click=set_meal_file_path + ), + meal_directory_path := ft.Text(settings_data.get("meal_storage_path", "Not Set")), + ],), + ft.Row(controls=[ + ft.Button( + "Set Checklist Storage Path", + icon=ft.Icons.FOLDER_OPEN, + on_click=set_checklist_file_path + ), + checklist_directory_path := ft.Text(settings_data.get("checklist_storage_path", "Not Set")), + ]), + ], + height=700, + expand=False, + ) + page.update() \ No newline at end of file diff --git a/src/models/MenuBar.py b/src/models/MenuBar.py index 1c1d5ea..a786c30 100644 --- a/src/models/MenuBar.py +++ b/src/models/MenuBar.py @@ -1,6 +1,9 @@ import flet as ft +from MealBuilder import builder +from MealSelector import selector +from Settings import settings -def create_menubar(page: ft.Page, selector, builder): +def create_menubar(page: ft.Page): menu = ft.AppBar( title=ft.Text("NoteNook"), bgcolor='#CC8B65', @@ -8,8 +11,9 @@ def create_menubar(page: ft.Page, selector, builder): actions=[ ft.PopupMenuButton( items=[ - ft.PopupMenuItem(text="Meal Selector", on_click=lambda e: selector(page)), - ft.PopupMenuItem(text="Meal Builder", on_click=lambda e: builder(page)), + ft.PopupMenuItem(content=ft.Text("Meal Selector"), on_click=lambda e: selector(page)), + ft.PopupMenuItem(content=ft.Text("Meal Builder"), on_click=lambda e: builder(page)), + ft.PopupMenuItem(content=ft.Text("Settings"), on_click=lambda e: settings(page)), ], icon = ft.Icons.FASTFOOD_OUTLINED, icon_color = '#E3DCD2' From 4a6bfec571c5fa929864b1fe0eae7cc3a728785f Mon Sep 17 00:00:00 2001 From: Nicholas Kalar Date: Wed, 17 Dec 2025 23:17:17 -0500 Subject: [PATCH 11/11] Made Flet 1.0 changes --- src/MealBuilder.py | 30 +++++++++++++++++------------- src/MealSelector.py | 8 ++++---- src/main.py | 7 +++---- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/MealBuilder.py b/src/MealBuilder.py index baaaf74..275d4f1 100644 --- a/src/MealBuilder.py +++ b/src/MealBuilder.py @@ -1,8 +1,8 @@ -from FileHandler import read_json, update_json +from FileHandler import read_ingredient_json, update_json import flet as ft -meal_json = read_json() +meal_json = read_ingredient_json() def get_meal_names(): meal_list = list(meal_json.keys()) @@ -62,6 +62,7 @@ def builder(page): # Doesn't work yet # if not self.new_ingredient or not self.new_quantity or not is_number(self.new_quantity): + # page.show_dialog(ft.SnackBar(ft.Text("Please fill in the current ingredient before adding a new one."))) # return # ingredient = { @@ -86,9 +87,9 @@ def builder(page): auto_scroll=False, ), ft.Row(controls=[ - ft.ElevatedButton(text="Add Ingredient", on_click=lambda e: self.append_new_ingredient_row(selector_body)), - ft.ElevatedButton(text="Add Meal", on_click=lambda e: self.add_new_meal(selector_body)), - ft.ElevatedButton(text="Back", on_click=lambda e: self.show_meal_selection(selector_body, page)) + ft.Button(content=ft.Text("Add Ingredient"), on_click=lambda e: self.append_new_ingredient_row(selector_body)), + ft.Button(content=ft.Text("Add Meal"), on_click=lambda e: self.add_new_meal(selector_body)), + ft.Button(content=ft.Text("Back"), on_click=lambda e: self.show_meal_selection(selector_body, page)) ] ) @@ -101,7 +102,7 @@ def builder(page): # Don't add a new row if the last one is blank if selector_body.controls[1].controls[-1].controls[0].value == "" or \ selector_body.controls[1].controls[-1].controls[1].value == "": - page.open(ft.SnackBar(ft.Text("Please fill in the current ingredient before adding a new one."))) + page.show_dialog(ft.SnackBar(ft.Text("Please fill in the current ingredient before adding a new one."))) return selector_body.controls[1].controls.append(ft.Row(self.create_new_ingredient_row(), @@ -118,7 +119,7 @@ def builder(page): if meal == "" or \ selector_body.controls[1].controls.controls[0].value == "" or \ selector_body.controls[1].controls.controls[1].value == "": - page.open(ft.SnackBar(ft.Text("Please fill out the meal information."))) + page.show_dialog(ft.SnackBar(ft.Text("Please fill out the meal information."))) return for row in selector_body.controls[1].controls: @@ -141,14 +142,17 @@ def builder(page): expanded_meal = [] if (selector_body.controls[0].controls[0].value == None): - page.open(ft.SnackBar(ft.Text("Please select a meal to update."))) + page.show_dialog(ft.SnackBar(ft.Text("Please select a meal to update."))) return meal_name = selector_body.controls[0].controls[0].value for details in meal_json[meal_name].items(): expanded_meal.append( - ft.Row(self.create_ingredient_row(details[0], details[1]), + ft.Row(controls=[ + self.create_ingredient_row(details[0], details[1]), + ft.Button(icon=ft.Icons.DELETE_FOREVER_ROUNDED, color=ft.Colors.RED_500, on_click=lambda e, d=details: expanded_meal.remove(e.control.parent)), + ], alignment=ft.MainAxisAlignment.SPACE_EVENLY, ) ) @@ -163,8 +167,8 @@ def builder(page): auto_scroll=False, ), ft.Row(controls=[ - ft.ElevatedButton(text="Save Changes", on_click=lambda e: self.update_ingredients(selector_body.controls[0].value)), - ft.ElevatedButton(text="Back", on_click=lambda e: self.show_meal_selection(selector_body, page)), + ft.Button(content=ft.Text("Save Changes"), on_click=lambda e: self.update_ingredients(selector_body.controls[0].value)), + ft.Button(content=ft.Text("Back"), on_click=lambda e: self.show_meal_selection(selector_body, page)), ] ) ] @@ -187,9 +191,9 @@ def builder(page): ), ft.Row( controls=[ - ft.ElevatedButton(text="Update Meal", + ft.Button(content=ft.Text("Update Meal"), on_click=lambda e: self.show_meal_details(selector_body, page)), - ft.ElevatedButton(text="Add Meal", on_click=lambda e: self.show_new_meal()) + ft.Button(content=ft.Text("Add Meal"), on_click=lambda e: self.show_new_meal()) ] ) ] diff --git a/src/MealSelector.py b/src/MealSelector.py index 569e730..b394fc5 100644 --- a/src/MealSelector.py +++ b/src/MealSelector.py @@ -1,9 +1,9 @@ -from FileHandler import read_json, combine_ingredients, write_checklist +from FileHandler import read_ingredient_json, combine_ingredients, write_checklist import flet as ft selected_meals = {} -meal_json = read_json() +meal_json = read_ingredient_json() def selector(page: ft.Page): def update_meal_selection(event): @@ -14,7 +14,7 @@ def selector(page: ft.Page): else: selected_meals[meal.label] = meal_json[meal.label] if selected_meals == {}: - page.open(ft.SnackBar(ft.Text("Please select at least one meal."))) + page.show_dialog(ft.SnackBar(ft.Text("Please select at least one meal."))) return write_checklist(combine_ingredients(selected_meals)) @@ -30,7 +30,7 @@ def selector(page: ft.Page): ) ) - submit_button = ft.ElevatedButton(text="Make Shopping List", on_click=update_meal_selection) + submit_button = ft.Button(content=ft.Text("Make Shopping List"), on_click=update_meal_selection) page.controls[0].content = ft.Column( controls = [ diff --git a/src/main.py b/src/main.py index 068aaaa..a0ddb37 100644 --- a/src/main.py +++ b/src/main.py @@ -1,5 +1,4 @@ import flet as ft -from MealBuilder import builder from MealSelector import selector from models.MenuBar import create_menubar @@ -8,11 +7,11 @@ def main(page: ft.Page): page.window.width = 750 page.window.height = 900 page.window.top = 10 - page.appbar = create_menubar(page, selector, builder) + page.appbar = create_menubar(page) page.bgcolor = '#013328' - page.add(ft.Pagelet(content=ft.Text())) + page.add(ft.Pagelet(content=ft.Text(), expand=True, bgcolor='#013328')) selector(page) if __name__ == "__main__": - ft.app(main) \ No newline at end of file + ft.run(main) \ No newline at end of file