333 self.ParentWindow.InsertValue(values[0], row, force=True) |
333 self.ParentWindow.InsertValue(values[0], row, force=True) |
334 elif self.ParentControl is not None: |
334 elif self.ParentControl is not None: |
335 width, height = self.ParentControl.GetSize() |
335 width, height = self.ParentControl.GetSize() |
336 target_idx = self.ParentControl.GetIndex() |
336 target_idx = self.ParentControl.GetIndex() |
337 merge_type = GRAPH_PARALLEL |
337 merge_type = GRAPH_PARALLEL |
338 if self.ParentControl.Is3DCanvas(): |
338 if isinstance(self.ParentControl, DebugVariableGraphic): |
|
339 if self.ParentControl.Is3DCanvas(): |
|
340 if y > height / 2: |
|
341 target_idx += 1 |
|
342 if len(values) > 1 and values[2] == "move": |
|
343 self.ParentWindow.MoveValue(values[0], target_idx) |
|
344 else: |
|
345 self.ParentWindow.InsertValue(values[0], target_idx, force=True) |
|
346 |
|
347 else: |
|
348 rect = self.ParentControl.GetAxesBoundingBox() |
|
349 if rect.InsideXY(x, y): |
|
350 merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height) |
|
351 if merge_rect.InsideXY(x, y): |
|
352 merge_type = GRAPH_ORTHOGONAL |
|
353 wx.CallAfter(self.ParentWindow.MergeGraphs, values[0], target_idx, merge_type, force=True) |
|
354 else: |
|
355 if y > height / 2: |
|
356 target_idx += 1 |
|
357 if len(values) > 1 and values[2] == "move": |
|
358 self.ParentWindow.MoveValue(values[0], target_idx) |
|
359 else: |
|
360 self.ParentWindow.InsertValue(values[0], target_idx, force=True) |
|
361 else: |
339 if y > height / 2: |
362 if y > height / 2: |
340 target_idx += 1 |
363 target_idx += 1 |
341 self.ParentWindow.InsertValue(values[0], target_idx, force=True) |
364 if len(values) > 1 and values[2] == "move": |
342 else: |
365 self.ParentWindow.MoveValue(values[0], target_idx) |
343 rect = self.ParentControl.GetAxesBoundingBox() |
|
344 if rect.InsideXY(x, y): |
|
345 merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height) |
|
346 if merge_rect.InsideXY(x, y): |
|
347 merge_type = GRAPH_ORTHOGONAL |
|
348 wx.CallAfter(self.ParentWindow.MergeGraphs, values[0], target_idx, merge_type, force=True) |
|
349 else: |
366 else: |
350 if y > height / 2: |
|
351 target_idx += 1 |
|
352 self.ParentWindow.InsertValue(values[0], target_idx, force=True) |
367 self.ParentWindow.InsertValue(values[0], target_idx, force=True) |
353 self.ParentWindow.InsertValue(values[0], force=True) |
368 |
|
369 elif len(values) > 1 and values[2] == "move": |
|
370 self.ParentWindow.MoveValue(values[0]) |
|
371 else: |
|
372 self.ParentWindow.InsertValue(values[0], force=True) |
354 |
373 |
355 def OnLeave(self): |
374 def OnLeave(self): |
356 self.ParentWindow.ResetHighlight() |
375 self.ParentWindow.ResetHighlight() |
357 return wx.TextDropTarget.OnLeave(self) |
376 return wx.TextDropTarget.OnLeave(self) |
358 |
377 |
376 |
395 |
377 GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2) |
396 GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2) |
378 |
397 |
379 SCROLLBAR_UNIT = 10 |
398 SCROLLBAR_UNIT = 10 |
380 |
399 |
|
400 #CANVAS_HIGHLIGHT_TYPES |
|
401 [HIGHLIGHT_NONE, |
|
402 HIGHLIGHT_BEFORE, |
|
403 HIGHLIGHT_AFTER, |
|
404 HIGHLIGHT_LEFT, |
|
405 HIGHLIGHT_RIGHT, |
|
406 HIGHLIGHT_RESIZE] = range(6) |
|
407 |
|
408 HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255)) |
|
409 HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128)) |
|
410 HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200)) |
|
411 HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200)) |
|
412 |
|
413 #CANVAS_SIZE_TYPES |
|
414 [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200] |
|
415 |
|
416 DEFAULT_CANVAS_HEIGHT = 200. |
|
417 CANVAS_BORDER = (20., 10.) |
|
418 CANVAS_PADDING = 8.5 |
|
419 VALUE_LABEL_HEIGHT = 17. |
|
420 AXES_LABEL_HEIGHT = 12.75 |
|
421 |
|
422 def compute_mask(x, y): |
|
423 mask = [] |
|
424 for xp, yp in zip(x, y): |
|
425 if xp == yp: |
|
426 mask.append(xp) |
|
427 else: |
|
428 mask.append("*") |
|
429 return mask |
|
430 |
381 def NextTick(variables): |
431 def NextTick(variables): |
382 next_tick = None |
432 next_tick = None |
383 for item, data in variables: |
433 for item, data in variables: |
384 if len(data) > 0: |
434 if len(data) > 0: |
385 if next_tick is None: |
435 if next_tick is None: |
396 range = max(1.0, max_value - min_value) |
446 range = max(1.0, max_value - min_value) |
397 else: |
447 else: |
398 center = 0.5 |
448 center = 0.5 |
399 range = 1.0 |
449 range = 1.0 |
400 return data, center - range * 0.55, center + range * 0.55 |
450 return data, center - range * 0.55, center + range * 0.55 |
|
451 |
|
452 class GraphButton(): |
|
453 |
|
454 def __init__(self, x, y, bitmap, callback): |
|
455 self.Position = wx.Point(x, y) |
|
456 self.Bitmap = bitmap |
|
457 self.Shown = True |
|
458 self.Enabled = True |
|
459 self.Callback = callback |
|
460 |
|
461 def __del__(self): |
|
462 self.callback = None |
|
463 |
|
464 def GetSize(self): |
|
465 return self.Bitmap.GetSize() |
|
466 |
|
467 def SetPosition(self, x, y): |
|
468 self.Position = wx.Point(x, y) |
|
469 |
|
470 def Show(self): |
|
471 self.Shown = True |
|
472 |
|
473 def Hide(self): |
|
474 self.Shown = False |
|
475 |
|
476 def IsShown(self): |
|
477 return self.Shown |
|
478 |
|
479 def Enable(self): |
|
480 self.Enabled = True |
|
481 |
|
482 def Disable(self): |
|
483 self.Enabled = False |
|
484 |
|
485 def IsEnabled(self): |
|
486 return self.Enabled |
|
487 |
|
488 def HitTest(self, x, y): |
|
489 if self.Shown and self.Enabled: |
|
490 w, h = self.Bitmap.GetSize() |
|
491 rect = wx.Rect(self.Position.x, self.Position.y, w, h) |
|
492 if rect.InsideXY(x, y): |
|
493 return True |
|
494 return False |
|
495 |
|
496 def ProcessCallback(self): |
|
497 if self.Callback is not None: |
|
498 wx.CallAfter(self.Callback) |
|
499 |
|
500 def Draw(self, dc): |
|
501 if self.Shown and self.Enabled: |
|
502 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True) |
401 |
503 |
402 class DebugVariableViewer: |
504 class DebugVariableViewer: |
403 |
505 |
404 def __init__(self, window, items=[]): |
506 def __init__(self, window, items=[]): |
405 self.ParentWindow = window |
507 self.ParentWindow = window |
611 DebugVariableViewer.__init__(self, window, items) |
713 DebugVariableViewer.__init__(self, window, items) |
612 |
714 |
613 wx.Panel.__init__(self, parent) |
715 wx.Panel.__init__(self, parent) |
614 self.SetBackgroundColour(wx.WHITE) |
716 self.SetBackgroundColour(wx.WHITE) |
615 self.SetDropTarget(DebugVariableDropTarget(window, self)) |
717 self.SetDropTarget(DebugVariableDropTarget(window, self)) |
|
718 self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) |
616 self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) |
719 self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) |
617 self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnter) |
720 self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnter) |
618 self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) |
721 self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) |
619 self.Bind(wx.EVT_SIZE, self.OnResize) |
722 self.Bind(wx.EVT_SIZE, self.OnResize) |
620 self.Bind(wx.EVT_PAINT, self.OnPaint) |
723 self.Bind(wx.EVT_PAINT, self.OnPaint) |
659 |
762 |
660 self.DrawCommonElements(gc) |
763 self.DrawCommonElements(gc) |
661 |
764 |
662 gc.EndDrawing() |
765 gc.EndDrawing() |
663 |
766 |
|
767 def OnLeftDown(self, event): |
|
768 width, height = self.GetSize() |
|
769 item_name = self.Items[0].GetVariable(self.ParentWindow.GetVariableNameMask()) |
|
770 w, h = self.GetTextExtent(item_name) |
|
771 x, y = event.GetPosition() |
|
772 rect = wx.Rect(20, (height - h) / 2, w, h) |
|
773 if rect.InsideXY(x, y): |
|
774 data = wx.TextDataObject(str((self.Items[0].GetVariable(), "debug", "move"))) |
|
775 dragSource = wx.DropSource(self) |
|
776 dragSource.SetData(data) |
|
777 dragSource.DoDragDrop() |
|
778 else: |
|
779 event.Skip() |
|
780 |
664 def OnLeftUp(self, event): |
781 def OnLeftUp(self, event): |
665 x, y = event.GetPosition() |
782 x, y = event.GetPosition() |
666 wx.CallAfter(self.HandleButtons, x, y) |
783 wx.CallAfter(self.HandleButtons, x, y) |
667 event.Skip() |
784 event.Skip() |
668 |
785 |
669 def OnPaint(self, event): |
786 def OnPaint(self, event): |
670 self.RefreshViewer() |
787 self.RefreshViewer() |
671 event.Skip() |
788 event.Skip() |
672 |
|
673 def compute_mask(x, y): |
|
674 mask = [] |
|
675 for xp, yp in zip(x, y): |
|
676 if xp == yp: |
|
677 mask.append(xp) |
|
678 else: |
|
679 mask.append("*") |
|
680 return mask |
|
681 |
|
682 #CANVAS_HIGHLIGHT_TYPES |
|
683 [HIGHLIGHT_NONE, |
|
684 HIGHLIGHT_BEFORE, |
|
685 HIGHLIGHT_AFTER, |
|
686 HIGHLIGHT_LEFT, |
|
687 HIGHLIGHT_RIGHT, |
|
688 HIGHLIGHT_RESIZE] = range(6) |
|
689 |
|
690 HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255)) |
|
691 HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128)) |
|
692 HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200)) |
|
693 HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200)) |
|
694 |
|
695 #CANVAS_SIZE_TYPES |
|
696 [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200] |
|
697 |
|
698 DEFAULT_CANVAS_HEIGHT = 200. |
|
699 CANVAS_BORDER = (20., 10.) |
|
700 CANVAS_PADDING = 8.5 |
|
701 VALUE_LABEL_HEIGHT = 17. |
|
702 AXES_LABEL_HEIGHT = 12.75 |
|
703 |
|
704 class GraphButton(): |
|
705 |
|
706 def __init__(self, x, y, bitmap, callback): |
|
707 self.Position = wx.Point(x, y) |
|
708 self.Bitmap = bitmap |
|
709 self.Shown = True |
|
710 self.Enabled = True |
|
711 self.Callback = callback |
|
712 |
|
713 def __del__(self): |
|
714 self.callback = None |
|
715 |
|
716 def GetSize(self): |
|
717 return self.Bitmap.GetSize() |
|
718 |
|
719 def SetPosition(self, x, y): |
|
720 self.Position = wx.Point(x, y) |
|
721 |
|
722 def Show(self): |
|
723 self.Shown = True |
|
724 |
|
725 def Hide(self): |
|
726 self.Shown = False |
|
727 |
|
728 def IsShown(self): |
|
729 return self.Shown |
|
730 |
|
731 def Enable(self): |
|
732 self.Enabled = True |
|
733 |
|
734 def Disable(self): |
|
735 self.Enabled = False |
|
736 |
|
737 def IsEnabled(self): |
|
738 return self.Enabled |
|
739 |
|
740 def HitTest(self, x, y): |
|
741 if self.Shown and self.Enabled: |
|
742 w, h = self.Bitmap.GetSize() |
|
743 rect = wx.Rect(self.Position.x, self.Position.y, w, h) |
|
744 if rect.InsideXY(x, y): |
|
745 return True |
|
746 return False |
|
747 |
|
748 def ProcessCallback(self): |
|
749 if self.Callback is not None: |
|
750 wx.CallAfter(self.Callback) |
|
751 |
|
752 def Draw(self, dc): |
|
753 if self.Shown and self.Enabled: |
|
754 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True) |
|
755 |
789 |
756 class DebugVariableGraphic(DebugVariableViewer, FigureCanvas): |
790 class DebugVariableGraphic(DebugVariableViewer, FigureCanvas): |
757 |
791 |
758 def __init__(self, parent, window, items, graph_type): |
792 def __init__(self, parent, window, items, graph_type): |
759 DebugVariableViewer.__init__(self, window, items) |
793 DebugVariableViewer.__init__(self, window, items) |
1675 panel.ShowButtons(True) |
1709 panel.ShowButtons(True) |
1676 merge_type = GRAPH_PARALLEL |
1710 merge_type = GRAPH_PARALLEL |
1677 if isinstance(panel, DebugVariableText) or panel.Is3DCanvas(): |
1711 if isinstance(panel, DebugVariableText) or panel.Is3DCanvas(): |
1678 if y_mouse > yw + height / 2: |
1712 if y_mouse > yw + height / 2: |
1679 idx += 1 |
1713 idx += 1 |
1680 wx.CallAfter(self.MoveGraph, variable, idx) |
1714 wx.CallAfter(self.MoveValue, variable, idx) |
1681 else: |
1715 else: |
1682 rect = panel.GetAxesBoundingBox(True) |
1716 rect = panel.GetAxesBoundingBox(True) |
1683 if rect.InsideXY(x_mouse, y_mouse): |
1717 if rect.InsideXY(x_mouse, y_mouse): |
1684 merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height) |
1718 merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height) |
1685 if merge_rect.InsideXY(x_mouse, y_mouse): |
1719 if merge_rect.InsideXY(x_mouse, y_mouse): |
1686 merge_type = GRAPH_ORTHOGONAL |
1720 merge_type = GRAPH_ORTHOGONAL |
1687 wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True) |
1721 wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True) |
1688 else: |
1722 else: |
1689 if y_mouse > yw + height / 2: |
1723 if y_mouse > yw + height / 2: |
1690 idx += 1 |
1724 idx += 1 |
1691 wx.CallAfter(self.MoveGraph, variable, idx) |
1725 wx.CallAfter(self.MoveValue, variable, idx) |
1692 self.ForceRefresh() |
1726 self.ForceRefresh() |
1693 return |
1727 return |
1694 width, height = self.GraphicsWindow.GetVirtualSize() |
1728 width, height = self.GraphicsWindow.GetVirtualSize() |
1695 rect = wx.Rect(0, 0, width, height) |
1729 rect = wx.Rect(0, 0, width, height) |
1696 if rect.InsideXY(x_mouse, y_mouse): |
1730 if rect.InsideXY(x_mouse, y_mouse): |
1697 wx.CallAfter(self.MoveGraph, variable, len(self.GraphicPanels)) |
1731 wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels)) |
1698 self.ForceRefresh() |
1732 self.ForceRefresh() |
1699 |
1733 |
1700 def RefreshView(self, only_values=False): |
1734 def RefreshView(self, only_values=False): |
1701 if USE_MPL: |
1735 if USE_MPL: |
1702 self.RefreshCanvasPosition() |
1736 self.RefreshCanvasPosition() |
2084 if source_panel.HasCapture(): |
2118 if source_panel.HasCapture(): |
2085 source_panel.ReleaseMouse() |
2119 source_panel.ReleaseMouse() |
2086 self.GraphicPanels.remove(source_panel) |
2120 self.GraphicPanels.remove(source_panel) |
2087 source_panel.Destroy() |
2121 source_panel.Destroy() |
2088 |
2122 |
2089 panel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) |
2123 if item.IsNumVariable(): |
2090 if self.CursorTick is not None: |
2124 panel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) |
2091 panel.SetCursorTick(self.CursorTick) |
2125 if self.CursorTick is not None: |
|
2126 panel.SetCursorTick(self.CursorTick) |
|
2127 else: |
|
2128 panel = DebugVariableText(self.GraphicsWindow, self, [item]) |
2092 self.GraphicPanels.insert(idx, panel) |
2129 self.GraphicPanels.insert(idx, panel) |
2093 self.ResetVariableNameMask() |
2130 self.ResetVariableNameMask() |
2094 self.RefreshGraphicsSizer() |
2131 self.RefreshGraphicsSizer() |
2095 self.ForceRefresh() |
2132 self.ForceRefresh() |
2096 |
2133 |
2106 item = VariableTableItem(self, source) |
2143 item = VariableTableItem(self, source) |
2107 if item.IsNumVariable(): |
2144 if item.IsNumVariable(): |
2108 result = self.AddDataConsumer(source.upper(), item) |
2145 result = self.AddDataConsumer(source.upper(), item) |
2109 if result is not None or force: |
2146 if result is not None or force: |
2110 source_item = item |
2147 source_item = item |
2111 if source_item is not None: |
2148 if source_item is not None and source_item.IsNumVariable(): |
2112 target_panel = self.GraphicPanels[target_idx] |
2149 target_panel = self.GraphicPanels[target_idx] |
2113 graph_type = target_panel.GraphType |
2150 graph_type = target_panel.GraphType |
2114 if target_panel != source_panel: |
2151 if target_panel != source_panel: |
2115 if (merge_type == GRAPH_PARALLEL and graph_type != merge_type or |
2152 if (merge_type == GRAPH_PARALLEL and graph_type != merge_type or |
2116 merge_type == GRAPH_ORTHOGONAL and |
2153 merge_type == GRAPH_ORTHOGONAL and |