Coverage for slic/gui/widgets/plotting.py: 31%
68 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-07-07 16:57 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-07-07 16:57 +0000
1import wx
3import matplotlib.dates
5from matplotlib.figure import Figure
6from matplotlib.backends.backend_wxagg import (
7 FigureCanvasWxAgg as FigureCanvas,
8 NavigationToolbar2WxAgg as NavigationToolbar
9)
11from .tools import WX_DEFAULT_RESIZABLE_DIALOG_STYLE
14class PlotDialog(wx.Dialog):
16 def __init__(self, title):
17 wx.Dialog.__init__(self, None, title=title, style=WX_DEFAULT_RESIZABLE_DIALOG_STYLE)
19 self.plot = plot = PlotPanel(self)
21 self.status_bar = status_bar = wx.StatusBar(self)
22 status_bar.SetFieldsCount(3) # toolbar help, x, y
24 self.Bind(wx.EVT_TOOL_ENTER, self.update_statusbar_help)
25 plot.canvas.mpl_connect("motion_notify_event", self.update_statusbar_coord)
27 vbox = wx.BoxSizer(wx.VERTICAL)
28 vbox.Add(plot, proportion=1, flag=wx.ALL|wx.EXPAND, border=0)
29 vbox.Add(status_bar, proportion=0, flag=wx.ALL|wx.EXPAND, border=0)
31 self.SetSizerAndFit(vbox)
34 def ShowModal(self):
35 self.plot.draw()
36 wx.Dialog.ShowModal(self)
38 def GetStatusBar(self):
39 return self.status_bar
41 def update_statusbar_help(self, event):
42 tool_id = event.GetSelection()
43 if tool_id == wx.ID_ANY:
44 return
45 help = self.plot.toolbar.GetToolLongHelp(tool_id)
46 self.status_bar.SetStatusText(help, 0)
48 def update_statusbar_coord(self, event):
49 if not event.inaxes:
50 return
51 x, y = event.xdata, event.ydata
52 x = matplotlib.dates.num2date(x) #TODO: how to check whether this needs to be applied?
53 self.status_bar.SetStatusText(f"x = {x}", 1)
54 self.status_bar.SetStatusText(f"y = {y}", 2)
58class PlotPanel(wx.Panel):
60 def __init__(self, parent, *args, **kwargs):
61 wx.Panel.__init__(self, parent)
63 self.sizer = sizer = wx.BoxSizer(wx.VERTICAL)
65 self.figure = Figure(*args, **kwargs)
66 self.make_axes()
67 self.add_canvas()
68 self.add_toolbar()
70 self.SetSizerAndFit(sizer)
73 def make_axes(self):
74 self.axes = self.figure.add_subplot(111)
76 def add_canvas(self):
77 self.canvas = canvas = FigureCanvas(self, wx.ID_ANY, self.figure)
78 self.sizer.Add(canvas, 1, wx.LEFT|wx.TOP|wx.EXPAND)
80 def add_toolbar(self):
81 self.toolbar = toolbar = NavigationToolbarX(self.canvas)
82 toolbar.Realize()
83 toolbar.update()
84 self.sizer.Add(toolbar, 0, wx.LEFT|wx.EXPAND)
86 def __getattr__(self, name):
87 return getattr(self.axes, name)
89 def reset(self):
90 self.figure.clear()
91 self.axes = self.make_axes()
93 def draw(self):
94 self.figure.tight_layout()
95 try: #TODO
96 self.canvas.draw()
97 except:
98 pass
99 self.canvas.flush_events()
103class NavigationToolbarX(NavigationToolbar):
105 toolitems = [t for t in NavigationToolbar.toolitems if t[0] != "Subplots"] # remove Subplots button