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 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) # -> focus moves
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
- v = self.value if v is None else v
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, backcall=True):
88
+ def reset(self, v=None, internal_callback=True):
88
89
  """Reset value when indexed (by knobs) with callback."""
89
- if v is None or v == '':
90
+ if v is None:
90
91
  v = self.std_value
91
- if v is None:
92
+ if np.isnan(v):
92
93
  return
93
- if isinstance(v, str):
94
- v = self.__eval(v.replace(',', '')) # eliminates commas; includes nan, inf
95
- self._set_value(v)
96
- if backcall:
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
- self._set_value(v)
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 None, this is the same as value.
174
+ If std_value is nan, this is the same as value.
172
175
  """
173
- if self.std_value is not None:
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 is not None:
180
- if not np.isnan(v):
181
- v += self.std_value
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 = [nan] # dummy data
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
- return int(np.searchsorted(self.range, self.value))
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
- n = len(self)
209
- i = (0 if j<0 else j if j<n else -1)
210
- self._set_value(self.range[i])
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
- return self._set_value(self.min + j * self.step)
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 = 0
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 self.label.IsEnabled():
433
- t = ' ' if v.std_value is None or v.value == v.std_value else '*'
434
- self.label.SetLabel(v.name + t)
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
- try:
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
- self.set_textcolour, '#ffffff')
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
- if self.text.IsEditable():
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 focus(c):
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(focus(c) for c in ls[i+1:])
507
- if key == wx.WXK_UP: return any(focus(c) for c in ls[i-1::-1])
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, backcall=None) # restore 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
- try:
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 gradients(x):
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(gradients(i/N)))
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.3"
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 not item:
506
- if item is None:
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 moved if shown
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=(300,200))
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(0.5, 0.5) # (w, h)/N
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
- def _watch(show):
1458
- if show:
1459
- if pane.IsShown():
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
- else:
1469
+ else:
1470
+ if pane.IsDocked():
1475
1471
  self.inspector.unwatch()
1476
1472
  self.monitor.unwatch()
1477
- wx.CallAfter(_watch, evt.IsShown())
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 is moved
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 is moved => EVT_SHOW
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
- text = self.GetTextRange(self.eol, self.TextLength)
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 + self.eol)
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 is moved
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,9 +1,9 @@
1
1
  #! python3
2
2
  """mwxlib core utilities.
3
3
  """
4
+ from contextlib import contextmanager
4
5
  from functools import wraps
5
6
  from bdb import BdbQuit
6
- from contextlib import contextmanager
7
7
  import traceback
8
8
  import warnings
9
9
  import time
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mwxlib
3
- Version: 0.97.3
3
+ Version: 0.97.6
4
4
  Summary: A wrapper of matplotlib and wxPython (phoenix)
5
5
  Home-page: https://github.com/komoto48g/mwxlib
6
6
  Author: Kazuya O'moto
@@ -1,15 +1,15 @@
1
1
  mwx/__init__.py,sha256=nN62CGTWjME7Zz2h-jIRB8MxwuErIkHPGrlBzydkF0o,643
2
- mwx/bookshelf.py,sha256=ILKB13hX4riJnYFJmUvu2b1xa4uz8KxA1ZVuf4Y1zqM,5136
3
- mwx/controls.py,sha256=KAnzk2EeiBZsvJkfIHKIXo8bhxc6uVpC5CW802657ow,47815
4
- mwx/framework.py,sha256=ro-UOz8GFUmBqiKAst5DIRcboRJ0_x2KXGjoGctBAkA,75249
5
- mwx/graphman.py,sha256=Y6PD9L-ee5hc7nwBkmTDDKXf6cGHkc5L-f6OW3QtD6M,70486
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=4mUQCvtE0SZxlHRflrgKYGlMgvj2HY9LtBhAm9Rnnd8,137518
12
- mwx/utilus.py,sha256=8GK_2mGY08DVN5_SGWynLKQEJsCKqvqWTDToar1XozM,37333
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.3.dist-info/LICENSE,sha256=PGtRKCaTkmUDlBQwpptJAxJtdqxIUtAmdBsaT9nUVkA,1091
25
- mwxlib-0.97.3.dist-info/METADATA,sha256=Q10wJtVKCVOVctcuIDSFiyDADO0rlPKp8Ga-PLxOTKI,1880
26
- mwxlib-0.97.3.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
27
- mwxlib-0.97.3.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
28
- mwxlib-0.97.3.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5