controls/DebugVariablePanel.py
changeset 937 bd6fdbb61784
parent 936 364d178df2d3
child 938 ef1bfe848bf9
equal deleted inserted replaced
936:364d178df2d3 937:bd6fdbb61784
   613     #CANVAS_HIGHLIGHT_TYPES
   613     #CANVAS_HIGHLIGHT_TYPES
   614     [HIGHLIGHT_NONE,
   614     [HIGHLIGHT_NONE,
   615      HIGHLIGHT_BEFORE,
   615      HIGHLIGHT_BEFORE,
   616      HIGHLIGHT_AFTER,
   616      HIGHLIGHT_AFTER,
   617      HIGHLIGHT_LEFT,
   617      HIGHLIGHT_LEFT,
   618      HIGHLIGHT_RIGHT] = range(5)
   618      HIGHLIGHT_RIGHT,
   619     
   619      HIGHLIGHT_RESIZE] = range(6)
   620     HIGHLIGHT_PEN = wx.Pen(wx.Colour(0, 128, 255))
   620     
   621     HIGHLIGHT_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
   621     HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255))
       
   622     HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
       
   623     HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200))
       
   624     HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200))
   622     
   625     
   623     #CANVAS_SIZE_TYPES
   626     #CANVAS_SIZE_TYPES
   624     [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200]
   627     [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200]
   625     
   628     
   626     DEFAULT_CANVAS_HEIGHT = 200.
   629     DEFAULT_CANVAS_HEIGHT = 200.
   633         
   636         
   634         def __init__(self, x, y, bitmap, callback):
   637         def __init__(self, x, y, bitmap, callback):
   635             self.Position = wx.Point(x, y)
   638             self.Position = wx.Point(x, y)
   636             self.Bitmap = bitmap
   639             self.Bitmap = bitmap
   637             self.Shown = True
   640             self.Shown = True
       
   641             self.Enabled = True
   638             self.Callback = callback
   642             self.Callback = callback
   639         
   643         
   640         def __del__(self):
   644         def __del__(self):
   641             self.callback = None
   645             self.callback = None
   642         
   646         
   644             return self.Bitmap.GetSize()
   648             return self.Bitmap.GetSize()
   645         
   649         
   646         def SetPosition(self, x, y):
   650         def SetPosition(self, x, y):
   647             self.Position = wx.Point(x, y)
   651             self.Position = wx.Point(x, y)
   648         
   652         
   649         def SetBitmap(self, bitmap):
       
   650             self.Bitmap = bitmap
       
   651             
       
   652         def SetCallback(self, callback):
       
   653             self.Callback = callback
       
   654         
       
   655         def Show(self):
   653         def Show(self):
   656             self.Shown = True
   654             self.Shown = True
   657             
   655             
   658         def Hide(self):
   656         def Hide(self):
   659             self.Shown = False
   657             self.Shown = False
   660         
   658         
       
   659         def IsShown(self):
       
   660             return self.Shown
       
   661         
       
   662         def Enable(self):
       
   663             self.Enabled = True
       
   664         
       
   665         def Disable(self):
       
   666             self.Enabled = False
       
   667         
       
   668         def IsEnabled(self):
       
   669             return self.Enabled
       
   670         
   661         def HitTest(self, x, y):
   671         def HitTest(self, x, y):
   662             if self.Shown:
   672             if self.Shown and self.Enabled:
   663                 w, h = self.Bitmap.GetSize()
   673                 w, h = self.Bitmap.GetSize()
   664                 rect = wx.Rect(self.Position.x, self.Position.y, w, h)
   674                 rect = wx.Rect(self.Position.x, self.Position.y, w, h)
   665                 if rect.InsideXY(x, y):
   675                 if rect.InsideXY(x, y):
   666                     return True
   676                     return True
   667             return False
   677             return False
   669         def ProcessCallback(self):
   679         def ProcessCallback(self):
   670             if self.Callback is not None:
   680             if self.Callback is not None:
   671                 wx.CallAfter(self.Callback)
   681                 wx.CallAfter(self.Callback)
   672                 
   682                 
   673         def Draw(self, dc):
   683         def Draw(self, dc):
   674             if self.Shown:
   684             if self.Shown and self.Enabled:
   675                 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True)
   685                 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True)
   676     
   686     
   677     class DraggingFigureCanvas(FigureCanvas):
   687     class DraggingFigureCanvas(FigureCanvas):
   678         
   688         
   679         def __init__(self, parent, window, *args, **kwargs):
   689         def __init__(self, parent, window, *args, **kwargs):
   686             self.ParentWindow = window
   696             self.ParentWindow = window
   687             self.Highlight = HIGHLIGHT_NONE
   697             self.Highlight = HIGHLIGHT_NONE
   688             self.CanvasSize = SIZE_MAXI
   698             self.CanvasSize = SIZE_MAXI
   689             
   699             
   690             self.Buttons = []
   700             self.Buttons = []
   691             self.SizeButtonsParams = dict(
       
   692                 [(size, (GetBitmap(bitmap), self.GetOnChangeSizeButton(size)))
       
   693                  for size, bitmap in zip([SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI],
       
   694                                          ["minimize_graph", "middle_graph", "maximize_graph"])])
       
   695             self.ContextualButtons = []
   701             self.ContextualButtons = []
   696             self.ContextualButtonsItem = None
   702             self.ContextualButtonsItem = None
   697             
   703             
   698             for size in [SIZE_MINI, SIZE_MIDDLE]:
   704             for size, bitmap in zip([SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI],
   699                 self.Buttons.append(GraphButton(0, 0, *self.SizeButtonsParams[size]))
   705                                     ["minimize_graph", "middle_graph", "maximize_graph"]):
       
   706                 self.Buttons.append(GraphButton(0, 0, GetBitmap(bitmap), self.GetOnChangeSizeButton(size)))
   700             self.Buttons.append(
   707             self.Buttons.append(
   701                 GraphButton(0, 0, GetBitmap("export_graph_mini"), self.OnExportGraphButton))
   708                 GraphButton(0, 0, GetBitmap("export_graph_mini"), self.OnExportGraphButton))
   702             self.Buttons.append(
   709             self.Buttons.append(
   703                 GraphButton(0, 0, GetBitmap("delete_graph"), self.OnCloseButton))
   710                 GraphButton(0, 0, GetBitmap("delete_graph"), self.OnCloseButton))
   704             
   711             
   728             destDC.SelectObject(self.bitmap)
   735             destDC.SelectObject(self.bitmap)
   729             
   736             
   730             destGC = wx.GCDC(destDC)
   737             destGC = wx.GCDC(destDC)
   731             
   738             
   732             destGC.BeginDrawing()
   739             destGC.BeginDrawing()
   733             destGC.SetPen(HIGHLIGHT_PEN)
   740             if self.Highlight == HIGHLIGHT_RESIZE:
   734             destGC.SetBrush(HIGHLIGHT_BRUSH)
   741                 destGC.SetPen(HIGHLIGHT_RESIZE_PEN)
   735             if self.Highlight in [HIGHLIGHT_BEFORE]:
   742                 destGC.SetBrush(HIGHLIGHT_RESIZE_BRUSH)
   736                 destGC.DrawLine(0, 1, width - 1, 1)
   743                 destGC.DrawRectangle(0, height - 5, width, 5)
   737             elif self.Highlight in [HIGHLIGHT_AFTER]:
   744             else:
   738                 destGC.DrawLine(0, height - 1, width - 1, height - 1)
   745                 destGC.SetPen(HIGHLIGHT_DROP_PEN)
   739             elif self.Highlight == HIGHLIGHT_LEFT:
   746                 destGC.SetBrush(HIGHLIGHT_DROP_BRUSH)
   740                 destGC.DrawRectangle(bbox.x, bbox.y, 
   747                 if self.Highlight in [HIGHLIGHT_BEFORE]:
   741                                      bbox.width / 2, bbox.height)
   748                     destGC.DrawLine(0, 1, width - 1, 1)
   742             elif self.Highlight == HIGHLIGHT_RIGHT:
   749                 elif self.Highlight in [HIGHLIGHT_AFTER]:
   743                 destGC.DrawRectangle(bbox.x + bbox.width / 2, bbox.y, 
   750                     destGC.DrawLine(0, height - 1, width - 1, height - 1)
   744                                      bbox.width / 2, bbox.height)
   751                 elif self.Highlight == HIGHLIGHT_LEFT:
       
   752                     destGC.DrawRectangle(bbox.x, bbox.y, 
       
   753                                          bbox.width / 2, bbox.height)
       
   754                 elif self.Highlight == HIGHLIGHT_RIGHT:
       
   755                     destGC.DrawRectangle(bbox.x + bbox.width / 2, bbox.y, 
       
   756                                          bbox.width / 2, bbox.height)
   745             
   757             
   746             for button in self.Buttons + self.ContextualButtons:
   758             for button in self.Buttons + self.ContextualButtons:
   747                 button.Draw(destGC)
   759                 button.Draw(destGC)
   748             
   760             
   749             if self.ParentWindow.IsDragging():
   761             if self.ParentWindow.IsDragging():
   838             for button in self.ContextualButtons:
   850             for button in self.ContextualButtons:
   839                 if button.HitTest(x, y):
   851                 if button.HitTest(x, y):
   840                     return True
   852                     return True
   841             return False
   853             return False
   842         
   854         
       
   855         def SetMinSize(self, size):
       
   856             wx.Window.SetMinSize(self, size)
       
   857             wx.CallAfter(self.RefreshButtonsState)
       
   858                 
   843         def ShowButtons(self, show):
   859         def ShowButtons(self, show):
   844             for button in self.Buttons:
   860             for button in self.Buttons:
   845                 if show:
   861                 if show:
   846                     button.Show()
   862                     button.Show()
   847                 else:
   863                 else:
   848                     button.Hide()
   864                     button.Hide()
       
   865             self.RefreshButtonsState()
   849             self.ParentWindow.ForceRefresh()
   866             self.ParentWindow.ForceRefresh()
   850         
   867         
   851         def OnEnterWindow(self, event):
   868         def OnEnterWindow(self, event):
   852             self.ShowButtons(True)
   869             self.ShowButtons(True)
   853             event.Skip()
   870             event.Skip()
   854             
   871             
   855         def OnLeaveWindow(self, event):
   872         def OnLeaveWindow(self, event):
   856             x, y = event.GetPosition()
   873             if self.Highlight != HIGHLIGHT_RESIZE or self.Parent.CanvasStartSize is None:
   857             width, height = self.GetSize()
   874                 x, y = event.GetPosition()
   858             if (x <= 0 or x >= width - 1 or
   875                 width, height = self.GetSize()
   859                 y <= 0 or y >= height - 1):
   876                 if (x <= 0 or x >= width - 1 or
   860                 self.ShowButtons(False)
   877                     y <= 0 or y >= height - 1):
       
   878                     self.ShowButtons(False)
   861             event.Skip()
   879             event.Skip()
   862         
   880         
   863         def GetOnChangeSizeButton(self, size):
   881         def GetOnChangeSizeButton(self, size):
   864             def OnChangeSizeButton():
   882             def OnChangeSizeButton():
   865                 self.CanvasSize = size
   883                 self.CanvasSize = size
   866                 self.Parent.SetCanvasSize(200, self.CanvasSize)
   884                 self.Parent.SetCanvasSize(200, self.CanvasSize)
   867                 params = []
       
   868                 if self.CanvasSize != SIZE_MINI:
       
   869                     params.append(self.SizeButtonsParams[SIZE_MINI])
       
   870                 else:
       
   871                     params.append(self.SizeButtonsParams[SIZE_MIDDLE])
       
   872                 if self.CanvasSize != SIZE_MAXI:
       
   873                     params.append(self.SizeButtonsParams[SIZE_MAXI])
       
   874                 else:
       
   875                     params.append(self.SizeButtonsParams[SIZE_MIDDLE])
       
   876                 for button, (bitmap, callback) in zip(self.Buttons, params):
       
   877                     button.SetBitmap(bitmap)
       
   878                     button.SetCallback(callback)
       
   879             return OnChangeSizeButton
   885             return OnChangeSizeButton
   880         
   886         
   881         def OnExportGraphButton(self):
   887         def OnExportGraphButton(self):
   882             self.Parent.ExportGraph()
   888             self.Parent.ExportGraph()
   883         
   889         
   902         def OnRemoveItemButton(self):            
   908         def OnRemoveItemButton(self):            
   903             wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent, 
   909             wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent, 
   904                          self.ContextualButtonsItem)
   910                          self.ContextualButtonsItem)
   905             self.DismissContextualButtons()
   911             self.DismissContextualButtons()
   906         
   912         
       
   913         def RefreshButtonsState(self, refresh_positions=False):
       
   914             width, height = self.GetSize()
       
   915             min_width, min_height = self.Parent.GetCanvasMinSize()
       
   916             for button, size in zip(self.Buttons, 
       
   917                                     [min_height, SIZE_MIDDLE, SIZE_MAXI]):
       
   918                 if size == height and button.IsEnabled():
       
   919                     button.Disable()
       
   920                     refresh_positions = True
       
   921                 elif not button.IsEnabled():
       
   922                     button.Enable()
       
   923                     refresh_positions = True
       
   924             if refresh_positions:
       
   925                 offset = 0
       
   926                 buttons = self.Buttons[:]
       
   927                 buttons.reverse()
       
   928                 for button in buttons:
       
   929                     if button.IsShown() and button.IsEnabled():
       
   930                         w, h = button.GetSize()
       
   931                         button.SetPosition(width - 5 - w - offset, 5)
       
   932                         offset += w + 2
       
   933                 self.ParentWindow.ForceRefresh()
       
   934         
   907         def OnResizeWindow(self, event):
   935         def OnResizeWindow(self, event):
   908             width, height = self.GetSize()
   936             wx.CallAfter(self.RefreshButtonsState, True)
   909             offset = 0
       
   910             buttons = self.Buttons[:]
       
   911             buttons.reverse()
       
   912             for button in buttons:
       
   913                 w, h = button.GetSize()
       
   914                 button.SetPosition(width - 5 - w - offset, 5)
       
   915                 offset += w + 2
       
   916             event.Skip()
   937             event.Skip()
   917     
   938     
   918     class DebugVariableGraphic(DebugVariableViewer):
   939     class DebugVariableGraphic(DebugVariableViewer):
   919         
   940         
   920         def __init__(self, parent, window, items, graph_type):
   941         def __init__(self, parent, window, items, graph_type):
   922         
   943         
   923             self.GraphType = graph_type
   944             self.GraphType = graph_type
   924             self.CursorTick = None
   945             self.CursorTick = None
   925             self.MouseStartPos = None
   946             self.MouseStartPos = None
   926             self.StartCursorTick = None
   947             self.StartCursorTick = None
       
   948             self.CanvasStartSize = None
   927             
   949             
   928             main_sizer = wx.BoxSizer(wx.VERTICAL)
   950             main_sizer = wx.BoxSizer(wx.VERTICAL)
   929             
   951             
   930             self.Figure = matplotlib.figure.Figure(facecolor='w')
   952             self.Figure = matplotlib.figure.Figure(facecolor='w')
   931             self.Figure.subplotpars.update(top=0.95, left=0.1, bottom=0.1, right=0.95)
   953             self.Figure.subplotpars.update(top=0.95, left=0.1, bottom=0.1, right=0.95)
   935             self.Canvas.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self))
   957             self.Canvas.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self))
   936             self.Canvas.mpl_connect('button_press_event', self.OnCanvasButtonPressed)
   958             self.Canvas.mpl_connect('button_press_event', self.OnCanvasButtonPressed)
   937             self.Canvas.mpl_connect('motion_notify_event', self.OnCanvasMotion)
   959             self.Canvas.mpl_connect('motion_notify_event', self.OnCanvasMotion)
   938             self.Canvas.mpl_connect('button_release_event', self.OnCanvasButtonReleased)
   960             self.Canvas.mpl_connect('button_release_event', self.OnCanvasButtonReleased)
   939             self.Canvas.mpl_connect('scroll_event', self.OnCanvasScroll)
   961             self.Canvas.mpl_connect('scroll_event', self.OnCanvasScroll)
       
   962             self.Canvas.Bind(wx.EVT_LEAVE_WINDOW, self.OnCanvasLeave)
   940             
   963             
   941             main_sizer.AddWindow(self.Canvas, 1, flag=wx.GROW)
   964             main_sizer.AddWindow(self.Canvas, 1, flag=wx.GROW)
   942             self.SetSizer(main_sizer)
   965             self.SetSizer(main_sizer)
   943             
   966             
   944             self.ResetGraphics()
   967             self.ResetGraphics()
   969                 self.AxesLabels[1].set_position((0.05, 2 * CANVAS_PADDING * graph_ratio))
   992                 self.AxesLabels[1].set_position((0.05, 2 * CANVAS_PADDING * graph_ratio))
   970                 self.Labels[1].set_position((0.05, 1.0 - CANVAS_PADDING * graph_ratio))
   993                 self.Labels[1].set_position((0.05, 1.0 - CANVAS_PADDING * graph_ratio))
   971         
   994         
   972             self.Figure.subplots_adjust()
   995             self.Figure.subplots_adjust()
   973         
   996         
       
   997         def GetCanvasMinSize(self):
       
   998             return wx.Size(200, 
       
   999                            CANVAS_BORDER[0] + CANVAS_BORDER[1] + 
       
  1000                            2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items))
       
  1001         
   974         def SetCanvasSize(self, width, height):
  1002         def SetCanvasSize(self, width, height):
   975             height = max(height,
  1003             height = max(height, self.GetCanvasMinSize()[1])
   976                          CANVAS_BORDER[0] + CANVAS_BORDER[1] + 
       
   977                          2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items))
       
   978             self.Canvas.SetMinSize(wx.Size(width, height))
  1004             self.Canvas.SetMinSize(wx.Size(width, height))
   979             self.RefreshLabelsPosition(height)
  1005             self.RefreshLabelsPosition(height)
   980             self.ParentWindow.RefreshGraphicsSizer()
  1006             self.ParentWindow.RefreshGraphicsSizer()
   981             
  1007             
   982         def GetAxesBoundingBox(self, absolute=False):
  1008         def GetAxesBoundingBox(self, absolute=False):
   988             return bbox
  1014             return bbox
   989         
  1015         
   990         def OnCanvasButtonPressed(self, event):
  1016         def OnCanvasButtonPressed(self, event):
   991             width, height = self.Canvas.GetSize()
  1017             width, height = self.Canvas.GetSize()
   992             x, y = event.x, height - event.y
  1018             x, y = event.x, height - event.y
   993             if not self.Canvas.IsOverButton(x, y) and not self.Is3DCanvas():
  1019             if not self.Canvas.IsOverButton(x, y):
   994                 rect = self.GetAxesBoundingBox()
  1020                 if event.inaxes == self.Axes and not self.Is3DCanvas():
   995                 if rect.InsideXY(x, y):
       
   996                     self.MouseStartPos = wx.Point(x, y)
  1021                     self.MouseStartPos = wx.Point(x, y)
   997                 item_idx = None
  1022                     item_idx = None
   998                 for i, t in ([pair for pair in enumerate(self.AxesLabels)] + 
  1023                     for i, t in ([pair for pair in enumerate(self.AxesLabels)] + 
   999                              [pair for pair in enumerate(self.Labels)]):
  1024                                  [pair for pair in enumerate(self.Labels)]):
  1000                     (x0, y0), (x1, y1) = t.get_window_extent().get_points()
  1025                         (x0, y0), (x1, y1) = t.get_window_extent().get_points()
  1001                     rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
  1026                         rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
  1002                     if rect.InsideXY(x, y):
  1027                         if rect.InsideXY(x, y):
  1003                         item_idx = i
  1028                             item_idx = i
  1004                         break
  1029                             break
  1005                 if item_idx is not None:
  1030                     if item_idx is not None:
  1006                     self.Canvas.ShowButtons(False)
  1031                         self.Canvas.ShowButtons(False)
  1007                     self.Canvas.DismissContextualButtons()
  1032                         self.Canvas.DismissContextualButtons()
  1008                     xw, yw = self.GetPosition()
  1033                         xw, yw = self.GetPosition()
  1009                     self.ParentWindow.StartDragNDrop(self, 
  1034                         self.ParentWindow.StartDragNDrop(self, 
  1010                         self.Items[item_idx], x + xw, y + yw, x + xw, y + yw)
  1035                             self.Items[item_idx], x + xw, y + yw, x + xw, y + yw)
  1011                 elif event.button == 1 and event.inaxes == self.Axes:
  1036                     elif event.button == 1 and event.inaxes == self.Axes:
  1012                     self.StartCursorTick = self.CursorTick
  1037                         self.StartCursorTick = self.CursorTick
  1013                     self.HandleCursorMove(event)
  1038                         self.HandleCursorMove(event)
  1014                 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
  1039                     elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
  1015                     width, height = self.Canvas.GetSize()
  1040                         width, height = self.Canvas.GetSize()
  1016                     start_tick, end_tick = self.ParentWindow.GetRange()
  1041                         start_tick, end_tick = self.ParentWindow.GetRange()
       
  1042                         self.StartCursorTick = start_tick
       
  1043                 
       
  1044                 elif event.button == 1 and event.y <= 5:
  1017                     self.MouseStartPos = wx.Point(x, y)
  1045                     self.MouseStartPos = wx.Point(x, y)
  1018                     self.StartCursorTick = start_tick
  1046                     self.CanvasStartSize = self.Canvas.GetSize()
  1019         
  1047         
  1020         def OnCanvasButtonReleased(self, event):
  1048         def OnCanvasButtonReleased(self, event):
  1021             if self.ParentWindow.IsDragging():
  1049             if self.ParentWindow.IsDragging():
  1022                 width, height = self.Canvas.GetSize()
  1050                 width, height = self.Canvas.GetSize()
  1023                 xw, yw = self.GetPosition()
  1051                 xw, yw = self.GetPosition()
  1026                     xw + event.x, 
  1054                     xw + event.x, 
  1027                     yw + height - event.y)
  1055                     yw + height - event.y)
  1028             else:
  1056             else:
  1029                 self.MouseStartPos = None
  1057                 self.MouseStartPos = None
  1030                 self.StartCursorTick = None
  1058                 self.StartCursorTick = None
       
  1059                 self.CanvasStartSize = None
  1031                 width, height = self.Canvas.GetSize()
  1060                 width, height = self.Canvas.GetSize()
  1032                 self.Canvas.HandleButtons(event.x, height - event.y)
  1061                 self.Canvas.HandleButtons(event.x, height - event.y)
       
  1062                 if event.y > 5 and self.Canvas.SetHighlight(HIGHLIGHT_NONE):
       
  1063                     self.Canvas.SetCursor(wx.NullCursor)
       
  1064                     self.ParentWindow.ForceRefresh()
  1033         
  1065         
  1034         def OnCanvasMotion(self, event):
  1066         def OnCanvasMotion(self, event):
  1035             width, height = self.Canvas.GetSize()
  1067             width, height = self.Canvas.GetSize()
  1036             if self.ParentWindow.IsDragging():
  1068             if self.ParentWindow.IsDragging():
  1037                 xw, yw = self.GetPosition()
  1069                 xw, yw = self.GetPosition()
  1038                 self.ParentWindow.MoveDragNDrop(
  1070                 self.ParentWindow.MoveDragNDrop(
  1039                     xw + event.x, 
  1071                     xw + event.x, 
  1040                     yw + height - event.y)
  1072                     yw + height - event.y)
  1041             elif not self.Is3DCanvas():
  1073             else:
  1042                 if event.button == 1:
  1074                 if not self.Is3DCanvas():
  1043                     if event.inaxes == self.Axes:
  1075                     if event.button == 1 and self.CanvasStartSize is None:
  1044                         if self.MouseStartPos is not None:
  1076                         if event.inaxes == self.Axes:
  1045                             self.HandleCursorMove(event)
  1077                             if self.MouseStartPos is not None:
  1046                     elif self.MouseStartPos is not None and len(self.Items) == 1:
  1078                                 self.HandleCursorMove(event)
  1047                         xw, yw = self.GetPosition()
  1079                         elif self.MouseStartPos is not None and len(self.Items) == 1:
  1048                         self.ParentWindow.SetCursorTick(self.StartCursorTick)
  1080                             xw, yw = self.GetPosition()
  1049                         self.ParentWindow.StartDragNDrop(self, 
  1081                             self.ParentWindow.SetCursorTick(self.StartCursorTick)
  1050                             self.Items[0],
  1082                             self.ParentWindow.StartDragNDrop(self, 
  1051                             event.x + xw, height - event.y + yw, 
  1083                                 self.Items[0],
  1052                             self.MouseStartPos.x + xw, self.MouseStartPos.y + yw)
  1084                                 event.x + xw, height - event.y + yw, 
  1053                 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
  1085                                 self.MouseStartPos.x + xw, self.MouseStartPos.y + yw)
  1054                     start_tick, end_tick = self.ParentWindow.GetRange()
  1086                     elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
  1055                     rect = self.GetAxesBoundingBox()
  1087                         start_tick, end_tick = self.ParentWindow.GetRange()
  1056                     self.ParentWindow.SetCanvasPosition(
  1088                         rect = self.GetAxesBoundingBox()
  1057                         self.StartCursorTick + (self.MouseStartPos.x - event.x) *
  1089                         self.ParentWindow.SetCanvasPosition(
  1058                         (end_tick - start_tick) / rect.width)
  1090                             self.StartCursorTick + (self.MouseStartPos.x - event.x) *
       
  1091                             (end_tick - start_tick) / rect.width)    
       
  1092                 
       
  1093                 if event.button == 1 and self.CanvasStartSize is not None:
       
  1094                     width, height = self.Canvas.GetSize()
       
  1095                     self.SetCanvasSize(width, 
       
  1096                         self.CanvasStartSize.height + height - event.y - self.MouseStartPos.y)
       
  1097                     
  1059                 elif event.button in [None, "up", "down"]:
  1098                 elif event.button in [None, "up", "down"]:
  1060                     if self.GraphType == GRAPH_PARALLEL:
  1099                     if self.GraphType == GRAPH_PARALLEL:
  1061                         orientation = [wx.RIGHT] * len(self.AxesLabels) + [wx.LEFT] * len(self.Labels)
  1100                             orientation = [wx.RIGHT] * len(self.AxesLabels) + [wx.LEFT] * len(self.Labels)
  1062                     elif len(self.AxesLabels) > 0:
  1101                     elif len(self.AxesLabels) > 0:
  1063                         orientation = [wx.RIGHT, wx.TOP, wx.LEFT, wx.BOTTOM]
  1102                         orientation = [wx.RIGHT, wx.TOP, wx.LEFT, wx.BOTTOM]
  1064                     item_idx = None
  1103                     item_idx = None
  1065                     item_style = None
  1104                     item_style = None
  1066                     for (i, t), style in zip([pair for pair in enumerate(self.AxesLabels)] + 
  1105                     for (i, t), style in zip([pair for pair in enumerate(self.AxesLabels)] + 
  1075                     if item_idx is not None:
  1114                     if item_idx is not None:
  1076                         self.Canvas.PopupContextualButtons(self.Items[item_idx], rect, item_style)
  1115                         self.Canvas.PopupContextualButtons(self.Items[item_idx], rect, item_style)
  1077                         return 
  1116                         return 
  1078                     if not self.Canvas.IsOverContextualButton(event.x, height - event.y):
  1117                     if not self.Canvas.IsOverContextualButton(event.x, height - event.y):
  1079                         self.Canvas.DismissContextualButtons()
  1118                         self.Canvas.DismissContextualButtons()
       
  1119                     
       
  1120                     if event.y <= 5:
       
  1121                         if self.Canvas.SetHighlight(HIGHLIGHT_RESIZE):
       
  1122                             self.Canvas.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS))
       
  1123                             self.ParentWindow.ForceRefresh()
       
  1124                     else:
       
  1125                         if self.Canvas.SetHighlight(HIGHLIGHT_NONE):
       
  1126                             self.Canvas.SetCursor(wx.NullCursor)
       
  1127                             self.ParentWindow.ForceRefresh()
  1080         
  1128         
  1081         def OnCanvasMouseDragging(self, x, y):
  1129         def OnCanvasMouseDragging(self, x, y):
  1082             xw, yw = self.GetPosition()
  1130             xw, yw = self.GetPosition()
  1083             self.ParentWindow.RefreshHighlight(x + xw, y + yw)
  1131             self.ParentWindow.RefreshHighlight(x + xw, y + yw)
  1084         
  1132         
  1106                     start_tick, end_tick = self.ParentWindow.GetRange()
  1154                     start_tick, end_tick = self.ParentWindow.GetRange()
  1107                     tick = (start_tick + end_tick) / 2.
  1155                     tick = (start_tick + end_tick) / 2.
  1108                 else:
  1156                 else:
  1109                     tick = event.xdata
  1157                     tick = event.xdata
  1110                 self.ParentWindow.ChangeRange(int(-event.step) / 3, tick)
  1158                 self.ParentWindow.ChangeRange(int(-event.step) / 3, tick)
       
  1159         
       
  1160         def OnCanvasLeave(self, event):
       
  1161             if self.CanvasStartSize is None and self.Canvas.SetHighlight(HIGHLIGHT_NONE):
       
  1162                 self.Canvas.SetCursor(wx.NullCursor)
       
  1163                 self.ParentWindow.ForceRefresh()
       
  1164             event.Skip()
  1111         
  1165         
  1112         def HighlightCanvas(self, highlight):
  1166         def HighlightCanvas(self, highlight):
  1113             self.Canvas.SetHighlight(highlight)
  1167             self.Canvas.SetHighlight(highlight)
  1114         
  1168         
  1115         def HandleCursorMove(self, event):
  1169         def HandleCursorMove(self, event):