login and registration screen

This commit is contained in:
2026-01-06 22:56:13 +01:00
parent 210cc5db26
commit e316001fa7
18 changed files with 592 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# OSX useful to ignore
*.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.dist-info/
*.egg-info/
.installed.cfg
*.egg
# IntelliJ Idea family of suites
.idea
*.iml
## File-based project format:
*.ipr
*.iws
## mpeltonen/sbt-idea plugin
.idea_modules/
# Briefcase log files
logs/
# Briefcase local configuratoin
.briefcase/
+5
View File
@@ -0,0 +1,5 @@
# Just Get It Release Notes
## 0.0.1 (06 Jan 2026)
* Initial release
+27
View File
@@ -0,0 +1,27 @@
Copyright (c) 2026, Ignace
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
+196
View File
@@ -0,0 +1,196 @@
# This project was generated with 0.3.26 using template: https://github.com/beeware/briefcase-template @ v0.3.26
[tool.briefcase]
project_name = "Just Get It"
bundle = "nl.suy"
version = "0.0.1"
url = "https://suy.nl/justgetit"
license.file = "LICENSE"
author = "Ignace"
author_email = "ignace@suy.nl"
[tool.briefcase.app.justgetit]
formal_name = "Just Get It"
description = "Just Get It App"
long_description = """More details about the app should go here.
"""
sources = [
"src/justgetit",
"src/justgetit/images",
]
test_sources = [
"tests",
]
requires = [
"requests",
]
test_requires = [
"pytest",
]
[tool.briefcase.app.justgetit.macOS]
universal_build = true
requires = [
"toga-cocoa~=0.5.0",
"std-nslog~=1.0.3",
]
[tool.briefcase.app.justgetit.linux]
requires = [
"toga-gtk~=0.5.0",
# PyGObject 3.52.1 enforces a requirement on libgirepository-2.0-dev. This library
# isn't available on Debian 12/Ubuntu 22.04. If you don't need to support those (or
# older) releases, you can remove this version pin. See beeware/toga#3143.
"pygobject < 3.52.1",
]
[tool.briefcase.app.justgetit.linux.system.debian]
system_requires = [
# Needed to compile pycairo wheel
"libcairo2-dev",
# One of the following two packages are needed to compile PyGObject wheel. If you
# remove the pygobject pin in the requires list, you should also change to the
# version 2.0 of the girepository library. See beeware/toga#3143.
"libgirepository1.0-dev",
# "libgirepository-2.0-dev",
]
system_runtime_requires = [
# Needed to provide GTK and its GI bindings
"gir1.2-gtk-3.0",
# One of the following two packages are needed to use PyGObject at runtime. If you
# remove the pygobject pin in the requires list, you should also change to the
# version 2.0 of the girepository library. See beeware/toga#3143.
"libgirepository-1.0-1",
# "libgirepository-2.0-0",
# Dependencies that GTK looks for at runtime
"libcanberra-gtk3-module",
# Needed to provide WebKit2 at runtime
# Note: Debian 11 requires gir1.2-webkit2-4.0 instead
# "gir1.2-webkit2-4.1",
]
[tool.briefcase.app.justgetit.linux.system.rhel]
system_requires = [
# Needed to compile pycairo wheel
"cairo-gobject-devel",
# Needed to compile PyGObject wheel
"gobject-introspection-devel",
]
system_runtime_requires = [
# Needed to support Python bindings to GTK
"gobject-introspection",
# Needed to provide GTK
"gtk3",
# Dependencies that GTK looks for at runtime
"libcanberra-gtk3",
# Needed to provide WebKit2 at runtime
# "webkit2gtk3",
]
[tool.briefcase.app.justgetit.linux.system.suse]
system_requires = [
# Needed to compile pycairo wheel
"cairo-devel",
# Needed to compile PyGObject wheel
"gobject-introspection-devel",
]
system_runtime_requires = [
# Needed to provide GTK
"gtk3",
# Needed to support Python bindings to GTK
"gobject-introspection", "typelib(Gtk) = 3.0",
# Dependencies that GTK looks for at runtime
"libcanberra-gtk3-module",
# Needed to provide WebKit2 at runtime
# "libwebkit2gtk3", "typelib(WebKit2)",
]
[tool.briefcase.app.justgetit.linux.system.arch]
system_requires = [
# Needed to compile pycairo wheel
"cairo",
# Needed to compile PyGObject wheel
"gobject-introspection",
# Runtime dependencies that need to exist so that the
# Arch package passes final validation.
# Needed to provide GTK
"gtk3",
# Dependencies that GTK looks for at runtime
"libcanberra",
# Needed to provide WebKit2
# "webkit2gtk",
]
system_runtime_requires = [
# Needed to provide GTK
"gtk3",
# Needed to provide PyGObject bindings
"gobject-introspection-runtime",
# Dependencies that GTK looks for at runtime
"libcanberra",
# Needed to provide WebKit2 at runtime
# "webkit2gtk",
]
[tool.briefcase.app.justgetit.linux.appimage]
manylinux = "manylinux_2_28"
system_requires = [
# Needed to compile pycairo wheel
"cairo-gobject-devel",
# Needed to compile PyGObject wheel
"gobject-introspection-devel",
# Needed to provide GTK
"gtk3-devel",
# Dependencies that GTK looks for at runtime, that need to be
# in the build environment to be picked up by linuxdeploy
"libcanberra-gtk3",
"PackageKit-gtk3-module",
"gvfs-client",
]
linuxdeploy_plugins = [
"DEPLOY_GTK_VERSION=3 gtk",
]
[tool.briefcase.app.justgetit.linux.flatpak]
flatpak_runtime = "org.gnome.Platform"
flatpak_runtime_version = "48"
flatpak_sdk = "org.gnome.Sdk"
[tool.briefcase.app.justgetit.windows]
requires = [
"toga-winforms~=0.5.0",
]
# Mobile deployments
[tool.briefcase.app.justgetit.iOS]
requires = [
"toga-iOS~=0.5.0",
"std-nslog~=1.0.3",
]
[tool.briefcase.app.justgetit.android]
requires = [
"toga-android~=0.5.0",
]
base_theme = "Theme.MaterialComponents.Light.DarkActionBar"
build_gradle_dependencies = [
"com.google.android.material:material:1.13.0",
# Needed for DetailedList
# "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0",
# Needed for MapView
# "org.osmdroid:osmdroid-android:6.1.20",
]
# Web deployments
[tool.briefcase.app.justgetit.web]
requires = [
"toga-web~=0.5.0",
]
View File
+4
View File
@@ -0,0 +1,4 @@
from justgetit.app import main
if __name__ == "__main__":
main().main_loop()
+40
View File
@@ -0,0 +1,40 @@
import toga
from toga.style.pack import COLUMN, ROW, CENTER, START, END
from toga.style import Pack
import requests
from justgetit.constants import *
from justgetit.login import Login
from justgetit.register import Register
class JustEatIt(toga.App):
login_screen = toga.Box()
register_screen = toga.Box()
def goto_next_page(self, widget):
"""
ask app to activate a next page, id of the page is in the id of the widget
:param widget: the widget that called this function
"""
print(f"action 6 {widget.id}")
if widget.id == 'register':
self.main_window.content = self.register_screen
elif widget.id =='login':
self.main_window.content = self.login_screen
def startup(self):
self.login_screen = Login(navigate_to=self.goto_next_page)
self.register_screen = Register(navigate_to=self.goto_next_page)
self.main_window = toga.MainWindow(title=self.formal_name, size=(SCREENWIDTH, SCREENHEIGHT))
self.main_window.content = self.register_screen
self.main_window.show()
def main():
return JustEatIt()
+2
View File
@@ -0,0 +1,2 @@
SCREENWIDTH = 380
SCREENHEIGHT = 680
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

+106
View File
@@ -0,0 +1,106 @@
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW, END, START, CENTER
from justgetit.constants import SCREENHEIGHT, SCREENWIDTH
class Login(toga.Box):
def __init__(self, navigate_to, *args, **kwargs):
super().__init__(*args, **kwargs)
self.navigate_to= navigate_to
register_button = toga.Button(
icon=toga.Icon("images/register"),
style=Pack(
width=50,
margin=5,
),
id="register",
on_press=self.navigate_to)
liner =toga.Box(style=Pack(width=SCREENWIDTH, height = 2, background_color="#ddd"))
menu_bar= toga.Row(
children=[register_button, liner],
style=Pack(
justify_content=END,
width = SCREENWIDTH,
background_color="#eee"
)
)
# Title icon
my_image = toga.Image("images/login.png")
title = toga.ImageView(my_image, style=Pack(
width=50,
margin_bottom=20
))
# Email input
name_input = toga.TextInput(
placeholder="Could be you here",
style=Pack(
width=250,
margin_bottom=10
)
)
# Password input
password_input = toga.PasswordInput(
placeholder="Feeling lucky?",
style=Pack(
width=250,
margin_bottom=20
)
)
# Login button
login_button = toga.Button(
icon=toga.Icon("images/save"),
style=Pack(
width=50,
margin=10,
background_color="white"
),
on_press=self.login_button_press)
login_area= toga.Box(
children=[login_button],
style=Pack(
width=250,
direction=ROW,
align_items=START,
margin=20
)
)
# Main content box (centered)
content_box = toga.Column(
children=[
title,
name_input,
password_input,
login_area
],
style=Pack(
align_items=CENTER,
height=SCREENHEIGHT - 50, # iPhone height
margin=20,
)
)
# Outer box to simulate iPhone screen
screen = toga.Column(
children=[menu_bar,
liner,
content_box],
style=Pack(
width=SCREENWIDTH, # iPhone width
)
)
self.add(screen)
def login_button_press(self, widget):
print("pressesd")
+107
View File
@@ -0,0 +1,107 @@
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW, END, START, CENTER
from justgetit.constants import SCREENHEIGHT, SCREENWIDTH
class Register(toga.Box):
def __init__(self, navigate_to, *args, **kwargs):
super().__init__(*args, **kwargs)
self.navigate_to= navigate_to
register_button = toga.Button(
icon=toga.Icon("images/login"),
style=Pack(
width=50,
margin=5,
),
id="login",
on_press=self.navigate_to)
liner = toga.Box(style=Pack(width=SCREENWIDTH, height = 2, background_color="#ddd"))
menu_bar= toga.Row(
children=[register_button, liner],
style=Pack(
justify_content=END,
width = SCREENWIDTH,
background_color="#eee"
)
)
# Title icon
my_image = toga.Image("images/register.png")
title = toga.ImageView(my_image, style=Pack(
width=50,
margin_bottom=20
))
# Email input
name_input = toga.TextInput(
placeholder="Gimme you wallet",
style=Pack(
width=250,
margin_bottom=10
)
)
# Password input
password_input = toga.PasswordInput(
placeholder="You have a secret?",
style=Pack(
width=250,
margin_bottom=20
)
)
# Login button
login_button = toga.Button(
icon=toga.Icon("images/save"),
style=Pack(
width=50,
margin=10,
background_color="white"
),
on_press=self.register_button_press)
login_area= toga.Box(
children=[login_button],
style=Pack(
width=250,
direction=ROW,
align_items=START,
margin=20
)
)
# Main content box (centered)
content_box = toga.Column(
children=[
title,
name_input,
password_input,
login_area
],
style=Pack(
align_items=CENTER,
height=SCREENHEIGHT - 50, # iPhone height
margin=20,
)
)
# Outer box to simulate iPhone screen
screen = toga.Column(
children=[menu_bar,
liner,
content_box],
style=Pack(
width=SCREENWIDTH, # iPhone width
)
)
self.add(screen)
def register_button_press(self, widget):
print("presses register")
+2
View File
@@ -0,0 +1,2 @@
Put any application resources (e.g., icons and resources) here;
they can be referenced in code as "resources/filename".
View File
+35
View File
@@ -0,0 +1,35 @@
import os
import sys
import tempfile
from pathlib import Path
import pytest
def run_tests():
project_path = Path(__file__).parent.parent
os.chdir(project_path)
# Determine any args to pass to pytest. If there aren't any,
# default to running the whole test suite.
args = sys.argv[1:]
if len(args) == 0:
args = ["tests"]
returncode = pytest.main(
[
# Turn up verbosity
"-vv",
# Disable color
"--color=no",
# Overwrite the cache directory to somewhere writable
"-o",
f"cache_dir={tempfile.gettempdir()}/.pytest_cache",
] + args
)
print(f">>>>>>>>>> EXIT {returncode} <<<<<<<<<<")
if __name__ == "__main__":
run_tests()
+3
View File
@@ -0,0 +1,3 @@
def test_first():
"""An initial test for the app."""
assert 1 + 1 == 2