mwxlib 0.97.3__py3-none-any.whl → 0.97.6__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/bookshelf.py +1 -1
- mwx/controls.py +72 -79
- mwx/framework.py +42 -39
- mwx/graphman.py +2 -3
- mwx/nutshell.py +4 -3
- mwx/utilus.py +1 -1
- {mwxlib-0.97.3.dist-info → mwxlib-0.97.6.dist-info}/METADATA +1 -1
- {mwxlib-0.97.3.dist-info → mwxlib-0.97.6.dist-info}/RECORD +11 -11
- {mwxlib-0.97.3.dist-info → mwxlib-0.97.6.dist-info}/WHEEL +1 -1
- {mwxlib-0.97.3.dist-info → mwxlib-0.97.6.dist-info}/LICENSE +0 -0
- {mwxlib-0.97.3.dist-info → mwxlib-0.97.6.dist-info}/top_level.txt +0 -0
mwx/bookshelf.py
CHANGED
|
@@ -40,7 +40,7 @@ class EditorTreeCtrl(wx.TreeCtrl, CtrlInterface):
|
|
|
40
40
|
def delete_item():
|
|
41
41
|
data = self.GetItemData(self.Selection)
|
|
42
42
|
if data:
|
|
43
|
-
data.parent.kill_buffer(data) #
|
|
43
|
+
data.parent.kill_buffer(data) # the focus moves
|
|
44
44
|
wx.CallAfter(self.SetFocus)
|
|
45
45
|
|
|
46
46
|
def dispatch(evt):
|
mwx/controls.py
CHANGED
|
@@ -48,7 +48,7 @@ class Param(object):
|
|
|
48
48
|
self.knobs = []
|
|
49
49
|
self.name = name
|
|
50
50
|
self.range = range
|
|
51
|
-
self.__std_value = value
|
|
51
|
+
self.__std_value = value if value is not None else nan
|
|
52
52
|
self.__value = value if value is not None else self.min
|
|
53
53
|
self.__check = False
|
|
54
54
|
if fmt is hex:
|
|
@@ -69,7 +69,8 @@ class Param(object):
|
|
|
69
69
|
self._tooltip = _Tip(handler.__doc__, updater.__doc__)
|
|
70
70
|
|
|
71
71
|
def __str__(self, v=None):
|
|
72
|
-
|
|
72
|
+
if v is None:
|
|
73
|
+
v = self.value
|
|
73
74
|
try:
|
|
74
75
|
return self.__format(v)
|
|
75
76
|
except ValueError:
|
|
@@ -84,45 +85,22 @@ class Param(object):
|
|
|
84
85
|
def __len__(self):
|
|
85
86
|
return len(self.range)
|
|
86
87
|
|
|
87
|
-
def reset(self, v=None,
|
|
88
|
+
def reset(self, v=None, internal_callback=True):
|
|
88
89
|
"""Reset value when indexed (by knobs) with callback."""
|
|
89
|
-
if v is None
|
|
90
|
+
if v is None:
|
|
90
91
|
v = self.std_value
|
|
91
|
-
if v
|
|
92
|
+
if np.isnan(v):
|
|
92
93
|
return
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
elif isinstance(v, str):
|
|
95
|
+
try:
|
|
96
|
+
v = self.__eval(v.replace(',', '')) # eliminates commas; includes nan, inf
|
|
97
|
+
except Exception:
|
|
98
|
+
v = self.value
|
|
99
|
+
internal_callback = False
|
|
100
|
+
self.value = v
|
|
101
|
+
if internal_callback:
|
|
97
102
|
self.callback('control', self)
|
|
98
103
|
|
|
99
|
-
def _set_value(self, v):
|
|
100
|
-
"""Set value and check the limit.
|
|
101
|
-
If the value is out of range, modify the value.
|
|
102
|
-
"""
|
|
103
|
-
if v is None:
|
|
104
|
-
v = nan
|
|
105
|
-
|
|
106
|
-
if np.isnan(v) or np.isinf(v):
|
|
107
|
-
self.__value = v
|
|
108
|
-
for knob in self.knobs:
|
|
109
|
-
knob.update_ctrl(None, notify=False)
|
|
110
|
-
return
|
|
111
|
-
elif v == self.__value:
|
|
112
|
-
return
|
|
113
|
-
|
|
114
|
-
valid = (self.min <= v <= self.max)
|
|
115
|
-
if valid:
|
|
116
|
-
self.__value = v
|
|
117
|
-
elif v < self.min:
|
|
118
|
-
self.__value = self.min
|
|
119
|
-
self.callback('underflow', self)
|
|
120
|
-
else:
|
|
121
|
-
self.__value = self.max
|
|
122
|
-
self.callback('overflow', self)
|
|
123
|
-
for knob in self.knobs:
|
|
124
|
-
knob.update_ctrl(valid, notify=True)
|
|
125
|
-
|
|
126
104
|
@property
|
|
127
105
|
def check(self):
|
|
128
106
|
"""A knob check property (user defined)."""
|
|
@@ -152,7 +130,30 @@ class Param(object):
|
|
|
152
130
|
|
|
153
131
|
@value.setter
|
|
154
132
|
def value(self, v):
|
|
155
|
-
|
|
133
|
+
if v is None:
|
|
134
|
+
v = nan
|
|
135
|
+
if np.isnan(v) or np.isinf(v):
|
|
136
|
+
self.__value = v
|
|
137
|
+
for knob in self.knobs:
|
|
138
|
+
knob.update_ctrl(None, notify=False)
|
|
139
|
+
return
|
|
140
|
+
elif v == self.__value:
|
|
141
|
+
for knob in self.knobs:
|
|
142
|
+
knob.update_ctrl(True, notify=False)
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
## If the value is out of range, it will be modified.
|
|
146
|
+
valid = (self.min <= v <= self.max)
|
|
147
|
+
if valid:
|
|
148
|
+
self.__value = v
|
|
149
|
+
elif v < self.min:
|
|
150
|
+
self.__value = self.min
|
|
151
|
+
self.callback('underflow', self)
|
|
152
|
+
else:
|
|
153
|
+
self.__value = self.max
|
|
154
|
+
self.callback('overflow', self)
|
|
155
|
+
for knob in self.knobs:
|
|
156
|
+
knob.update_ctrl(valid, notify=True)
|
|
156
157
|
|
|
157
158
|
@property
|
|
158
159
|
def std_value(self):
|
|
@@ -161,6 +162,8 @@ class Param(object):
|
|
|
161
162
|
|
|
162
163
|
@std_value.setter
|
|
163
164
|
def std_value(self, v):
|
|
165
|
+
if v is None:
|
|
166
|
+
v = nan
|
|
164
167
|
self.__std_value = v
|
|
165
168
|
for knob in self.knobs:
|
|
166
169
|
knob.update_label()
|
|
@@ -168,21 +171,20 @@ class Param(object):
|
|
|
168
171
|
@property
|
|
169
172
|
def offset(self):
|
|
170
173
|
"""Offset value
|
|
171
|
-
If std_value is
|
|
174
|
+
If std_value is nan, this is the same as value.
|
|
172
175
|
"""
|
|
173
|
-
if self.std_value
|
|
176
|
+
if not np.isnan(self.std_value):
|
|
174
177
|
return self.value - self.std_value
|
|
175
178
|
return self.value
|
|
176
179
|
|
|
177
180
|
@offset.setter
|
|
178
181
|
def offset(self, v):
|
|
179
|
-
if self.std_value
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
self._set_value(v)
|
|
182
|
+
if not np.isnan(self.std_value):
|
|
183
|
+
v += self.std_value
|
|
184
|
+
self.value = v
|
|
183
185
|
|
|
184
|
-
min = property(lambda self: self.__range[0])
|
|
185
|
-
max = property(lambda self: self.__range[-1])
|
|
186
|
+
min = property(lambda self: self.__range[0] if self else nan)
|
|
187
|
+
max = property(lambda self: self.__range[-1] if self else nan)
|
|
186
188
|
|
|
187
189
|
@property
|
|
188
190
|
def range(self):
|
|
@@ -192,7 +194,7 @@ class Param(object):
|
|
|
192
194
|
@range.setter
|
|
193
195
|
def range(self, v):
|
|
194
196
|
if v is None:
|
|
195
|
-
self.__range = [
|
|
197
|
+
self.__range = [] # dummy data
|
|
196
198
|
else:
|
|
197
199
|
self.__range = sorted(v)
|
|
198
200
|
for knob in self.knobs:
|
|
@@ -200,14 +202,17 @@ class Param(object):
|
|
|
200
202
|
|
|
201
203
|
@property
|
|
202
204
|
def index(self):
|
|
203
|
-
"""A knob index -> value.
|
|
204
|
-
|
|
205
|
+
"""A knob index -> value.
|
|
206
|
+
Returns -1 if the value is not defined."""
|
|
207
|
+
if self:
|
|
208
|
+
return int(np.searchsorted(self.range, self.value))
|
|
209
|
+
return -1
|
|
205
210
|
|
|
206
211
|
@index.setter
|
|
207
212
|
def index(self, j):
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
if self:
|
|
214
|
+
i = (0 if j < 0 else j if j < len(self) else -1)
|
|
215
|
+
self.value = self.range[i]
|
|
211
216
|
|
|
212
217
|
|
|
213
218
|
class LParam(Param):
|
|
@@ -266,7 +271,7 @@ class LParam(Param):
|
|
|
266
271
|
|
|
267
272
|
@index.setter
|
|
268
273
|
def index(self, j):
|
|
269
|
-
|
|
274
|
+
self.value = self.min + j * self.step
|
|
270
275
|
|
|
271
276
|
|
|
272
277
|
## --------------------------------
|
|
@@ -319,7 +324,8 @@ class Knob(wx.Panel):
|
|
|
319
324
|
|
|
320
325
|
if type is None:
|
|
321
326
|
type = 'slider'
|
|
322
|
-
cw
|
|
327
|
+
if cw < 0:
|
|
328
|
+
cw = 0
|
|
323
329
|
elif type == 'choice':
|
|
324
330
|
if cw < 0:
|
|
325
331
|
cw = 20
|
|
@@ -429,28 +435,20 @@ class Knob(wx.Panel):
|
|
|
429
435
|
if isinstance(self.label, wx.CheckBox):
|
|
430
436
|
self.label.SetValue(v.check)
|
|
431
437
|
|
|
432
|
-
if
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
self.label.Refresh()
|
|
438
|
+
t = ' ' if np.isnan(v.std_value) or v.value == v.std_value else '*'
|
|
439
|
+
self.label.SetLabel(v.name + t)
|
|
440
|
+
self.label.Refresh()
|
|
436
441
|
|
|
437
442
|
def update_ctrl(self, valid=True, notify=False):
|
|
438
443
|
"""Called when value is being changed (internal use only)."""
|
|
439
444
|
v = self.__par
|
|
440
|
-
|
|
441
|
-
j = v.index
|
|
442
|
-
except (OverflowError, ValueError):
|
|
443
|
-
## OverflowError: cannot convert float infinity to integer
|
|
444
|
-
## ValueError: cannot convert float NaN to integer
|
|
445
|
-
j = -1
|
|
446
|
-
|
|
447
|
-
self.ctrl.SetValue(j)
|
|
445
|
+
self.ctrl.SetValue(v.index)
|
|
448
446
|
self.text.SetValue(str(v))
|
|
449
447
|
if valid:
|
|
450
448
|
if notify:
|
|
451
449
|
if self.text.BackgroundColour != '#ffff80':
|
|
452
450
|
wx.CallAfter(wx.CallLater, 1000,
|
|
453
|
-
|
|
451
|
+
self.set_textcolour, '#ffffff')
|
|
454
452
|
self.set_textcolour('#ffff80') # light-yellow
|
|
455
453
|
else:
|
|
456
454
|
self.set_textcolour('#ffffff') # True: white
|
|
@@ -464,8 +462,7 @@ class Knob(wx.Panel):
|
|
|
464
462
|
|
|
465
463
|
def set_textcolour(self, c):
|
|
466
464
|
if self:
|
|
467
|
-
|
|
468
|
-
self.text.BackgroundColour = c
|
|
465
|
+
self.text.BackgroundColour = c
|
|
469
466
|
self.text.Refresh()
|
|
470
467
|
|
|
471
468
|
def shift(self, evt, bit):
|
|
@@ -496,15 +493,15 @@ class Knob(wx.Panel):
|
|
|
496
493
|
if key == wx.WXK_LEFT: return self.shift(evt, -1)
|
|
497
494
|
if key == wx.WXK_RIGHT: return self.shift(evt, 1)
|
|
498
495
|
|
|
499
|
-
def
|
|
496
|
+
def _focus(c):
|
|
500
497
|
if isinstance(c, Knob) and c.ctrl.IsEnabled():
|
|
501
498
|
c.ctrl.SetFocus()
|
|
502
499
|
return True
|
|
503
500
|
|
|
504
501
|
ls = next(x for x in self.Parent.layout_groups if self in x)
|
|
505
502
|
i = ls.index(self)
|
|
506
|
-
if key == wx.WXK_DOWN: return any(
|
|
507
|
-
if key == wx.WXK_UP: return any(
|
|
503
|
+
if key == wx.WXK_DOWN: return any(_focus(c) for c in ls[i+1:])
|
|
504
|
+
if key == wx.WXK_UP: return any(_focus(c) for c in ls[i-1::-1])
|
|
508
505
|
|
|
509
506
|
def OnTextKeyUp(self, evt): #<wx._core.KeyEvent>
|
|
510
507
|
evt.Skip()
|
|
@@ -514,7 +511,7 @@ class Knob(wx.Panel):
|
|
|
514
511
|
if key == wx.WXK_DOWN: return self.shift(evt, -1)
|
|
515
512
|
if key == wx.WXK_UP: return self.shift(evt, 1)
|
|
516
513
|
if key == wx.WXK_ESCAPE:
|
|
517
|
-
self.__par.reset(self.__par.value,
|
|
514
|
+
self.__par.reset(self.__par.value, internal_callback=None) # restore value
|
|
518
515
|
evt.Skip()
|
|
519
516
|
|
|
520
517
|
def OnTextEnter(self, evt): #<wx._core.CommandEvent>
|
|
@@ -525,11 +522,7 @@ class Knob(wx.Panel):
|
|
|
525
522
|
def OnTextExit(self, evt): #<wx._core.FocusEvent>
|
|
526
523
|
x = self.text.Value.strip()
|
|
527
524
|
if x != str(self.__par):
|
|
528
|
-
|
|
529
|
-
self.__par.reset(x) # reset value if focus out
|
|
530
|
-
except Exception:
|
|
531
|
-
self.text.SetValue(str(self.__par))
|
|
532
|
-
self.__par.reset(self.__par.value, backcall=None) # restore value
|
|
525
|
+
self.__par.reset(x)
|
|
533
526
|
evt.Skip()
|
|
534
527
|
|
|
535
528
|
def OnCheck(self, evt): #<wx._core.CommandEvent>
|
|
@@ -1358,7 +1351,7 @@ class Gauge(wx.Control):
|
|
|
1358
1351
|
dc.Clear()
|
|
1359
1352
|
dc.SetPen(wx.TRANSPARENT_PEN)
|
|
1360
1353
|
|
|
1361
|
-
def
|
|
1354
|
+
def _gradients(x):
|
|
1362
1355
|
y = 4 * x
|
|
1363
1356
|
if y < 1: rgb = (0, y, 1)
|
|
1364
1357
|
elif y < 2: rgb = (0, 1, 2-y)
|
|
@@ -1372,7 +1365,7 @@ class Gauge(wx.Control):
|
|
|
1372
1365
|
for i in range(N):
|
|
1373
1366
|
x = int(i * w / N)
|
|
1374
1367
|
if i < self.__value:
|
|
1375
|
-
dc.SetBrush(wx.Brush(
|
|
1368
|
+
dc.SetBrush(wx.Brush(_gradients(i/N)))
|
|
1376
1369
|
else:
|
|
1377
1370
|
dc.SetBrush(wx.Brush('white'))
|
|
1378
1371
|
dc.DrawRectangle(x, 0, d, h)
|
mwx/framework.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#! python3
|
|
2
2
|
"""mwxlib framework.
|
|
3
3
|
"""
|
|
4
|
-
__version__ = "0.97.
|
|
4
|
+
__version__ = "0.97.6"
|
|
5
5
|
__author__ = "Kazuya O'moto <komoto@jeol.co.jp>"
|
|
6
6
|
|
|
7
|
+
from contextlib import contextmanager
|
|
7
8
|
from functools import wraps, partial
|
|
8
9
|
from importlib import reload
|
|
9
10
|
import traceback
|
|
@@ -75,6 +76,16 @@ def postcall(f):
|
|
|
75
76
|
return _f
|
|
76
77
|
|
|
77
78
|
|
|
79
|
+
@contextmanager
|
|
80
|
+
def save_focus_excursion():
|
|
81
|
+
wnd = wx.Window.FindFocus() # original focus
|
|
82
|
+
try:
|
|
83
|
+
yield wnd
|
|
84
|
+
finally:
|
|
85
|
+
if wnd:
|
|
86
|
+
wnd.SetFocus() # restore focus
|
|
87
|
+
|
|
88
|
+
|
|
78
89
|
_speckeys = {
|
|
79
90
|
wx.WXK_ALT : 'alt',
|
|
80
91
|
wx.WXK_BACK : 'backspace',
|
|
@@ -502,11 +513,8 @@ def pack(self, items, orient=wx.HORIZONTAL, style=None, label=None):
|
|
|
502
513
|
else:
|
|
503
514
|
sizer = wx.BoxSizer(orient)
|
|
504
515
|
for item in items:
|
|
505
|
-
if
|
|
506
|
-
|
|
507
|
-
item = (0,0), 0,0,0, # null space
|
|
508
|
-
else:
|
|
509
|
-
item = (0,0) # padding space
|
|
516
|
+
if item is None:
|
|
517
|
+
item = ((0, 0), 0, 0, 0) # null space
|
|
510
518
|
try:
|
|
511
519
|
try:
|
|
512
520
|
sizer.Add(item, *style)
|
|
@@ -838,7 +846,7 @@ class MiniFrame(wx.MiniFrame, KeyCtrlInterfaceMixin):
|
|
|
838
846
|
class AuiNotebook(aui.AuiNotebook):
|
|
839
847
|
"""AuiNotebook extension class.
|
|
840
848
|
"""
|
|
841
|
-
def __init__(self, *args, **kwargs):
|
|
849
|
+
def __init__(self, *args, name=None, **kwargs):
|
|
842
850
|
kwargs.setdefault('style',
|
|
843
851
|
(aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_BOTTOM)
|
|
844
852
|
^ aui.AUI_NB_CLOSE_ON_ACTIVE_TAB
|
|
@@ -847,6 +855,8 @@ class AuiNotebook(aui.AuiNotebook):
|
|
|
847
855
|
aui.AuiNotebook.__init__(self, *args, **kwargs)
|
|
848
856
|
|
|
849
857
|
self._mgr = self.EventHandler
|
|
858
|
+
if name:
|
|
859
|
+
self.Name = name
|
|
850
860
|
|
|
851
861
|
def tab_menu(evt):
|
|
852
862
|
tabs = evt.EventObject #<AuiTabCtrl>
|
|
@@ -885,7 +895,7 @@ class AuiNotebook(aui.AuiNotebook):
|
|
|
885
895
|
wnd = wx.Window.FindFocus() # original focus
|
|
886
896
|
org = self.CurrentPage
|
|
887
897
|
if j != self.Selection:
|
|
888
|
-
self.Selection = j # focus
|
|
898
|
+
self.Selection = j # the focus moves if shown
|
|
889
899
|
self.CurrentPage.SetFocus() # reset focus
|
|
890
900
|
if wnd and wnd is not org: # restore focus other window
|
|
891
901
|
wnd.SetFocus()
|
|
@@ -1133,37 +1143,35 @@ class ShellFrame(MiniFrame):
|
|
|
1133
1143
|
self.ginfo = LocalsWatcher(self, name="globals")
|
|
1134
1144
|
self.linfo = LocalsWatcher(self, name="locals")
|
|
1135
1145
|
|
|
1136
|
-
self.console = AuiNotebook(self, size=(600,400))
|
|
1146
|
+
self.console = AuiNotebook(self, size=(600,400), name='console')
|
|
1137
1147
|
self.console.AddPage(self.__shell, "root", bitmap=Icon('core'))
|
|
1138
1148
|
self.console.TabCtrlHeight = 0
|
|
1139
|
-
self.console.Name = "console"
|
|
1149
|
+
## self.console.Name = "console"
|
|
1140
1150
|
|
|
1141
1151
|
## self.console.Bind(aui.EVT_AUINOTEBOOK_BUTTON, self.OnConsoleCloseBtn)
|
|
1142
1152
|
self.console.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnConsolePageClose)
|
|
1143
1153
|
self.console.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnConsolePageChanged)
|
|
1144
1154
|
|
|
1145
|
-
self.ghost = AuiNotebook(self, size=(600,400))
|
|
1155
|
+
self.ghost = AuiNotebook(self, size=(600,400), name="ghost")
|
|
1146
1156
|
self.ghost.AddPage(self.Scratch, "Scratch", bitmap=Icon('ghost'))
|
|
1147
1157
|
self.ghost.AddPage(self.Log, "Log")
|
|
1148
1158
|
self.ghost.AddPage(self.Help, "Help")
|
|
1149
|
-
self.ghost.Name = "ghost"
|
|
1150
1159
|
|
|
1151
1160
|
self.ghost.AddPage(self.Bookshelf, "Bookshelf", bitmap=Icon('book'))
|
|
1152
1161
|
|
|
1153
1162
|
self.ghost.SetDropTarget(FileDropLoader(self.Scratch))
|
|
1154
1163
|
|
|
1155
|
-
self.watcher = AuiNotebook(self, size=(
|
|
1164
|
+
self.watcher = AuiNotebook(self, size=(600,400), name="watcher")
|
|
1156
1165
|
self.watcher.AddPage(self.ginfo, "globals")
|
|
1157
1166
|
self.watcher.AddPage(self.linfo, "locals")
|
|
1158
1167
|
self.watcher.AddPage(self.monitor, "Monitor", bitmap=Icon('tv'))
|
|
1159
1168
|
self.watcher.AddPage(self.inspector, "Inspector", bitmap=Icon('inspect'))
|
|
1160
|
-
self.watcher.Name = "watcher"
|
|
1161
1169
|
|
|
1162
1170
|
self.watcher.Bind(wx.EVT_SHOW, self.OnGhostShow)
|
|
1163
1171
|
|
|
1164
1172
|
self._mgr = aui.AuiManager()
|
|
1165
1173
|
self._mgr.SetManagedWindow(self)
|
|
1166
|
-
self._mgr.SetDockSizeConstraint(
|
|
1174
|
+
self._mgr.SetDockSizeConstraint(1, 1)
|
|
1167
1175
|
|
|
1168
1176
|
self._mgr.AddPane(self.console,
|
|
1169
1177
|
aui.AuiPaneInfo().Name("console").CenterPane()
|
|
@@ -1454,27 +1462,23 @@ class ShellFrame(MiniFrame):
|
|
|
1454
1462
|
|
|
1455
1463
|
def OnShow(self, evt):
|
|
1456
1464
|
pane = self._mgr.GetPane(self.watcher)
|
|
1457
|
-
|
|
1458
|
-
if
|
|
1459
|
-
|
|
1460
|
-
self.inspector.watch() # restart
|
|
1461
|
-
self.monitor.watch()
|
|
1462
|
-
else:
|
|
1463
|
-
if pane.IsDocked():
|
|
1464
|
-
self.inspector.unwatch()
|
|
1465
|
-
self.monitor.unwatch()
|
|
1466
|
-
wx.CallAfter(_watch, evt.IsShown())
|
|
1467
|
-
evt.Skip()
|
|
1468
|
-
|
|
1469
|
-
def OnGhostShow(self, evt):
|
|
1470
|
-
def _watch(show):
|
|
1471
|
-
if show:
|
|
1472
|
-
self.inspector.watch() # restart
|
|
1465
|
+
if evt.IsShown():
|
|
1466
|
+
if pane.IsShown():
|
|
1467
|
+
self.inspector.watch()
|
|
1473
1468
|
self.monitor.watch()
|
|
1474
|
-
|
|
1469
|
+
else:
|
|
1470
|
+
if pane.IsDocked():
|
|
1475
1471
|
self.inspector.unwatch()
|
|
1476
1472
|
self.monitor.unwatch()
|
|
1477
|
-
|
|
1473
|
+
evt.Skip()
|
|
1474
|
+
|
|
1475
|
+
def OnGhostShow(self, evt):
|
|
1476
|
+
if evt.IsShown():
|
|
1477
|
+
self.inspector.watch()
|
|
1478
|
+
self.monitor.watch()
|
|
1479
|
+
else:
|
|
1480
|
+
self.inspector.unwatch()
|
|
1481
|
+
self.monitor.unwatch()
|
|
1478
1482
|
evt.Skip()
|
|
1479
1483
|
|
|
1480
1484
|
def OnConsolePageChanged(self, evt): #<wx._aui.AuiNotebookEvent>
|
|
@@ -1542,12 +1546,13 @@ class ShellFrame(MiniFrame):
|
|
|
1542
1546
|
self._mgr.RestoreMaximizedPane()
|
|
1543
1547
|
self._mgr.Update()
|
|
1544
1548
|
return
|
|
1549
|
+
if pane.IsShown():
|
|
1550
|
+
pane.best_size = win.Size
|
|
1545
1551
|
self.popup_window(win, not pane.IsShown())
|
|
1546
1552
|
|
|
1553
|
+
@save_focus_excursion()
|
|
1547
1554
|
def popup_window(self, win, show=True):
|
|
1548
1555
|
"""Show the notebook page and keep the focus."""
|
|
1549
|
-
wnd = wx.Window.FindFocus() # original focus
|
|
1550
|
-
|
|
1551
1556
|
for pane in self._mgr.GetAllPanes():
|
|
1552
1557
|
nb = pane.window
|
|
1553
1558
|
if nb is win:
|
|
@@ -1555,14 +1560,11 @@ class ShellFrame(MiniFrame):
|
|
|
1555
1560
|
j = nb.GetPageIndex(win) # find and select page
|
|
1556
1561
|
if j != -1:
|
|
1557
1562
|
if j != nb.Selection:
|
|
1558
|
-
nb.Selection = j # the focus
|
|
1563
|
+
nb.Selection = j # the focus moves
|
|
1559
1564
|
break
|
|
1560
1565
|
else:
|
|
1561
1566
|
return # no such pane.window
|
|
1562
1567
|
|
|
1563
|
-
if wnd:
|
|
1564
|
-
wnd.SetFocus() # restore focus
|
|
1565
|
-
|
|
1566
1568
|
## Modify the floating position of the pane when displayed.
|
|
1567
1569
|
## Note: This is a known bug in wxWidgets 3.17 -- 3.20,
|
|
1568
1570
|
## and will be fixed in wxPython 4.2.1.
|
|
@@ -1598,6 +1600,7 @@ class ShellFrame(MiniFrame):
|
|
|
1598
1600
|
if editor:
|
|
1599
1601
|
return editor.load_file(filename, lineno)
|
|
1600
1602
|
|
|
1603
|
+
@save_focus_excursion()
|
|
1601
1604
|
def load(self, filename, lineno=0, show=True):
|
|
1602
1605
|
"""Load file @where the object is defined.
|
|
1603
1606
|
|
mwx/graphman.py
CHANGED
|
@@ -959,7 +959,7 @@ class Frame(mwx.Frame):
|
|
|
959
959
|
if isinstance(win, aui.AuiNotebook):
|
|
960
960
|
j = win.GetPageIndex(plug)
|
|
961
961
|
if j != win.Selection:
|
|
962
|
-
win.Selection = j # the focus
|
|
962
|
+
win.Selection = j # the focus moves => EVT_SHOW
|
|
963
963
|
else:
|
|
964
964
|
plug.handler('page_shown', plug)
|
|
965
965
|
else:
|
|
@@ -1242,8 +1242,7 @@ class Frame(mwx.Frame):
|
|
|
1242
1242
|
nb.AddPage(plug, caption)
|
|
1243
1243
|
else:
|
|
1244
1244
|
size = plug.GetSize() + (2,30) # padding for notebook
|
|
1245
|
-
nb = AuiNotebook(self)
|
|
1246
|
-
nb.Name = title
|
|
1245
|
+
nb = AuiNotebook(self, name=title)
|
|
1247
1246
|
nb.AddPage(plug, caption)
|
|
1248
1247
|
self._mgr.AddPane(nb, aui.AuiPaneInfo()
|
|
1249
1248
|
.Name(title).Caption(title)
|
mwx/nutshell.py
CHANGED
|
@@ -987,11 +987,12 @@ class EditorInterface(CtrlInterface):
|
|
|
987
987
|
return p, q, st
|
|
988
988
|
|
|
989
989
|
def grep_forward(self, pattern, flags=re.M):
|
|
990
|
-
|
|
990
|
+
orig = self.eol if (self.markline == self.cline) else self.cpos
|
|
991
|
+
text = self.GetTextRange(orig, self.TextLength)
|
|
991
992
|
errs = re.finditer(pattern, text, flags)
|
|
992
993
|
for err in errs:
|
|
993
994
|
p, q = err.span()
|
|
994
|
-
self.goto_char(q +
|
|
995
|
+
self.goto_char(q + orig)
|
|
995
996
|
self.goto_char(self.bol)
|
|
996
997
|
self.mark = self.cpos
|
|
997
998
|
self.EnsureVisible(self.cline)
|
|
@@ -1927,7 +1928,7 @@ class EditorBook(AuiNotebook, CtrlInterface):
|
|
|
1927
1928
|
buf = self.buffer
|
|
1928
1929
|
j = self.GetPageIndex(buf)
|
|
1929
1930
|
if j != -1:
|
|
1930
|
-
self.DeletePage(j) # the focus
|
|
1931
|
+
self.DeletePage(j) # the focus moves
|
|
1931
1932
|
if not self.buffer: # no buffers
|
|
1932
1933
|
self.new_buffer()
|
|
1933
1934
|
|
mwx/utilus.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
mwx/__init__.py,sha256=nN62CGTWjME7Zz2h-jIRB8MxwuErIkHPGrlBzydkF0o,643
|
|
2
|
-
mwx/bookshelf.py,sha256=
|
|
3
|
-
mwx/controls.py,sha256=
|
|
4
|
-
mwx/framework.py,sha256=
|
|
5
|
-
mwx/graphman.py,sha256=
|
|
2
|
+
mwx/bookshelf.py,sha256=Y4xI2SrEO22DrI1hyyfFx7DfFZA8znOzX9RWMPsA2BE,5137
|
|
3
|
+
mwx/controls.py,sha256=LAPGoi_bpiGu6eGhPVHBzv2hx162kWxYBmzlZouMOdk,47582
|
|
4
|
+
mwx/framework.py,sha256=r9nbxrRta0lQat7wWzgBOlHkNay9TYSHHikm1gDRhuk,75209
|
|
5
|
+
mwx/graphman.py,sha256=Cyhl_Da_HGBfk721gu1r5iwSH9L3yPEG8Fzmc2gx-EU,70462
|
|
6
6
|
mwx/images.py,sha256=_-Eh3xF7Khu42ivkYp97NXIzSNGbjcidqtWjZQFGtqE,47827
|
|
7
7
|
mwx/matplot2.py,sha256=xCJ_ZzdDEWmzctpPaOrzTnwXyHINP4nfFHweoTZa6ug,32899
|
|
8
8
|
mwx/matplot2g.py,sha256=wiZFDFuQe3ax71fmyeR_9hvAmgT-4nVfZ30UByv8Nv8,64379
|
|
9
9
|
mwx/matplot2lg.py,sha256=JRWjWnLJUytbSq6wxs4P0gbVUr3xoLSF6Wwqd5V_pJI,27404
|
|
10
10
|
mwx/mgplt.py,sha256=ITzxA97yDwr_35BUk5OqnyskSuKVDbpf2AQCKY1jHTI,5671
|
|
11
|
-
mwx/nutshell.py,sha256=
|
|
12
|
-
mwx/utilus.py,sha256=
|
|
11
|
+
mwx/nutshell.py,sha256=Zwlh_1zFRCmlTBFsw_0xHBLsofKSmzd8K62cWBov1FQ,137580
|
|
12
|
+
mwx/utilus.py,sha256=mmqB4P_3mTi7SrFleMiN1599Jm0Us0XKnNA6v2xglSs,37333
|
|
13
13
|
mwx/wxmon.py,sha256=f3V24EF7kdMlYF7usLYK9QE5KU6fSu0jVqsvwAiA-Ag,12647
|
|
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=hbApzZWa9-BmQthu7uZBlBbGbtf4iJ_prO8IhxoGMs8
|
|
|
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.97.
|
|
25
|
-
mwxlib-0.97.
|
|
26
|
-
mwxlib-0.97.
|
|
27
|
-
mwxlib-0.97.
|
|
28
|
-
mwxlib-0.97.
|
|
24
|
+
mwxlib-0.97.6.dist-info/LICENSE,sha256=PGtRKCaTkmUDlBQwpptJAxJtdqxIUtAmdBsaT9nUVkA,1091
|
|
25
|
+
mwxlib-0.97.6.dist-info/METADATA,sha256=j9v4RwJ93aqB5yYTBlE1i0oENtFExZ5GTIoi_rFIo7E,1880
|
|
26
|
+
mwxlib-0.97.6.dist-info/WHEEL,sha256=Rp8gFpivVLXx-k3U95ozHnQw8yDcPxmhOpn_Gx8d5nc,91
|
|
27
|
+
mwxlib-0.97.6.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
|
|
28
|
+
mwxlib-0.97.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|