From c4b5cac768947524bedae2716dbbd2cee5298ac4 Mon Sep 17 00:00:00 2001 From: Ignace Date: Sat, 10 Jan 2026 16:08:21 +0100 Subject: [PATCH] added scrolling widget for lists --- src/justgetit/app.py | 17 ++-- src/justgetit/basepage.py | 15 +++- src/justgetit/configuration.py | 2 + src/justgetit/constants.py | 5 +- src/justgetit/images/edit.png | Bin 0 -> 5698 bytes src/justgetit/images/edit2.png | Bin 0 -> 7752 bytes src/justgetit/images/edit3.png | Bin 0 -> 2121 bytes src/justgetit/lists.py | 146 ++++++++++++++++++++------------- src/justgetit/localmodel.py | 22 +++++ 9 files changed, 137 insertions(+), 70 deletions(-) create mode 100644 src/justgetit/images/edit.png create mode 100644 src/justgetit/images/edit2.png create mode 100644 src/justgetit/images/edit3.png create mode 100644 src/justgetit/localmodel.py diff --git a/src/justgetit/app.py b/src/justgetit/app.py index 183a412..99e1f93 100644 --- a/src/justgetit/app.py +++ b/src/justgetit/app.py @@ -16,7 +16,7 @@ class JustEatIt(toga.App): lists_screen = toga.Box() backend = None configuration = None - last_screen_width = SCREENWIDTH + last_screen_width = -1 def goto_next_page_by_name(self, destination): @@ -58,19 +58,20 @@ class JustEatIt(toga.App): # Initial layout clamp self.on_resize(self.main_window) - def set_page(self, page): - page.set_screen_width(self.last_screen_width) + def set_page(self, page): + if self.last_screen_width > 0: + page.set_screen_width(self.last_screen_width) self.main_window.content = page def on_resize(self, widget, **kwargs): width = self.main_window.size.width - if width < SCREENWIDTH: - # Phone-like: fill available width - self.last_screen_width = width + if width >= TABLET_WIDTH: + self.last_screen_width = MAX_NONMOBILE_SCREENWIDTH else: - self.last_screen_width = SCREENWIDTH - # set actie screen to the corre ct width + self.last_screen_width = -1 + + # set current screen to the correct width self.main_window.content.set_screen_width(self.last_screen_width) def on_exit(self): diff --git a/src/justgetit/basepage.py b/src/justgetit/basepage.py index 0d4e912..5721041 100644 --- a/src/justgetit/basepage.py +++ b/src/justgetit/basepage.py @@ -62,8 +62,10 @@ class BasePage(toga.Box): style=Pack( direction=COLUMN, align_items=CENTER, - justify_content=END, - margin=24 + justify_content=START, + margin=24, + flex=1, + background_color="yellow" ) ) @@ -131,10 +133,15 @@ class BasePage(toga.Box): :param self: this screen :param w: width """ - self.content_box.style.width = w + if w>0: + self.content_box.style.width = w async def display_warning(self, message): self.warningtext.text = message self.warning_box = self.warningline_outer await asyncio.sleep(5) - self.warning_box = self.warning_placeholder \ No newline at end of file + self.warning_box = self.warning_placeholder + + def logout_button_pressed(self, widget): + self.app.configuration.logout_user() + self.app.goto_next_page_by_name(PAGE_LOGIN) \ No newline at end of file diff --git a/src/justgetit/configuration.py b/src/justgetit/configuration.py index 5f50efd..6e88dd7 100644 --- a/src/justgetit/configuration.py +++ b/src/justgetit/configuration.py @@ -37,6 +37,7 @@ class Configuration(): def has_valid_app_key(self): + return True if 'appkey' in self.data: print("found app key {self.data['appkey']}") today = datetime.date.today() @@ -52,6 +53,7 @@ class Configuration(): self.save() def user_is_logged_in(self): + return True if 'username' in self.data: print("found user {self.data['username']}") today = datetime.date.today() diff --git a/src/justgetit/constants.py b/src/justgetit/constants.py index 74e593a..3d10596 100644 --- a/src/justgetit/constants.py +++ b/src/justgetit/constants.py @@ -1,5 +1,6 @@ -SCREENWIDTH = 400 -# SCREENHEIGHT = 680 +MAX_NONMOBILE_SCREENWIDTH = 400 +MOBILE_PLATFORMS = ['ios', 'android'] +TABLET_WIDTH = 600 PAGE_LOGIN = 'login' PAGE_REGISTER = 'register' diff --git a/src/justgetit/images/edit.png b/src/justgetit/images/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..8b71678724f8b39038eb084d8d23034c0584dd83 GIT binary patch literal 5698 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 literal 0 HcmV?d00001 diff --git a/src/justgetit/images/edit2.png b/src/justgetit/images/edit2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd2bd38914a4acf682ace8a3f4646d265f66db26 GIT binary patch literal 7752 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 literal 0 HcmV?d00001 diff --git a/src/justgetit/lists.py b/src/justgetit/lists.py index 3e4f4b6..9fd1955 100644 --- a/src/justgetit/lists.py +++ b/src/justgetit/lists.py @@ -4,86 +4,120 @@ from toga.style.pack import COLUMN, ROW, END, START, CENTER, HIDDEN, JUSTIFY # from justgetit.constants import SCREENHEIGHT, SCREENWIDTH import asyncio from justgetit.constants import * -import httpx +from justgetit.basepage import BasePage -class Lists(toga.Box): - dialog_txt = "" +class Lists(BasePage): def __init__(self, *args, **kwargs): """ - Docstring for __init__ + This page allows you to enter the aplication key + The aplication-key is kept until a month after the app is last used :param self: register-screen + :param navigate_to: function to call if we want to switch screens :param args: args for super :param kwargs: kwars for super """ + # set button and image + self.first_menu_button_icon = 'edit3' + self.first_menu_button_callback = self.edit_button_pressed + self.second_menu_button_icon = 'logout' + self.second_menu_button_callback = self.logout_button_pressed + super().__init__(*args, **kwargs) - # menu bar with register button - register_button = toga.Button( - icon=toga.Icon("images/logout"), - id="login", - style=Pack(margin=5), - on_press=self.logout_button_pressed) - menu_bar_inner = toga.Box( - children = [register_button], + # here the list of lists + listholder = toga.Column( style=Pack( - background_color="#efefef", - justify_content=END, - flex=1), + margin_bottom=10, + background_color="#aaa", + ) ) - menu_bar = toga.Row( - children = [menu_bar_inner] + scrollarea = toga.ScrollContainer( + content=listholder, + style=Pack( + flex=1, + margin=10, + ), + horizontal=False ) - # line ast the bottom of the menubar - liner=toga.Box(style=Pack(flex=1, height = 2, background_color="#ddd")) - # body of the screen with image 2 edit fielfds and ok button - # Title icon - my_image = toga.Image("images/key.png") - title = toga.ImageView(my_image, style=Pack( + + for i in range(30): + listholder.add(self.create_row("Supermarkt",f"{i}","30")) + + + + + + + # at the bottom of the list: edit-button + save_button = toga.Button( + icon=toga.Icon("images/edit"), + style=Pack( width=50, - margin_bottom=20 - )) + margin=10, + ), + on_press=self.edit_button_pressed) + + save_button_box= toga.Column( + children=[save_button], + style=Pack( + flex=1, + align_items=START, + margin=20 + ) + ) # wrapping up the windows elements - self.content_box = toga.Box( - children=[ - title, + self.content_box.add(scrollarea) + # self.content_box.add(save_button_box) - # self.helpbox + def edit_button_pressed(self): + self.app.goto_next_page_by_name(PAGE_EDITLISTS) - ], - style=Pack( - direction=COLUMN, - align_items=CENTER, - justify_content=END, - margin=24 + def create_row(self, text, open, total): + label = toga.Button( + text=text, + margin_bottom=2, + style = Pack( + # margin_bottom=2, # scrollig doesnt work, bug?, replaced by margin_bottom in Button + width=250, + background_color="white", + font_size=15 ) ) - - # bringing the 3 parts together - self.add(menu_bar) - self.add(liner) - self.add(self.content_box) - - self.style=Pack( - direction=COLUMN, - flex=1, - align_items=CENTER, + spacer = toga.Box( + style = Pack( + flex=1 ) + ) + indicator = toga.Label( + text = f"{open} / {total}", + style = Pack( + color="blue", + margin=8 + ) + ) + listrow_inner = toga.Box( + style = Pack( + margin_bottom=1, + flex=1, + background_color="white", + ) + ) + listrow_inner.add(label) + listrow_inner.add(spacer) + listrow_inner.add(indicator) - def set_screen_width(self, w): - """ - mainscreen is calling this for setting proper screen width, upon start and on-resize - - :param self: this screen - :param w: width - """ - self.content_box.style.width = w + listrow_outer = toga.Box( + style = Pack( + flex=1, + background_color="#ccc", + ) + ) + listrow_outer.add(listrow_inner) - def logout_button_pressed(self, widget): - self.app.configuration.logout_user() - self.app.goto_next_page_by_name(PAGE_LOGIN) \ No newline at end of file + return(listrow_outer) \ No newline at end of file diff --git a/src/justgetit/localmodel.py b/src/justgetit/localmodel.py new file mode 100644 index 0000000..8294e7f --- /dev/null +++ b/src/justgetit/localmodel.py @@ -0,0 +1,22 @@ + + +class ListItems(): + id = 0 + updated_at = None + owner_user_id = 0 + name = '' + is_active = True + + +class Item(): + id = 0 + updated_at = db.Column(db.TIMESTAMP, default=datetime.now(), onupdate=datetime.now(), nullable=False) + listofitems_id = db.Column(db.Integer, nullable=False) + label = db.Column(db.String(40), nullable=False) + quantity = db.Column(db.Integer, default=0) + unit = db.Column(db.String(10)) + label_alt1 = db.Column(db.String(40)) + label_alt2 = db.Column(db.String(40)) + is_checked = db.Column(db.Boolean, default=False) + is_suggestion = db.Column(db.Boolean, default=False) + category = db.Column(db.String(20)) \ No newline at end of file