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

1import wx 

2 

3import matplotlib.dates 

4 

5from matplotlib.figure import Figure 

6from matplotlib.backends.backend_wxagg import ( 

7 FigureCanvasWxAgg as FigureCanvas, 

8 NavigationToolbar2WxAgg as NavigationToolbar 

9) 

10 

11from .tools import WX_DEFAULT_RESIZABLE_DIALOG_STYLE 

12 

13 

14class PlotDialog(wx.Dialog): 

15 

16 def __init__(self, title): 

17 wx.Dialog.__init__(self, None, title=title, style=WX_DEFAULT_RESIZABLE_DIALOG_STYLE) 

18 

19 self.plot = plot = PlotPanel(self) 

20 

21 self.status_bar = status_bar = wx.StatusBar(self) 

22 status_bar.SetFieldsCount(3) # toolbar help, x, y 

23 

24 self.Bind(wx.EVT_TOOL_ENTER, self.update_statusbar_help) 

25 plot.canvas.mpl_connect("motion_notify_event", self.update_statusbar_coord) 

26 

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) 

30 

31 self.SetSizerAndFit(vbox) 

32 

33 

34 def ShowModal(self): 

35 self.plot.draw() 

36 wx.Dialog.ShowModal(self) 

37 

38 def GetStatusBar(self): 

39 return self.status_bar 

40 

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) 

47 

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) 

55 

56 

57 

58class PlotPanel(wx.Panel): 

59 

60 def __init__(self, parent, *args, **kwargs): 

61 wx.Panel.__init__(self, parent) 

62 

63 self.sizer = sizer = wx.BoxSizer(wx.VERTICAL) 

64 

65 self.figure = Figure(*args, **kwargs) 

66 self.make_axes() 

67 self.add_canvas() 

68 self.add_toolbar() 

69 

70 self.SetSizerAndFit(sizer) 

71 

72 

73 def make_axes(self): 

74 self.axes = self.figure.add_subplot(111) 

75 

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) 

79 

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) 

85 

86 def __getattr__(self, name): 

87 return getattr(self.axes, name) 

88 

89 def reset(self): 

90 self.figure.clear() 

91 self.axes = self.make_axes() 

92 

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() 

100 

101 

102 

103class NavigationToolbarX(NavigationToolbar): 

104 

105 toolitems = [t for t in NavigationToolbar.toolitems if t[0] != "Subplots"] # remove Subplots button 

106 

107 

108