qpuiq 0.16__tar.gz → 0.18__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of qpuiq might be problematic. Click here for more details.

Files changed (108) hide show
  1. {qpuiq-0.16/qpuiq.egg-info → qpuiq-0.18}/PKG-INFO +4 -13
  2. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/base.py +23 -21
  3. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/canvas.py +20 -7
  4. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/layout.py +68 -0
  5. {qpuiq-0.16 → qpuiq-0.18}/PUI/__init__.py +1 -1
  6. {qpuiq-0.16 → qpuiq-0.18}/PUI/dom.py +12 -0
  7. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/__init__.py +1 -0
  8. qpuiq-0.18/PUI/flet/divider.py +14 -0
  9. {qpuiq-0.16 → qpuiq-0.18}/PUI/node.py +3 -0
  10. {qpuiq-0.16 → qpuiq-0.18}/README.md +3 -12
  11. {qpuiq-0.16 → qpuiq-0.18/qpuiq.egg-info}/PKG-INFO +4 -13
  12. {qpuiq-0.16 → qpuiq-0.18}/qpuiq.egg-info/SOURCES.txt +1 -0
  13. {qpuiq-0.16 → qpuiq-0.18}/LICENSE.txt +0 -0
  14. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/__init__.py +0 -0
  15. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/application.py +0 -0
  16. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/button.py +0 -0
  17. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/checkbox.py +0 -0
  18. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/combobox.py +0 -0
  19. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/dialog.py +0 -0
  20. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/divider.py +0 -0
  21. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/image.py +0 -0
  22. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/label.py +0 -0
  23. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/matplotlib.py +0 -0
  24. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/mdi.py +0 -0
  25. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/menu.py +0 -0
  26. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/modal.py +0 -0
  27. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/progressbar.py +0 -0
  28. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/radiobutton.py +0 -0
  29. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/scroll.py +0 -0
  30. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/splitter.py +0 -0
  31. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/tab.py +0 -0
  32. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/table.py +0 -0
  33. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/text.py +0 -0
  34. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/textfield.py +0 -0
  35. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/toolbar.py +0 -0
  36. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/tree.py +0 -0
  37. {qpuiq-0.16 → qpuiq-0.18}/PUI/PySide6/window.py +0 -0
  38. {qpuiq-0.16 → qpuiq-0.18}/PUI/common.py +0 -0
  39. {qpuiq-0.16 → qpuiq-0.18}/PUI/decorator.py +0 -0
  40. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/application.py +0 -0
  41. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/base.py +0 -0
  42. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/button.py +0 -0
  43. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/canvas.py +0 -0
  44. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/checkbox.py +0 -0
  45. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/label.py +0 -0
  46. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/layout.py +0 -0
  47. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/progressbar.py +0 -0
  48. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/radiobutton.py +0 -0
  49. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/scroll.py +0 -0
  50. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/tab.py +0 -0
  51. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/text.py +0 -0
  52. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/textfield.py +0 -0
  53. {qpuiq-0.16 → qpuiq-0.18}/PUI/flet/window.py +0 -0
  54. {qpuiq-0.16 → qpuiq-0.18}/PUI/interfaces.py +0 -0
  55. {qpuiq-0.16 → qpuiq-0.18}/PUI/state.py +0 -0
  56. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/__init__.py +0 -0
  57. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/application.py +0 -0
  58. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/base.py +0 -0
  59. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/button.py +0 -0
  60. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/checkbox.py +0 -0
  61. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/label.py +0 -0
  62. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/layout.py +0 -0
  63. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/progressbar.py +0 -0
  64. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/radiobutton.py +0 -0
  65. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/scroll.py +0 -0
  66. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/tab.py +0 -0
  67. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/text.py +0 -0
  68. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/textfield.py +0 -0
  69. {qpuiq-0.16 → qpuiq-0.18}/PUI/textual/window.py +0 -0
  70. {qpuiq-0.16 → qpuiq-0.18}/PUI/timeline.py +0 -0
  71. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/__init__.py +0 -0
  72. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/application.py +0 -0
  73. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/base.py +0 -0
  74. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/button.py +0 -0
  75. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/canvas.py +0 -0
  76. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/checkbox.py +0 -0
  77. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/label.py +0 -0
  78. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/layout.py +0 -0
  79. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/progressbar.py +0 -0
  80. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/radiobutton.py +0 -0
  81. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/scroll.py +0 -0
  82. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/tab.py +0 -0
  83. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/text.py +0 -0
  84. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/textfield.py +0 -0
  85. {qpuiq-0.16 → qpuiq-0.18}/PUI/tkinter/window.py +0 -0
  86. {qpuiq-0.16 → qpuiq-0.18}/PUI/utils.py +0 -0
  87. {qpuiq-0.16 → qpuiq-0.18}/PUI/view.py +0 -0
  88. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/__init__.py +0 -0
  89. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/application.py +0 -0
  90. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/base.py +0 -0
  91. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/button.py +0 -0
  92. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/canvas.py +0 -0
  93. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/checkbox.py +0 -0
  94. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/combobox.py +0 -0
  95. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/dialog.py +0 -0
  96. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/divider.py +0 -0
  97. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/label.py +0 -0
  98. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/layout.py +0 -0
  99. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/progressbar.py +0 -0
  100. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/radiobutton.py +0 -0
  101. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/scroll.py +0 -0
  102. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/text.py +0 -0
  103. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/textfield.py +0 -0
  104. {qpuiq-0.16 → qpuiq-0.18}/PUI/wx/window.py +0 -0
  105. {qpuiq-0.16 → qpuiq-0.18}/qpuiq.egg-info/dependency_links.txt +0 -0
  106. {qpuiq-0.16 → qpuiq-0.18}/qpuiq.egg-info/top_level.txt +0 -0
  107. {qpuiq-0.16 → qpuiq-0.18}/setup.cfg +0 -0
  108. {qpuiq-0.16 → qpuiq-0.18}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qpuiq
