home,history und settings Tab

This commit is contained in:
Michael S. 2024-06-23 19:41:00 +02:00
parent aa5a0708b9
commit 710c865753
12 changed files with 134 additions and 296 deletions

7
.gitignore vendored
View file

@ -152,9 +152,4 @@ dmypy.json
# Cython debug symbols # Cython debug symbols
cython_debug/ cython_debug/
# PyCharm app/saves/history.json
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

View file

@ -1,26 +1,31 @@
import flet as ft import flet as ft
from pages.root import Nahrung from pages.home import Home
from pages.history import History
from pages.settings import Settings from pages.settings import Settings
from flet import app
def main(page: ft.Page): def main(page: ft.Page):
page.title = "Nahrungstracker" page.title = "Nahrungstracker"
page.scroll = True page.scroll = True
# Initialize views history_instance = History() # Erstellen der History-Instanz
nahrung = Nahrung()
settings = Settings()
# Store reference to the page in instances home = Home(history_instance) # Übergeben der History-Instanz an Home
nahrung.page = page home.page = page
settings = Settings()
settings.page = page settings.page = page
# Function to switch views
def on_navigation_change(e): def on_navigation_change(e):
page.controls.clear() page.controls.clear()
if e.control.selected_index == 0: if e.control.selected_index == 0:
page.appbar = nahrung.create_appbar() page.appbar = home.create_appbar()
page.add(nahrung) page.add(home)
elif e.control.selected_index == 1: elif e.control.selected_index == 1:
page.appbar = ft.AppBar(title=ft.Text("History"))
history_instance.update_history_view()
page.add(history_instance) # Hinzufügen der History-Instanz zur Seite
elif e.control.selected_index == 2:
page.appbar = ft.AppBar(title=ft.Text("Settings")) page.appbar = ft.AppBar(title=ft.Text("Settings"))
page.add(settings) page.add(settings)
page.update() page.update()
@ -28,14 +33,16 @@ def main(page: ft.Page):
page.navigation_bar = ft.NavigationBar( page.navigation_bar = ft.NavigationBar(
destinations=[ destinations=[
ft.NavigationDestination(icon=ft.icons.HOME, label="Home"), ft.NavigationDestination(icon=ft.icons.HOME, label="Home"),
ft.NavigationDestination(icon=ft.icons.HISTORY, label="History"),
ft.NavigationDestination(icon=ft.icons.SETTINGS, label="Settings") ft.NavigationDestination(icon=ft.icons.SETTINGS, label="Settings")
], ],
on_change=on_navigation_change, on_change=on_navigation_change,
) )
page.appbar = nahrung.create_appbar() page.appbar = home.create_appbar()
page.add(nahrung) page.add(home)
page.update() # Ensure the initial UI is updated page.update()
if __name__ == "__main__": if __name__ == "__main__":
ft.app(target=main) print("run")
app(target=main)

View file

@ -0,0 +1,60 @@
import flet as ft
from datetime import datetime
from pages import file_handler
def get_time():
t = datetime.now()
return [t.year, t.month, t.day, t.hour, t.minute, t.second]
class History(ft.UserControl):
def __init__(self) -> None:
super().__init__()
self.settings, self.history = file_handler.load(self)
self.historylist = []
self.update_history()
self.history_container = ft.Container(
content=ft.Column(controls=self.historylist)
)
self.controls = [self.history_container]
def build(self):
return ft.Column(self.controls)
def addkcal(self, emoji, kcal):
self.history.append([emoji, kcal, get_time()])
file_handler.save(self.settings, self.history)
self.update_history()
def update_history(self):
self.historylist.clear()
for h in self.history:
self.historylist.insert(0,
ft.Container(
content=ft.Column(
controls=[
ft.Row(
[ft.Text(str(f"{h[2][3]}:{h[2][4]}:{h[2][5]} {h[2][2]}.{h[2][1]}.{h[2][0]}"))],
alignment=ft.MainAxisAlignment.END
),
ft.Row(
[ft.Text(str(f"({h[1]} kcal) {h[0]}"), size=20)],
alignment=ft.MainAxisAlignment.START,
)
]
),
bgcolor=ft.colors.INDIGO_600,
border_radius=5,
padding=6
)
)
def update_history_view(self):
self.update_history()
self.controls.clear()
self.history_container = ft.Container(
content=ft.Column(controls=self.historylist)
)
self.controls = [self.history_container]
print("reset history view")

