pikapython/test/python/PikaUI/PikaUI_core.py

163 lines
3.3 KiB
Python
Raw Normal View History

import weakref
2023-02-09 23:17:40 +08:00
# class ALIGN(_backend.ALIGN): (vm not pass)
# pass
2023-02-09 23:17:40 +08:00
class _ALIGN:
CENTER = 0
TOP_MID = 1
2023-02-09 23:17:40 +08:00
ALIGN = _ALIGN
_backend = None
2023-02-09 23:17:40 +08:00
def set_backend(backend):
global _backend
global ALIGN
2023-02-22 21:59:28 +08:00
global app
2023-02-09 23:17:40 +08:00
_backend = backend
ALIGN = _backend.ALIGN
2023-02-22 21:59:28 +08:00
app = _App()
2023-02-09 23:17:40 +08:00
class Widget:
backend = None
width = 0
height = 0
pos = None
parent = None
align = None
text = None
isroot = False
2023-02-09 23:17:40 +08:00
_label = None
_child = []
def __init__(self,
2023-02-22 21:59:28 +08:00
text=None,
2023-02-09 23:17:40 +08:00
width=100,
height=100,
pos=None,
align=ALIGN.TOP_MID):
self.width = width
self.height = height
self.pos = pos
self.align = align
self.text = text
2023-02-22 21:59:28 +08:00
def build(self):
pass
2023-02-09 23:17:40 +08:00
def _setPerent(self, parent):
self.parent = weakref.ref(parent)
2023-02-09 23:17:40 +08:00
def update(self):
if self.parent is None:
print('self.parent is None')
2023-02-09 23:17:40 +08:00
return
if self.parent.backend is None:
print('self.parent.backend is None')
2023-02-09 23:17:40 +08:00
return
if self.backend is None:
self.backend = self._createBackend(self.parent)
if not self.isroot:
self._updateAlign(self.align)
self._updateAttr(self.width, self.height, self.pos)
self._updateText(self.text)
2023-02-09 23:17:40 +08:00
for c in self._child:
c.update()
def _createBackend(self, parent: "Widget"):
2023-02-22 20:39:59 +08:00
return _backend.widget(parent.backend)
2023-02-09 23:17:40 +08:00
def _updateAttr(self,
width,
height,
pos):
self.backend.set_width(width)
self.backend.set_height(height)
if not pos is None:
self.backend.set_pos(pos[0], pos[1])
def _updateAlign(self, align):
self.backend.align(align, 0, 0)
def _updateText(self, text):
if not None is text:
self._label = _backend.label(self.backend)
self._label.set_text(self.text)
self._label.align(_backend.ALIGN.CENTER, 0, 0)
def add(self, *child):
for c in child:
c._setPerent(self)
self._child.append(c)
return self
2023-02-22 21:59:28 +08:00
class Page(Widget):
def __init__(self):
super().__init__()
self._setPerent(self)
self.isroot = True
self.backend = _backend.Screen()
2023-02-09 23:17:40 +08:00
class Button(Widget):
def _createBackend(self, parent: Widget):
return _backend.btn(parent.backend)
class Text(Widget):
def _createBackend(self, parent: Widget):
return _backend.label(parent.backend)
def _updateText(self, text):
self.backend.set_text(text)
2023-02-22 21:59:28 +08:00
class PageManager:
pageThis = None
pageList = []
2023-02-22 22:05:08 +08:00
def enter(self, page: Page):
2023-02-22 22:08:18 +08:00
self.clean()
2023-02-22 21:59:28 +08:00
self.pageThis = page
self.pageList.append(page)
page.build()
self.update()
2023-02-22 22:05:08 +08:00
def back(self):
2023-02-22 21:59:28 +08:00
if len(self.pageList) <= 1:
return
_ = self.pageList.pop()
self.pageThis = self.pageList[-1]
2023-02-22 22:05:08 +08:00
self.clean()
2023-02-22 21:59:28 +08:00
self.update()
def update(self):
if self.pageThis is None:
return
self.pageThis.update()
2023-02-22 22:05:08 +08:00
def clean(self):
_backend.clean()
2023-02-22 21:59:28 +08:00
class _App:
pageManager = PageManager()
def update(self):
self.pageManager.update()
app = _App()
2023-02-09 23:17:40 +08:00
2023-02-22 21:59:28 +08:00
def App():
return app