228 graphics_button_sizer.AddWindow(range_label, flag=wx.ALIGN_CENTER_VERTICAL) |
228 graphics_button_sizer.AddWindow(range_label, flag=wx.ALIGN_CENTER_VERTICAL) |
229 |
229 |
230 self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY) |
230 self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY) |
231 self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) |
231 self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) |
232 graphics_button_sizer.AddWindow(self.CanvasRange, 1, |
232 graphics_button_sizer.AddWindow(self.CanvasRange, 1, |
233 border=5, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) |
233 border=5, |
|
234 flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) |
234 |
235 |
235 self.CanvasRange.Clear() |
236 self.CanvasRange.Clear() |
236 default_range_idx = 0 |
237 default_range_idx = 0 |
237 for idx, (text, value) in enumerate(RANGE_VALUES): |
238 for idx, (text, value) in enumerate(RANGE_VALUES): |
238 self.CanvasRange.Append(text) |
239 self.CanvasRange.Append(text) |
241 self.CanvasRange.SetSelection(default_range_idx) |
242 self.CanvasRange.SetSelection(default_range_idx) |
242 |
243 |
243 for name, bitmap, help in [ |
244 for name, bitmap, help in [ |
244 ("CurrentButton", "current", _("Go to current value")), |
245 ("CurrentButton", "current", _("Go to current value")), |
245 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: |
246 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: |
246 button = wx.lib.buttons.GenBitmapButton(self, |
247 button = wx.lib.buttons.GenBitmapButton( |
247 bitmap=GetBitmap(bitmap), |
248 self, bitmap=GetBitmap(bitmap), |
248 size=wx.Size(28, 28), style=wx.NO_BORDER) |
249 size=wx.Size(28, 28), style=wx.NO_BORDER) |
249 button.SetToolTipString(help) |
250 button.SetToolTipString(help) |
250 setattr(self, name, button) |
251 setattr(self, name, button) |
251 self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button) |
252 self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button) |
252 graphics_button_sizer.AddWindow(button, border=5, flag=wx.LEFT) |
253 graphics_button_sizer.AddWindow(button, border=5, flag=wx.LEFT) |
253 |
254 |
254 self.CanvasPosition = wx.ScrollBar(self, |
255 self.CanvasPosition = wx.ScrollBar( |
255 size=wx.Size(0, 16), style=wx.SB_HORIZONTAL) |
256 self, size=wx.Size(0, 16), style=wx.SB_HORIZONTAL) |
256 self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK, |
257 self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK, |
257 self.OnPositionChanging, self.CanvasPosition) |
258 self.OnPositionChanging, self.CanvasPosition) |
258 self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP, |
259 self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP, |
259 self.OnPositionChanging, self.CanvasPosition) |
260 self.OnPositionChanging, self.CanvasPosition) |
260 self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN, |
261 self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN, |
261 self.OnPositionChanging, self.CanvasPosition) |
262 self.OnPositionChanging, self.CanvasPosition) |
262 self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP, |
263 self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP, |
263 self.OnPositionChanging, self.CanvasPosition) |
264 self.OnPositionChanging, self.CanvasPosition) |
264 self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN, |
265 self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN, |
265 self.OnPositionChanging, self.CanvasPosition) |
266 self.OnPositionChanging, self.CanvasPosition) |
266 main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM) |
267 main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM) |
267 |
268 |
268 self.TickSizer = wx.BoxSizer(wx.HORIZONTAL) |
269 self.TickSizer = wx.BoxSizer(wx.HORIZONTAL) |
269 main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL | wx.GROW) |
270 main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL | wx.GROW) |
270 |
271 |
386 self.UpdateCursorTick() |
387 self.UpdateCursorTick() |
387 |
388 |
388 def MoveCursorTick(self, move): |
389 def MoveCursorTick(self, move): |
389 if self.CursorTick is not None: |
390 if self.CursorTick is not None: |
390 cursor_tick = max(self.Ticks[0], |
391 cursor_tick = max(self.Ticks[0], |
391 min(self.CursorTick + move, |
392 min(self.CursorTick + move, self.Ticks[-1])) |
392 self.Ticks[-1])) |
|
393 cursor_tick_idx = numpy.argmin(numpy.abs(self.Ticks - cursor_tick)) |
393 cursor_tick_idx = numpy.argmin(numpy.abs(self.Ticks - cursor_tick)) |
394 if self.Ticks[cursor_tick_idx] == self.CursorTick: |
394 if self.Ticks[cursor_tick_idx] == self.CursorTick: |
395 cursor_tick_idx = max(0, |
395 cursor_tick_idx = max(0, |
396 min(cursor_tick_idx + abs(move) / move, |
396 min(cursor_tick_idx + abs(move) / move, |
397 len(self.Ticks) - 1)) |
397 len(self.Ticks) - 1)) |
398 self.CursorTick = self.Ticks[cursor_tick_idx] |
398 self.CursorTick = self.Ticks[cursor_tick_idx] |
399 self.StartTick = max(self.Ticks[ |
399 self.StartTick = max( |
400 numpy.argmin(numpy.abs(self.Ticks - |
400 self.Ticks[numpy.argmin( |
401 self.CursorTick + self.CurrentRange))], |
401 numpy.abs(self.Ticks - self.CursorTick + self.CurrentRange))], |
402 min(self.StartTick, self.CursorTick)) |
402 min(self.StartTick, self.CursorTick)) |
403 self.RefreshCanvasPosition() |
403 self.RefreshCanvasPosition() |
404 self.UpdateCursorTick() |
404 self.UpdateCursorTick() |
405 |
405 |
406 def ResetCursorTick(self): |
406 def ResetCursorTick(self): |
407 self.CursorTick = None |
407 self.CursorTick = None |
735 def ResetVariableNameMask(self): |
735 def ResetVariableNameMask(self): |
736 items = [] |
736 items = [] |
737 for panel in self.GraphicPanels: |
737 for panel in self.GraphicPanels: |
738 items.extend(panel.GetItems()) |
738 items.extend(panel.GetItems()) |
739 if len(items) > 1: |
739 if len(items) > 1: |
740 self.VariableNameMask = reduce(compute_mask, |
740 self.VariableNameMask = reduce( |
741 [item.GetVariable().split('.') for item in items]) |
741 compute_mask, [item.GetVariable().split('.') for item in items]) |
742 elif len(items) > 0: |
742 elif len(items) > 0: |
743 self.VariableNameMask = items[0].GetVariable().split('.')[:-1] + ['*'] |
743 self.VariableNameMask = items[0].GetVariable().split('.')[:-1] + ['*'] |
744 else: |
744 else: |
745 self.VariableNameMask = [] |
745 self.VariableNameMask = [] |
746 self.MaskLabel.ChangeValue(".".join(self.VariableNameMask)) |
746 self.MaskLabel.ChangeValue(".".join(self.VariableNameMask)) |
932 vwidth, vheight = self.GraphicsSizer.GetMinSize() |
932 vwidth, vheight = self.GraphicsSizer.GetMinSize() |
933 posx = max(0, min(xstart, (vwidth - window_size[0]) / SCROLLBAR_UNIT)) |
933 posx = max(0, min(xstart, (vwidth - window_size[0]) / SCROLLBAR_UNIT)) |
934 posy = max(0, min(ystart, (vheight - window_size[1]) / SCROLLBAR_UNIT)) |
934 posy = max(0, min(ystart, (vheight - window_size[1]) / SCROLLBAR_UNIT)) |
935 self.GraphicsWindow.Scroll(posx, posy) |
935 self.GraphicsWindow.Scroll(posx, posy) |
936 self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, |
936 self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, |
937 vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT, posx, posy) |
937 vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT, |
|
938 posx, posy) |
938 |
939 |
939 def OnGraphicsWindowEraseBackground(self, event): |
940 def OnGraphicsWindowEraseBackground(self, event): |
940 pass |
941 pass |
941 |
942 |
942 def OnGraphicsWindowPaint(self, event): |
943 def OnGraphicsWindowPaint(self, event): |