73 return plot.PlotCanvas._axisInterval(self.Canvas, spec, lower, upper) |
73 return plot.PlotCanvas._axisInterval(self.Canvas, spec, lower, upper) |
74 self.Canvas._axisInterval = _axisInterval |
74 self.Canvas._axisInterval = _axisInterval |
75 self.Canvas.SetYSpec('border') |
75 self.Canvas.SetYSpec('border') |
76 self.Canvas.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnCanvasLeftDown) |
76 self.Canvas.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnCanvasLeftDown) |
77 self.Canvas.canvas.Bind(wx.EVT_LEFT_UP, self.OnCanvasLeftUp) |
77 self.Canvas.canvas.Bind(wx.EVT_LEFT_UP, self.OnCanvasLeftUp) |
|
78 self.Canvas.canvas.Bind(wx.EVT_MIDDLE_DOWN, self.OnCanvasMiddleDown) |
|
79 self.Canvas.canvas.Bind(wx.EVT_MIDDLE_UP, self.OnCanvasMiddleUp) |
78 self.Canvas.canvas.Bind(wx.EVT_MOTION, self.OnCanvasMotion) |
80 self.Canvas.canvas.Bind(wx.EVT_MOTION, self.OnCanvasMotion) |
79 self.Canvas.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnCanvasMouseWheel) |
81 self.Canvas.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnCanvasMouseWheel) |
80 self.Canvas.canvas.Bind(wx.EVT_SIZE, self.OnCanvasResize) |
82 self.Canvas.canvas.Bind(wx.EVT_SIZE, self.OnCanvasResize) |
81 main_sizer.AddWindow(self.Canvas, 0, border=0, flag=wx.GROW) |
83 main_sizer.AddWindow(self.Canvas, 0, border=0, flag=wx.GROW) |
82 |
84 |
83 range_sizer = wx.FlexGridSizer(cols=9, hgap=5, rows=1, vgap=0) |
85 range_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=0) |
84 range_sizer.AddGrowableCol(5) |
86 range_sizer.AddGrowableCol(5) |
85 range_sizer.AddGrowableRow(0) |
87 range_sizer.AddGrowableRow(0) |
86 main_sizer.AddSizer(range_sizer, 0, border=5, flag=wx.GROW|wx.ALL) |
88 main_sizer.AddSizer(range_sizer, 0, border=5, flag=wx.GROW|wx.ALL) |
87 |
89 |
88 range_label = wx.StaticText(self.Editor, label=_('Range:')) |
90 range_label = wx.StaticText(self.Editor, label=_('Range:')) |
129 bitmap=GetBitmap("current"), size=wx.Size(28, 28), style=wx.NO_BORDER) |
131 bitmap=GetBitmap("current"), size=wx.Size(28, 28), style=wx.NO_BORDER) |
130 self.CurrentButton.SetToolTipString(_("Go to current value")) |
132 self.CurrentButton.SetToolTipString(_("Go to current value")) |
131 self.Bind(wx.EVT_BUTTON, self.OnCurrentButton, self.CurrentButton) |
133 self.Bind(wx.EVT_BUTTON, self.OnCurrentButton, self.CurrentButton) |
132 range_sizer.AddWindow(self.CurrentButton, 0, border=0, flag=0) |
134 range_sizer.AddWindow(self.CurrentButton, 0, border=0, flag=0) |
133 |
135 |
|
136 self.ResetZoomOffsetButton = wx.lib.buttons.GenBitmapButton(self.Editor, |
|
137 bitmap=GetBitmap("fit"), size=wx.Size(28, 28), style=wx.NO_BORDER) |
|
138 self.CurrentButton.SetToolTipString(_("Reset zoom and offset")) |
|
139 self.Bind(wx.EVT_BUTTON, self.OnResetZoomOffsetButton, |
|
140 self.ResetZoomOffsetButton) |
|
141 range_sizer.AddWindow(self.ResetZoomOffsetButton, 0, border=0, flag=0) |
|
142 |
134 self.ExportGraphButton = wx.lib.buttons.GenBitmapButton(self.Editor, |
143 self.ExportGraphButton = wx.lib.buttons.GenBitmapButton(self.Editor, |
135 bitmap=GetBitmap("export_graph"), size=wx.Size(28, 28), style=wx.NO_BORDER) |
144 bitmap=GetBitmap("export_graph"), size=wx.Size(28, 28), style=wx.NO_BORDER) |
136 self.ExportGraphButton.SetToolTipString(_("Export graph values to clipboard")) |
145 self.ExportGraphButton.SetToolTipString(_("Export graph values to clipboard")) |
137 self.Bind(wx.EVT_BUTTON, self.OnExportGraphButtonClick, |
146 self.Bind(wx.EVT_BUTTON, self.OnExportGraphButtonClick, |
138 self.ExportGraphButton) |
147 self.ExportGraphButton) |
283 |
292 |
284 def IsViewing(self, tagname): |
293 def IsViewing(self, tagname): |
285 return self.InstancePath == tagname |
294 return self.InstancePath == tagname |
286 |
295 |
287 def NewValue(self, tick, value, forced=False): |
296 def NewValue(self, tick, value, forced=False): |
288 self.Datas.append((float(tick), {True:1., False:0.}.get(value, float(value)))) |
297 value = {True:1., False:0.}.get(value, float(value)) |
|
298 self.Datas.append((float(tick), value)) |
289 if self.MinValue is None: |
299 if self.MinValue is None: |
290 self.MinValue = value |
300 self.MinValue = value |
291 else: |
301 else: |
292 self.MinValue = min(self.MinValue, value) |
302 self.MinValue = min(self.MinValue, value) |
293 if self.MaxValue is None: |
303 if self.MaxValue is None: |
338 self.CurrentZoom = ZOOM_VALUES[self.CanvasZoom.GetSelection()][1] |
348 self.CurrentZoom = ZOOM_VALUES[self.CanvasZoom.GetSelection()][1] |
339 wx.CallAfter(self.RefreshView, True) |
349 wx.CallAfter(self.RefreshView, True) |
340 event.Skip() |
350 event.Skip() |
341 |
351 |
342 def OnPositionChanging(self, event): |
352 def OnPositionChanging(self, event): |
343 self.ResetBounds() |
353 if len(self.Datas) > 0: |
344 self.StartTick = self.Datas[0][0] + event.GetPosition() |
354 self.ResetBounds() |
345 self.Fixed = True |
355 self.StartTick = self.Datas[0][0] + event.GetPosition() |
346 self.NewDataAvailable(True) |
356 self.Fixed = True |
|
357 self.NewDataAvailable(True) |
347 event.Skip() |
358 event.Skip() |
348 |
359 |
349 def OnResetButton(self, event): |
360 def OnResetButton(self, event): |
350 self.Fixed = False |
361 self.Fixed = False |
351 self.ResetView() |
362 self.ResetView() |
352 event.Skip() |
363 event.Skip() |
353 |
364 |
354 def OnCurrentButton(self, event): |
365 def OnCurrentButton(self, event): |
355 self.ResetBounds() |
366 if len(self.Datas) > 0: |
356 self.StartTick = max(self.Datas[0][0], self.Datas[-1][0] - self.CurrentRange) |
367 self.ResetBounds() |
357 self.Fixed = False |
368 self.StartTick = max(self.Datas[0][0], self.Datas[-1][0] - self.CurrentRange) |
358 self.NewDataAvailable(True) |
369 self.Fixed = False |
|
370 self.NewDataAvailable(True) |
|
371 event.Skip() |
|
372 |
|
373 def OnResetZoomOffsetButton(self, event): |
|
374 if len(self.Datas) > 0: |
|
375 self.YCenter = (self.MaxValue + self.MinValue) / 2 |
|
376 else: |
|
377 self.YCenter = 0.0 |
|
378 self.CurrentZoom = 1.0 |
|
379 self.CanvasZoom.SetSelection(0) |
|
380 wx.CallAfter(self.RefreshView, True) |
359 event.Skip() |
381 event.Skip() |
360 |
382 |
361 def OnExportGraphButtonClick(self, event): |
383 def OnExportGraphButtonClick(self, event): |
362 data_copy = self.Datas[:] |
384 data_copy = self.Datas[:] |
363 text = "tick;%s;\n" % self.InstancePath |
385 text = "tick;%s;\n" % self.InstancePath |
378 elif self.Mode == MODE_MOTION: |
400 elif self.Mode == MODE_MOTION: |
379 self.GetBounds() |
401 self.GetBounds() |
380 self.CurrentMousePos = event.GetPosition() |
402 self.CurrentMousePos = event.GetPosition() |
381 self.CurrentMotionValue = self.Datas[self.StartIdx][0] |
403 self.CurrentMotionValue = self.Datas[self.StartIdx][0] |
382 event.Skip() |
404 event.Skip() |
383 |
405 |
384 def OnCanvasLeftUp(self, event): |
406 def OnCanvasLeftUp(self, event): |
385 self.Dragging = False |
407 self.Dragging = False |
386 if self.Mode == MODE_MOTION: |
408 if self.Mode == MODE_MOTION: |
387 self.CurrentMousePos = None |
409 self.CurrentMousePos = None |
388 self.CurrentMotionValue = None |
410 self.CurrentMotionValue = None |
|
411 if self.Canvas.canvas.HasCapture(): |
|
412 self.Canvas.canvas.ReleaseMouse() |
|
413 event.Skip() |
|
414 |
|
415 def OnCanvasMiddleDown(self, event): |
|
416 self.Fixed = True |
|
417 self.Canvas.canvas.CaptureMouse() |
|
418 if len(self.Datas) > 0: |
|
419 self.GetBounds() |
|
420 self.CurrentMousePos = event.GetPosition() |
|
421 self.CurrentMotionValue = self.Datas[self.StartIdx][0] |
|
422 event.Skip() |
|
423 |
|
424 def OnCanvasMiddleUp(self, event): |
|
425 self.CurrentMousePos = None |
|
426 self.CurrentMotionValue = None |
389 if self.Canvas.canvas.HasCapture(): |
427 if self.Canvas.canvas.HasCapture(): |
390 self.Canvas.canvas.ReleaseMouse() |
428 self.Canvas.canvas.ReleaseMouse() |
391 event.Skip() |
429 event.Skip() |
392 |
430 |
393 def OnCanvasMotion(self, event): |
431 def OnCanvasMotion(self, event): |