qpuiq 0.10__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.

Files changed (103) hide show
  1. PUI/PySide6/__init__.py +49 -0
  2. PUI/PySide6/application.py +58 -0
  3. PUI/PySide6/base.py +222 -0
  4. PUI/PySide6/button.py +21 -0
  5. PUI/PySide6/canvas.py +288 -0
  6. PUI/PySide6/checkbox.py +32 -0
  7. PUI/PySide6/combobox.py +75 -0
  8. PUI/PySide6/dialog.py +72 -0
  9. PUI/PySide6/divider.py +23 -0
  10. PUI/PySide6/image.py +30 -0
  11. PUI/PySide6/label.py +33 -0
  12. PUI/PySide6/layout.py +72 -0
  13. PUI/PySide6/matplotlib.py +23 -0
  14. PUI/PySide6/mdi.py +33 -0
  15. PUI/PySide6/menu.py +85 -0
  16. PUI/PySide6/modal.py +132 -0
  17. PUI/PySide6/progressbar.py +17 -0
  18. PUI/PySide6/radiobutton.py +29 -0
  19. PUI/PySide6/scroll.py +153 -0
  20. PUI/PySide6/splitter.py +25 -0
  21. PUI/PySide6/tab.py +39 -0
  22. PUI/PySide6/table.py +89 -0
  23. PUI/PySide6/text.py +35 -0
  24. PUI/PySide6/textfield.py +62 -0
  25. PUI/PySide6/toolbar.py +57 -0
  26. PUI/PySide6/tree.py +120 -0
  27. PUI/PySide6/window.py +81 -0
  28. PUI/__init__.py +46 -0
  29. PUI/common.py +20 -0
  30. PUI/decorator.py +20 -0
  31. PUI/dom.py +238 -0
  32. PUI/flet/__init__.py +21 -0
  33. PUI/flet/application.py +42 -0
  34. PUI/flet/base.py +37 -0
  35. PUI/flet/button.py +20 -0
  36. PUI/flet/canvas.py +86 -0
  37. PUI/flet/checkbox.py +23 -0
  38. PUI/flet/label.py +27 -0
  39. PUI/flet/layout.py +50 -0
  40. PUI/flet/progressbar.py +21 -0
  41. PUI/flet/radiobutton.py +27 -0
  42. PUI/flet/scroll.py +83 -0
  43. PUI/flet/tab.py +42 -0
  44. PUI/flet/text.py +55 -0
  45. PUI/flet/textfield.py +58 -0
  46. PUI/flet/window.py +25 -0
  47. PUI/interfaces.py +97 -0
  48. PUI/node.py +407 -0
  49. PUI/state.py +698 -0
  50. PUI/textual/__init__.py +34 -0
  51. PUI/textual/application.py +82 -0
  52. PUI/textual/base.py +113 -0
  53. PUI/textual/button.py +17 -0
  54. PUI/textual/checkbox.py +21 -0
  55. PUI/textual/label.py +36 -0
  56. PUI/textual/layout.py +48 -0
  57. PUI/textual/progressbar.py +17 -0
  58. PUI/textual/radiobutton.py +24 -0
  59. PUI/textual/scroll.py +72 -0
  60. PUI/textual/tab.py +75 -0
  61. PUI/textual/text.py +32 -0
  62. PUI/textual/textfield.py +49 -0
  63. PUI/textual/window.py +7 -0
  64. PUI/timeline.py +36 -0
  65. PUI/tkinter/__init__.py +43 -0
  66. PUI/tkinter/application.py +49 -0
  67. PUI/tkinter/base.py +68 -0
  68. PUI/tkinter/button.py +15 -0
  69. PUI/tkinter/canvas.py +49 -0
  70. PUI/tkinter/checkbox.py +27 -0
  71. PUI/tkinter/label.py +17 -0
  72. PUI/tkinter/layout.py +114 -0
  73. PUI/tkinter/progressbar.py +17 -0
  74. PUI/tkinter/radiobutton.py +26 -0
  75. PUI/tkinter/scroll.py +201 -0
  76. PUI/tkinter/tab.py +52 -0
  77. PUI/tkinter/text.py +20 -0
  78. PUI/tkinter/textfield.py +53 -0
  79. PUI/tkinter/window.py +51 -0
  80. PUI/utils.py +15 -0
  81. PUI/view.py +161 -0
  82. PUI/wx/__init__.py +19 -0
  83. PUI/wx/application.py +44 -0
  84. PUI/wx/base.py +202 -0
  85. PUI/wx/button.py +16 -0
  86. PUI/wx/canvas.py +255 -0
  87. PUI/wx/checkbox.py +25 -0
  88. PUI/wx/combobox.py +72 -0
  89. PUI/wx/dialog.py +66 -0
  90. PUI/wx/divider.py +19 -0
  91. PUI/wx/label.py +18 -0
  92. PUI/wx/layout.py +46 -0
  93. PUI/wx/progressbar.py +17 -0
  94. PUI/wx/radiobutton.py +27 -0
  95. PUI/wx/scroll.py +44 -0
  96. PUI/wx/text.py +23 -0
  97. PUI/wx/textfield.py +56 -0
  98. PUI/wx/window.py +58 -0
  99. qpuiq-0.10.dist-info/LICENSE.txt +21 -0
  100. qpuiq-0.10.dist-info/METADATA +227 -0
  101. qpuiq-0.10.dist-info/RECORD +103 -0
  102. qpuiq-0.10.dist-info/WHEEL +5 -0
  103. qpuiq-0.10.dist-info/top_level.txt +1 -0
PUI/state.py ADDED
@@ -0,0 +1,698 @@
1
+ from .view import *
2
+ from collections import defaultdict
3
+
4
+ class StateMutationInViewBuilderError(Exception):
5
+ pass
6
+
7
+ class DummyBinding():
8
+ def __init__(self, value):
9
+ self.value = value
10
+
11
+ class AttrBinding():
12
+ def __init__(self, state, key):
13
+ try:
14
+ self.viewroot = find_puiview()
15
+ self.viewparent = self.viewroot.frames[-1]
16
+ except:
17
+ pass
18
+ self.state = state
19
+ self.key = key
20
+ dt = type(getattr(self.state, self.key))
21
+ if dt is str:
22
+ self.func = str
23
+ elif dt is int:
24
+ self.func = int
25
+ elif dt is float:
26
+ self.func = float
27
+ else:
28
+ self.func = lambda x:x
29
+
30
+ @property
31
+ def value(self):
32
+ return getattr(self.state, self.key)
33
+
34
+ @value.setter
35
+ def value(self, value):
36
+ try: # skip validation error
37
+ setattr(self.state, self.key, self.func(value))
38
+ except:
39
+ pass
40
+
41
+ def change(self, callback):
42
+ getattr(self.state, "_StateObject__callbacks")[self.key].add(callback)
43
+
44
+ def bind(self, getter, setter):
45
+ getattr(self.state, "_StateObject__binders")[self.key] = None
46
+ setattr(getattr(self.state, "_StateObject__values"), self.key, getter())
47
+ getattr(self.state, "_StateObject__binders")[self.key] = (getter, setter)
48
+
49
+ def emit(self):
50
+ listeners = set()
51
+ for l in getattr(self.state, "_StateObject__listeners").values():
52
+ listeners.update(l)
53
+ _notify(getattr(self.state, "_StateObject__pending"), listeners)
54
+
55
+ class ListBinding():
56
+ def __init__(self, state, key):
57
+ try:
58
+ self.viewroot = find_puiview()
59
+ self.viewparent = self.viewroot.frames[-1]
60
+ except PuiViewNotFoundError:
61
+ pass
62
+ self.state = state
63
+ self.key = key
64
+ dt = type(self.state[self.key])
65
+ if dt is str:
66
+ self.func = str
67
+ elif dt is int:
68
+ self.func = int
69
+ elif dt is float:
70
+ self.func = float
71
+ else:
72
+ self.func = lambda x:x
73
+
74
+ @property
75
+ def value(self):
76
+ try: # skip validation error
77
+ return self.state[self.key]
78
+ except:
79
+ pass
80
+
81
+ @value.setter
82
+ def value(self, value):
83
+ self.state[self.key] = self.func(value)
84
+
85
+ def change(self, callback):
86
+ getattr(self.state, "_StateList__callbacks")[self.key].add(callback)
87
+
88
+ def bind(self, getter, setter):
89
+ getattr(self.state, "_StateList__binders")[self.key] = None
90
+ self.state[self.key] = getter()
91
+ getattr(self.state, "_StateList__binders")[self.key] = (getter, setter)
92
+
93
+ def emit(self):
94
+ _notify(getattr(self.state, "_StateList__pending"), getattr(self.state, "_StateList__listeners"))
95
+
96
+ class DictBinding():
97
+ def __init__(self, state, key):
98
+ try:
99
+ self.viewroot = find_puiview()
100
+ self.viewparent = self.viewroot.frames[-1]
101
+ except PuiViewNotFoundError:
102
+ pass
103
+ self.state = state
104
+ self.key = key
105
+ dt = type(self.state[self.key])
106
+ if dt is str:
107
+ self.func = str
108
+ elif dt is int:
109
+ self.func = int
110
+ elif dt is float:
111
+ self.func = float
112
+ else:
113
+ self.func = lambda x:x
114
+
115
+ @property
116
+ def value(self):
117
+ return self.state[self.key]
118
+
119
+ @value.setter
120
+ def value(self, value):
121
+ try: # skip validation error
122
+ self.state[self.key] = self.func(value)
123
+ except:
124
+ pass
125
+
126
+ def change(self, callback):
127
+ getattr(self.state, "_StateDict__callbacks")[self.key].add(callback)
128
+
129
+ def bind(self, getter, setter):
130
+ getattr(self.state, "_StateDict__binders")[self.key] = None
131
+ self.state[self.key] = getter()
132
+ getattr(self.state, "_StateDict__binders")[self.key] = (getter, setter)
133
+
134
+ def emit(self):
135
+ _notify(getattr(self.state, "_StateDict__pending"), getattr(self.state, "_StateDict__listeners"))
136
+
137
+ def _notify(pending, listeners):
138
+ if pending is None:
139
+ tbd = []
140
+ for l in listeners:
141
+ if l.retired_by:
142
+ tbd.append(l)
143
+ for l in tbd:
144
+ listeners.remove(l)
145
+ for l in list(listeners):
146
+ l.redraw()
147
+ else:
148
+ pending.update(listeners)
149
+
150
+ class BaseState():
151
+ pass
152
+
153
+ def State(data=None):
154
+ if data is None:
155
+ return StateObject()
156
+ if isinstance(data, list):
157
+ return StateList(data)
158
+ if isinstance(data, dict):
159
+ return StateDict(data)
160
+ return StateObject(data)
161
+
162
+ class StateObject(BaseState):
163
+ def __init__(self, values=None):
164
+ self.__listeners = defaultdict(set)
165
+ self.__callbacks = defaultdict(set)
166
+ self.__binders = {}
167
+ self.__pending = None
168
+ if values is None:
169
+ self.__values = BaseState()
170
+ else:
171
+ self.__values = values
172
+
173
+ def __call__(self, key=None):
174
+ if key is None:
175
+ listeners = set()
176
+ for l in self.__listeners.values():
177
+ listeners.update(l)
178
+ _notify(self.__pending, listeners)
179
+ return
180
+ try:
181
+ view = find_puiview()
182
+ self.__listeners[key].add(view)
183
+ except PuiViewNotFoundError:
184
+ pass
185
+ return AttrBinding(self, key)
186
+
187
+ def __enter__(self):
188
+ self.__pending = set()
189
+ return self
190
+
191
+ def __exit__(self, ex_type, value, traceback):
192
+ pending = self.__pending
193
+ self.__pending = None
194
+ _notify(self.__pending, pending)
195
+
196
+ if ex_type is None: # don't consume exception
197
+ return self
198
+
199
+ # getter
200
+ def __getattr__(self, key):
201
+ if not key.startswith("_"):
202
+ try:
203
+ view = find_puiview()
204
+ self.__listeners[key].add(view)
205
+ except PuiViewNotFoundError:
206
+ view = None
207
+ ret = getattr(self.__values, key)
208
+ if view:
209
+ if isinstance(ret, StateObject):
210
+ ret.__listeners[key].add(view)
211
+ elif isinstance(ret, StateList):
212
+ ret._StateList__listeners.add(view)
213
+ elif isinstance(ret, StateDict):
214
+ ret._StateDict__listeners.add(view)
215
+ return ret
216
+
217
+ # setter
218
+ def __setattr__(self, key, value):
219
+ try:
220
+ find_puiview()
221
+ raise StateMutationInViewBuilderError()
222
+ except PuiViewNotFoundError:
223
+ pass
224
+ if key.startswith("_"):
225
+ object.__setattr__(self, key, value)
226
+ else:
227
+ if self.__binders.get(key):
228
+ self.__binders[key][1](value)
229
+
230
+ if type(value) is list:
231
+ value = StateList(value)
232
+ elif type(value) is dict:
233
+ value = StateDict(value)
234
+ if not hasattr(self.__values, key) or getattr(self.__values, key) != value:
235
+ setattr(self.__values, key, value)
236
+ _notify(self.__pending, self.__listeners[key])
237
+ for cb in self.__callbacks[key]:
238
+ cb(value)
239
+
240
+ # getter
241
+ def __repr__(self):
242
+ return f"StateObject({self.__values.__repr__()})"
243
+
244
+ class StateList(BaseState):
245
+ def __init__(self, values=None):
246
+ self.__listeners = set()
247
+ self.__callbacks = defaultdict(set)
248
+ self.__binders = {}
249
+ self.__pending = None
250
+ if values is None:
251
+ self.__values = []
252
+ else:
253
+ self.__values = values
254
+
255
+ def __call__(self, key=None):
256
+ if key is None:
257
+ _notify(self.__pending, self.__listeners)
258
+ return
259
+ try:
260
+ view = find_puiview()
261
+ self.__listeners.add(view)
262
+ except PuiViewNotFoundError:
263
+ pass
264
+ return ListBinding(self, key)
265
+
266
+ def __enter__(self):
267
+ self.__pending = set()
268
+ return self
269
+
270
+ def __exit__(self, ex_type, value, traceback):
271
+ pending = self.__pending
272
+ self.__pending = None
273
+ _notify(self.__pending, pending)
274
+
275
+ if ex_type is None: # don't consume exception
276
+ return self
277
+
278
+ # getter
279
+ def __getitem__(self, key):
280
+ try:
281
+ view = find_puiview()
282
+ self.__listeners.add(view)
283
+ except PuiViewNotFoundError:
284
+ view = None
285
+
286
+ ret = self.__values[key]
287
+ if view:
288
+ if isinstance(ret, StateObject):
289
+ ret._StateObject__listeners.add(view)
290
+ elif isinstance(ret, StateList):
291
+ ret.__listeners.add(view)
292
+ elif isinstance(ret, StateDict):
293
+ ret._StateDict__listeners.add(view)
294
+ return ret
295
+ # setter
296
+ def __setitem__(self, key, value):
297
+ try:
298
+ find_puiview()
299
+ raise StateMutationInViewBuilderError()
300
+ except PuiViewNotFoundError:
301
+ pass
302
+ if self.__binders.get(key):
303
+ self.__binders[key][1](value)
304
+ new = key >= len(self.__values)
305
+ if new or self.__values[key] != value:
306
+ self.__values[key] = value
307
+ _notify(self.__pending, self.__listeners)
308
+ for cb in self.__callbacks[key]:
309
+ cb(value)
310
+ if new:
311
+ for cb in self.__callbacks[None]:
312
+ cb(value)
313
+
314
+ # getter
315
+ def __bool__(self):
316
+ try:
317
+ view = find_puiview()
318
+ self.__listeners.add(view)
319
+ except PuiViewNotFoundError:
320
+ pass
321
+ return bool(self.__values)
322
+
323
+ # getter
324
+ def __len__(self):
325
+ try:
326
+ view = find_puiview()
327
+ self.__listeners.add(view)
328
+ except PuiViewNotFoundError:
329
+ pass
330
+ return len(self.__values)
331
+
332
+ # getter
333
+ def __iter__(self):
334
+ try:
335
+ view = find_puiview()
336
+ self.__listeners.add(view)
337
+ except PuiViewNotFoundError:
338
+ pass
339
+ return self.__values.__iter__()
340
+
341
+ # getter
342
+ def __repr__(self):
343
+ try:
344
+ view = find_puiview()
345
+ self.__listeners.add(view)
346
+ except PuiViewNotFoundError:
347
+ pass
348
+ return self.__values.__repr__()
349
+
350
+ # setter
351
+ def append(self, obj):
352
+ try:
353
+ find_puiview()
354
+ raise StateMutationInViewBuilderError()
355
+ except PuiViewNotFoundError:
356
+ pass
357
+ self.__values.append(obj)
358
+ _notify(self.__pending, self.__listeners)
359
+ for cb in self.__callbacks[None]:
360
+ cb(self.__values)
361
+
362
+ # setter
363
+ def clear(self):
364
+ try:
365
+ find_puiview()
366
+ raise StateMutationInViewBuilderError()
367
+ except PuiViewNotFoundError:
368
+ pass
369
+ self.__values.clear()
370
+ _notify(self.__pending, self.__listeners)
371
+ for cb in self.__callbacks[None]:
372
+ cb(self.__values)
373
+
374
+ # getter
375
+ def count(self, value):
376
+ try:
377
+ view = find_puiview()
378
+ self.__listeners.add(view)
379
+ except PuiViewNotFoundError:
380
+ pass
381
+ return self.__values.count(value)
382
+
383
+ # setter
384
+ def extend(self, iterable):
385
+ try:
386
+ find_puiview()
387
+ raise StateMutationInViewBuilderError()
388
+ except PuiViewNotFoundError:
389
+ pass
390
+ self.__values.extend(iterable)
391
+ _notify(self.__pending, self.__listeners)
392
+ for cb in self.__callbacks[None]:
393
+ cb(self.__values)
394
+
395
+ # getter
396
+ def index(self, value, *args, **kwargs):
397
+ try:
398
+ view = find_puiview()
399
+ self.__listeners.add(view)
400
+ except PuiViewNotFoundError:
401
+ pass
402
+ return self.__values.index(value, *args, **kwargs)
403
+
404
+ # setter
405
+ def insert(self, index, object):
406
+ try:
407
+ find_puiview()
408
+ raise StateMutationInViewBuilderError()
409
+ except PuiViewNotFoundError:
410
+ pass
411
+ self.__values.insert(index, object)
412
+ _notify(self.__pending, self.__listeners)
413
+ for cb in self.__callbacks[index]:
414
+ cb(object)
415
+ for cb in self.__callbacks[None]:
416
+ cb(self.__values)
417
+
418
+ # getter/setter
419
+ def pop(self, index=-1):
420
+ try:
421
+ find_puiview()
422
+ raise StateMutationInViewBuilderError()
423
+ except PuiViewNotFoundError:
424
+ pass
425
+ r = self.__values.pop(index)
426
+ _notify(self.__pending, self.__listeners)
427
+ for cb in self.__callbacks[index]:
428
+ cb(self.__values)
429
+ for cb in self.__callbacks[None]:
430
+ cb(self.__values)
431
+ return r
432
+
433
+ # setter
434
+ def remove(self, value):
435
+ try:
436
+ find_puiview()
437
+ raise StateMutationInViewBuilderError()
438
+ except PuiViewNotFoundError:
439
+ pass
440
+ self.__values.remove(value)
441
+ _notify(self.__pending, self.__listeners)
442
+ for cb in self.__callbacks[None]:
443
+ cb(self.__values)
444
+
445
+ # setter
446
+ def reverse(self, value):
447
+ try:
448
+ find_puiview()
449
+ raise StateMutationInViewBuilderError()
450
+ except PuiViewNotFoundError:
451
+ pass
452
+ self.__values.reverse(value)
453
+ _notify(self.__pending, self.__listeners)
454
+ for cb in self.__callbacks[None]:
455
+ cb(self.__values)
456
+
457
+
458
+ # setter
459
+ def sort(self, *args, **kwargs):
460
+ try:
461
+ find_puiview()
462
+ raise StateMutationInViewBuilderError()
463
+ except PuiViewNotFoundError:
464
+ pass
465
+ self.__values.sort(*args, **kwargs)
466
+ _notify(self.__pending, self.__listeners)
467
+ for cb in self.__callbacks[None]:
468
+ cb(self.__values)
469
+
470
+ # getter
471
+ def get(self, index, default=None):
472
+ try:
473
+ view = find_puiview()
474
+ self.__listeners.add(view)
475
+ except PuiViewNotFoundError:
476
+ pass
477
+ if index >= 0 and index < len(self.__values):
478
+ return self.__values[index]
479
+ else:
480
+ return default
481
+
482
+ # getter
483
+ def range(self):
484
+ return range(len(self.__values))
485
+
486
+ class StateDict(BaseState):
487
+ def __init__(self, values=None):
488
+ self.__listeners = set()
489
+ self.__callbacks = defaultdict(set)
490
+ self.__binders = {}
491
+ self.__pending = None
492
+ if values is None:
493
+ self.__values = {}
494
+ else:
495
+ self.__values = values
496
+
497
+ def __call__(self, key=None):
498
+ if key is None:
499
+ _notify(self.__pending, self.__listeners)
500
+ return
501
+ try:
502
+ view = find_puiview()
503
+ self.__listeners.add(view)
504
+ except PuiViewNotFoundError:
505
+ pass
506
+ return DictBinding(self, key)
507
+
508
+ def __enter__(self):
509
+ self.__pending = set()
510
+ return self
511
+
512
+ def __exit__(self, ex_type, value, traceback):
513
+ pending = self.__pending
514
+ self.__pending = None
515
+ _notify(self.__pending, pending)
516
+
517
+ if ex_type is None: # don't consume exception
518
+ return self
519
+
520
+ # setter
521
+ def __delitem__(self, key):
522
+ try:
523
+ find_puiview()
524
+ raise StateMutationInViewBuilderError()
525
+ except PuiViewNotFoundError:
526
+ pass
527
+ self.__values.__delitem__(key)
528
+ _notify(self.__pending, self.__listeners)
529
+ for cb in self.__callbacks[None]:
530
+ cb(self.__values)
531
+
532
+ # getter
533
+ def __getitem__(self, key):
534
+ try:
535
+ view = find_puiview()
536
+ self.__listeners.add(view)
537
+ except PuiViewNotFoundError:
538
+ view = None
539
+ ret = self.__values[key]
540
+ if view:
541
+ if isinstance(ret, StateObject):
542
+ ret._StateObject__listeners.add(view)
543
+ elif isinstance(ret, StateList):
544
+ ret._StateList__listeners.add(view)
545
+ elif isinstance(ret, StateDict):
546
+ ret.__listeners.add(view)
547
+ return ret
548
+
549
+ # getter
550
+ def __getattr__(self, key):
551
+ if not key.startswith("_"):
552
+ try:
553
+ view = find_puiview()
554
+ self.__listeners.add(view)
555
+ except PuiViewNotFoundError:
556
+ view = None
557
+ ret = getattr(self.__values, key)
558
+ if view:
559
+ if isinstance(ret, StateObject):
560
+ ret._StateObject__listeners.add(view)
561
+ elif isinstance(ret, StateList):
562
+ ret._StateList__listeners.add(view)
563
+ elif isinstance(ret, StateDict):
564
+ ret.__listeners.add(view)
565
+ return ret
566
+
567
+ # setter
568
+ def __setattr__(self, key, value):
569
+ try:
570
+ find_puiview()
571
+ raise StateMutationInViewBuilderError()
572
+ except PuiViewNotFoundError:
573
+ pass
574
+ if key.startswith("_"):
575
+ object.__setattr__(self, key, value)
576
+ else:
577
+ if self.__binders.get(key):
578
+ self.__binders[key][1](value)
579
+ _notify(self.__pending, self.__listeners)
580
+ return setattr(self.__values, key, value)
581
+
582
+ # getter
583
+ def __bool__(self):
584
+ try:
585
+ view = find_puiview()
586
+ self.__listeners.add(view)
587
+ except PuiViewNotFoundError:
588
+ pass
589
+ return bool(self.__values)
590
+
591
+ # getter
592
+ def __iter__(self):
593
+ try:
594
+ view = find_puiview()
595
+ self.__listeners.add(view)
596
+ except PuiViewNotFoundError:
597
+ pass
598
+ return self.__values.__iter__()
599
+
600
+ # getter
601
+ def __repr__(self):
602
+ try:
603
+ view = find_puiview()
604
+ self.__listeners.add(view)
605
+ except PuiViewNotFoundError:
606
+ pass
607
+ return self.__values.__repr__()
608
+
609
+ # setter
610
+ def __setitem__(self, key, value):
611
+ try:
612
+ find_puiview()
613
+ raise StateMutationInViewBuilderError()
614
+ except PuiViewNotFoundError:
615
+ pass
616
+ if self.__binders.get(key):
617
+ self.__binders[key][1](value)
618
+ if not key in self.__values or self.__values[key] != value:
619
+ self.__values[key] = value
620
+ _notify(self.__pending, self.__listeners)
621
+ for cb in self.__callbacks[key]:
622
+ cb(value)
623
+ for cb in self.__callbacks[None]:
624
+ cb(self.__values)
625
+
626
+ # setter
627
+ def clear(self):
628
+ try:
629
+ find_puiview()
630
+ raise StateMutationInViewBuilderError()
631
+ except PuiViewNotFoundError:
632
+ pass
633
+ self.__values.clear()
634
+ _notify(self.__pending, self.__listeners)
635
+ for cb in self.__callbacks[None]:
636
+ cb(self.__values)
637
+
638
+ # getter
639
+ def get(self, key, default=None):
640
+ try:
641
+ view = find_puiview()
642
+ self.__listeners.add(view)
643
+ except PuiViewNotFoundError:
644
+ pass
645
+ return self.__values.get(key, default)
646
+
647
+ # getter
648
+ def items(self):
649
+ try:
650
+ view = find_puiview()
651
+ self.__listeners.add(view)
652
+ except PuiViewNotFoundError:
653
+ pass
654
+ return self.__values.items()
655
+
656
+ # getter
657
+ def keys(self):
658
+ try:
659
+ view = find_puiview()
660
+ self.__listeners.add(view)
661
+ except PuiViewNotFoundError:
662
+ pass
663
+ return self.__values.keys()
664
+
665
+ # getter/setter
666
+ def pop(self, key, default=None):
667
+ try:
668
+ find_puiview()
669
+ raise StateMutationInViewBuilderError()
670
+ except PuiViewNotFoundError:
671
+ pass
672
+ r = self.__values.pop(key, default)
673
+ _notify(self.__pending, self.__listeners)
674
+ for cb in self.__callbacks[None]:
675
+ cb(self.__values)
676
+ return r
677
+
678
+ # setter
679
+ def setdefault(self, key, default=None):
680
+ try:
681
+ find_puiview()
682
+ raise StateMutationInViewBuilderError()
683
+ except PuiViewNotFoundError:
684
+ pass
685
+ r = self.__values.setdefault(key, default)
686
+ _notify(self.__pending, self.__listeners)
687
+ for cb in self.__callbacks[None]:
688
+ cb(self.__values)
689
+ return r
690
+
691
+ # getter
692
+ def values(self):
693
+ try:
694
+ view = find_puiview()
695
+ self.__listeners.add(view)
696
+ except PuiViewNotFoundError:
697
+ pass
698
+ return self.__values.values()