Example #1
0
class _FigurePanelWx(wx.Panel):
    """Specialise InteractiveState for wx gui toolkit"""
    def __init__(self, *args, **kwargs):
        interactive = kwargs.pop('interactive', False)
        super(_FigurePanelWx, self).__init__(*args, **kwargs)
        # Create figure and canvas
        self.figure = self.FigureCls()
        self.canvas = self.CanvasCls(self, wx.ID_ANY, self.figure)
        # Standard sizing
        self.Bind(wx.EVT_SIZE, self.OnSize)
        # Cursors used by InteractiveState
        self._cursors = {None: wx.StockCursor(wx.CURSOR_DEFAULT),
                        'pan':wx.StockCursor(wx.CURSOR_HAND),
                        'zoom':wx.StockCursor(wx.CURSOR_CROSS)}
        # These will call through to self.interactive
        self._left_down = False
        self.canvas.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClick)
        self.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
        self.canvas.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.canvas.Bind(wx.EVT_MOTION, self.OnMotion)
        self.canvas.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
        #Prepare interactivity
        self.set_interactive(interactive)

    def OnSize(self, event):
        self.canvas.SetSize(self.GetSize())

    def set_interactive(self, interactive):
        self._interactive = InteractiveState(interactive, self)

    def _set_cursor(self, mode):
        self.canvas.SetCursor(self._cursors[mode])

    def _point(self, event):
        x, y = event.GetPosition()
        w, h = self.canvas.GetSize()
        return float(x) / float(w), float(h - y) / float(h)

    def OnLeftDown(self, event):
        self._left_down = True
        self._interactive.on_left_down(self._point(event))

    def OnLeftUp(self, event):
        self._left_down = False
        self._interactive.on_left_up(self._point(event))

    def OnLeftDoubleClick(self, event):
        self._interactive.on_left_double_click(self._point(event))

    def OnRightDown(self, event):
        self._interactive.on_right_down(self._point(event))

    def OnMotion(self, event):
        if self._left_down and not wx.GetMouseState().LeftDown():
            self.OnLeftUp(event)
        elif self._left_down:
            self._interactive.on_mouse_drag(self._point(event))
        else:
            self._interactive.on_mouse_move(self._point(event))