Procházet zdrojové kódy

spike: add timer and groups; simplify ui and nice_gui

Falko Schindler před 4 roky
rodič
revize
35b39ad3fc

+ 0 - 8
spike_classes/elements/element.py

@@ -10,11 +10,3 @@ class Element:
         self.view_stack[-1].add(view)
         view.add_page(self.wp)
         self.view = view
-
-    def __enter__(self):
-
-        self.view_stack.append(self.view)
-
-    def __exit__(self, *_):
-
-        self.view_stack.pop()

+ 11 - 0
spike_classes/elements/group.py

@@ -0,0 +1,11 @@
+from elements.element import Element
+
+class Group(Element):
+
+    def __enter__(self):
+
+        self.view_stack.append(self.view)
+
+    def __exit__(self, *_):
+
+        self.view_stack.pop()

+ 9 - 0
spike_classes/elements/row.py

@@ -0,0 +1,9 @@
+import justpy as jp
+from elements.group import Group
+
+class Row(Group):
+
+    def __init__(self):
+
+        view = jp.QDiv(classes='row items-start', style='gap: 1em', delete_flag=False)
+        super().__init__(view)

+ 7 - 0
spike_classes/main.py

@@ -3,3 +3,10 @@ from nice_gui import ui
 
 ui.label('Hello world!')
 ui.button('Click me')
+
+with ui.row():
+    ui.label('left')
+    ui.label('right')
+
+t = ui.label('Timer')
+ui.timer(1.0, lambda: setattr(t.view, 'text', t.view.text + '.'))

+ 8 - 2
spike_classes/nice_gui.py

@@ -4,10 +4,11 @@ import uvicorn
 import sys
 import inspect
 from ui import Ui
+from timer import Timer
 from elements.element import Element
 
 if not inspect.stack()[-2].filename.endswith('spawn.py'):
-    uvicorn.run('nice_gui:ui', host='0.0.0.0', port=80, lifespan='on', reload=True)
+    uvicorn.run('nice_gui:app', host='0.0.0.0', port=80, lifespan='on', reload=True)
     sys.exit()
 
 wp = jp.QuasarPage(delete_flag=False, head_html='<script>confirm = () => true;</script>')
@@ -16,7 +17,12 @@ main = jp.Div(a=wp, classes='q-ma-md column items-start', style='row-gap: 1em')
 main.add_page(wp)
 jp.justpy(lambda: wp, start_server=False)
 
+@jp.app.on_event('startup')
+def startup():
+    [jp.run_task(t) for t in Timer.tasks]
+
 Element.view_stack = [main]
 Element.wp = wp
 
-ui = Ui()
+app = jp.app
+ui = Ui

+ 19 - 0
spike_classes/timer.py

@@ -0,0 +1,19 @@
+import asyncio
+from elements.element import Element
+
+class Timer:
+
+    tasks = []
+
+    def __init__(self, interval, callback):
+
+        parent = Element.view_stack[-1]
+
+        async def loop():
+
+            while True:
+                callback()
+                await parent.update()
+                await asyncio.sleep(interval)
+
+        self.tasks.append(loop())

+ 3 - 14
spike_classes/ui.py

@@ -1,17 +1,6 @@
-import justpy as jp
-from starlette.applications import Starlette
-
-class Ui(Starlette):
+class Ui:
 
     from elements.label import Label as label
     from elements.button import Button as button
-
-    def __init__(self):
-        # NOTE: we enhance our own ui object with all capabilities of jp.app
-        self.__dict__.update(jp.app.__dict__)
-
-        self.tasks = []
-
-        @self.on_event('startup')
-        def startup():
-            [jp.run_task(t) for t in self.tasks]
+    from elements.row import Row as row
+    from timer import Timer as timer