# HG changeset patch # User Laurent Bessard # Date 1361837873 -3600 # Node ID da7f80e04a544a2cb744320b07be90b040163f46 # Parent 2ba9d7e3be7273f88c8de1606881df6c2e99b444 Fixed panels displaying non-numeric variables in DebugVariablePanel diff -r 2ba9d7e3be72 -r da7f80e04a54 controls/DebugVariablePanel.py --- a/controls/DebugVariablePanel.py Tue Feb 26 01:16:28 2013 +0100 +++ b/controls/DebugVariablePanel.py Tue Feb 26 01:17:53 2013 +0100 @@ -306,7 +306,7 @@ def OnDragOver(self, x, y, d): if self.ParentControl is not None: - self.ParentControl.OnCanvasMouseDragging(x, y) + self.ParentControl.OnMouseDragging(x, y) else: self.ParentWindow.RefreshHighlight(x, y) return wx.TextDropTarget.OnDragOver(self, x, y, d) @@ -332,7 +332,7 @@ row = self.ParentWindow.Table.GetNumberRows() self.ParentWindow.InsertValue(values[0], row, force=True) elif self.ParentControl is not None: - width, height = self.ParentControl.Canvas.GetSize() + width, height = self.ParentControl.GetSize() target_idx = self.ParentControl.GetIndex() merge_type = GRAPH_PARALLEL if self.ParentControl.Is3DCanvas(): @@ -399,25 +399,18 @@ range = 1.0 return data, center - range * 0.55, center + range * 0.55 - class DebugVariableViewer(wx.Panel): - - def AddViewer(self): - pass - - def AddButtons(self): - pass - - def __init__(self, parent, window, items=[]): - wx.Panel.__init__(self, parent) - self.SetBackgroundColour(wx.WHITE) - self.SetDropTarget(DebugVariableDropTarget(window, self)) - + class DebugVariableViewer: + + def __init__(self, window, items=[]): self.ParentWindow = window self.Items = items + self.Highlight = HIGHLIGHT_NONE + self.Buttons = [] + def __del__(self): self.ParentWindow = None - + def GetIndex(self): return self.ParentWindow.GetViewerIndex(self) @@ -467,74 +460,137 @@ for item in self.Items: item.ResetData() - def Refresh(self): + def RefreshViewer(self): pass - - def OnForceButton(self, event): - if len(self.Items) == 1: - wx.CallAfter(self.ForceValue, self.Items[0]) - else: - menu = wx.Menu(title='') - for item in self.Items: - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, - text=item.GetVariable(self.ParentWindow.GetVariableNameMask())) - self.Bind(wx.EVT_MENU, - self.GetForceVariableMenuFunction(item), - id=new_id) - self.PopupMenu(menu) + + def SetHighlight(self, highlight): + if self.Highlight != highlight: + self.Highlight = highlight + return True + return False + + def GetButtons(self): + return self.Buttons + + def HandleButtons(self, x, y): + for button in self.GetButtons(): + if button.HitTest(x, y): + button.ProcessCallback() + return True + return False + + def IsOverButton(self, x, y): + for button in self.GetButtons(): + if button.HitTest(x, y): + return True + return False + + def ShowButtons(self, show): + for button in self.Buttons: + if show: + button.Show() + else: + button.Hide() + self.RefreshButtonsState() + self.ParentWindow.ForceRefresh() + + def RefreshButtonsState(self, refresh_positions=False): + if self: + width, height = self.GetSize() + if refresh_positions: + offset = 0 + buttons = self.Buttons[:] + buttons.reverse() + for button in buttons: + if button.IsShown() and button.IsEnabled(): + w, h = button.GetSize() + button.SetPosition(width - 5 - w - offset, 5) + offset += w + 2 + self.ParentWindow.ForceRefresh() + + def DrawCommonElements(self, dc, buttons=None): + width, height = self.GetSize() + + dc.SetPen(HIGHLIGHT_DROP_PEN) + dc.SetBrush(HIGHLIGHT_DROP_BRUSH) + if self.Highlight in [HIGHLIGHT_BEFORE]: + dc.DrawLine(0, 1, width - 1, 1) + elif self.Highlight in [HIGHLIGHT_AFTER]: + dc.DrawLine(0, height - 1, width - 1, height - 1) + + if buttons is None: + buttons = self.Buttons + for button in buttons: + button.Draw(dc) + + if self.ParentWindow.IsDragging(): + destBBox = self.ParentWindow.GetDraggingAxesClippingRegion(self) + srcPos = self.ParentWindow.GetDraggingAxesPosition(self) + if destBBox.width > 0 and destBBox.height > 0: + srcPanel = self.ParentWindow.DraggingAxesPanel + srcBBox = srcPanel.GetAxesBoundingBox() + + if destBBox.x == 0: + srcX = srcBBox.x - srcPos.x + else: + srcX = srcBBox.x + if destBBox.y == 0: + srcY = srcBBox.y - srcPos.y + else: + srcY = srcBBox.y + + srcBmp = _convert_agg_to_wx_bitmap(srcPanel.get_renderer(), None) + srcDC = wx.MemoryDC() + srcDC.SelectObject(srcBmp) + + dc.Blit(destBBox.x, destBBox.y, + int(destBBox.width), int(destBBox.height), + srcDC, srcX, srcY) + + def OnEnter(self, event): + self.ShowButtons(True) event.Skip() - - def OnReleaseButton(self, event): - if len(self.Items) == 1: - wx.CallAfter(self.ReleaseValue, self.Items[0]) - else: - menu = wx.Menu(title='') - for item in self.Items: - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, - text=item.GetVariable(self.ParentWindow.GetVariableNameMask())) - self.Bind(wx.EVT_MENU, - self.GetReleaseVariableMenuFunction(item), - id=new_id) - - self.PopupMenu(menu) + + def OnLeave(self, event): + if self.Highlight != HIGHLIGHT_RESIZE or self.CanvasStartSize is None: + x, y = event.GetPosition() + width, height = self.GetSize() + if (x <= 0 or x >= width - 1 or + y <= 0 or y >= height - 1): + self.ShowButtons(False) event.Skip() - def OnDeleteButton(self, event): - if len(self.Items) == 1: - wx.CallAfter(self.ParentWindow.DeleteValue, self, self.Items[0]) - else: - menu = wx.Menu(title='') - for item in self.Items: - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, - text=item.GetVariable(self.ParentWindow.GetVariableNameMask())) - self.Bind(wx.EVT_MENU, - self.GetDeleteValueMenuFunction(item), - id=new_id) - - new_id = wx.NewId() - AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("All")) - self.Bind(wx.EVT_MENU, self.OnDeleteAllValuesMenu, id=new_id) - - self.PopupMenu(menu) + def OnCloseButton(self): + wx.CallAfter(self.ParentWindow.DeleteValue, self) + + def OnForceButton(self): + wx.CallAfter(self.ForceValue, self.Items[0]) + + def OnReleaseButton(self): + wx.CallAfter(self.ReleaseValue, self.Items[0]) + + def OnResizeWindow(self, event): + wx.CallAfter(self.RefreshButtonsState, True) event.Skip() - - def GetForceVariableMenuFunction(self, item): - def ForceVariableFunction(event): - self.ForceValue(item) - return ForceVariableFunction - - def GetReleaseVariableMenuFunction(self, item): - def ReleaseVariableFunction(event): - self.ReleaseValue(item) - return ReleaseVariableFunction - - def GetDeleteValueMenuFunction(self, item): - def DeleteValueFunction(event): - self.ParentWindow.DeleteValue(self, item) - return DeleteValueFunction + + def OnMouseDragging(self, x, y): + xw, yw = self.GetPosition() + self.ParentWindow.RefreshHighlight(x + xw, y + yw) + + def OnDragging(self, x, y): + width, height = self.GetSize() + if y < height / 2: + if self.ParentWindow.IsViewerFirst(self): + self.SetHighlight(HIGHLIGHT_BEFORE) + else: + self.SetHighlight(HIGHLIGHT_NONE) + self.ParentWindow.HighlightPreviousViewer(self) + else: + self.SetHighlight(HIGHLIGHT_AFTER) + + def OnResize(self, event): + wx.CallAfter(self.RefreshButtonsState, True) + event.Skip() def ForceValue(self, item): iec_path = item.GetVariable().upper() @@ -547,59 +603,72 @@ def ReleaseValue(self, item): iec_path = item.GetVariable().upper() self.ParentWindow.ReleaseDataValue(iec_path) - - def OnDeleteAllValuesMenu(self, event): - wx.CallAfter(self.ParentWindow.DeleteValue, self) - - class DebugVariableText(DebugVariableViewer): + + + class DebugVariableText(DebugVariableViewer, wx.Panel): def __init__(self, parent, window, items=[]): - DebugVariableViewer.__init__(self, parent, window, items) - - main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) - main_sizer.AddGrowableCol(0) - - viewer_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) - viewer_sizer.AddGrowableCol(0) - main_sizer.AddSizer(viewer_sizer, border=5, - flag=wx.ALL|wx.GROW|wx.ALIGN_CENTER_VERTICAL) - - variable_name_label = wx.TextCtrl(self, size=wx.Size(0, -1), - value=self.Items[0].GetVariable(), style=wx.TE_READONLY|wx.TE_RIGHT|wx.NO_BORDER) - variable_name_label.SetSelection(variable_name_label.GetLastPosition(), -1) - viewer_sizer.AddWindow(variable_name_label, flag=wx.GROW) - - self.ValueLabel = wx.TextCtrl(self, - size=wx.Size(100, -1), style=wx.TE_READONLY|wx.TE_RIGHT|wx.NO_BORDER) - viewer_sizer.AddWindow(self.ValueLabel, - border=5, flag=wx.LEFT) - - button_sizer = wx.BoxSizer(wx.HORIZONTAL) - self.MainSizer.AddSizer(button_sizer, border=5, - flag=wx.TOP|wx.BOTTOM|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) - - buttons = [ - ("ForceButton", "force", _("Force value")), - ("ReleaseButton", "release", _("Release value")), - ("DeleteButton", "delete_graph", _("Remove debug variable"))] - - for name, bitmap, help in buttons: - button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), - size=wx.Size(20, 20), style=wx.NO_BORDER) - button.SetToolTipString(help) - setattr(self, name, button) - self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button) - button_sizer.AddWindow(button, border=5, flag=wx.LEFT) - - self.SetSizer(main_sizer) - - def Refresh(self): - self.ValueLabel.ChangeValue(self.Items[0].GetValue()) + DebugVariableViewer.__init__(self, window, items) + + wx.Panel.__init__(self, parent) + self.SetBackgroundColour(wx.WHITE) + self.SetDropTarget(DebugVariableDropTarget(window, self)) + self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) + self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnter) + self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) + self.Bind(wx.EVT_SIZE, self.OnResize) + self.Bind(wx.EVT_PAINT, self.OnPaint) + + self.SetMinSize(wx.Size(0, 25)) + + self.Buttons.append( + GraphButton(0, 0, GetBitmap("force"), self.OnForceButton)) + self.Buttons.append( + GraphButton(0, 0, GetBitmap("release"), self.OnReleaseButton)) + self.Buttons.append( + GraphButton(0, 0, GetBitmap("delete_graph"), self.OnCloseButton)) + + self.ShowButtons(False) + + def RefreshViewer(self): + width, height = self.GetSize() + bitmap = wx.EmptyBitmap(width, height) + + dc = wx.BufferedPaintDC(self, bitmap) + dc.Clear() + dc.BeginDrawing() + + gc = wx.GCDC(dc) + + item_name = self.Items[0].GetVariable(self.ParentWindow.GetVariableNameMask()) + w, h = gc.GetTextExtent(item_name) + gc.DrawText(item_name, 10, (height - h) / 2) + if self.Items[0].IsForced(): - self.ValueLabel.SetForegroundColour(wx.BLUE) - else: - self.ValueLabel.SetForegroundColour(wx.BLACK) - self.ValueLabel.SetSelection(self.ValueLabel.GetLastPosition(), -1) + gc.SetTextForeground(wx.BLUE) + self.Buttons[0].Disable() + self.Buttons[1].Enable() + else: + self.Buttons[1].Disable() + self.Buttons[0].Enable() + self.RefreshButtonsState(True) + + item_value = self.Items[0].GetValue() + w, h = gc.GetTextExtent(item_value) + gc.DrawText(item_value, width - 40 - w, (height - h) / 2) + + self.DrawCommonElements(gc) + + gc.EndDrawing() + + def OnLeftUp(self, event): + x, y = event.GetPosition() + wx.CallAfter(self.HandleButtons, x, y) + event.Skip() + + def OnPaint(self, event): + self.RefreshViewer() + event.Skip() def compute_mask(x, y): mask = [] @@ -684,23 +753,36 @@ if self.Shown and self.Enabled: dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True) - class DraggingFigureCanvas(FigureCanvas): - - def __init__(self, parent, window, *args, **kwargs): - FigureCanvas.__init__(self, parent, *args, **kwargs) - self.SetBackgroundColour(wx.WHITE) - self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow) - self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow) - self.Bind(wx.EVT_SIZE, self.OnResizeWindow) - - self.ParentWindow = window - self.Highlight = HIGHLIGHT_NONE + class DebugVariableGraphic(DebugVariableViewer, FigureCanvas): + + def __init__(self, parent, window, items, graph_type): + DebugVariableViewer.__init__(self, window, items) + self.CanvasSize = SIZE_MAXI - - self.Buttons = [] + self.GraphType = graph_type + self.CursorTick = None + self.MouseStartPos = None + self.StartCursorTick = None + self.CanvasStartSize = None self.ContextualButtons = [] self.ContextualButtonsItem = None + self.Figure = matplotlib.figure.Figure(facecolor='w') + self.Figure.subplotpars.update(top=0.95, left=0.1, bottom=0.1, right=0.95) + + FigureCanvas.__init__(self, parent, -1, self.Figure) + self.SetBackgroundColour(wx.WHITE) + self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnter) + self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) + self.Bind(wx.EVT_SIZE, self.OnResize) + + self.SetMinSize(wx.Size(200, 200)) + self.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self)) + self.mpl_connect('button_press_event', self.OnCanvasButtonPressed) + self.mpl_connect('motion_notify_event', self.OnCanvasMotion) + self.mpl_connect('button_release_event', self.OnCanvasButtonReleased) + self.mpl_connect('scroll_event', self.OnCanvasScroll) + for size, bitmap in zip([SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI], ["minimize_graph", "middle_graph", "maximize_graph"]): self.Buttons.append(GraphButton(0, 0, GetBitmap(bitmap), self.GetOnChangeSizeButton(size))) @@ -709,19 +791,9 @@ self.Buttons.append( GraphButton(0, 0, GetBitmap("delete_graph"), self.OnCloseButton)) + self.ResetGraphics() + self.RefreshLabelsPosition(200) self.ShowButtons(False) - - def SetHighlight(self, highlight): - if self.Highlight != highlight: - self.Highlight = highlight - return True - return False - - def GetAxesBoundingBox(self): - width, height = self.GetSize() - ax, ay, aw, ah = self.figure.gca().get_position().bounds - return wx.Rect(ax * width, height - (ay + ah) * height - 1, - aw * width + 2, ah * height + 1) def draw(self, drawDC=None): FigureCanvasAgg.draw(self) @@ -744,54 +816,22 @@ else: destGC.SetPen(HIGHLIGHT_DROP_PEN) destGC.SetBrush(HIGHLIGHT_DROP_BRUSH) - if self.Highlight in [HIGHLIGHT_BEFORE]: - destGC.DrawLine(0, 1, width - 1, 1) - elif self.Highlight in [HIGHLIGHT_AFTER]: - destGC.DrawLine(0, height - 1, width - 1, height - 1) - elif self.Highlight == HIGHLIGHT_LEFT: + if self.Highlight == HIGHLIGHT_LEFT: destGC.DrawRectangle(bbox.x, bbox.y, bbox.width / 2, bbox.height) elif self.Highlight == HIGHLIGHT_RIGHT: destGC.DrawRectangle(bbox.x + bbox.width / 2, bbox.y, bbox.width / 2, bbox.height) - for button in self.Buttons + self.ContextualButtons: - button.Draw(destGC) - - if self.ParentWindow.IsDragging(): - destBBox = self.ParentWindow.GetDraggingAxesClippingRegion(self.Parent) - if destBBox.width > 0 and destBBox.height > 0: - srcPanel = self.ParentWindow.DraggingAxesPanel - srcBBox = srcPanel.GetAxesBoundingBox() - - if destBBox.x == 0: - srcX = srcBBox.x + srcBBox.width - destBBox.width - else: - srcX = srcBBox.x - if destBBox.y == 0: - srcY = srcBBox.y + srcBBox.height - destBBox.height - else: - srcY = srcBBox.y - - srcBmp = _convert_agg_to_wx_bitmap(srcPanel.Canvas.get_renderer(), None) - srcDC = wx.MemoryDC() - srcDC.SelectObject(srcBmp) - - destGC.Blit(destBBox.x, destBBox.y, - int(destBBox.width), int(destBBox.height), - srcDC, srcX, srcY) - + self.DrawCommonElements(destGC, self.Buttons + self.ContextualButtons) + destGC.EndDrawing() self._isDrawn = True self.gui_repaint(drawDC=drawDC) - def HandleButtons(self, x, y): - for button in self.Buttons + self.ContextualButtons: - if button.HitTest(x, y): - button.ProcessCallback() - return True - return False + def GetButtons(self): + return self.Buttons + self.ContextualButtons def PopupContextualButtons(self, item, rect, style=wx.RIGHT): if self.ContextualButtonsItem is not None and item != self.ContextualButtonsItem: @@ -840,12 +880,6 @@ self.ContextualButtons = [] self.ParentWindow.ForceRefresh() - def IsOverButton(self, x, y): - for button in self.Buttons + self.ContextualButtons: - if button.HitTest(x, y): - return True - return False - def IsOverContextualButton(self, x, y): for button in self.ContextualButtons: if button.HitTest(x, y): @@ -855,65 +889,40 @@ def SetMinSize(self, size): wx.Window.SetMinSize(self, size) wx.CallAfter(self.RefreshButtonsState) - - def ShowButtons(self, show): - for button in self.Buttons: - if show: - button.Show() - else: - button.Hide() - self.RefreshButtonsState() - self.ParentWindow.ForceRefresh() - - def OnEnterWindow(self, event): - self.ShowButtons(True) - event.Skip() - - def OnLeaveWindow(self, event): - if self.Highlight != HIGHLIGHT_RESIZE or self.Parent.CanvasStartSize is None: - x, y = event.GetPosition() - width, height = self.GetSize() - if (x <= 0 or x >= width - 1 or - y <= 0 or y >= height - 1): - self.ShowButtons(False) - event.Skip() def GetOnChangeSizeButton(self, size): def OnChangeSizeButton(): self.CanvasSize = size - self.Parent.SetCanvasSize(200, self.CanvasSize) + self.SetCanvasSize(200, self.CanvasSize) return OnChangeSizeButton def OnExportGraphButton(self): - self.Parent.ExportGraph() - - def OnCloseButton(self): - self.ParentWindow.DeleteValue(self.Parent) + self.ExportGraph() def OnForceButton(self): - wx.CallAfter(self.Parent.ForceValue, + wx.CallAfter(self.ForceValue, self.ContextualButtonsItem) self.DismissContextualButtons() def OnReleaseButton(self): - wx.CallAfter(self.Parent.ReleaseValue, + wx.CallAfter(self.ReleaseValue, self.ContextualButtonsItem) self.DismissContextualButtons() def OnExportItemGraphButton(self): - wx.CallAfter(self.Parent.ExportGraph, + wx.CallAfter(self.ExportGraph, self.ContextualButtonsItem) self.DismissContextualButtons() def OnRemoveItemButton(self): - wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent, + wx.CallAfter(self.ParentWindow.DeleteValue, self, self.ContextualButtonsItem) self.DismissContextualButtons() def RefreshButtonsState(self, refresh_positions=False): if self: width, height = self.GetSize() - min_width, min_height = self.Parent.GetCanvasMinSize() + min_width, min_height = self.GetCanvasMinSize() for button, size in zip(self.Buttons, [min_height, SIZE_MIDDLE, SIZE_MAXI]): if size == height and button.IsEnabled(): @@ -933,41 +942,6 @@ offset += w + 2 self.ParentWindow.ForceRefresh() - def OnResizeWindow(self, event): - wx.CallAfter(self.RefreshButtonsState, True) - event.Skip() - - class DebugVariableGraphic(DebugVariableViewer): - - def __init__(self, parent, window, items, graph_type): - DebugVariableViewer.__init__(self, parent, window, items) - - self.GraphType = graph_type - self.CursorTick = None - self.MouseStartPos = None - self.StartCursorTick = None - self.CanvasStartSize = None - - main_sizer = wx.BoxSizer(wx.VERTICAL) - - self.Figure = matplotlib.figure.Figure(facecolor='w') - self.Figure.subplotpars.update(top=0.95, left=0.1, bottom=0.1, right=0.95) - - self.Canvas = DraggingFigureCanvas(self, self.ParentWindow, -1, self.Figure) - self.Canvas.SetMinSize(wx.Size(200, 200)) - self.Canvas.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self)) - self.Canvas.mpl_connect('button_press_event', self.OnCanvasButtonPressed) - self.Canvas.mpl_connect('motion_notify_event', self.OnCanvasMotion) - self.Canvas.mpl_connect('button_release_event', self.OnCanvasButtonReleased) - self.Canvas.mpl_connect('scroll_event', self.OnCanvasScroll) - self.Canvas.Bind(wx.EVT_LEAVE_WINDOW, self.OnCanvasLeave) - - main_sizer.AddWindow(self.Canvas, 1, flag=wx.GROW) - self.SetSizer(main_sizer) - - self.ResetGraphics() - self.RefreshLabelsPosition(200) - def RefreshLabelsPosition(self, height): canvas_ratio = 1. / height graph_ratio = 1. / ((1.0 - (CANVAS_BORDER[0] + CANVAS_BORDER[1]) * canvas_ratio) * height) @@ -1002,12 +976,15 @@ def SetCanvasSize(self, width, height): height = max(height, self.GetCanvasMinSize()[1]) - self.Canvas.SetMinSize(wx.Size(width, height)) + self.SetMinSize(wx.Size(width, height)) self.RefreshLabelsPosition(height) self.ParentWindow.RefreshGraphicsSizer() def GetAxesBoundingBox(self, absolute=False): - bbox = self.Canvas.GetAxesBoundingBox() + width, height = self.GetSize() + ax, ay, aw, ah = self.figure.gca().get_position().bounds + bbox = wx.Rect(ax * width, height - (ay + ah) * height - 1, + aw * width + 2, ah * height + 1) if absolute: xw, yw = self.GetPosition() bbox.x += xw @@ -1015,9 +992,9 @@ return bbox def OnCanvasButtonPressed(self, event): - width, height = self.Canvas.GetSize() + width, height = self.GetSize() x, y = event.x, height - event.y - if not self.Canvas.IsOverButton(x, y): + if not self.IsOverButton(x, y): if event.inaxes == self.Axes: item_idx = None for i, t in ([pair for pair in enumerate(self.AxesLabels)] + @@ -1028,8 +1005,8 @@ item_idx = i break if item_idx is not None: - self.Canvas.ShowButtons(False) - self.Canvas.DismissContextualButtons() + self.ShowButtons(False) + self.DismissContextualButtons() xw, yw = self.GetPosition() self.ParentWindow.StartDragNDrop(self, self.Items[item_idx], x + xw, y + yw, x + xw, y + yw) @@ -1039,17 +1016,17 @@ self.StartCursorTick = self.CursorTick self.HandleCursorMove(event) elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: - width, height = self.Canvas.GetSize() + width, height = self.GetSize() start_tick, end_tick = self.ParentWindow.GetRange() self.StartCursorTick = start_tick elif event.button == 1 and event.y <= 5: self.MouseStartPos = wx.Point(x, y) - self.CanvasStartSize = self.Canvas.GetSize() + self.CanvasStartSize = self.GetSize() def OnCanvasButtonReleased(self, event): if self.ParentWindow.IsDragging(): - width, height = self.Canvas.GetSize() + width, height = self.GetSize() xw, yw = self.GetPosition() self.ParentWindow.StopDragNDrop( self.ParentWindow.DraggingAxesPanel.Items[0].GetVariable(), @@ -1059,14 +1036,14 @@ self.MouseStartPos = None self.StartCursorTick = None self.CanvasStartSize = None - width, height = self.Canvas.GetSize() - self.Canvas.HandleButtons(event.x, height - event.y) - if event.y > 5 and self.Canvas.SetHighlight(HIGHLIGHT_NONE): - self.Canvas.SetCursor(wx.NullCursor) + width, height = self.GetSize() + self.HandleButtons(event.x, height - event.y) + if event.y > 5 and self.SetHighlight(HIGHLIGHT_NONE): + self.SetCursor(wx.NullCursor) self.ParentWindow.ForceRefresh() def OnCanvasMotion(self, event): - width, height = self.Canvas.GetSize() + width, height = self.GetSize() if self.ParentWindow.IsDragging(): xw, yw = self.GetPosition() self.ParentWindow.MoveDragNDrop( @@ -1093,7 +1070,7 @@ (end_tick - start_tick) / rect.width) if event.button == 1 and self.CanvasStartSize is not None: - width, height = self.Canvas.GetSize() + width, height = self.GetSize() self.SetCanvasSize(width, self.CanvasStartSize.height + height - event.y - self.MouseStartPos.y) @@ -1116,42 +1093,20 @@ item_style = style break if item_idx is not None: - self.Canvas.PopupContextualButtons(self.Items[item_idx], rect, item_style) + self.PopupContextualButtons(self.Items[item_idx], rect, item_style) return - if not self.Canvas.IsOverContextualButton(event.x, height - event.y): - self.Canvas.DismissContextualButtons() + if not self.IsOverContextualButton(event.x, height - event.y): + self.DismissContextualButtons() if event.y <= 5: - if self.Canvas.SetHighlight(HIGHLIGHT_RESIZE): - self.Canvas.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS)) + if self.SetHighlight(HIGHLIGHT_RESIZE): + self.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS)) self.ParentWindow.ForceRefresh() else: - if self.Canvas.SetHighlight(HIGHLIGHT_NONE): - self.Canvas.SetCursor(wx.NullCursor) + if self.SetHighlight(HIGHLIGHT_NONE): + self.SetCursor(wx.NullCursor) self.ParentWindow.ForceRefresh() - def OnCanvasMouseDragging(self, x, y): - xw, yw = self.GetPosition() - self.ParentWindow.RefreshHighlight(x + xw, y + yw) - - def OnCanvasDragging(self, x, y): - width, height = self.Canvas.GetSize() - bbox = self.Canvas.GetAxesBoundingBox() - if bbox.InsideXY(x, y) and not self.Is3DCanvas(): - rect = wx.Rect(bbox.x, bbox.y, bbox.width / 2, bbox.height) - if rect.InsideXY(x, y): - self.Canvas.SetHighlight(HIGHLIGHT_LEFT) - else: - self.Canvas.SetHighlight(HIGHLIGHT_RIGHT) - elif y < height / 2: - if self.ParentWindow.IsViewerFirst(self): - self.Canvas.SetHighlight(HIGHLIGHT_BEFORE) - else: - self.Canvas.SetHighlight(HIGHLIGHT_NONE) - self.ParentWindow.HighlightPreviousViewer(self) - else: - self.Canvas.SetHighlight(HIGHLIGHT_AFTER) - def OnCanvasScroll(self, event): if event.inaxes is not None: if self.GraphType == GRAPH_ORTHOGONAL: @@ -1161,14 +1116,29 @@ tick = event.xdata self.ParentWindow.ChangeRange(int(-event.step) / 3, tick) - def OnCanvasLeave(self, event): - if self.CanvasStartSize is None and self.Canvas.SetHighlight(HIGHLIGHT_NONE): - self.Canvas.SetCursor(wx.NullCursor) + def OnDragging(self, x, y): + width, height = self.GetSize() + bbox = self.GetAxesBoundingBox() + if bbox.InsideXY(x, y) and not self.Is3DCanvas(): + rect = wx.Rect(bbox.x, bbox.y, bbox.width / 2, bbox.height) + if rect.InsideXY(x, y): + self.SetHighlight(HIGHLIGHT_LEFT) + else: + self.SetHighlight(HIGHLIGHT_RIGHT) + elif y < height / 2: + if self.ParentWindow.IsViewerFirst(self): + self.SetHighlight(HIGHLIGHT_BEFORE) + else: + self.SetHighlight(HIGHLIGHT_NONE) + self.ParentWindow.HighlightPreviousViewer(self) + else: + self.SetHighlight(HIGHLIGHT_AFTER) + + def OnLeave(self, event): + if self.CanvasStartSize is None and self.SetHighlight(HIGHLIGHT_NONE): + self.SetCursor(wx.NullCursor) self.ParentWindow.ForceRefresh() - event.Skip() - - def HighlightCanvas(self, highlight): - self.Canvas.SetHighlight(highlight) + DebugVariableViewer.OnLeave(self, event) def HandleCursorMove(self, event): start_tick, end_tick = self.ParentWindow.GetRange() @@ -1253,7 +1223,7 @@ rotation='vertical', verticalalignment='top', transform=self.Axes.transAxes)) - width, height = self.Canvas.GetSize() + width, height = self.GetSize() self.RefreshLabelsPosition(height) def AddItem(self, item): @@ -1278,7 +1248,7 @@ def SetCursorTick(self, cursor_tick): self.CursorTick = cursor_tick - def Refresh(self, refresh_graphics=True): + def RefreshViewer(self, refresh_graphics=True): if refresh_graphics: start_tick, end_tick = self.ParentWindow.GetRange() @@ -1409,7 +1379,7 @@ label.set_text(value) label.set_style(style) - self.Canvas.draw() + self.draw() def ExportGraph(self, item=None): if item is not None: @@ -1640,7 +1610,7 @@ self.DraggingAxesPanel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) self.DraggingAxesPanel.SetCursorTick(self.CursorTick) width, height = panel.GetSize() - self.DraggingAxesPanel.SetMinSize(wx.Size(width, height)) + self.DraggingAxesPanel.SetSize(wx.Size(width, height)) self.DraggingAxesPanel.SetPosition(wx.Point(0, -height)) else: self.DraggingAxesPanel = panel @@ -1658,19 +1628,19 @@ def RefreshHighlight(self, x_mouse, y_mouse): for idx, panel in enumerate(self.GraphicPanels): x, y = panel.GetPosition() - width, height = panel.Canvas.GetSize() + width, height = panel.GetSize() rect = wx.Rect(x, y, width, height) if (rect.InsideXY(x_mouse, y_mouse) or idx == 0 and y_mouse < 0 or idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]): - panel.OnCanvasDragging(x_mouse - x, y_mouse - y) - else: - panel.HighlightCanvas(HIGHLIGHT_NONE) + panel.OnDragging(x_mouse - x, y_mouse - y) + else: + panel.SetHighlight(HIGHLIGHT_NONE) self.ForceRefresh() def ResetHighlight(self): for panel in self.GraphicPanels: - panel.HighlightCanvas(HIGHLIGHT_NONE) + panel.SetHighlight(HIGHLIGHT_NONE) self.ForceRefresh() def IsDragging(self): @@ -1678,26 +1648,33 @@ def GetDraggingAxesClippingRegion(self, panel): x, y = panel.GetPosition() - width, height = panel.Canvas.GetSize() + width, height = panel.GetSize() bbox = wx.Rect(x, y, width, height) bbox = bbox.Intersect(self.DraggingAxesBoundingBox) bbox.x -= x bbox.y -= y return bbox + def GetDraggingAxesPosition(self, panel): + x, y = panel.GetPosition() + return wx.Point(self.DraggingAxesBoundingBox.x - x, + self.DraggingAxesBoundingBox.y - y) + def StopDragNDrop(self, variable, x_mouse, y_mouse): + if self.DraggingAxesPanel not in self.GraphicPanels: + self.DraggingAxesPanel.Destroy() self.DraggingAxesPanel = None self.DraggingAxesBoundingBox = None self.DraggingAxesMousePos = None for idx, panel in enumerate(self.GraphicPanels): - panel.HighlightCanvas(HIGHLIGHT_NONE) + panel.SetHighlight(HIGHLIGHT_NONE) xw, yw = panel.GetPosition() - width, height = panel.Canvas.GetSize() + width, height = panel.GetSize() bbox = wx.Rect(xw, yw, width, height) if bbox.InsideXY(x_mouse, y_mouse): - panel.Canvas.ShowButtons(True) + panel.ShowButtons(True) merge_type = GRAPH_PARALLEL - if panel.Is3DCanvas(): + if isinstance(panel, DebugVariableText) or panel.Is3DCanvas(): if y_mouse > yw + height / 2: idx += 1 wx.CallAfter(self.MoveGraph, variable, idx) @@ -1733,7 +1710,7 @@ destBBox = self.DraggingAxesBoundingBox srcBBox = self.DraggingAxesPanel.GetAxesBoundingBox() - srcBmp = _convert_agg_to_wx_bitmap(self.DraggingAxesPanel.Canvas.get_renderer(), None) + srcBmp = _convert_agg_to_wx_bitmap(self.DraggingAxesPanel.get_renderer(), None) srcDC = wx.MemoryDC() srcDC.SelectObject(srcBmp) @@ -1749,12 +1726,12 @@ refresh_graphics = False if self.DraggingAxesPanel is not None and self.DraggingAxesPanel not in self.GraphicPanels: - self.DraggingAxesPanel.Refresh(refresh_graphics) + self.DraggingAxesPanel.RefreshViewer(refresh_graphics) for panel in self.GraphicPanels: if isinstance(panel, DebugVariableGraphic): - panel.Refresh(refresh_graphics) + panel.RefreshViewer(refresh_graphics) else: - panel.Refresh() + panel.RefreshViewer() if self.CursorTick is not None: tick = self.CursorTick @@ -1808,8 +1785,8 @@ for panel in self.GraphicPanels: panel.UnregisterObsoleteData() if panel.IsEmpty(): - if panel.Canvas.HasCapture(): - panel.Canvas.ReleaseMouse() + if panel.HasCapture(): + panel.ReleaseMouse() self.GraphicPanels.remove(panel) panel.Destroy() @@ -2037,7 +2014,7 @@ idx = self.GetViewerIndex(viewer) if idx is None: return - self.GraphicPanels[idx-1].HighlightCanvas(HIGHLIGHT_AFTER) + self.GraphicPanels[idx-1].SetHighlight(HIGHLIGHT_AFTER) def ResetVariableNameMask(self): items = [] @@ -2104,8 +2081,8 @@ if source_panel is not None: source_panel.RemoveItem(item) if source_panel.IsEmpty(): - if source_panel.Canvas.HasCapture(): - source_panel.Canvas.ReleaseMouse() + if source_panel.HasCapture(): + source_panel.ReleaseMouse() self.GraphicPanels.remove(source_panel) source_panel.Destroy() @@ -2144,8 +2121,8 @@ if source_panel is not None: source_panel.RemoveItem(source_item) if source_panel.IsEmpty(): - if source_panel.Canvas.HasCapture(): - source_panel.Canvas.ReleaseMouse() + if source_panel.HasCapture(): + source_panel.ReleaseMouse() self.GraphicPanels.remove(source_panel) source_panel.Destroy() elif (merge_type != graph_type and len(target_panel.Items) == 2):