--- a/controls/DebugVariablePanel.py Thu Feb 21 17:11:36 2013 +0100
+++ b/controls/DebugVariablePanel.py Thu Feb 21 20:08:06 2013 +0100
@@ -615,10 +615,13 @@
- HIGHLIGHT_RIGHT] = range(5)
+ HIGHLIGHT_RESIZE] = range(6) - HIGHLIGHT_PEN = wx.Pen(wx.Colour(0, 128, 255))
- HIGHLIGHT_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
+ HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255)) + HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128)) + HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200)) + HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200)) [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200]
@@ -635,6 +638,7 @@
self.Position = wx.Point(x, y)
@@ -646,20 +650,26 @@
def SetPosition(self, x, y):
self.Position = wx.Point(x, y)
- def SetBitmap(self, bitmap):
- def SetCallback(self, callback):
- self.Callback = callback
+ if self.Shown and self.Enabled: w, h = self.Bitmap.GetSize()
rect = wx.Rect(self.Position.x, self.Position.y, w, h)
@@ -671,7 +681,7 @@
wx.CallAfter(self.Callback)
+ if self.Shown and self.Enabled: dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True)
class DraggingFigureCanvas(FigureCanvas):
@@ -688,15 +698,12 @@
self.CanvasSize = SIZE_MAXI
- self.SizeButtonsParams = dict(
- [(size, (GetBitmap(bitmap), self.GetOnChangeSizeButton(size)))
- for size, bitmap in zip([SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI],
- ["minimize_graph", "middle_graph", "maximize_graph"])])
self.ContextualButtons = []
self.ContextualButtonsItem = None
- for size in [SIZE_MINI, SIZE_MIDDLE]:
- self.Buttons.append(GraphButton(0, 0, *self.SizeButtonsParams[size]))
+ 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))) GraphButton(0, 0, GetBitmap("export_graph_mini"), self.OnExportGraphButton))
@@ -730,18 +737,23 @@
- destGC.SetPen(HIGHLIGHT_PEN)
- destGC.SetBrush(HIGHLIGHT_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:
- 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)
+ if self.Highlight == HIGHLIGHT_RESIZE: + destGC.SetPen(HIGHLIGHT_RESIZE_PEN) + destGC.SetBrush(HIGHLIGHT_RESIZE_BRUSH) + destGC.DrawRectangle(0, height - 5, width, 5) + 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: + 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:
@@ -840,12 +852,17 @@
+ def SetMinSize(self, size): + wx.Window.SetMinSize(self, size) + wx.CallAfter(self.RefreshButtonsState) def ShowButtons(self, show):
for button in self.Buttons:
+ self.RefreshButtonsState() self.ParentWindow.ForceRefresh()
def OnEnterWindow(self, event):
@@ -853,29 +870,18 @@
def OnLeaveWindow(self, event):
- 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)
+ 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) def GetOnChangeSizeButton(self, size):
def OnChangeSizeButton():
self.Parent.SetCanvasSize(200, self.CanvasSize)
- if self.CanvasSize != SIZE_MINI:
- params.append(self.SizeButtonsParams[SIZE_MINI])
- params.append(self.SizeButtonsParams[SIZE_MIDDLE])
- if self.CanvasSize != SIZE_MAXI:
- params.append(self.SizeButtonsParams[SIZE_MAXI])
- params.append(self.SizeButtonsParams[SIZE_MIDDLE])
- for button, (bitmap, callback) in zip(self.Buttons, params):
- button.SetBitmap(bitmap)
- button.SetCallback(callback)
return OnChangeSizeButton
def OnExportGraphButton(self):
@@ -904,15 +910,30 @@
self.ContextualButtonsItem)
self.DismissContextualButtons()
- def OnResizeWindow(self, event):
+ def RefreshButtonsState(self, refresh_positions=False): width, height = self.GetSize()
- buttons = self.Buttons[:]
- w, h = button.GetSize()
- button.SetPosition(width - 5 - w - offset, 5)
+ min_width, min_height = self.Parent.GetCanvasMinSize() + for button, size in zip(self.Buttons, + [min_height, SIZE_MIDDLE, SIZE_MAXI]): + if size == height and button.IsEnabled(): + refresh_positions = True + elif not button.IsEnabled(): + refresh_positions = True + buttons = self.Buttons[:] + if button.IsShown() and button.IsEnabled(): + w, h = button.GetSize() + button.SetPosition(width - 5 - w - offset, 5) + self.ParentWindow.ForceRefresh() + def OnResizeWindow(self, event): + wx.CallAfter(self.RefreshButtonsState, True) class DebugVariableGraphic(DebugVariableViewer):
@@ -924,6 +945,7 @@
self.MouseStartPos = None
self.StartCursorTick = None
+ self.CanvasStartSize = None main_sizer = wx.BoxSizer(wx.VERTICAL)
@@ -937,6 +959,7 @@
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)
@@ -971,10 +994,13 @@
self.Figure.subplots_adjust()
+ def GetCanvasMinSize(self): + CANVAS_BORDER[0] + CANVAS_BORDER[1] + + 2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items)) def SetCanvasSize(self, width, height):
- CANVAS_BORDER[0] + CANVAS_BORDER[1] +
- 2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items))
+ height = max(height, self.GetCanvasMinSize()[1]) self.Canvas.SetMinSize(wx.Size(width, height))
self.RefreshLabelsPosition(height)
self.ParentWindow.RefreshGraphicsSizer()
@@ -990,32 +1016,34 @@
def OnCanvasButtonPressed(self, event):
width, height = self.Canvas.GetSize()
x, y = event.x, height - event.y
- if not self.Canvas.IsOverButton(x, y) and not self.Is3DCanvas():
- rect = self.GetAxesBoundingBox()
- if rect.InsideXY(x, y):
+ if not self.Canvas.IsOverButton(x, y): + if event.inaxes == self.Axes and not self.Is3DCanvas(): self.MouseStartPos = wx.Point(x, y)
- for i, t in ([pair for pair in enumerate(self.AxesLabels)] +
- [pair for pair in enumerate(self.Labels)]):
- (x0, y0), (x1, y1) = t.get_window_extent().get_points()
- rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
- if rect.InsideXY(x, y):
- if item_idx is not None:
- self.Canvas.ShowButtons(False)
- self.Canvas.DismissContextualButtons()
- xw, yw = self.GetPosition()
- self.ParentWindow.StartDragNDrop(self,
- self.Items[item_idx], x + xw, y + yw, x + xw, y + yw)
- elif event.button == 1 and event.inaxes == self.Axes:
- self.StartCursorTick = self.CursorTick
- self.HandleCursorMove(event)
- elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
- width, height = self.Canvas.GetSize()
- start_tick, end_tick = self.ParentWindow.GetRange()
+ for i, t in ([pair for pair in enumerate(self.AxesLabels)] + + [pair for pair in enumerate(self.Labels)]): + (x0, y0), (x1, y1) = t.get_window_extent().get_points() + rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0) + if rect.InsideXY(x, y): + if item_idx is not None: + self.Canvas.ShowButtons(False) + self.Canvas.DismissContextualButtons() + xw, yw = self.GetPosition() + self.ParentWindow.StartDragNDrop(self, + self.Items[item_idx], x + xw, y + yw, x + xw, y + yw) + elif event.button == 1 and event.inaxes == self.Axes: + self.StartCursorTick = self.CursorTick + self.HandleCursorMove(event) + elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: + width, height = self.Canvas.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.StartCursorTick = start_tick
+ self.CanvasStartSize = self.Canvas.GetSize() def OnCanvasButtonReleased(self, event):
if self.ParentWindow.IsDragging():
@@ -1028,8 +1056,12 @@
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) + self.ParentWindow.ForceRefresh() def OnCanvasMotion(self, event):
width, height = self.Canvas.GetSize()
@@ -1038,27 +1070,34 @@
self.ParentWindow.MoveDragNDrop(
- elif not self.Is3DCanvas():
- if event.inaxes == self.Axes:
- if self.MouseStartPos is not None:
- self.HandleCursorMove(event)
- elif self.MouseStartPos is not None and len(self.Items) == 1:
- xw, yw = self.GetPosition()
- self.ParentWindow.SetCursorTick(self.StartCursorTick)
- self.ParentWindow.StartDragNDrop(self,
- event.x + xw, height - event.y + yw,
- self.MouseStartPos.x + xw, self.MouseStartPos.y + yw)
- elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
- start_tick, end_tick = self.ParentWindow.GetRange()
- rect = self.GetAxesBoundingBox()
- self.ParentWindow.SetCanvasPosition(
- self.StartCursorTick + (self.MouseStartPos.x - event.x) *
- (end_tick - start_tick) / rect.width)
+ if not self.Is3DCanvas(): + if event.button == 1 and self.CanvasStartSize is None: + if event.inaxes == self.Axes: + if self.MouseStartPos is not None: + self.HandleCursorMove(event) + elif self.MouseStartPos is not None and len(self.Items) == 1: + xw, yw = self.GetPosition() + self.ParentWindow.SetCursorTick(self.StartCursorTick) + self.ParentWindow.StartDragNDrop(self, + event.x + xw, height - event.y + yw, + self.MouseStartPos.x + xw, self.MouseStartPos.y + yw) + elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: + start_tick, end_tick = self.ParentWindow.GetRange() + rect = self.GetAxesBoundingBox() + self.ParentWindow.SetCanvasPosition( + self.StartCursorTick + (self.MouseStartPos.x - event.x) * + (end_tick - start_tick) / rect.width) + if event.button == 1 and self.CanvasStartSize is not None: + width, height = self.Canvas.GetSize() + self.SetCanvasSize(width, + self.CanvasStartSize.height + height - event.y - self.MouseStartPos.y) elif event.button in [None, "up", "down"]:
if self.GraphType == GRAPH_PARALLEL:
- orientation = [wx.RIGHT] * len(self.AxesLabels) + [wx.LEFT] * len(self.Labels)
+ orientation = [wx.RIGHT] * len(self.AxesLabels) + [wx.LEFT] * len(self.Labels) elif len(self.AxesLabels) > 0:
orientation = [wx.RIGHT, wx.TOP, wx.LEFT, wx.BOTTOM]
@@ -1077,6 +1116,15 @@
if not self.Canvas.IsOverContextualButton(event.x, height - event.y):
self.Canvas.DismissContextualButtons()
+ if self.Canvas.SetHighlight(HIGHLIGHT_RESIZE): + self.Canvas.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS)) + self.ParentWindow.ForceRefresh() + if self.Canvas.SetHighlight(HIGHLIGHT_NONE): + self.Canvas.SetCursor(wx.NullCursor) + self.ParentWindow.ForceRefresh() def OnCanvasMouseDragging(self, x, y):
xw, yw = self.GetPosition()
@@ -1109,6 +1157,12 @@
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) + self.ParentWindow.ForceRefresh() def HighlightCanvas(self, highlight):
self.Canvas.SetHighlight(highlight)