From: <ef...@us...> - 2010-06-19 23:46:53
|
Revision: 8441 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8441&view=rev Author: efiring Date: 2010-06-19 23:46:47 +0000 (Sat, 19 Jun 2010) Log Message: ----------- [1530104, 3017380] slider grabs mouse; patch by C. Gohlke and baxissimo Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/backend_bases.py trunk/matplotlib/lib/matplotlib/widgets.py Modified: trunk/matplotlib/lib/matplotlib/backend_bases.py =================================================================== --- trunk/matplotlib/lib/matplotlib/backend_bases.py 2010-06-17 17:45:38 UTC (rev 8440) +++ trunk/matplotlib/lib/matplotlib/backend_bases.py 2010-06-19 23:46:47 UTC (rev 8441) @@ -1122,7 +1122,10 @@ return # Find all axes containing the mouse - axes_list = [a for a in self.canvas.figure.get_axes() if a.in_axes(self)] + if self.canvas.mouse_grabber is None: + axes_list = [a for a in self.canvas.figure.get_axes() if a.in_axes(self)] + else: + axes_list = [self.canvas.mouse_grabber] if len(axes_list) == 0: # None found self.inaxes = None @@ -1332,6 +1335,7 @@ self._lastx, self._lasty = None, None self.button_pick_id = self.mpl_connect('button_press_event',self.pick) self.scroll_pick_id = self.mpl_connect('scroll_event',self.pick) + self.mouse_grabber = None # the axes currently grabbing mouse if False: ## highlight the artists that are hit @@ -1610,6 +1614,26 @@ event = IdleEvent(s, self, guiEvent=guiEvent) self.callbacks.process(s, event) + def grab_mouse(self, ax): + """ + Set the child axes which are currently grabbing the mouse events. + Usually called by the widgets themselves. + It is an error to call this if the mouse is already grabbed by + another axes. + """ + if self.mouse_grabber not in (None, ax): + raise RuntimeError('two different attempted to grab mouse input') + self.mouse_grabber = ax + + def release_mouse(self, ax): + """ + Release the mouse grab held by the axes, ax. + Usually called by the widgets. + It is ok to call this even if you ax doesn't have the mouse grab currently. + """ + if self.mouse_grabber is ax: + self.mouse_grabber = None + def draw(self, *args, **kwargs): """ Render the :class:`~matplotlib.figure.Figure` Modified: trunk/matplotlib/lib/matplotlib/widgets.py =================================================================== --- trunk/matplotlib/lib/matplotlib/widgets.py 2010-06-17 17:45:38 UTC (rev 8440) +++ trunk/matplotlib/lib/matplotlib/widgets.py 2010-06-19 23:46:47 UTC (rev 8441) @@ -106,6 +106,7 @@ ax.figure.canvas.mpl_connect('button_press_event', self._click) + ax.figure.canvas.mpl_connect('button_release_event', self._release) ax.figure.canvas.mpl_connect('motion_notify_event', self._motion) ax.set_navigate(False) ax.set_axis_bgcolor(color) @@ -117,8 +118,21 @@ self._lastcolor = color def _click(self, event): - if event.inaxes != self.ax: return - if not self.eventson: return + if event.inaxes != self.ax: + return + if not self.eventson: + return + if event.canvas.mouse_grabber != self.ax: + event.canvas.grab_mouse(self.ax) + + def _release(self, event): + if event.canvas.mouse_grabber != self.ax: + return + event.canvas.release_mouse(self.ax) + if not self.eventson: + return + if event.inaxes != self.ax: + return for cid, func in self.observers.items(): func(event) @@ -209,6 +223,7 @@ ax.set_navigate(False) ax.figure.canvas.mpl_connect('button_press_event', self._update) + ax.figure.canvas.mpl_connect('button_release_event', self._update) if dragging: ax.figure.canvas.mpl_connect('motion_notify_event', self._update) self.label = ax.text(-0.02, 0.5, label, transform=ax.transAxes, @@ -227,14 +242,35 @@ self.closedmax = closedmax self.slidermin = slidermin self.slidermax = slidermax + self.drag_active = False def _update(self, event): 'update the slider position' - if event.button !=1: return - if event.inaxes != self.ax: return + if event.button != 1: + return + + if event.name == 'button_press_event' and event.inaxes == self.ax: + self.drag_active = True + event.canvas.grab_mouse(self.ax) + + if not self.drag_active: + return + + elif ((event.name == 'button_release_event') + or (event.name == 'button_press_event' and event.inaxes != self.ax)): + self.drag_active = False + event.canvas.release_mouse(self.ax) + return + val = event.xdata - if not self.closedmin and val<=self.valmin: return - if not self.closedmax and val>=self.valmax: return + if val <= self.valmin: + if not self.closedmin: + return + val = self.valmin + elif val >= self.valmax: + if not self.closedmax: + return + val = self.valmax if self.slidermin is not None: if val<=self.slidermin.val: return This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |