qpuiq 0.11__py3-none-any.whl → 0.12__py3-none-any.whl

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.

PUI/PySide6/base.py CHANGED
@@ -72,6 +72,19 @@ class QtPUIView(PUIView):
72
72
  self.qt_params[k] = v
73
73
  return self
74
74
 
75
+ class EventFilter(QtCore.QObject):
76
+ def __init__(self):
77
+ super().__init__()
78
+ self.node = None
79
+
80
+ def eventFilter(self, obj, event):
81
+ node = self.node.get_node()
82
+ if event.type() == QtCore.QEvent.DragEnter:
83
+ return node.handleDragEnterEvent(event)
84
+ elif event.type() == QtCore.QEvent.Drop:
85
+ return node.handleDropEvent(event)
86
+ return super().eventFilter(obj, event)
87
+
75
88
  class QtBaseWidget(PUINode):
76
89
  pui_terminal = True
77
90
 
@@ -89,6 +102,12 @@ class QtBaseWidget(PUINode):
89
102
  def update(self, prev=None):
90
103
  super().update(prev)
91
104
 
105
+ if prev:
106
+ self.eventFilter = prev.eventFilter
107
+ else:
108
+ self.eventFilter = EventFilter()
109
+ self.eventFilter.node = self
110
+
92
111
  sizePolicy = self.ui.sizePolicy()
93
112
  if self.layout_width is not None:
94
113
  sizePolicy.setHorizontalPolicy(QtWidgets.QSizePolicy.Preferred)
@@ -102,6 +121,29 @@ class QtBaseWidget(PUINode):
102
121
 
103
122
  _apply_params(self.ui, self)
104
123
 
124
+ def postUpdate(self):
125
+ if self.ui:
126
+ if self._onDropped:
127
+ self.ui.setAcceptDrops(True)
128
+ self.ui.installEventFilter(self.eventFilter)
129
+ else:
130
+ self.ui.setAcceptDrops(False)
131
+ super().postUpdate()
132
+
133
+ def handleDragEnterEvent(self, event):
134
+ if self._onDragEntered:
135
+ self._onDragEntered[0](event, *self._onDragEntered[1], **self._onDragEntered[2])
136
+ else:
137
+ event.setDropAction(QtCore.Qt.CopyAction)
138
+ event.accept()
139
+
140
+ def handleDropEvent(self, event):
141
+ if self._onDropped:
142
+ self._onDropped[0](event, *self._onDropped[1], **self._onDropped[2])
143
+ else:
144
+ print("Dropped", event)
145
+ event.ignore()
146
+
105
147
  def qtSizeHint(self):
106
148
  node = self.get_node()
107
149
  if not node.ui:
PUI/PySide6/table.py CHANGED
@@ -49,8 +49,45 @@ class QtTableModelAdapter(QtCore.QAbstractTableModel):
49
49
  return self.model.columnCount()
50
50
 
51
51
 
52
+ class QtTableNodeModelAdapter(QtCore.QAbstractTableModel):
53
+ def __init__(self, children):
54
+ super().__init__()
55
+ self.children = children
56
+
57
+ def data(self, index, role):
58
+ if role == QtCore.Qt.DisplayRole:
59
+ data = self.children[index.row()].children[index.column()].data
60
+ if isinstance(data, BaseBinding):
61
+ return str(data.value)
62
+ return data
63
+ return None
64
+
65
+ def setData(self, index, value, role):
66
+ if role == QtCore.Qt.EditRole:
67
+ n = self.children[index.row()].children[index.column()]
68
+ if isinstance(n.data, BaseBinding):
69
+ n.data.value = value
70
+ else:
71
+ n._set(value)
72
+ return True
73
+
74
+ def flags(self, index):
75
+ flags = super().flags(index)
76
+ n = self.children[index.row()].children[index.column()]
77
+ if isinstance(n.data, BaseBinding) or n._set_callback:
78
+ flags |= QtCore.Qt.ItemIsEditable
79
+ return flags
80
+
81
+ def rowCount(self, index):
82
+ return len(self.children)
83
+
84
+ def columnCount(self, index):
85
+ if self.children:
86
+ return len(self.children[0].children)
87
+ return 0
88
+
52
89
  class Table(QtBaseWidget):
53
- def __init__(self, model, autofit=True):
90
+ def __init__(self, model=None, autofit=True):
54
91
  super().__init__()
55
92
  self.layout_weight = 1
56
93
  self.model = model
@@ -67,23 +104,44 @@ class Table(QtBaseWidget):
67
104
  self.curr_model = Prop()
68
105
  self.ui = QtWidgets.QTableView()
69
106
 
70
- if self.model.columnHeader is None:
71
- self.ui.horizontalHeader().hide()
72
- else:
73
- self.ui.horizontalHeader().show()
107
+ if self.model:
108
+ if self.model.columnHeader is None:
109
+ self.ui.horizontalHeader().hide()
110
+ else:
111
+ self.ui.horizontalHeader().show()
74
112
 
75
- if self.model.rowHeader is None:
76
- self.ui.verticalHeader().hide()
77
- else:
78
- self.ui.verticalHeader().show()
113
+ if self.model.rowHeader is None:
114
+ self.ui.verticalHeader().hide()
115
+ else:
116
+ self.ui.verticalHeader().show()
79
117
 
80
- if self.curr_model.set(self.model):
81
- self.qt_model = QtTableModelAdapter(self.model)
82
- self.ui.setModel(self.qt_model)
118
+ if self.curr_model.set(self.model):
119
+ self.qt_model = QtTableModelAdapter(self.model)
120
+ self.ui.setModel(self.qt_model)
121
+ else:
122
+ self.qt_model.refresh()
83
123
  else:
84
- self.qt_model.refresh()
124
+ self.ui.horizontalHeader().hide()
125
+ self.ui.verticalHeader().hide()
126
+ self.qt_model = QtTableNodeModelAdapter(self.children)
127
+ self.ui.setModel(self.qt_model)
85
128
 
86
129
  if self.autofit:
87
130
  self.ui.resizeColumnsToContents()
88
131
 
89
132
  super().update(prev)
133
+
134
+ class TableNode(PUINode):
135
+ def __init__(self, data=""):
136
+ super().__init__()
137
+ self._set_callback = None
138
+ self.data = data
139
+
140
+ def set(self, cb, *args, **kwargs):
141
+ self._set_callback = (cb, args, kwargs)
142
+ return self
143
+
144
+ def _set(self, data):
145
+ if self._set_callback:
146
+ cb, args, kwargs = self._set_callback
147
+ cb(data, *args, **kwargs)
PUI/PySide6/tree.py CHANGED
@@ -6,6 +6,7 @@ class QAbstractItemModelAdapter(QtCore.QAbstractItemModel):
6
6
  def __init__(self, model: "BaseTreeAdapter"):
7
7
  super().__init__()
8
8
  self.model = model
9
+ self.node = None
9
10
 
10
11
  def index(self, row, column, parent = QtCore.QModelIndex()):
11
12
  parent_node = parent.internalPointer() if parent.isValid() else None
@@ -14,6 +15,27 @@ class QAbstractItemModelAdapter(QtCore.QAbstractItemModel):
14
15
  return self.createIndex(row, column, child)
15
16
  return QtCore.QModelIndex()
16
17
 
18
+ def flags(self, index):
19
+ if not index.isValid():
20
+ return QtCore.Qt.ItemIsDropEnabled
21
+
22
+ defaultFlags = super().flags(index)
23
+
24
+ return defaultFlags | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEditable
25
+
26
+ def canDropMimeData(self, data, action, row, column, parent):
27
+ if parent.isValid():
28
+ pass
29
+ else:
30
+ return bool(self.node._onDropped)
31
+
32
+ def dropMimeData(self, data, action, row, column, parent):
33
+ if parent.isValid():
34
+ pass
35
+ else:
36
+ event = QtGui.QDropEvent(QtCore.QPoint(0,0), action, data, QtCore.Qt.MouseButton.LeftButton, QtCore.Qt.KeyboardModifier.NoModifier, QtCore.QEvent.Drop)
37
+ self.node._onDropped[0](event, *self.node._onDropped[1], **self.node._onDropped[2])
38
+
17
39
  def parent(self, index):
18
40
  if not index.isValid():
19
41
  return QModelIndex()
@@ -42,9 +64,94 @@ class QAbstractItemModelAdapter(QtCore.QAbstractItemModel):
42
64
  parent_node = parent.internalPointer() if parent.isValid() else None
43
65
  return self.model.rowCount(parent_node) > 0
44
66
 
67
+ def clicked(self, node):
68
+ self.model.clicked(node)
69
+
70
+ def dblclicked(self, node):
71
+ self.model.dblclicked(node)
72
+
73
+ def expanded(self, node):
74
+ self.model.expanded(node)
75
+
76
+ def collapsed(self, node):
77
+ self.model.collapsed(node)
78
+
79
+ class QTreeNodeModelAdapter(QtCore.QAbstractItemModel):
80
+ def __init__(self, rootnode):
81
+ super().__init__()
82
+ self.node = None
83
+ self.rootnode = rootnode
84
+
85
+ def index(self, row, column, parent = QtCore.QModelIndex()):
86
+ parent_node = parent.internalPointer() if parent.isValid() else self.rootnode
87
+ if 0 <= row and row < len(parent_node.children):
88
+ child = parent_node.children[row]
89
+ return self.createIndex(row, column, child)
90
+ return QtCore.QModelIndex()
91
+
92
+ def flags(self, index):
93
+ if not index.isValid():
94
+ return QtCore.Qt.ItemIsDropEnabled
95
+
96
+ defaultFlags = super().flags(index)
97
+
98
+ return defaultFlags | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEditable
99
+
100
+ def canDropMimeData(self, data, action, row, column, parent):
101
+ if parent.isValid():
102
+ pass
103
+ else:
104
+ return bool(self.node._onDropped)
105
+
106
+ def dropMimeData(self, data, action, row, column, parent):
107
+ if parent.isValid():
108
+ pass
109
+ else:
110
+ event = QtGui.QDropEvent(QtCore.QPoint(0,0), action, data, QtCore.Qt.MouseButton.LeftButton, QtCore.Qt.KeyboardModifier.NoModifier, QtCore.QEvent.Drop)
111
+ self.node._onDropped[0](event, *self.node._onDropped[1], **self.node._onDropped[2])
112
+
113
+ def parent(self, index):
114
+ if not index.isValid():
115
+ return QModelIndex()
116
+ node = index.internalPointer()
117
+ parent_node = node.parent
118
+ if parent_node:
119
+ return self.createIndex(0, 0, parent_node)
120
+ return QModelIndex()
121
+
122
+ def data(self, index, role):
123
+ if not index.isValid():
124
+ return None
125
+ node = index.internalPointer()
126
+ if role == QtCore.Qt.DisplayRole:
127
+ return node.data
128
+ return None
129
+
130
+ def rowCount(self, parent):
131
+ parent_node = parent.internalPointer() if parent.isValid() else self.rootnode
132
+ return len(parent_node.children)
133
+
134
+ def columnCount(self, parent):
135
+ return 1
136
+
137
+ def hasChildren(self, parent):
138
+ parent_node = parent.internalPointer() if parent.isValid() else self.rootnode
139
+ return len(parent_node.children) > 0
140
+
141
+ def clicked(self, node):
142
+ node._clicked(None)
143
+
144
+ def dblclicked(self, node):
145
+ node._dblclicked(None)
146
+
147
+ def expanded(self, node):
148
+ node._expanded()
149
+
150
+ def collapsed(self, node):
151
+ node._collapsed()
45
152
 
46
153
  class Tree(QtBaseWidget):
47
- def __init__(self, model):
154
+ def __init__(self, model=None):
48
155
  super().__init__()
49
156
  self.layout_weight = 1
50
157
  self.model = model
@@ -66,11 +173,17 @@ class Tree(QtBaseWidget):
66
173
  self.ui.expanded.connect(self.on_item_expanded)
67
174
  self.ui.collapsed.connect(self.on_item_collapsed)
68
175
 
69
- if self.curr_model.set(self.model):
70
- self.qt_model = QAbstractItemModelAdapter(self.model)
71
- self.ui.setModel(self.qt_model)
176
+ if self.model:
177
+ if self.curr_model.set(self.model):
178
+ self.qt_model = QAbstractItemModelAdapter(self.model)
179
+ self.qt_model.node = self
180
+ self.ui.setModel(self.qt_model)
181
+ else:
182
+ self.qt_model.modelReset.emit()
72
183
  else:
73
- self.qt_model.modelReset.emit()
184
+ self.qt_model = QTreeNodeModelAdapter(self)
185
+ self.qt_model.node = self
186
+ self.ui.setModel(self.qt_model)
74
187
 
75
188
  for pending in self.pendings:
76
189
  pending[0](*pending[1:])
@@ -99,22 +212,66 @@ class Tree(QtBaseWidget):
99
212
  self.pendings.append([self.expandable, enabled])
100
213
  return self
101
214
 
215
+ def expand(self, cb, *args, **kwargs):
216
+ self._expand_callback = (cb, args, kwargs)
217
+ return self
218
+
219
+ def _expanded(self):
220
+ if self._expand_callback:
221
+ cb, args, kwargs = self._expand_callback
222
+ cb(*args, **kwargs)
223
+
224
+ def collapse(self, cb, *args, **kwargs):
225
+ self._collapse_callback = (cb, args, kwargs)
226
+ return self
227
+
228
+ def _collapsed(self):
229
+ if self._collapse_callback:
230
+ cb, args, kwargs = self._collapse_callback
231
+ cb(*args, **kwargs)
232
+
102
233
  def on_item_clicked(self, index):
103
234
  node = self.get_node()
104
235
  treenode = index.internalPointer()
105
- node.model.clicked(treenode)
236
+ self.qt_model.clicked(treenode)
106
237
 
107
238
  def on_item_double_clicked(self, index):
108
239
  node = self.get_node()
109
240
  treenode = index.internalPointer()
110
- node.model.dblclicked(treenode)
241
+ self.qt_model.dblclicked(treenode)
111
242
 
112
243
  def on_item_expanded(self, index):
113
244
  node = self.get_node()
114
245
  treenode = index.internalPointer()
115
- node.model.expanded(treenode)
246
+ self.qt_model.expanded(treenode)
116
247
 
117
248
  def on_item_collapsed(self, index):
118
249
  node = self.get_node()
119
250
  treenode = index.internalPointer()
120
- node.model.collapsed(treenode)
251
+ self.qt_model.collapsed(treenode)
252
+
253
+ class TreeNode(PUINode):
254
+ def __init__(self, data=""):
255
+ super().__init__()
256
+ self._set_callback = None
257
+ self.data = data
258
+ self._expand_callback = None
259
+ self._collapse_callback = None
260
+
261
+ def expand(self, cb, *args, **kwargs):
262
+ self._expand_callback = (cb, args, kwargs)
263
+ return self
264
+
265
+ def _expanded(self):
266
+ if self._expand_callback:
267
+ cb, args, kwargs = self._expand_callback
268
+ cb(*args, **kwargs)
269
+
270
+ def collapse(self, cb, *args, **kwargs):
271
+ self._collapse_callback = (cb, args, kwargs)
272
+ return self
273
+
274
+ def _collapsed(self):
275
+ if self._collapse_callback:
276
+ cb, args, kwargs = self._collapse_callback
277
+ cb(*args, **kwargs)
PUI/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.11"
1
+ __version__ = "0.12"
2
2
 
3
3
  from .node import *
4
4
  from .view import *
PUI/node.py CHANGED
@@ -73,6 +73,8 @@ class PUINode():
73
73
  self._onMouseUp = None
74
74
  self._onMouseMove = None
75
75
  self._onWheel = None
76
+ self._onDragEntered = None
77
+ self._onDropped = None
76
78
 
77
79
  self.ui = None
78
80
  self.args = args
@@ -306,6 +308,14 @@ class PUINode():
306
308
  self.genKey()
307
309
  return self
308
310
 
311
+ def dragEnter(self, callback, *cb_args, **cb_kwargs):
312
+ self._onDragEntered = callback, cb_args, cb_kwargs
313
+ return self
314
+
315
+ def drop(self, callback, *cb_args, **cb_kwargs):
316
+ self._onDropped = callback, cb_args, cb_kwargs
317
+ return self
318
+
309
319
  def click(self, callback, *cb_args, **cb_kwargs):
310
320
  self._onClicked = callback, cb_args, cb_kwargs
311
321
  return self
PUI/state.py CHANGED
@@ -8,7 +8,10 @@ class DummyBinding():
8
8
  def __init__(self, value):
9
9
  self.value = value
10
10
 
11
- class AttrBinding():
11
+ class BaseBinding():
12
+ pass
13
+
14
+ class AttrBinding(BaseBinding):
12
15
  def __init__(self, state, key):
13
16
  try:
14
17
  self.viewroot = find_puiview()
@@ -52,7 +55,7 @@ class AttrBinding():
52
55
  listeners.update(l)
53
56
  _notify(getattr(self.state, "_StateObject__pending"), listeners)
54
57
 
55
- class ListBinding():
58
+ class ListBinding(BaseBinding):
56
59
  def __init__(self, state, key):
57
60
  try:
58
61
  self.viewroot = find_puiview()
@@ -93,7 +96,7 @@ class ListBinding():
93
96
  def emit(self):
94
97
  _notify(getattr(self.state, "_StateList__pending"), getattr(self.state, "_StateList__listeners"))
95
98
 
96
- class DictBinding():
99
+ class DictBinding(BaseBinding):
97
100
  def __init__(self, state, key):
98
101
  try:
99
102
  self.viewroot = find_puiview()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qpuiq
3
- Version: 0.11
3
+ Version: 0.12
4
4
  Summary: "PUI" Python Declarative UI Framework
5
5
  Home-page: https://github.com/buganini/PUI
6
6
  Author: Buganini Chiu
@@ -17,8 +17,23 @@ PUI doesn't do UI itself, it turns imperative UI libraries into reactive/declara
17
17
  [CPPUI: Experimental C++ Version](https://github.com/buganini/CPPUI)
18
18
 
19
19
  # Installation
20
- ```
20
+ ``` shell
21
21
  pip install QPUIQ
22
+
23
+ # Optional, for hot-reload
24
+ pip install jurigged
25
+
26
+ # Optional, for PySide6 backend
27
+ pip install PySide6
28
+
29
+ # Optional, for textual backend
30
+ pip install textual
31
+
32
+ # Optional, for wxPython backend
33
+ pip install wxPython
34
+
35
+ # Optional, for flet backend
36
+ pip install flet
22
37
  ```
23
38
 
24
39
  # Get Started
@@ -1,16 +1,16 @@
1
- PUI/__init__.py,sha256=k1uH-6Fwt9MOnxqx1cim50EYUceb4VQ-XycI8eLyuxg,966
1
+ PUI/__init__.py,sha256=XdqoyAVcheQeWKq1l0qpLMN6jfHigBEh9fskePCjnB8,966
2
2
  PUI/common.py,sha256=iCMdJPgdKxnZObpjjYzxa_LN8eS4w0FOTfgaDwD_fGY,500
3
3
  PUI/decorator.py,sha256=BN3POYv69QCDomoHENN-UA-d4wY_vfARIb5RJ2qEnS8,483
4
4
  PUI/dom.py,sha256=RgdDyv6vSFgkCoj9G2cjzQQOiymG8DwmmSoAZfxYvJM,10141
5
5
  PUI/interfaces.py,sha256=rGUciM3S6ICEVgVoahkva8yXUGpweqy1kAzhUQut40E,2182
6
- PUI/node.py,sha256=FwcqKGN-GU4TleXtFp2MZ0dPQq-UHTkesKlAf6cNPQ8,12912
7
- PUI/state.py,sha256=74PUUU7gewtuWB2-H51NyIUDtUGx_n3keWie_bkcIQk,20137
6
+ PUI/node.py,sha256=lO0j4pCGLEkq226dD3NYNhUi0e7ect5_8aeWrEki6ZE,13245
7
+ PUI/state.py,sha256=BLz-LM_s4_T9Tu_AqombQc87gkV5N8Wgsq1njSkxkBY,20201
8
8
  PUI/timeline.py,sha256=-mO1TLqxp2_3dk-EvdBE9wBkQf5RIPrPazTPXDzWSN0,940
9
9
  PUI/utils.py,sha256=canb7_Uz0sQ1UZDzyDuIsfAVXzEfZCkc9F81sMY4rTE,505
10
10
  PUI/view.py,sha256=Oe6sXLHD554GnlLlO5QpY7kegngkzrmMEYRHrdzGZUQ,4623
11
11
  PUI/PySide6/__init__.py,sha256=z895ldBVUaEqfGQW4CvYhWh2F6L0qGQA1MXUHVMf9Ms,1110
12
12
  PUI/PySide6/application.py,sha256=OsIE47efST4I13txD-7rS1cTWAGhynckl45Wdb1bafk,1471
13
- PUI/PySide6/base.py,sha256=he1BrtsGGB8ycphYTHo91VRnHxU9rM8Yb749FxLrZb4,6546
13
+ PUI/PySide6/base.py,sha256=wAkvN_dxG8fKHUNH99lO2Kc9ZEENQFDkPt1hkDFSBLM,7910
14
14
  PUI/PySide6/button.py,sha256=mHfcH98dABYgksuT58fK0amSwtCM9aaYwr7Y2EArEJA,561
15
15
  PUI/PySide6/canvas.py,sha256=mkMjGXcQmUeV1a1HChv6KTWuh_5ao_qA-dYqCnsHo3s,9108
16
16
  PUI/PySide6/checkbox.py,sha256=Rsns0BleE4g9yTDdlsD8IADU3qcQkVO2VsFVvYlNL88,900
@@ -29,11 +29,11 @@ PUI/PySide6/radiobutton.py,sha256=Qe5jjVkGSx8Pf3deAm-9c0cbYsrWl15W9UxrwrWuOo4,79
29
29
  PUI/PySide6/scroll.py,sha256=T8eXTW5ABPWbyOV5ioKXbBNE1CdoPmQ9IRmb2x12tqI,5857
30
30
  PUI/PySide6/splitter.py,sha256=ObjcC8UgkAL7o-xXhi4XIkDEKhC4s5Ukk7tKMNa023Q,797
31
31
  PUI/PySide6/tab.py,sha256=tMkhEfD4Wb_7Hs4-u4nOzm87GSHqmehcnwcFm24qRIg,953
32
- PUI/PySide6/table.py,sha256=KyEZpgKOGgTOSHwnwkDwvcrDpQHUd4_eaotmupvlnLs,2907
32
+ PUI/PySide6/table.py,sha256=TTCMf_YNKmkFiqs_qLqw3qbvFsxoBNnz9VMObx_2l3s,4800
33
33
  PUI/PySide6/text.py,sha256=4kRRZiuH-bLLJMNZ6hK9zAWOorsG-l4uujHbG6I5S20,1069
34
34
  PUI/PySide6/textfield.py,sha256=Us-UZMDCwrREwFLjPKKa3e3c_1U4WWD2kzFCe3xiY0k,2140
35
35
  PUI/PySide6/toolbar.py,sha256=NPkn99D5xK4RLBA0vxLD7EqYu5eh9ucCL2y1vSJWQl4,1800
36
- PUI/PySide6/tree.py,sha256=svGlI7dIvVwizq_IfoZD0rT3nrPOMGp04hXKwGzCQUE,3807
36
+ PUI/PySide6/tree.py,sha256=G25bnOaKuI6rwyU745av8K6bH-Os0hMPcRxOqMoB47A,8915
37
37
  PUI/PySide6/window.py,sha256=CpkIFpleVr3oXOM6vdukahWtX5SV6cWNc1TUW84JPM4,2694
38
38
  PUI/flet/__init__.py,sha256=3YzGA0oPfu9eW8DtKQSoAsa8o6ZTGKWakYBTxGaaH8Y,438
39
39
  PUI/flet/application.py,sha256=3ZGZrAngSEkVK-WseOV-n_6ljhd86ZKBgO6Jp2PmsJA,937
@@ -96,8 +96,8 @@ PUI/wx/scroll.py,sha256=LPwRL9KZuoKrTFEWo1_zW3l_Fbaznq_2jA9GuwTp8Dc,1199
96
96
  PUI/wx/text.py,sha256=YeIyDyHH0xBcD_iXbYSTtvL25YDtug1QJNVPvCSAqEk,544
97
97
  PUI/wx/textfield.py,sha256=BmMebfqlDJqacaKdh2SON88xF73l0csC7L7hoNjz-qs,1778
98
98
  PUI/wx/window.py,sha256=juAsn3W4SzmH8f5LDGvjwppvPD8fDObRUJ_MkQFKCIE,1847
99
- qpuiq-0.11.dist-info/LICENSE.txt,sha256=1Xwik2AmLNGoIYhAPzvNC28M08Q3EvkOe4TtlQuSd_E,1072
100
- qpuiq-0.11.dist-info/METADATA,sha256=uR0W72qXqelQ20m8npo6zpoGaEBprgRv8g9N6kd5m3E,5453
101
- qpuiq-0.11.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
102
- qpuiq-0.11.dist-info/top_level.txt,sha256=zMudhifPite0CEVGYvdi-5W3P_dpum71xjU7_g-ZHS0,4
103
- qpuiq-0.11.dist-info/RECORD,,
99
+ qpuiq-0.12.dist-info/LICENSE.txt,sha256=1Xwik2AmLNGoIYhAPzvNC28M08Q3EvkOe4TtlQuSd_E,1072
100
+ qpuiq-0.12.dist-info/METADATA,sha256=0nqLbJxZZ-b2P_xn5Yu6DJTa3jTzNMTUaYIbcNCrjWs,5716
101
+ qpuiq-0.12.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
102
+ qpuiq-0.12.dist-info/top_level.txt,sha256=zMudhifPite0CEVGYvdi-5W3P_dpum71xjU7_g-ZHS0,4
103
+ qpuiq-0.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (70.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5