3
- Version: 0.16
3
+ Version: 0.18
4
4
  Summary: "PUI" Python Declarative UI Framework
5
5
  Home-page: https://github.com/buganini/PUI
6
6
  Author: Buganini Chiu
@@ -213,38 +213,29 @@ Then PUI will take care of view update [(code)](https://github.com/buganini/PUI/
213
213
  * no canvas
214
214
 
215
215
  # Documents
216
- * [Components Reference](REFERENCE.md)
217
- * [Sizing Strategy](https://html-preview.github.io/?url=https://github.com/buganini/PUI/blob/main/doc/Sizing.html)
216
+ * [Components Reference](https://buganini.github.io/PUI/doc/Reference.html)
217
+ * [Layout Strategy](https://buganini.github.io/PUI/doc/Layout.html)
218
218
 
219
219
  # Used by
220
- * https://github.com/buganini/kikit-ui
220
+ * https://github.com/buganini/Kikakuka
221
221
  * https://github.com/solvcon/modmesh
222
222
 
223
223
  # TODO
224
- * Merge node and view
225
224
  * Dump with layout parameters and add test cases
226
225
  * [Toga](https://beeware.org/project/projects/libraries/toga/)
227
- * [ISSUE] textual layout sizing (cookbook scroll example)
228
226
  * [ISSUE] flet layout sizing (cookbook scroll example)
229
227
  * nested state trigger
230
228
  * set state in PUIView __init__
231
229
  * set state in setup() ?
232
230
  * Tabs(`tabposition`)
233
231
  * Lazy List
234
- * StateObject decorator
235
232
  * UI Flow
236
233
  * Navigation Stack
237
234
  * View Router
238
235
  * Model Window/Dialog
239
236
  * Layout
240
- * ZBox
241
237
  * SwiftUI style overlay ??
242
238
  * Canvas
243
- * Rect
244
239
  * Arc
245
- * Image
246
240
  * ...
247
- * Table
248
- * Tree
249
- * Dialog
250
241
  * State with Pydantic support?
@@ -132,17 +132,17 @@ class QtBaseWidget(PUINode):
132
132
 
133
133
  def handleDragEnterEvent(self, event):
134
134
  if self._onDragEntered:
135
- self._onDragEntered[0](event, *self._onDragEntered[1], **self._onDragEntered[2])
135
+ return self._onDragEntered[0](event, *self._onDragEntered[1], **self._onDragEntered[2])
136
136
  else:
137
- event.setDropAction(QtCore.Qt.CopyAction)
138
- event.accept()
137
+ event.ignore()
138
+ return True
139
139
 
140
140
  def handleDropEvent(self, event):
141
141
  if self._onDropped:
142
- self._onDropped[0](event, *self._onDropped[1], **self._onDropped[2])
142
+ return self._onDropped[0](event, *self._onDropped[1], **self._onDropped[2])
143
143
  else:
144
- print("Dropped", event)
145
144
  event.ignore()
145
+ return False
146
146
 
147
147
  def qtSizeHint(self):
148
148
  node = self.get_node()
@@ -162,7 +162,11 @@ class QtBaseWidget(PUINode):
162
162
  self.qt_params[k] = v
163
163
  return self
164
164
 
165
- class QtBaseLayout(PUINode):
165
+ class QtBaseLayout(QtBaseWidget):
166
+ pui_terminal = False
167
+ container_x = False
168
+ container_y = False
169
+
166
170
  def __init__(self):
167
171
  super().__init__()
168
172
  self.qt_params = {}
@@ -178,11 +182,7 @@ class QtBaseLayout(PUINode):
178
182
  return self.layout
179
183
 
180
184
  def destroy(self, direct):
181
- if direct:
182
- if self.ui:
183
- self.ui.deleteLater()
184
185
  self.layout = None
185
- self.ui = None
186
186
  super().destroy(direct)
187
187
 
188
188
  def update(self, prev=None):
@@ -192,7 +192,6 @@ class QtBaseLayout(PUINode):
192
192
  self.mounted_children = []
193
193
 
194
194
  super().update(prev)
195
- _apply_params(self.ui, self)
196
195
 
197
196
  def addChild(self, idx, child):
198
197
  from .modal import Modal
@@ -222,19 +221,22 @@ class QtBaseLayout(PUINode):
222
221
  self.mounted_children.pop(idx)
223
222
 
224
223
  def postUpdate(self):
225
- super().postUpdate()
224
+ if self.ui:
225
+ if self._onDropped:
226
+ self.ui.setAcceptDrops(True)
227
+ self.ui.installEventFilter(self.eventFilter)
228
+ else:
229
+ self.ui.setAcceptDrops(False)
226
230
 
227
- for i, child in enumerate(self.mounted_children):
228
- child = child.get_node()
229
- self.mounted_children[i] = child.get_node()
231
+ super().postUpdate()
230
232
 
231
- weight = child.layout_weight
232
- self.qtlayout.setStretch(i, weight if weight else 0)
233
+ if self.container_x or self.container_y:
234
+ for i, child in enumerate(self.mounted_children):
235
+ child = child.get_node()
236
+ self.mounted_children[i] = child.get_node()
233
237
 
234
- def qt(self, **kwargs):
235
- for k,v in kwargs.items():
236
- self.qt_params[k] = v
237
- return self
238
+ weight = child.layout_weight
239
+ self.qtlayout.setStretch(i, weight if weight else 0)
238
240
 
239
241
  class QtBaseFrame(QtBaseWidget):
240
242
  pui_terminal = False
@@ -73,15 +73,30 @@ class PUIQtCanvas(QtWidgets.QWidget):
73
73
 
74
74
  node.width = self.geometry().width()
75
75
  node.height = self.geometry().height()
76
- node.painter(node, *node.args)
77
-
76
+ immediate = node.painter(node, *node.args)
78
77
  node.qpainter.end()
79
78
  node.qpainter = None
79
+ if immediate:
80
+ self.update()
80
81
 
81
82
  class ImageResource():
82
- def scale(self, width, height):
83
+ @staticmethod
84
+ def load(path):
83
85
  ir = ImageResource()
84
- ir.qimage = self.qimage.scaled(width, height)
86
+ ir.qimage = QImage(path)
87
+ return ir
88
+
89
+ def crop(self, x, y, width, height):
90
+ ir = ImageResource()
91
+ ir.qimage = self.qimage.copy(x, y, width, height)
92
+ return ir
93
+
94
+ def scale(self, width, height, keepAspectRatio=True, quality=0):
95
+ ir = ImageResource()
96
+ method = {
97
+ 0: QtCore.Qt.TransformationMode.FastTransformation
98
+ }.get(quality, QtCore.Qt.TransformationMode.SmoothTransformation)
99
+ ir.qimage = self.qimage.scaled(width, height, QtCore.Qt.AspectRatioMode.KeepAspectRatio if keepAspectRatio else QtCore.Qt.IgnoreAspectRatio, method)
85
100
  return ir
86
101
 
87
102
  class Canvas(QtBaseWidget):
@@ -306,9 +321,7 @@ class Canvas(QtBaseWidget):
306
321
  raise RuntimeError(f"Not implemented: drawShapely({type(shape).__name__}) {dir(shape)}")
307
322
 
308
323
  def loadImage(self, image_path):
309
- ir = ImageResource()
310
- ir.qimage = QImage(image_path)
311
- return ir
324
+ return ImageResource.load(image_path)
312
325
 
313
326
  def drawImage(self, image, x=0, y=0, width=None, height=None, src_x=0, src_y=0, src_width=None, src_height=None, opacity=1.0):
314
327
  if image.qimage.isNull():
@@ -1,7 +1,74 @@
1
1
  from .. import *
2
2
  from .base import *
3
3
 
4
+ class Stack(QtBaseLayout):
5
+ pui_terminal = False
6
+ pui_reversed_order = True
7
+
8
+ def __init__(self):
9
+ super().__init__()
10
+ self.qt_params = {}
11
+ if not isinstance(self.non_virtual_parent, QtBaseLayout):
12
+ self.layout_padding = (11,11,11,11)
13
+
14
+ @property
15
+ def outer(self):
16
+ return self.ui
17
+
18
+ @property
19
+ def inner(self):
20
+ return self.layout
21
+
22
+ def destroy(self, direct):
23
+ self.layout = None
24
+ super().destroy(direct)
25
+
26
+ def update(self, prev=None):
27
+ if prev and prev.ui:
28
+ self.ui = prev.ui
29
+ self.qtlayout = prev.qtlayout
30
+ else:
31
+ self.ui = QtWidgets.QWidget()
32
+ self.qtlayout = QtWidgets.QStackedLayout()
33
+ self.qtlayout.setStackingMode(QtWidgets.QStackedLayout.StackAll)
34
+ self.qtlayout.setContentsMargins(0,0,0,0)
35
+ self.ui.setLayout(self.qtlayout)
36
+ super().update(prev)
37
+
38
+ def addChild(self, idx, child):
39
+ from .modal import Modal
40
+ from .layout import Spacer
41
+ if isinstance(child, Spacer):
42
+ pass
43
+ elif isinstance(child, Modal):
44
+ pass
45
+ elif isinstance(child, QtBaseWidget) or isinstance(child, QtBaseLayout):
46
+ self.qtlayout.insertWidget(idx, child.outer)
47
+ self.mounted_children.insert(idx, child)
48
+
49
+ def removeChild(self, idx, child):
50
+ from .modal import Modal
51
+ from .layout import Spacer
52
+ if isinstance(child, Spacer):
53
+ pass
54
+ elif isinstance(child, Modal):
55
+ pass
56
+ elif isinstance(child, QtBaseWidget) or isinstance(child, QtBaseLayout):
57
+ child.outer.setParent(None)
58
+ self.mounted_children.pop(idx)
59
+
60
+ def postUpdate(self):
61
+ if self.ui:
62
+ if self._onDropped:
63
+ self.ui.setAcceptDrops(True)
64
+ self.ui.installEventFilter(self.eventFilter)
65
+ else:
66
+ self.ui.setAcceptDrops(False)
67
+
68
+ super().postUpdate()
69
+
4
70
  class HBox(QtBaseLayout):
71
+ container_x = True
5
72
  def update(self, prev):
6
73
  if prev and prev.ui:
7
74
  self.ui = prev.ui
@@ -14,6 +81,7 @@ class HBox(QtBaseLayout):
14
81
  super().update(prev)
15
82
 
16
83
  class VBox(QtBaseLayout):
84
+ container_y = True
17
85
  def update(self, prev):
18
86
  if prev and prev.ui:
19
87
  self.ui = prev.ui
@@ -1,4 +1,4 @@
1
- __version__ = "0.16"
1
+ __version__ = "0.18"
2
2
 
3
3
  from .node import *
4
4
  from .view import *
@@ -49,6 +49,18 @@ def sync(node, dom_parent, dom_offset, oldVDOM, newVDOM, depth=0):
49
49
  if node.pui_grid_layout:
50
50
  sortGridDOMInPlace(oldVDOM)
51
51
  sortGridDOMInPlace(newVDOM)
52
+ else:
53
+ oldOrdered = [c for c in oldVDOM if not c.pui_outoforder]
54
+ oldOutOfOrdered = [c for c in oldVDOM if c.pui_outoforder]
55
+ newOrdered = [c for c in newVDOM if not c.pui_outoforder]
56
+ newOutOfOrdered = [c for c in newVDOM if c.pui_outoforder]
57
+
58
+ if node.pui_reversed_order:
59
+ oldOrdered.reverse()
60
+ newOrdered.reverse()
61
+
62
+ oldVDOM = oldOrdered + oldOutOfOrdered
63
+ newVDOM = newOrdered + newOutOfOrdered
52
64
 
53
65
  if DEBUG:
54
66
  print(f"{(depth+1)*' '}===OLD===")
@@ -2,6 +2,7 @@ from .application import *
2
2
  from .button import *
3
3
  from .canvas import *
4
4
  from .checkbox import *
5
+ from .divider import *
5
6
  from .label import *
6
7
  from .layout import *
7
8
  from .progressbar import *
@@ -0,0 +1,14 @@
1
+ from .. import *
2
+ from .base import *
3
+
4
+ class Divider(FBase):
5
+ def update(self, prev):
6
+ if prev and prev.ui:
7
+ self.ui = prev.ui
8
+ try:
9
+ self.ui.update()
10
+ except:
11
+ pass
12
+ else:
13
+ self.ui = ft.Divider()
14
+ self.ui.expand = self.layout_weight
@@ -27,6 +27,9 @@ class PUINode():
27
27
  # Menu and window-like UI elements, are out-of-order, so they are moved to the end of siblings before DOM syncing to simplify the process
28
28
  pui_outoforder = False
29
29
 
30
+ # When enabled, children are added in reverse order, used by Stack
31
+ pui_reversed_order = False
32
+
30
33
  # Used by PUIView
31
34
  pui_isview = False
32
35
 
@@ -196,38 +196,29 @@ Then PUI will take care of view update [(code)](https://github.com/buganini/PUI/
196
196
  * no canvas
197
197
 
198
198
  # Documents
199
- * [Components Reference](REFERENCE.md)
200
- * [Sizing Strategy](https://html-preview.github.io/?url=https://github.com/buganini/PUI/blob/main/doc/Sizing.html)
199
+ * [Components Reference](https://buganini.github.io/PUI/doc/Reference.html)
200
+ * [Layout Strategy](https://buganini.github.io/PUI/doc/Layout.html)
201
201
 
202
202
  # Used by
203
- * https://github.com/buganini/kikit-ui
203
+ * https://github.com/buganini/Kikakuka
204
204
  * https://github.com/solvcon/modmesh
205
205
 
206
206
  # TODO
207
- * Merge node and view
208
207
  * Dump with layout parameters and add test cases
209
208
  * [Toga](https://beeware.org/project/projects/libraries/toga/)
210
- * [ISSUE] textual layout sizing (cookbook scroll example)
211
209
  * [ISSUE] flet layout sizing (cookbook scroll example)
212
210
  * nested state trigger
213
211
  * set state in PUIView __init__
214
212
  * set state in setup() ?
215
213
  * Tabs(`tabposition`)
216
214
  * Lazy List
217
- * StateObject decorator
218
215
  * UI Flow
219
216
  * Navigation Stack
220
217
  * View Router
221
218
  * Model Window/Dialog
222
219
  * Layout
223
- * ZBox
224
220
  * SwiftUI style overlay ??
225
221
  * Canvas
226
- * Rect
227
222
  * Arc
228
- * Image
229
223
  * ...
230
- * Table
231
- * Tree
232
- * Dialog
233
224
  * State with Pydantic support?
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qpuiq
3
- Version: 0.16
3
+ Version: 0.18
4
4
  Summary: "PUI" Python Declarative UI Framework
5
5
  Home-page: https://github.com/buganini/PUI
6
6
  Author: Buganini Chiu
@@ -213,38 +213,29 @@ Then PUI will take care of view update [(code)](https://github.com/buganini/PUI/
213
213
  * no canvas
214
214
 
215
215
  # Documents
216
- * [Components Reference](REFERENCE.md)
217
- * [Sizing Strategy](https://html-preview.github.io/?url=https://github.com/buganini/PUI/blob/main/doc/Sizing.html)
216
+ * [Components Reference](https://buganini.github.io/PUI/doc/Reference.html)
217
+ * [Layout Strategy](https://buganini.github.io/PUI/doc/Layout.html)
218
218
 
219
219
  # Used by
220
- * https://github.com/buganini/kikit-ui
220
+ * https://github.com/buganini/Kikakuka
221
221
  * https://github.com/solvcon/modmesh
222
222
 
223
223
  # TODO
224
- * Merge node and view
225
224
  * Dump with layout parameters and add test cases
226
225
  * [Toga](https://beeware.org/project/projects/libraries/toga/)
227
- * [ISSUE] textual layout sizing (cookbook scroll example)
228
226
  * [ISSUE] flet layout sizing (cookbook scroll example)
229
227
  * nested state trigger
230
228
  * set state in PUIView __init__
231
229
  * set state in setup() ?
232
230
  * Tabs(`tabposition`)
233
231
  * Lazy List
234
- * StateObject decorator
235
232
  * UI Flow
236
233
  * Navigation Stack
237
234
  * View Router
238
235
  * Model Window/Dialog
239
236
  * Layout
240
- * ZBox
241
237
  * SwiftUI style overlay ??
242
238
  * Canvas
243
- * Rect
244
239
  * Arc
245
- * Image
246
240
  * ...
247
- * Table
248
- * Tree
249
- * Dialog
250
241
  * State with Pydantic support?
@@ -44,6 +44,7 @@ PUI/flet/base.py
44
44
  PUI/flet/button.py
45
45
  PUI/flet/canvas.py
46
46
  PUI/flet/checkbox.py
47
+ PUI/flet/divider.py
47
48
  PUI/flet/label.py
48
49
  PUI/flet/layout.py
49
50
  PUI/flet/progressbar.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes