Revision: 6454
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6454&view=rev
Author:   jdh2358
Date:     2008-11-26 17:43:09 +0000 (Wed, 26 Nov 2008)

Log Message:
-----------
added figure/axes enter/leave events

Modified Paths:
--------------
    trunk/matplotlib/doc/users/event_handling.rst
    trunk/matplotlib/lib/matplotlib/backend_bases.py

Added Paths:
-----------
    trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py

Modified: trunk/matplotlib/doc/users/event_handling.rst
===================================================================
--- trunk/matplotlib/doc/users/event_handling.rst       2008-11-25 21:43:36 UTC 
(rev 6453)
+++ trunk/matplotlib/doc/users/event_handling.rst       2008-11-26 17:43:09 UTC 
(rev 6454)
@@ -53,15 +53,19 @@
 =======================  
======================================================================================
 Event name               Class and description
 =======================  
======================================================================================
-'button_press_event'     :class:`~matplotlib.backend_bases.MouseEvent`  - 
mouse button is pressed
-'button_release_event'   :class:`~matplotlib.backend_bases.MouseEvent`  - 
mouse button is released
-'draw_event'             :class:`~matplotlib.backend_bases.DrawEvent`   - 
canvas draw
-'key_press_event'        :class:`~matplotlib.backend_bases.KeyEvent`    - key 
is pressed
-'key_release_event'      :class:`~matplotlib.backend_bases.KeyEvent`    - key 
is released
-'motion_notify_event'    :class:`~matplotlib.backend_bases.MouseEvent`  - 
mouse motion
-'pick_event'             :class:`~matplotlib.backend_bases.PickEvent`   - an 
object in the canvas is selected
-'resize_event'           :class:`~matplotlib.backend_bases.ResizeEvent` - 
figure canvas is resized
-'scroll_event'           :class:`~matplotlib.backend_bases.MouseEvent`  - 
mouse scroll wheel is rolled
+'button_press_event'     :class:`~matplotlib.backend_bases.MouseEvent`     - 
mouse button is pressed
+'button_release_event'   :class:`~matplotlib.backend_bases.MouseEvent`     - 
mouse button is released
+'draw_event'             :class:`~matplotlib.backend_bases.DrawEvent`      - 
canvas draw
+'key_press_event'        :class:`~matplotlib.backend_bases.KeyEvent`       - 
key is pressed
+'key_release_event'      :class:`~matplotlib.backend_bases.KeyEvent`       - 
key is released
+'motion_notify_event'    :class:`~matplotlib.backend_bases.MouseEvent`     - 
mouse motion
+'pick_event'             :class:`~matplotlib.backend_bases.PickEvent`      - 
an object in the canvas is selected
+'resize_event'           :class:`~matplotlib.backend_bases.ResizeEvent`    - 
figure canvas is resized
+'scroll_event'           :class:`~matplotlib.backend_bases.MouseEvent`     - 
mouse scroll wheel is rolled
+'figure_enter_event'     :class:`~matplotlib.backend_bases.LocationEvent`  - 
mouse enters a new figure
+'figure_leave_event'     :class:`~matplotlib.backend_bases.LocationEvent`  - 
mouse leaves a figure
+'axes_enter_event'     :class:`~matplotlib.backend_bases.LocationEvent`    - 
mouse enters a new axes
+'axes_leave_event'     :class:`~matplotlib.backend_bases.LocationEvent`    - 
mouse leaves an axes
 =======================  
======================================================================================
 
 .. _event-attributes:
@@ -330,6 +334,66 @@
     plt.show()
 
 
+.. _enter-leave-events:
+
+Mouse enter and leave
+======================
+
+If you want to be notified when the mouse enters or leaves a figure or
+axes, you can connect to the figure/axes enter/leave events.  Here is
+a simple example that changes the colors of the axes and figure
+background that the mouse is over::
+
+    """
+    Illustrate the figure and axes enter and leave events by changing the
+    frame colors on enter and leave
+    """
+    import matplotlib.pyplot as plt
+
+    def enter_axes(event):
+        print 'enter_axes', event.inaxes
+        event.inaxes.patch.set_facecolor('yellow')
+        event.canvas.draw()
+
+    def leave_axes(event):
+        print 'leave_axes', event.inaxes
+        event.inaxes.patch.set_facecolor('white')
+        event.canvas.draw()
+
+    def enter_figure(event):
+        print 'enter_figure', event.canvas.figure
+        event.canvas.figure.patch.set_facecolor('red')
+        event.canvas.draw()
+
+    def leave_figure(event):
+        print 'leave_figure', event.canvas.figure
+        event.canvas.figure.patch.set_facecolor('grey')
+        event.canvas.draw()
+
+    fig1 = plt.figure()
+    fig1.suptitle('mouse hover over figure or axes to trigger events')
+    ax1 = fig1.add_subplot(211)
+    ax2 = fig1.add_subplot(212)
+
+    fig1.canvas.mpl_connect('figure_enter_event', enter_figure)
+    fig1.canvas.mpl_connect('figure_leave_event', leave_figure)
+    fig1.canvas.mpl_connect('axes_enter_event', enter_axes)
+    fig1.canvas.mpl_connect('axes_leave_event', leave_axes)
+
+    fig2 = plt.figure()
+    fig2.suptitle('mouse hover over figure or axes to trigger events')
+    ax1 = fig2.add_subplot(211)
+    ax2 = fig2.add_subplot(212)
+
+    fig2.canvas.mpl_connect('figure_enter_event', enter_figure)
+    fig2.canvas.mpl_connect('figure_leave_event', leave_figure)
+    fig2.canvas.mpl_connect('axes_enter_event', enter_axes)
+    fig2.canvas.mpl_connect('axes_leave_event', leave_axes)
+
+    plt.show()
+
+
+
 .. _object-picking:
 
 Object picking

Added: trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py
===================================================================
--- trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py         
                (rev 0)
+++ trunk/matplotlib/examples/event_handling/figure_axes_enter_leave.py 
2008-11-26 17:43:09 UTC (rev 6454)
@@ -0,0 +1,49 @@
+"""
+Illustrate the figure and axes enter and leave events by changing the
+frame colors on enter and leave
+"""
+import matplotlib.pyplot as plt
+
+def enter_axes(event):
+    print 'enter_axes', event.inaxes
+    event.inaxes.patch.set_facecolor('yellow')
+    event.canvas.draw()
+
+def leave_axes(event):
+    print 'leave_axes', event.inaxes
+    event.inaxes.patch.set_facecolor('white')
+    event.canvas.draw()
+
+def enter_figure(event):
+    print 'enter_figure', event.canvas.figure
+    event.canvas.figure.patch.set_facecolor('red')
+    event.canvas.draw()
+
+def leave_figure(event):
+    print 'leave_figure', event.canvas.figure
+    event.canvas.figure.patch.set_facecolor('grey')
+    event.canvas.draw()
+
+fig1 = plt.figure()
+fig1.suptitle('mouse hover over figure or axes to trigger events')
+ax1 = fig1.add_subplot(211)
+ax2 = fig1.add_subplot(212)
+
+fig1.canvas.mpl_connect('figure_enter_event', enter_figure)
+fig1.canvas.mpl_connect('figure_leave_event', leave_figure)
+fig1.canvas.mpl_connect('axes_enter_event', enter_axes)
+fig1.canvas.mpl_connect('axes_leave_event', leave_axes)
+
+fig2 = plt.figure()
+fig2.suptitle('mouse hover over figure or axes to trigger events')
+ax1 = fig2.add_subplot(211)
+ax2 = fig2.add_subplot(212)
+
+fig2.canvas.mpl_connect('figure_enter_event', enter_figure)
+fig2.canvas.mpl_connect('figure_leave_event', leave_figure)
+fig2.canvas.mpl_connect('axes_enter_event', enter_axes)
+fig2.canvas.mpl_connect('axes_leave_event', leave_axes)
+
+plt.show()
+
+

Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backend_bases.py    2008-11-25 21:43:36 UTC 
(rev 6453)
+++ trunk/matplotlib/lib/matplotlib/backend_bases.py    2008-11-26 17:43:09 UTC 
(rev 6454)
@@ -743,6 +743,9 @@
     xdata  = None       # x coord of mouse in data coords
     ydata  = None       # y coord of mouse in data coords
 
+    # the last event that was triggered before this one
+    _lastevent = None
+
     def __init__(self, name, canvas, x, y,guiEvent=None):
         """
         *x*, *y* in figure coords, 0,0 = bottom, left
@@ -751,8 +754,12 @@
         self.x = x
         self.y = y
 
+
+
         if x is None or y is None:
             # cannot check if event was in axes if no x,y info
+            self.inaxes = False
+            self._update_enter_leave()
             return
 
         # Find all axes containing the mouse
@@ -760,6 +767,7 @@
 
         if len(axes_list) == 0: # None found
             self.inaxes = None
+            self._update_enter_leave()
             return
         elif (len(axes_list) > 1): # Overlap, get the highest zorder
             axCmp = lambda _x,_y: cmp(_x.zorder, _y.zorder)
@@ -777,6 +785,36 @@
             self.xdata  = xdata
             self.ydata  = ydata
 
+        self._update_enter_leave()
+
+    def _update_enter_leave(self):
+        'process the figure/axes enter leave events'
+        if LocationEvent._lastevent is not None:
+            last = LocationEvent._lastevent
+            if last.canvas!=self.canvas:
+                # process figure enter/leave event
+                last.canvas.callbacks.process('figure_leave_event', last)
+                self.canvas.callbacks.process('figure_enter_event', self)
+            if last.inaxes!=self.inaxes:
+                # process axes enter/leave events
+                if last.inaxes is not None:
+                    last.canvas.callbacks.process('axes_leave_event', last)
+                if self.inaxes is not None:
+                    self.canvas.callbacks.process('axes_enter_event', self)
+
+        else:
+            # process a figure enter event
+            self.canvas.callbacks.process('figure_enter_event', self)
+            # process an axes enter event if we are over an axes
+            if self.inaxes is not None:
+                self.canvas.callbacks.process('axes_enter_event', self)
+
+
+        LocationEvent._lastevent = self
+
+
+
+
 class MouseEvent(LocationEvent):
     """
     A mouse event ('button_press_event', 'button_release_event', 
'scroll_event',
@@ -914,6 +952,12 @@
         'motion_notify_event',
         'pick_event',
         'idle_event',
+        'figure_enter_event',
+        # todo: we only process this when a mouse enters a different
+        # figure -- we need to connect to the GUI leavel event
+        'figure_leave_event',
+        'axes_enter_event',
+        'axes_leave_event'
         ]
 
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to