View file

@ -1,7 +1,8 @@
import flet as ft import flet as ft
from datetime import datetime
from random import choice from random import choice
from datetime import datetime
from pages import file_handler from pages import file_handler
from .history import History
def get_time(): def get_time():
t = datetime.now() t = datetime.now()
@ -10,21 +11,16 @@ def get_time():
def random_emoji(): def random_emoji():
return choice("🍎🍐🍊🍋🍌🍉🍇🍓🍈🍒🍑🍍🥝🥭🥑🍅🍆🥒🥕🥬🌽🥔🍠🌰🥜🍯🥐🍞🥖🥨🥯🧀🥚🍳🥓🧄🧅🥞🧇🍤🍗🍖🍕🌭🍔🍟🥙🌮🌯🥗🥘🍝🍜🦪🍲🍥🍣🍱🍛🍚🧆🍙🍘🍢🍡🍧🍨🍦🍰🎂🍮🍭🍬🍫🍿🍩🍪🥮🧁🥛🧈🍼☕🍵🍶🍺🍻🥂🍷🥃🍸🍹🍾🧉🧃🧊🧂🥄🍴") return choice("🍎🍐🍊🍋🍌🍉🍇🍓🍈🍒🍑🍍🥝🥭🥑🍅🍆🥒🥕🥬🌽🥔🍠🌰🥜🍯🥐🍞🥖🥨🥯🧀🥚🍳🥓🧄🧅🥞🧇🍤🍗🍖🍕🌭🍔🍟🥙🌮🌯🥗🥘🍝🍜🦪🍲🍥🍣🍱🍛🍚🧆🍙🍘🍢🍡🍧🍨🍦🍰🎂🍮🍭🍬🍫🍿🍩🍪🥮🧁🥛🧈🍼☕🍵🍶🍺🍻🥂🍷🥃🍸🍹🍾🧉🧃🧊🧂🥄🍴")
class Home(ft.UserControl):
class Nahrung(ft.UserControl): def __init__(self, history_instance: History) -> None:
def __init__(self) -> None:
super().__init__() super().__init__()
self.settings, self.history = file_handler.load(self) self.history_instance = history_instance
self.kjtext = ft.Text("0", size=25) self.kjtext = ft.Text("0", size=25)
self.kcaltext = ft.Text("0", size=30) self.kcaltext = ft.Text("0", size=30)
self.kcaltextfield = ft.TextField(keyboard_type="NUMBER", expand=True, on_change=self.reseterrorinkcaltextfield, on_submit=self.editkcal) self.kcaltextfield = ft.TextField(keyboard_type="NUMBER", expand=True, on_change=self.reseterrorinkcaltextfield, on_submit=self.editkcal)
self.snack_bar = ft.SnackBar(ft.Text("Hinzugefügt"))
# Initialize history list
self.historylist = []
self.update_history()
# Initialize controls
self.main_container = ft.Container( self.main_container = ft.Container(
content=ft.Column( content=ft.Column(
[ [
@ -32,14 +28,14 @@ class Nahrung(ft.UserControl):
[ [
ft.Text("kjoule:", size=20), ft.Text("kjoule:", size=20),
self.kjtext, self.kjtext,
ft.Text(f"/{round(self.settings['kcal_max'] * 4.184, 0)}", size=10) ft.Text(f"/{round(self.history_instance.settings['kcal_max'] * 4.184, 0)}", size=10)
] ]
), ),
ft.Row( ft.Row(
[ [
ft.Text("kcal:", size=25), ft.Text("kcal:", size=25),
self.kcaltext, self.kcaltext,
ft.Text(f"/{self.settings['kcal_max']}", size=10) ft.Text(f"/{self.history_instance.settings['kcal_max']}", size=10)
] ]
), ),
ft.Row( ft.Row(
@ -55,13 +51,7 @@ class Nahrung(ft.UserControl):
padding=15, padding=15,
) )
self.history_container = ft.Container( self.controls = [self.main_container, self.snack_bar]
content=ft.Column([ft.Text("Verlauf:"),
ft.Column(controls=self.historylist)
]),
)
self.controls = [self.main_container, self.history_container]
self.load_todays_kcal() self.load_todays_kcal()
@ -75,22 +65,29 @@ class Nahrung(ft.UserControl):
def editkcal(self, e): def editkcal(self, e):
try: try:
emoji = random_emoji() emoji = random_emoji()
print(emoji)
new_kcal = int(self.kcaltext.value) + int(self.kcaltextfield.value) new_kcal = int(self.kcaltext.value) + int(self.kcaltextfield.value)
self.kcaltext.value = str(new_kcal) self.kcaltext.value = str(new_kcal)
self.kjtext.value = str(round(new_kcal * 4.184, 0)) self.kjtext.value = str(round(new_kcal * 4.184, 0))
self.history.append([emoji, self.kcaltextfield.value, get_time()]) self.history_instance.addkcal(emoji, self.kcaltextfield.value)
file_handler.save(self.settings, self.history)
self.update_history()
self.reseterrorinkcaltextfield() self.reseterrorinkcaltextfield()
self.kcaltextfield.value = "" self.kcaltextfield.value = ""
self.update()
self.snack_bar.open = True
self.page.snack_bar = self.snack_bar
self.page.update()
self.snack_bar.open = False
self.page.snack_bar = None
self.history_instance.update_history_view()
except ValueError: except ValueError:
self.kcaltextfield.error_text = "\\(*O*)/ nicht verschreiben!!" self.kcaltextfield.error_text = "\\(*O*)/ nicht verschreiben!!"
self.update() self.page.update()
def create_appbar(self): def create_appbar(self):
return ft.AppBar( return ft.AppBar(
title=ft.Text("Nahrungstracker"), title=ft.Text("Home"),
actions=[ actions=[
ft.PopupMenuButton( ft.PopupMenuButton(
items=[ft.PopupMenuItem(text="Reset", on_click=self.resethistory)] items=[ft.PopupMenuItem(text="Reset", on_click=self.resethistory)]
@ -98,45 +95,20 @@ class Nahrung(ft.UserControl):
], ],
) )
def update_history(self): def resethistory(self,e):
self.historylist.clear() print("reset button")
for h in self.history:
self.historylist.insert(0,
ft.Container(content=
ft.Column(controls=[
ft.Row(
[ft.Text(str(f"{h[2][3]}:{h[2][4]}:{h[2][5]} {h[2][2]}.{h[2][1]}.{h[2][0]}"))],
alignment=ft.MainAxisAlignment.END
),
ft.Row(
[ft.Text(str(f"({h[1]} kcal) {h[0]}"), size=20)],
alignment=ft.MainAxisAlignment.START,
)]),
bgcolor=ft.colors.INDIGO_600, # "#226666",
border_radius=5,
padding=6
)
)
def resethistory(self, e):
print("pressed")
def reset(e): def reset(e):
self.kcaltext.value = "0" self.kcaltext.value = "0"
self.kjtext.value = "0" self.kjtext.value = "0"
self.history = [] self.history_instance.history = []
file_handler.save(self.settings, self.history) file_handler.save(self.history_instance.settings, self.history_instance.history)
self.update_history() self.history_instance.update_history_view() # Aktualisieren der History-Ansicht
self.history_container.content = ft.Column(self.historylist)
self.dialog.open = False self.dialog.open = False
# beide updaten
self.page.update() self.page.update()
self.update()
def close(e): def close(e):
self.dialog.open = False self.dialog.open = False
# beide updaten
self.page.update() self.page.update()
self.update()
self.dialog = ft.AlertDialog( self.dialog = ft.AlertDialog(
modal=True, modal=True,
@ -149,20 +121,17 @@ class Nahrung(ft.UserControl):
actions_alignment=ft.MainAxisAlignment.END, actions_alignment=ft.MainAxisAlignment.END,
on_dismiss=lambda e: print("Modal dialog dismissed!"), on_dismiss=lambda e: print("Modal dialog dismissed!"),
) )
self.page.dialog = self.dialog
self.page.dialog = self.dialog
self.dialog.open = True self.dialog.open = True
self.page.update() self.page.update()
def load_todays_kcal(self): def load_todays_kcal(self):
today_date = get_time()[:3] today_date = get_time()[:3]
print(today_date)
todays_kcal = 0 todays_kcal = 0
for entry in self.history: for entry in self.history_instance.history:
entry_date = entry[2][:3] # Year, Month, Day part of the entry's timestamp entry_date = entry[2][:3]
if entry_date == today_date: if entry_date == today_date:
todays_kcal += int(entry[1]) todays_kcal += int(entry[1])
self.kcaltext.value = str(todays_kcal) self.kcaltext.value = str(todays_kcal)

View file

@ -1,26 +1,38 @@
[ [
[ [
"\ud83c\udf4b", "\ud83e\uddc1",
"8", "50",
[ [
2024, 2024,
6, 6,
23, 23,
13, 19,
37, 38,
23 59
] ]
], ],
[ [
"\ud83c\udf47", "\ud83c\udf5d",
"800",
[
2024,
6,
23,
19,
39,
6
]
],
[
"\ud83c\udf2d",
"5", "5",
[ [
2024, 2024,
6, 6,
23, 23,
13, 19,
37, 39,
40 22
] ]
] ]
] ]

View file

@ -1,4 +0,0 @@
import flet as ft
def get_views(page):
return {}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

View file

@ -1,16 +0,0 @@
import json
def save(jsettings,jhisory):
with open("saves/settings.json", "w") as data:
data.write(json.dumps(jsettings,indent=4))
with open("saves/history.json", "w") as data:
data.write(json.dumps(jhisory,indent=4))
def load(self) -> list:
with open("saves/settings.json", "r") as data:
jsettings = json.load(data)
with open("saves/history.json", "r") as data:
jhistory = json.load(data)
return jsettings,jhistory

180
main.py
View file

@ -1,180 +0,0 @@
import flet as ft
import file_handler
from datetime import datetime
from random import choice
def get_time():
t = datetime.now()
return [t.year, t.month, t.day, t.hour, t.minute, t.second]
def random_emoji():
return choice("🍎🍐🍊🍋🍌🍉🍇🍓🍈🍒🍑🍍🥝🥭🥑🍅🍆🥒🥕🥬🌽🥔🍠🌰🥜🍯🥐🍞🥖🥨🥯🧀🥚🍳🥓🧄🧅🥞🧇🍤🍗🍖🍕🌭🍔🍟🥙🌮🌯🥗🥘🍝🍜🦪🍲🍥🍣🍱🍛🍚🧆🍙🍘🍢🍡🍧🍨🍦🍰🎂🍮🍭🍬🍫🍿🍩🍪🥮🧁🥛🧈🍼☕🍵🍶🍺🍻🥂🍷🥃🍸🍹🍾🧉🧃🧊🧂🥄🍴")
class Nahrung(ft.UserControl):
def __init__(self) -> None:
super().__init__()
self.settings, self.history = file_handler.load(self)
self.kjtext = ft.Text("0", size=25)
self.kcaltext = ft.Text("0", size=30)
self.kcaltextfield = ft.TextField(keyboard_type="NUMBER", expand=True, autofocus=True, on_change=self.reseterrorinkcaltextfield, on_submit=self.editkcal)
# Initialize history list
self.historylist = []
self.update_history()
# Initialize controls
self.main_container = ft.Container(
content=ft.Column(
[
ft.Row(
[
ft.Text("kjoule:", size=20),
self.kjtext,
ft.Text(f"/{round(self.settings['kcal_max'] * 4.184, 0)}", size=10)
]
),
ft.Row(
[
ft.Text("kcal:", size=25),
self.kcaltext,
ft.Text(f"/{self.settings['kcal_max']}", size=10)
]
),
ft.Row(
[
self.kcaltextfield,
ft.FloatingActionButton(icon="add", on_click=self.editkcal)
]
),
]
),
bgcolor=ft.colors.INDIGO_400,
border_radius=10,
padding=15,
)
self.history_container = ft.Container(
content=ft.Column([ft.Text("Verlauf:"),
ft.Column(controls=self.historylist)
]),
)
self.controls = [self.main_container, self.history_container]
self.load_todays_kcal()
def reseterrorinkcaltextfield(self, e=None):
self.kcaltextfield.error_text = ""
def build(self):
self.kjtext.value = str(round(int(self.kcaltext.value) * 4.184, 0))
return ft.Column(self.controls)
def editkcal(self, e):
try:
emoji = random_emoji()
new_kcal = int(self.kcaltext.value) + int(self.kcaltextfield.value)
self.kcaltext.value = str(new_kcal)
self.kjtext.value = str(round(new_kcal * 4.184, 0))
self.history.append([emoji, self.kcaltextfield.value, get_time()])
file_handler.save(self.settings, self.history)
self.update_history()
self.reseterrorinkcaltextfield()
self.kcaltextfield.value = ""
self.update()
except ValueError:
self.kcaltextfield.error_text = "\\(*O*)/ nicht verschreiben!!"
self.update()
def create_appbar(self):
return ft.AppBar(
title=ft.Text("Nahrungstracker"),
actions=[
ft.PopupMenuButton(
items=[ft.PopupMenuItem(text="Reset", on_click=self.resethistory)]
)
],
)
def update_history(self):
self.historylist.clear()
for h in self.history:
self.historylist.insert(0,
ft.Container(content=
ft.Column(controls=[
ft.Row(
[ft.Text(str(f"{h[2][3]}:{h[2][4]}:{h[2][5]} {h[2][2]}.{h[2][1]}.{h[2][0]}"))],
alignment=ft.MainAxisAlignment.END
),
ft.Row(
[ft.Text(str(f"({h[1]} kcal) {h[0]}"), size=20)],
alignment=ft.MainAxisAlignment.START,
)]),
bgcolor=ft.colors.INDIGO_600, # "#226666",
border_radius=5,
padding=6
)
)
def resethistory(self, e):
print("pressed")
def reset(e):
self.kcaltext.value = "0"
self.kjtext.value = "0"
self.history = []
file_handler.save(self.settings, self.history)
self.update_history()
self.history_container.content = ft.Column(self.historylist)
self.dialog.open = False
# beide updaten
self.page.update()
self.update()
def close(e):
self.dialog.open = False
# beide updaten
self.page.update()
self.update()
self.dialog = ft.AlertDialog(
modal=True,
title=ft.Text("Wirklich?"),
content=ft.Text("Alle Daten werden aus deinem Verlauf gelöscht!!!"),
actions=[
ft.TextButton("ja", on_click=reset),
ft.TextButton("nein", on_click=close),
],
actions_alignment=ft.MainAxisAlignment.END,
on_dismiss=lambda e: print("Modal dialog dismissed!"),
)
self.page.dialog = self.dialog
self.dialog.open = True
self.page.update()
def load_todays_kcal(self):
today_date = get_time()[:3]
print(today_date)
todays_kcal = 0
for entry in self.history:
entry_date = entry[2][:3] # Year, Month, Day part of the entry's timestamp
if entry_date == today_date:
todays_kcal += int(entry[1])
self.kcaltext.value = str(todays_kcal)
def main(page: ft.Page):
page.title = "Nahrungstracker"
page.scroll = True
nahrung = Nahrung()
nahrung.page = page # Store reference to the page in Nahrung instance
page.appbar = nahrung.create_appbar()
page.add(nahrung)
page.update() # Ensure the initial UI is updated
if __name__ == "__main__":
ft.app(target=main)

View file

@ -1 +0,0 @@
flet==0.21.*

View file

@ -1 +0,0 @@
[]

View file

@ -1,3 +0,0 @@
{
"kcal_max": 2000
}