mwxlib 0.99.0__py3-none-any.whl → 0.99.2__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 mwxlib might be problematic. Click here for more details.
- mwx/controls.py +55 -54
- mwx/framework.py +1 -1
- mwx/graphman.py +13 -1
- mwx/utilus.py +1 -1
- {mwxlib-0.99.0.dist-info → mwxlib-0.99.2.dist-info}/METADATA +1 -1
- {mwxlib-0.99.0.dist-info → mwxlib-0.99.2.dist-info}/RECORD +9 -9
- {mwxlib-0.99.0.dist-info → mwxlib-0.99.2.dist-info}/WHEEL +1 -1
- {mwxlib-0.99.0.dist-info → mwxlib-0.99.2.dist-info}/LICENSE +0 -0
- {mwxlib-0.99.0.dist-info → mwxlib-0.99.2.dist-info}/top_level.txt +0 -0
mwx/controls.py
CHANGED
|
@@ -25,25 +25,26 @@ class Param:
|
|
|
25
25
|
|
|
26
26
|
Args:
|
|
27
27
|
name : label
|
|
28
|
-
range :
|
|
29
|
-
value : std_value (default is
|
|
28
|
+
range : list of values
|
|
29
|
+
value : std_value (default is None)
|
|
30
30
|
fmt : text formatter or format:str (default is '%g')
|
|
31
31
|
`hex` specifies hexadecimal format
|
|
32
|
-
handler : called when
|
|
33
|
-
updater : called when
|
|
32
|
+
handler : called when knob is handled.
|
|
33
|
+
updater : called when button is pressed.
|
|
34
|
+
checker : called when tick turns on/off.
|
|
34
35
|
|
|
35
36
|
Attributes:
|
|
36
37
|
knobs : knob list
|
|
37
38
|
callback : single state machine that handles following events
|
|
38
39
|
|
|
39
|
-
- control -> when index changed by knobs or reset (handler)
|
|
40
|
-
-
|
|
41
|
-
-
|
|
40
|
+
- control -> when index is changed by knobs or reset (handler)
|
|
41
|
+
- updated -> when button is pressed (updater)
|
|
42
|
+
- checked -> when tick turns on/off (checker)
|
|
42
43
|
- overflow -> when value overflows
|
|
43
44
|
- underflow -> when value underflows
|
|
44
45
|
"""
|
|
45
46
|
def __init__(self, name, range=None, value=None, fmt=None,
|
|
46
|
-
handler=None, updater=None):
|
|
47
|
+
handler=None, updater=None, checker=None):
|
|
47
48
|
self.knobs = []
|
|
48
49
|
self.name = name
|
|
49
50
|
self.range = range
|
|
@@ -60,8 +61,8 @@ class Param:
|
|
|
60
61
|
self.__format = lambda v: fmt % v
|
|
61
62
|
self.callback = SSM({
|
|
62
63
|
'control' : [ _F(handler) ] if handler else [],
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
'updated' : [ _F(updater) ] if updater else [],
|
|
65
|
+
'checked' : [ _F(checker) ] if checker else [],
|
|
65
66
|
'overflow' : [],
|
|
66
67
|
'underflow' : [],
|
|
67
68
|
})
|
|
@@ -95,8 +96,8 @@ class Param:
|
|
|
95
96
|
def reset(self, v=None, internal_callback=True):
|
|
96
97
|
"""Reset value when indexed (by knobs) with callback."""
|
|
97
98
|
if v is None:
|
|
98
|
-
v = self.std_value
|
|
99
|
-
if np.isnan(v):
|
|
99
|
+
v = self.std_value
|
|
100
|
+
if np.isnan(v):
|
|
100
101
|
return
|
|
101
102
|
elif isinstance(v, str):
|
|
102
103
|
try:
|
|
@@ -104,41 +105,19 @@ class Param:
|
|
|
104
105
|
except Exception:
|
|
105
106
|
v = self.value
|
|
106
107
|
internal_callback = False
|
|
107
|
-
|
|
108
|
-
if v is None:
|
|
109
|
-
v = nan
|
|
110
|
-
if np.isnan(v) or np.isinf(v):
|
|
111
|
-
self.__value = v
|
|
112
|
-
for knob in self.knobs:
|
|
113
|
-
knob.update_ctrl(None, notify=False)
|
|
114
|
-
return
|
|
115
|
-
if v != self.__value:
|
|
116
|
-
## If the value is out of range, it will be modified.
|
|
117
|
-
valid = (self.min <= v <= self.max)
|
|
118
|
-
if valid:
|
|
119
|
-
self.__value = v
|
|
120
|
-
elif v < self.min:
|
|
121
|
-
self.__value = self.min
|
|
122
|
-
self.callback('underflow', self)
|
|
123
|
-
else:
|
|
124
|
-
self.__value = self.max
|
|
125
|
-
self.callback('overflow', self)
|
|
126
|
-
for knob in self.knobs:
|
|
127
|
-
knob.update_ctrl(valid, notify=True)
|
|
108
|
+
self.value = v
|
|
128
109
|
if internal_callback:
|
|
129
110
|
self.callback('control', self)
|
|
130
111
|
|
|
131
112
|
@property
|
|
132
113
|
def check(self):
|
|
133
|
-
"""A knob check
|
|
114
|
+
"""A knob check-flag (user defined)."""
|
|
134
115
|
return self.__check
|
|
135
116
|
|
|
136
117
|
@check.setter
|
|
137
118
|
def check(self, v):
|
|
138
119
|
self.__check = bool(v)
|
|
139
|
-
self.callback('
|
|
140
|
-
for knob in self.knobs:
|
|
141
|
-
knob.update_label()
|
|
120
|
+
self.callback('checked', self)
|
|
142
121
|
|
|
143
122
|
@property
|
|
144
123
|
def name(self):
|
|
@@ -157,7 +136,30 @@ class Param:
|
|
|
157
136
|
|
|
158
137
|
@value.setter
|
|
159
138
|
def value(self, v):
|
|
160
|
-
|
|
139
|
+
if v is None:
|
|
140
|
+
v = nan
|
|
141
|
+
if np.isnan(v) or np.isinf(v):
|
|
142
|
+
self.__value = v
|
|
143
|
+
for knob in self.knobs:
|
|
144
|
+
knob.update_ctrl(None, notify=False)
|
|
145
|
+
return
|
|
146
|
+
elif v == self.__value:
|
|
147
|
+
for knob in self.knobs:
|
|
148
|
+
knob.update_ctrl(True, notify=False)
|
|
149
|
+
return
|
|
150
|
+
|
|
151
|
+
## If the value is out of range, it will be modified.
|
|
152
|
+
valid = (self.min <= v <= self.max)
|
|
153
|
+
if valid:
|
|
154
|
+
self.__value = v
|
|
155
|
+
elif v < self.min:
|
|
156
|
+
self.__value = self.min
|
|
157
|
+
self.callback('underflow', self)
|
|
158
|
+
else:
|
|
159
|
+
self.__value = self.max
|
|
160
|
+
self.callback('overflow', self)
|
|
161
|
+
for knob in self.knobs:
|
|
162
|
+
knob.update_ctrl(valid, notify=True)
|
|
161
163
|
|
|
162
164
|
@property
|
|
163
165
|
def std_value(self):
|
|
@@ -224,19 +226,21 @@ class LParam(Param):
|
|
|
224
226
|
|
|
225
227
|
Args:
|
|
226
228
|
name : label
|
|
227
|
-
range : range [min:max:step]
|
|
229
|
+
range : range params [min:max:step]
|
|
228
230
|
value : std_value (default is None)
|
|
229
231
|
fmt : text formatter or format:str (default is '%g')
|
|
230
232
|
`hex` specifies hexadecimal format
|
|
231
|
-
handler : called when
|
|
232
|
-
updater : called when
|
|
233
|
+
handler : called when knob is handled.
|
|
234
|
+
updater : called when button is pressed.
|
|
235
|
+
checker : called when tick turns on/off.
|
|
233
236
|
|
|
234
237
|
Attributes:
|
|
235
238
|
knobs : knob list
|
|
236
239
|
callback : single state machine that handles following events
|
|
237
240
|
|
|
238
|
-
- control -> when index changed by knobs or reset (handler)
|
|
239
|
-
-
|
|
241
|
+
- control -> when index is changed by knobs or reset (handler)
|
|
242
|
+
- updated -> when button is pressed (updater)
|
|
243
|
+
- checked -> when tick turns on/off (checker)
|
|
240
244
|
- overflow -> when value overflows
|
|
241
245
|
- underflow -> when value underflows
|
|
242
246
|
"""
|
|
@@ -295,8 +299,9 @@ class Knob(wx.Panel):
|
|
|
295
299
|
type : ctrl type (slider[*], [hv]spin, choice, None)
|
|
296
300
|
style : style of label
|
|
297
301
|
None -> static text (default)
|
|
298
|
-
chkbox -> label with check box
|
|
299
302
|
button -> label with flat button
|
|
303
|
+
chkbox -> label with checkbox
|
|
304
|
+
checkbox -> label with checkbox
|
|
300
305
|
cw : width of ctrl
|
|
301
306
|
lw : width of label
|
|
302
307
|
tw : width of textbox
|
|
@@ -326,7 +331,7 @@ class Knob(wx.Panel):
|
|
|
326
331
|
self.__par = param
|
|
327
332
|
self.__par.knobs.append(self) # パラメータの関連付けを行う
|
|
328
333
|
|
|
329
|
-
if type
|
|
334
|
+
if not type:
|
|
330
335
|
type = 'slider'
|
|
331
336
|
if cw < 0:
|
|
332
337
|
cw = 0
|
|
@@ -338,19 +343,17 @@ class Knob(wx.Panel):
|
|
|
338
343
|
|
|
339
344
|
label = self.__par.name + ' '
|
|
340
345
|
|
|
341
|
-
if style == 'chkbox':
|
|
346
|
+
if style == 'chkbox' or style == 'checkbox':
|
|
342
347
|
if lw >= 0:
|
|
343
348
|
lw += 16
|
|
344
349
|
self.label = wx.CheckBox(self, label=label, size=(lw,-1))
|
|
345
350
|
self.label.Bind(wx.EVT_CHECKBOX, self.OnCheck)
|
|
346
|
-
|
|
347
351
|
elif style == 'button':
|
|
348
352
|
if lw >= 0:
|
|
349
353
|
lw += 16
|
|
350
354
|
self.label = pb.PlateButton(self, label=label, size=(lw,-1),
|
|
351
355
|
style=pb.PB_STYLE_DEFAULT|pb.PB_STYLE_SQUARE)
|
|
352
356
|
self.label.Bind(wx.EVT_BUTTON, self.OnPress)
|
|
353
|
-
|
|
354
357
|
elif not style:
|
|
355
358
|
self.label = wx.StaticText(self, label=label, size=(lw,-1))
|
|
356
359
|
else:
|
|
@@ -442,6 +445,7 @@ class Knob(wx.Panel):
|
|
|
442
445
|
t = ' ' if np.isnan(v.std_value) or v.value == v.std_value else '*'
|
|
443
446
|
self.label.SetLabel(v.name + t)
|
|
444
447
|
self.label.Refresh()
|
|
448
|
+
self.Refresh()
|
|
445
449
|
|
|
446
450
|
def update_ctrl(self, valid=True, notify=False):
|
|
447
451
|
"""Called when value is being changed (internal use only)."""
|
|
@@ -478,12 +482,14 @@ class Knob(wx.Panel):
|
|
|
478
482
|
j = self.ctrl.GetValue() + bit
|
|
479
483
|
if j != v.index:
|
|
480
484
|
v.index = j
|
|
485
|
+
v.reset(v.value)
|
|
481
486
|
|
|
482
487
|
def OnScroll(self, evt): #<wx._core.ScrollEvent><wx._controls.SpinEvent><wx._core.CommandEvent>
|
|
483
488
|
v = self.__par
|
|
484
489
|
j = self.ctrl.GetValue()
|
|
485
490
|
if j != v.index:
|
|
486
491
|
v.index = j
|
|
492
|
+
v.reset(v.value)
|
|
487
493
|
evt.Skip()
|
|
488
494
|
|
|
489
495
|
def OnMouseWheel(self, evt): #<wx._core.MouseEvent>
|
|
@@ -532,7 +538,7 @@ class Knob(wx.Panel):
|
|
|
532
538
|
evt.Skip()
|
|
533
539
|
|
|
534
540
|
def OnPress(self, evt): #<wx._core.CommandEvent>
|
|
535
|
-
self.__par.callback('
|
|
541
|
+
self.__par.callback('updated', self.__par)
|
|
536
542
|
evt.Skip()
|
|
537
543
|
|
|
538
544
|
def Enable(self, p=True):
|
|
@@ -590,7 +596,6 @@ class KnobCtrlPanel(scrolled.ScrolledPanel):
|
|
|
590
596
|
for cc in obj.Children: # child of child <wx._core.SizerItem>
|
|
591
597
|
cc.Show(not cc.IsShown())
|
|
592
598
|
self.Layout()
|
|
593
|
-
self.SendSizeEvent()
|
|
594
599
|
break
|
|
595
600
|
evt.Skip()
|
|
596
601
|
|
|
@@ -618,9 +623,7 @@ class KnobCtrlPanel(scrolled.ScrolledPanel):
|
|
|
618
623
|
## child = self.Sizer.Children[groupid]
|
|
619
624
|
## child.Show(p)
|
|
620
625
|
self.Sizer.Show(groupid % len(self.__groups), p)
|
|
621
|
-
## self.Sizer.Fit(self) # do Fit(self.Parent) if needed
|
|
622
626
|
self.Layout()
|
|
623
|
-
self.Parent.SendSizeEvent() # let parent redraw the child panel
|
|
624
627
|
|
|
625
628
|
def is_folded(self, groupid):
|
|
626
629
|
child = self.Sizer.Children[groupid]
|
|
@@ -632,9 +635,7 @@ class KnobCtrlPanel(scrolled.ScrolledPanel):
|
|
|
632
635
|
if isinstance(child.Sizer, wx.StaticBoxSizer) and child.IsShown():
|
|
633
636
|
for cc in child.Sizer.Children: # child of child <wx._core.SizerItem>
|
|
634
637
|
cc.Show(not p)
|
|
635
|
-
## self.Sizer.Fit(self) # do Fit(self.Parent) if needed
|
|
636
638
|
self.Layout()
|
|
637
|
-
self.Parent.SendSizeEvent() # let parent redraw the child panel
|
|
638
639
|
|
|
639
640
|
def layout(self, items, title=None,
|
|
640
641
|
row=0, expand=0, border=2, hspacing=1, vspacing=1,
|
mwx/framework.py
CHANGED
mwx/graphman.py
CHANGED
|
@@ -336,6 +336,7 @@ class LayerInterface(CtrlInterface):
|
|
|
336
336
|
'thread_error' : [ None ], # failed in error
|
|
337
337
|
'page_shown' : [ None, _F(self.Draw, True) ],
|
|
338
338
|
'page_closed' : [ None, _F(self.Draw, False) ],
|
|
339
|
+
'page_hidden' : [ None, _F(self.Draw, False) ],
|
|
339
340
|
},
|
|
340
341
|
0 : {
|
|
341
342
|
'C-c pressed' : (0, _F(copy_params)),
|
|
@@ -380,6 +381,7 @@ class LayerInterface(CtrlInterface):
|
|
|
380
381
|
lambda v: Menu.Popup(self, self.menu))
|
|
381
382
|
|
|
382
383
|
self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy)
|
|
384
|
+
self.Bind(wx.EVT_SHOW, self.OnShow)
|
|
383
385
|
|
|
384
386
|
try:
|
|
385
387
|
self.Init()
|
|
@@ -419,6 +421,16 @@ class LayerInterface(CtrlInterface):
|
|
|
419
421
|
del self.Arts
|
|
420
422
|
evt.Skip()
|
|
421
423
|
|
|
424
|
+
def OnShow(self, evt):
|
|
425
|
+
if not self:
|
|
426
|
+
return
|
|
427
|
+
if isinstance(self.Parent, aui.AuiNotebook):
|
|
428
|
+
if evt.IsShown():
|
|
429
|
+
self.handler('page_shown', self)
|
|
430
|
+
else:
|
|
431
|
+
self.handler('page_hidden', self)
|
|
432
|
+
evt.Skip()
|
|
433
|
+
|
|
422
434
|
Shown = property(
|
|
423
435
|
lambda self: self.IsShown(),
|
|
424
436
|
lambda self,v: self.Show(v))
|
|
@@ -1001,7 +1013,7 @@ class Frame(mwx.Frame):
|
|
|
1001
1013
|
plug.handler('page_closed', plug)
|
|
1002
1014
|
else:
|
|
1003
1015
|
win.handler('page_closed', win)
|
|
1004
|
-
evt.Skip()
|
|
1016
|
+
evt.Skip(False) # Don't skip to avoid being called twice.
|
|
1005
1017
|
|
|
1006
1018
|
## --------------------------------
|
|
1007
1019
|
## Plugin <Layer> interface
|
mwx/utilus.py
CHANGED
|
@@ -197,7 +197,7 @@ def typename(obj, docp=False, qualp=True):
|
|
|
197
197
|
|
|
198
198
|
modname = getattr(obj, '__module__', None)
|
|
199
199
|
if modname and modname != "__main__" and not modname.startswith('mwx'):
|
|
200
|
-
name = modname + '.' + name
|
|
200
|
+
name = modname + ('.' if qualp else '..') + name
|
|
201
201
|
|
|
202
202
|
if docp and callable(obj) and obj.__doc__:
|
|
203
203
|
name += "<{!r}>".format(obj.__doc__.splitlines()[0]) # concat the first doc line
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
mwx/__init__.py,sha256=nN62CGTWjME7Zz2h-jIRB8MxwuErIkHPGrlBzydkF0o,643
|
|
2
2
|
mwx/bookshelf.py,sha256=so-xSLq08sMlJBErTxOaDoKUAMa_g1CkIP2pNnff68c,5607
|
|
3
|
-
mwx/controls.py,sha256=
|
|
4
|
-
mwx/framework.py,sha256=
|
|
5
|
-
mwx/graphman.py,sha256
|
|
3
|
+
mwx/controls.py,sha256=1WTJEFeeGY9_gycGzHMQUdgBGgwc2QnvDnQPJ49bRZY,48053
|
|
4
|
+
mwx/framework.py,sha256=dCQ_xwPssrjBpGYLwxQRlKRHf-kX4tumFgZlVt7iQ3Q,75587
|
|
5
|
+
mwx/graphman.py,sha256=-klqkJ8h5Vi01Xe9H_N28m-59x2lbRe_ow3NHswnDZE,70433
|
|
6
6
|
mwx/images.py,sha256=_-Eh3xF7Khu42ivkYp97NXIzSNGbjcidqtWjZQFGtqE,47827
|
|
7
7
|
mwx/matplot2.py,sha256=xCJ_ZzdDEWmzctpPaOrzTnwXyHINP4nfFHweoTZa6ug,32899
|
|
8
8
|
mwx/matplot2g.py,sha256=gCXa8X1MEMP7n_mG73h3SkWKuNZOfjVKUTWNRXXK11c,64310
|
|
9
9
|
mwx/matplot2lg.py,sha256=JRWjWnLJUytbSq6wxs4P0gbVUr3xoLSF6Wwqd5V_pJI,27404
|
|
10
10
|
mwx/mgplt.py,sha256=0WJ1RN_Y0a4Y3rz1C_Lx-WhumtOMdb1N49guX9aZZ_o,5602
|
|
11
11
|
mwx/nutshell.py,sha256=xoHTyWZ46geGy3u4aU8k8_-mr520EdGcvuQRO4TBU_A,140715
|
|
12
|
-
mwx/utilus.py,sha256=
|
|
12
|
+
mwx/utilus.py,sha256=iizdVrbwL1lX7eTfsMmltFz4IfHqTXVM37wwlPQ3A3Y,37346
|
|
13
13
|
mwx/wxmon.py,sha256=Pq8XXigM_isJd80yiqG18iRVdArJpsePpxfnZOkk-Uw,12573
|
|
14
14
|
mwx/wxpdb.py,sha256=lLowkkAgMhPFHAfklD7wZHq0qbSMjRxnBFtSajmVgME,19133
|
|
15
15
|
mwx/wxwil.py,sha256=hhyB1lPrF9ixeObxCOKQv0Theu-B-kpJg_yVU3EGSNg,5406
|
|
@@ -21,8 +21,8 @@ mwx/plugins/frame_listview.py,sha256=yEYPCdLHLSMTJwTv6iYAh3Lo4lJvYfp5BxTLP3FhW9Y
|
|
|
21
21
|
mwx/plugins/line_profile.py,sha256=--9NIc3x5EfRB3L59JvD7rzENQHyiYfu7wWJo6AuMkA,820
|
|
22
22
|
mwx/py/__init__.py,sha256=xykgfOytOwNuvXsfkLoumFZSTN-iBsHOjczYXngjmUE,12
|
|
23
23
|
mwx/py/filling.py,sha256=fumUG1F5M9TL-Dfqni4G85uk7TmvnUunTbdcPDV0vfo,16857
|
|
24
|
-
mwxlib-0.99.
|
|
25
|
-
mwxlib-0.99.
|
|
26
|
-
mwxlib-0.99.
|
|
27
|
-
mwxlib-0.99.
|
|
28
|
-
mwxlib-0.99.
|
|
24
|
+
mwxlib-0.99.2.dist-info/LICENSE,sha256=PGtRKCaTkmUDlBQwpptJAxJtdqxIUtAmdBsaT9nUVkA,1091
|
|
25
|
+
mwxlib-0.99.2.dist-info/METADATA,sha256=fLuVjSWTwHhXJmBuIEwD-HCdHHhFPVHnXapKkretuvQ,7411
|
|
26
|
+
mwxlib-0.99.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
27
|
+
mwxlib-0.99.2.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
|
|
28
|
+
mwxlib-0.99.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|