source: sasview/guitools/canvas.py @ f193585

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since f193585 was f193585, checked in by Gervaise Alina <gervyh@…>, 16 years ago

some changes

  • Property mode set to 100644
File size: 3.4 KB
Line 
1import wx
2from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg, _convert_agg_to_wx_bitmap
3from matplotlib.backends.backend_agg import FigureCanvasAgg
4from matplotlib.backend_bases import MouseEvent
5
6class FigureCanvas(FigureCanvasWxAgg):
7    """
8    Add features to the wx agg canvas for better support of AUI and
9    faster plotting.
10    """
11
12    def __init__(self, *args, **kw):
13        super(FigureCanvas,self).__init__(*args, **kw)
14        self._isRendered = False
15       
16        # Create an timer for handling draw_idle requests
17        # If there are events pending when the timer is
18        # complete, reset the timer and continue.  The
19        # alternative approach, binding to wx.EVT_IDLE,
20        # doesn't behave as nicely.
21        self.idletimer = wx.CallLater(1,self._onDrawIdle)
22        # Support for mouse wheel
23        self.Bind(wx.EVT_MOUSEWHEEL, self._onMouseWheel)
24
25
26    def draw_idle(self, *args, **kwargs):
27        """
28        Render after a delay if no other render requests have been made.
29        """
30        self.idletimer.Restart(5, *args, **kwargs)  # Delay by 5 ms
31
32    def _onDrawIdle(self, *args, **kwargs):
33        if False and wx.GetApp().Pending():
34            self.idletimer.Restart(5, *args, **kwargs)
35        else:
36            self.draw(*args, **kwargs)
37
38    def draw(self, drawDC=None):
39        """
40        Render the figure using agg.
41        """
42
43        # Only draw if window is shown, otherwise graph will bleed through
44        # on the notebook style AUI widgets.
45        if self.IsShownOnScreen():
46            self._isRendered = True
47            FigureCanvasWxAgg.draw(self)
48            self.bitmap = _convert_agg_to_wx_bitmap(self.get_renderer(), None)
49            self.gui_repaint(drawDC=drawDC)
50        else:
51            self._isRendered = False
52    def _onMouseWheel(self, evt):
53        """Translate mouse wheel events into matplotlib events"""
54        # Determine mouse location
55        x = evt.GetX()
56        y = self.figure.bbox.height - evt.GetY()
57
58        # Convert delta/rotation/rate into a floating point step size
59        delta = evt.GetWheelDelta()
60        rotation = evt.GetWheelRotation()
61        rate = evt.GetLinesPerAction()
62        #print "delta,rotation,rate",delta,rotation,rate
63        step = rate*float(rotation)/delta
64
65        # Convert to mpl event
66        evt.Skip()
67        self.scroll_event(x, y, step, guiEvent=evt)
68
69    def scroll_event(self, x, y, step=1, guiEvent=None):
70        """
71        Backend derived classes should call this function on any
72        scroll wheel event.  x,y are the canvas coords: 0,0 is lower,
73        left.  button and key are as defined in MouseEvent
74        """
75        button = 'up' if step >= 0 else 'down'
76        self._button = button
77        s = 'scroll_event'
78        event = MouseEvent(s, self, x, y, button, self._key, guiEvent=guiEvent)
79        setattr(event,'step',step)
80        self.callbacks.process(s, event)
81
82
83    def _onPaint(self, evt):
84        """
85        Called when wxPaintEvt is generated
86        """
87
88        if not self._isRealized:
89            self.realize()
90
91        # Need to draw the graph the first time it is shown otherwise
92        # it is a black canvas.  After that we can use the rendered
93        # bitmap for updates.
94        if self._isRendered:
95            self.gui_repaint(drawDC=wx.PaintDC(self))
96        else:
97            self.draw(drawDC=wx.PaintDC(self))
98
99        evt.Skip()
100   
Note: See TracBrowser for help on using the repository browser.