source: sasview/_modules/sas/plottools/binder.html @ a462c6a

gh-pages
Last change on this file since a462c6a was a462c6a, checked in by ajj, 9 years ago

Rebuild to fix index and modules docs

  • Property mode set to 100644
File size: 54.3 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html xmlns="http://www.w3.org/1999/xhtml">
6  <head>
7    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8   
9    <title>sas.plottools.binder &mdash; SasView 3.0.0 documentation</title>
10   
11    <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
12    <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
13   
14    <script type="text/javascript">
15      var DOCUMENTATION_OPTIONS = {
16        URL_ROOT:    '../../../',
17        VERSION:     '3.0.0',
18        COLLAPSE_INDEX: false,
19        FILE_SUFFIX: '.html',
20        HAS_SOURCE:  true
21      };
22    </script>
23    <script type="text/javascript" src="../../../_static/jquery.js"></script>
24    <script type="text/javascript" src="../../../_static/underscore.js"></script>
25    <script type="text/javascript" src="../../../_static/doctools.js"></script>
26    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
27    <link rel="top" title="SasView 3.0.0 documentation" href="../../../index.html" />
28    <link rel="up" title="Module code" href="../../index.html" /> 
29  </head>
30  <body>
31    <div class="related">
32      <h3>Navigation</h3>
33      <ul>
34        <li class="right" style="margin-right: 10px">
35          <a href="../../../genindex.html" title="General Index"
36             accesskey="I">index</a></li>
37        <li class="right" >
38          <a href="../../../py-modindex.html" title="Python Module Index"
39             >modules</a> |</li>
40        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
41          <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li> 
42      </ul>
43    </div> 
44
45    <div class="document">
46      <div class="documentwrapper">
47        <div class="bodywrapper">
48          <div class="body">
49           
50  <h1>Source code for sas.plottools.binder</h1><div class="highlight"><pre>
51<span class="sd">&quot;&quot;&quot;</span>
52<span class="sd">Extension to MPL to support the binding of artists to key/mouse events.</span>
53<span class="sd">&quot;&quot;&quot;</span>
54<span class="kn">import</span> <span class="nn">sys</span>
55
56
57<div class="viewcode-block" id="Selection"><a class="viewcode-back" href="../../../dev/api/sas.plottools.html#sas.plottools.binder.Selection">[docs]</a><span class="k">class</span> <span class="nc">Selection</span><span class="p">:</span>
58    <span class="sd">&quot;&quot;&quot;</span>
59<span class="sd">    Store and compare selections.</span>
60<span class="sd">    &quot;&quot;&quot;</span>
61    <span class="c"># TODO: We need some way to check in prop matches, preferably</span>
62    <span class="c"># TODO: without imposing structure on prop.</span>
63       
64    <span class="n">artist</span> <span class="o">=</span> <span class="bp">None</span>
65    <span class="n">prop</span> <span class="o">=</span> <span class="p">{}</span>
66   
67    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">artist</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">prop</span><span class="o">=</span><span class="p">{}):</span>
68        <span class="bp">self</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">prop</span> <span class="o">=</span> <span class="n">artist</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">prop</span>
69       
70    <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
71        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">artist</span> <span class="ow">is</span> <span class="n">other</span><span class="o">.</span><span class="n">artist</span>
72   
73    <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
74        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">artist</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">other</span><span class="o">.</span><span class="n">artist</span>
75   
76    <span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
77        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">artist</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span>
78
79</div>
80<div class="viewcode-block" id="BindArtist"><a class="viewcode-back" href="../../../dev/api/sas.plottools.html#sas.plottools.binder.BindArtist">[docs]</a><span class="k">class</span> <span class="nc">BindArtist</span><span class="p">:</span>
81    <span class="sd">&quot;&quot;&quot;</span>
82<span class="sd">    &quot;&quot;&quot;</span>
83    <span class="c"># Track keyboard modifiers for events.</span>
84    <span class="c"># TODO: Move keyboard modifier support into the backend.  We cannot</span>
85    <span class="c"># TODO: properly support it from outside the windowing system since there</span>
86    <span class="c"># TODO: is no way to recognized whether shift is held down when the mouse</span>
87    <span class="c"># TODO: first clicks on the the application window.</span>
88    <span class="n">control</span><span class="p">,</span> <span class="n">shift</span><span class="p">,</span> <span class="n">alt</span><span class="p">,</span> <span class="n">meta</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">,</span> <span class="bp">False</span>
89
90    <span class="c"># Track doubleclick</span>
91    <span class="n">dclick_threshhold</span> <span class="o">=</span> <span class="mf">0.25</span>
92    <span class="n">_last_button</span><span class="p">,</span> <span class="n">_last_time</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="mi">0</span>
93   
94    <span class="c"># Mouse/keyboard events we can bind to</span>
95    <span class="n">events</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;enter&#39;</span><span class="p">,</span> <span class="s">&#39;leave&#39;</span><span class="p">,</span> <span class="s">&#39;motion&#39;</span><span class="p">,</span> <span class="s">&#39;click&#39;</span><span class="p">,</span> <span class="s">&#39;dclick&#39;</span><span class="p">,</span> <span class="s">&#39;drag&#39;</span><span class="p">,</span> <span class="s">&#39;release&#39;</span><span class="p">,</span>
96             <span class="s">&#39;scroll&#39;</span><span class="p">,</span> <span class="s">&#39;key&#39;</span><span class="p">,</span> <span class="s">&#39;keyup&#39;</span><span class="p">]</span>
97    <span class="c"># TODO: Need our own event structure</span>
98   
99    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">figure</span><span class="p">):</span>
100        <span class="n">canvas</span> <span class="o">=</span> <span class="n">figure</span><span class="o">.</span><span class="n">canvas</span>
101
102        <span class="c"># Link to keyboard/mouse</span>
103        <span class="k">try</span><span class="p">:</span>
104            <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span> <span class="o">=</span> <span class="p">[</span>
105                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;motion_notify_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onMotion</span><span class="p">),</span>
106                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;button_press_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onClick</span><span class="p">),</span>
107                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;button_release_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onRelease</span><span class="p">),</span>
108                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;key_press_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onKey</span><span class="p">),</span>
109                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;key_release_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onKeyRelease</span><span class="p">),</span>
110                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;scroll_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onScroll</span><span class="p">)</span>
111            <span class="p">]</span>
112        <span class="k">except</span><span class="p">:</span>
113            <span class="k">print</span> <span class="s">&quot;bypassing scroll_event: wrong matplotlib version&quot;</span>
114            <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span> <span class="o">=</span> <span class="p">[</span>
115                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;motion_notify_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onMotion</span><span class="p">),</span>
116                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;button_press_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onClick</span><span class="p">),</span>
117                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;button_release_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onRelease</span><span class="p">),</span>
118                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;key_press_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onKey</span><span class="p">),</span>
119                <span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s">&#39;key_release_event&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_onKeyRelease</span><span class="p">),</span>
120            <span class="p">]</span>
121           
122        <span class="bp">self</span><span class="o">.</span><span class="n">_current</span> <span class="o">=</span> <span class="bp">None</span>
123        <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span> <span class="o">=</span> <span class="p">{}</span>
124        <span class="bp">self</span><span class="o">.</span><span class="n">canvas</span> <span class="o">=</span> <span class="n">canvas</span>
125        <span class="bp">self</span><span class="o">.</span><span class="n">figure</span> <span class="o">=</span> <span class="n">figure</span>
126        <span class="bp">self</span><span class="o">.</span><span class="n">clearall</span><span class="p">()</span>
127       
128<div class="viewcode-block" id="BindArtist.clear"><a class="viewcode-back" href="../../../dev/api/sas.plottools.html#sas.plottools.binder.BindArtist.clear">[docs]</a>    <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">artists</span><span class="p">):</span>
129        <span class="sd">&quot;&quot;&quot;</span>
130<span class="sd">        self.clear(h1,h2,...)</span>
131<span class="sd">            Remove connections for artists h1, h2, ...</span>
132<span class="sd">            </span>
133<span class="sd">        Use clearall() to reset all connections.</span>
134<span class="sd">        &quot;&quot;&quot;</span>
135
136        <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">artists</span><span class="p">:</span>
137            <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
138                <span class="k">if</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">a</span><span class="p">]:</span>
139                    <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">h</span><span class="p">]</span>
140            <span class="k">if</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span><span class="p">:</span>
141                <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
142        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current</span><span class="o">.</span><span class="n">artist</span> <span class="ow">in</span> <span class="n">artists</span><span class="p">:</span>
143            <span class="bp">self</span><span class="o">.</span><span class="n">_current</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
144        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="o">.</span><span class="n">artist</span> <span class="ow">in</span> <span class="n">artists</span><span class="p">:</span>
145            <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
146        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span><span class="o">.</span><span class="n">artist</span> <span class="ow">in</span> <span class="n">artists</span><span class="p">:</span>
147            <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
148        </div>
149<div class="viewcode-block" id="BindArtist.clearall"><a class="viewcode-back" href="../../../dev/api/sas.plottools.html#sas.plottools.binder.BindArtist.clearall">[docs]</a>    <span class="k">def</span> <span class="nf">clearall</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
150        <span class="sd">&quot;&quot;&quot;</span>
151<span class="sd">        Clear connections to all artists.</span>
152<span class="sd">        </span>
153<span class="sd">        Use clear(h1,h2,...) to reset specific artists.</span>
154<span class="sd">        &quot;&quot;&quot;</span>
155        <span class="c"># Don&#39;t monitor any actions</span>
156        <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span> <span class="o">=</span> <span class="p">{}</span>
157        <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
158            <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
159
160        <span class="c"># Need activity state</span>
161        <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span> <span class="o">=</span> <span class="p">[]</span>
162        <span class="bp">self</span><span class="o">.</span><span class="n">_current</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
163        <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
164        <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
165</div>
166<div class="viewcode-block" id="BindArtist.disconnect"><a class="viewcode-back" href="../../../dev/api/sas.plottools.html#sas.plottools.binder.BindArtist.disconnect">[docs]</a>    <span class="k">def</span> <span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
167        <span class="sd">&quot;&quot;&quot;</span>
168<span class="sd">        In case we need to disconnect from the canvas...</span>
169<span class="sd">        &quot;&quot;&quot;</span>
170        <span class="k">try</span><span class="p">:</span>
171            <span class="k">for</span> <span class="n">cid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_disconnect</span><span class="p">(</span><span class="n">cid</span><span class="p">)</span>
172        <span class="k">except</span><span class="p">:</span>
173            <span class="k">print</span> <span class="s">&quot;Error disconnection canvas: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_value</span>
174            <span class="k">pass</span>
175        <span class="bp">self</span><span class="o">.</span><span class="n">_connections</span> <span class="o">=</span> <span class="p">[]</span>
176</div>
177    <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
178        <span class="bp">self</span><span class="o">.</span><span class="n">disconnect</span><span class="p">()</span>
179
180    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">trigger</span><span class="p">,</span> <span class="n">artist</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
181        <span class="sd">&quot;&quot;&quot;Register a callback for an artist to a particular trigger event.</span>
182<span class="sd">        </span>
183<span class="sd">        usage:</span>
184<span class="sd">            self.connect(eventname,artist,action)</span>
185<span class="sd">    </span>
186<span class="sd">        where:</span>
187<span class="sd">            eventname is a string</span>
188<span class="sd">            artist is the particular graph object to respond to the event</span>
189<span class="sd">            action(event,**kw) is called when the event is triggered</span>
190
191<span class="sd">        The action callback is associated with particular artists.</span>
192<span class="sd">        Different artists will have different kwargs.  See documentation</span>
193<span class="sd">        on the contains() method for each artist.  One common properties</span>
194<span class="sd">        are ind for the index of the item under the cursor, which is</span>
195<span class="sd">        returned by Line2D and by collections.</span>
196
197<span class="sd">        The following events are supported:</span>
198<span class="sd">            enter: mouse cursor moves into the artist or to a new index</span>
199<span class="sd">            leave: mouse cursor leaves the artist</span>
200<span class="sd">            click: mouse button pressed on the artist</span>
201<span class="sd">            drag: mouse button pressed on the artist and cursor moves</span>
202<span class="sd">            release: mouse button released for the artist</span>
203<span class="sd">            key: key pressed when mouse is on the artist</span>
204<span class="sd">            keyrelease: key released for the artist</span>
205<span class="sd">    </span>
206<span class="sd">        The event received by action has a number of attributes:</span>
207<span class="sd">            name is the event name which was triggered</span>
208<span class="sd">            artist is the object which triggered the event</span>
209<span class="sd">            x,y are the screen coordinates of the mouse</span>
210<span class="sd">            xdata,ydata are the graph coordinates of the mouse</span>
211<span class="sd">            button is the mouse button being pressed/released</span>
212<span class="sd">            key is the key being pressed/released</span>
213<span class="sd">            shift,control,alt,meta are flags which are true if the</span>
214<span class="sd">                corresponding key is pressed at the time of the event.</span>
215<span class="sd">            details is a dictionary of artist specific details, such as the</span>
216<span class="sd">                id(s) of the point that were clicked.</span>
217<span class="sd">                </span>
218<span class="sd">        When receiving an event, first check the modifier state to be</span>
219<span class="sd">        sure it applies.  E.g., the callback for &#39;press&#39; might be:</span>
220<span class="sd">            if event.button == 1 and event.shift: process Shift-click</span>
221
222<span class="sd">        TODO: Only receive events with the correct modifiers (e.g., S-click,</span>
223<span class="sd">        TODO:   or *-click for any modifiers).</span>
224<span class="sd">        TODO: Only receive button events for the correct button (e.g., click1</span>
225<span class="sd">        TODO:   release3, or dclick* for any button)</span>
226<span class="sd">        TODO: Support virtual artist, so that and artist can be flagged as</span>
227<span class="sd">        TODO:   having a tag list and receive the correct events</span>
228<span class="sd">        TODO: Support virtual events for binding to button-3 vs shift button-1</span>
229<span class="sd">        TODO:   without changing callback code</span>
230<span class="sd">        TODO: Attach multiple callbacks to the same event?</span>
231<span class="sd">        TODO: Clean up interaction with toolbar modes</span>
232<span class="sd">        TODO: push/pushclear/pop context so that binding changes for</span>
233<span class="sd">             the duration</span>
234<span class="sd">        TODO:   e.g., to support ? context sensitive help</span>
235<span class="sd">        &quot;&quot;&quot;</span>
236        <span class="c"># Check that the trigger is valid</span>
237        <span class="k">if</span> <span class="n">trigger</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">:</span>
238            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> invalid --- valid triggers are </span><span class="si">%s</span><span class="s">&quot;</span>\
239                 <span class="o">%</span> <span class="p">(</span><span class="n">trigger</span><span class="p">,</span> <span class="s">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">))</span>
240
241        <span class="c"># Register the trigger callback</span>
242        <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">trigger</span><span class="p">][</span><span class="n">artist</span><span class="p">]</span> <span class="o">=</span> <span class="n">action</span>
243
244        <span class="c"># Maintain a list of all artists</span>
245        <span class="k">if</span> <span class="n">artist</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span><span class="p">:</span>
246            <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">artist</span><span class="p">)</span>
247
248<div class="viewcode-block" id="BindArtist.trigger"><a class="viewcode-back" href="../../../dev/api/sas.plottools.html#sas.plottools.binder.BindArtist.trigger">[docs]</a>    <span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actor</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">ev</span><span class="p">):</span>
249        <span class="sd">&quot;&quot;&quot;</span>
250<span class="sd">        Trigger a particular event for the artist.  Fallback to axes,</span>
251<span class="sd">        to figure, and to &#39;all&#39; if the event is not processed.</span>
252<span class="sd">        &quot;&quot;&quot;</span>
253        <span class="k">if</span> <span class="n">action</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">:</span>
254            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="s">&quot;Trigger expects &quot;</span> <span class="o">+</span> <span class="s">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">events</span><span class="p">)</span>
255       
256        <span class="c"># Tag the event with modifiers</span>
257        <span class="k">for</span> <span class="n">mod</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;alt&#39;</span><span class="p">,</span> <span class="s">&#39;control&#39;</span><span class="p">,</span> <span class="s">&#39;shift&#39;</span><span class="p">,</span> <span class="s">&#39;meta&#39;</span><span class="p">):</span>
258            <span class="nb">setattr</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mod</span><span class="p">))</span>
259        <span class="nb">setattr</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="s">&#39;artist&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
260        <span class="nb">setattr</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="s">&#39;action&#39;</span><span class="p">,</span> <span class="n">action</span><span class="p">)</span>
261        <span class="nb">setattr</span><span class="p">(</span><span class="n">ev</span><span class="p">,</span> <span class="s">&#39;prop&#39;</span><span class="p">,</span> <span class="p">{})</span>
262       
263        <span class="c"># Fallback scheme.  If the event does not return false, pass to parent.</span>
264        <span class="n">processed</span> <span class="o">=</span> <span class="bp">False</span>
265        <span class="n">artist</span><span class="p">,</span> <span class="n">prop</span> <span class="o">=</span> <span class="n">actor</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="n">actor</span><span class="o">.</span><span class="n">prop</span>
266        <span class="k">if</span> <span class="n">artist</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">]:</span>
267            <span class="n">ev</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="n">ev</span><span class="o">.</span><span class="n">prop</span> <span class="o">=</span> <span class="n">artist</span><span class="p">,</span> <span class="n">prop</span>
268            <span class="n">processed</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">][</span><span class="n">artist</span><span class="p">](</span><span class="n">ev</span><span class="p">)</span>
269        <span class="k">if</span> <span class="ow">not</span> <span class="n">processed</span> <span class="ow">and</span> <span class="n">ev</span><span class="o">.</span><span class="n">inaxes</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">]:</span>
270            <span class="n">ev</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="n">ev</span><span class="o">.</span><span class="n">prop</span> <span class="o">=</span> <span class="n">ev</span><span class="o">.</span><span class="n">inaxes</span><span class="p">,</span> <span class="p">{}</span>
271            <span class="n">processed</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">][</span><span class="n">ev</span><span class="o">.</span><span class="n">inaxes</span><span class="p">](</span><span class="n">ev</span><span class="p">)</span>
272        <span class="k">if</span> <span class="ow">not</span> <span class="n">processed</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">figure</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">]:</span>
273            <span class="n">ev</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="n">ev</span><span class="o">.</span><span class="n">prop</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">figure</span><span class="p">,</span> <span class="p">{}</span>
274            <span class="n">processed</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">][</span><span class="bp">self</span><span class="o">.</span><span class="n">figure</span><span class="p">](</span><span class="n">ev</span><span class="p">)</span>
275        <span class="k">if</span> <span class="ow">not</span> <span class="n">processed</span> <span class="ow">and</span> <span class="s">&#39;all&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">]:</span>
276            <span class="n">ev</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="n">ev</span><span class="o">.</span><span class="n">prop</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="p">{}</span>
277            <span class="n">processed</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">[</span><span class="n">action</span><span class="p">][</span><span class="s">&#39;all&#39;</span><span class="p">](</span><span class="n">ev</span><span class="p">)</span>
278        <span class="k">return</span> <span class="n">processed</span>
279</div>
280    <span class="k">def</span> <span class="nf">_find_current</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
281        <span class="sd">&quot;&quot;&quot;</span>
282<span class="sd">        Find the artist who will receive the event.  Only search</span>
283<span class="sd">        registered artists.  All others are invisible to the mouse.</span>
284<span class="sd">        &quot;&quot;&quot;</span>
285        <span class="c"># TODO: sort by zorder of axes then by zorder within axes</span>
286        <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="nb">cmp</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="nb">cmp</span><span class="p">(</span><span class="n">y</span><span class="o">.</span><span class="n">zorder</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">zorder</span><span class="p">))</span>
287        <span class="n">found</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
288        <span class="k">for</span> <span class="n">artist</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_artists</span><span class="p">:</span>
289            <span class="c"># TODO: should contains() return false if invisible?</span>
290            <span class="k">if</span> <span class="ow">not</span> <span class="n">artist</span><span class="o">.</span><span class="n">get_visible</span><span class="p">():</span>
291                <span class="k">continue</span>
292            <span class="c"># TODO: optimization - exclude artists not inaxes</span>
293            <span class="k">try</span><span class="p">:</span>
294                <span class="n">inside</span><span class="p">,</span> <span class="n">prop</span> <span class="o">=</span> <span class="n">artist</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
295            <span class="k">except</span><span class="p">:</span>
296                <span class="c"># Probably an old version of matplotlib</span>
297                <span class="n">inside</span> <span class="o">=</span> <span class="bp">False</span>
298            <span class="k">if</span> <span class="n">inside</span><span class="p">:</span>
299                <span class="n">found</span><span class="o">.</span><span class="n">artist</span><span class="p">,</span> <span class="n">found</span><span class="o">.</span><span class="n">prop</span> <span class="o">=</span> <span class="n">artist</span><span class="p">,</span> <span class="n">prop</span>
300                <span class="k">break</span>
301       
302        <span class="c"># TODO: how to check if prop is equal?</span>
303        <span class="k">if</span> <span class="n">found</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current</span><span class="p">:</span>
304            <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_current</span><span class="p">,</span> <span class="s">&#39;leave&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
305            <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="n">found</span><span class="p">,</span> <span class="s">&#39;enter&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
306        <span class="bp">self</span><span class="o">.</span><span class="n">_current</span> <span class="o">=</span> <span class="n">found</span>
307
308        <span class="k">return</span> <span class="n">found</span>
309       
310    <span class="k">def</span> <span class="nf">_onMotion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
311        <span class="sd">&quot;&quot;&quot;</span>
312<span class="sd">        Track enter/leave/motion through registered artists; all</span>
313<span class="sd">        other artists are invisible.</span>
314<span class="sd">        &quot;&quot;&quot;</span>
315        <span class="c">## Can&#39;t kill double-click on motion since Windows produces</span>
316        <span class="c">## spurious motion events.</span>
317        <span class="c">#self._last_button = None</span>
318       
319        <span class="c"># Dibs on the motion event for the clicked artist</span>
320        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="p">:</span>
321            <span class="c"># Make sure the x,y data use the coordinate system of the</span>
322            <span class="c"># artist rather than the default axes coordinates.</span>
323           
324            <span class="n">transform</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="o">.</span><span class="n">artist</span><span class="o">.</span><span class="n">get_transform</span><span class="p">()</span>
325            <span class="c">#x,y = event.xdata,event.ydata</span>
326            <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">y</span>
327            <span class="k">try</span><span class="p">:</span>
328                <span class="k">if</span> <span class="n">transform</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;IdentityTransform&quot;</span><span class="p">:</span>
329                    <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">transform</span><span class="o">.</span><span class="n">inverted</span><span class="p">()</span><span class="o">.</span><span class="n">transform</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
330                <span class="k">else</span><span class="p">:</span>
331                    <span class="c">## For interactive plottable apply transform is not working</span>
332                    <span class="c">## don&#39;t know why maybe marker definition</span>
333                    <span class="c">##transform =&quot;CompositeGenericTransform&quot; crash</span>
334                    <span class="k">pass</span>
335            <span class="k">except</span><span class="p">:</span>
336                <span class="c">## CRUFT matplotlib-0.91 support</span>
337                <span class="c">## exception for transform =&quot;CompositeGenericTransform&quot;</span>
338                <span class="c">## crashes also here</span>
339                <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">transform</span><span class="o">.</span><span class="n">inverse_xy_tup</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
340
341            <span class="c">#event.xdata, event.ydata = x, y</span>
342            <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="p">,</span> <span class="s">&#39;drag&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
343        <span class="k">else</span><span class="p">:</span>
344            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_current</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
345            <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="n">found</span><span class="p">,</span> <span class="s">&#39;motion&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
346
347    <span class="k">def</span> <span class="nf">_onClick</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
348        <span class="sd">&quot;&quot;&quot;</span>
349<span class="sd">        Process button click</span>
350<span class="sd">        &quot;&quot;&quot;</span>
351        <span class="kn">import</span> <span class="nn">time</span>
352       
353        <span class="c"># Check for double-click</span>
354        <span class="n">event_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
355        <span class="k">if</span> <span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">button</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_last_button</span><span class="p">)</span> <span class="ow">or</span> \
356                <span class="p">(</span><span class="n">event_time</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">_last_time</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">dclick_threshhold</span><span class="p">):</span>
357            <span class="n">action</span> <span class="o">=</span> <span class="s">&#39;click&#39;</span>
358        <span class="k">else</span><span class="p">:</span>
359            <span class="n">action</span> <span class="o">=</span> <span class="s">&#39;dclick&#39;</span>
360        <span class="bp">self</span><span class="o">.</span><span class="n">_last_button</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">button</span>
361        <span class="bp">self</span><span class="o">.</span><span class="n">_last_time</span> <span class="o">=</span> <span class="n">event_time</span>
362       
363        <span class="c"># If an artist is already dragging, feed any additional button</span>
364        <span class="c"># presses to that artist.</span>
365        <span class="c"># TODO: do we want to force a single button model on the user?</span>
366        <span class="c"># TODO: that is, once a button is pressed, no other buttons</span>
367        <span class="c"># TODO: can come through?  I think this belongs in canvas, not here.</span>
368        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="p">:</span>
369            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span>
370        <span class="k">else</span><span class="p">:</span>
371            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_current</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
372        <span class="c">#print &quot;button %d pressed&quot;%event.button</span>
373        <span class="c"># Note: it seems like if &quot;click&quot; returns False then hasclick should</span>
374        <span class="c"># not be set.  The problem is that there are two reasons it can</span>
375        <span class="c"># return false: because there is no click action for this artist</span>
376        <span class="c"># or because the click action returned false.  A related problem</span>
377        <span class="c"># is that click actions will go to the canvas if there is no click</span>
378        <span class="c"># action for the artist, even if the artist has a drag. I&#39;ll leave</span>
379        <span class="c"># it to future maintainers to sort out this problem.  For now the</span>
380        <span class="c"># recommendation is that users should define click if they have</span>
381        <span class="c"># drag or release on the artist.</span>
382        <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="n">found</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
383        <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span> <span class="o">=</span> <span class="n">found</span>
384
385    <span class="k">def</span> <span class="nf">_onDClick</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
386        <span class="sd">&quot;&quot;&quot;</span>
387<span class="sd">        Process button double click</span>
388<span class="sd">        &quot;&quot;&quot;</span>
389        <span class="c"># If an artist is already dragging, feed any additional button</span>
390        <span class="c"># presses to that artist.</span>
391        <span class="c"># TODO: do we want to force a single button model on the user?</span>
392        <span class="c"># TODO: that is, once a button is pressed, no other buttons</span>
393        <span class="c"># TODO: can come through?  I think this belongs in canvas, not here.</span>
394        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="p">:</span>
395            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span>
396        <span class="k">else</span><span class="p">:</span>
397            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_current</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
398        <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="n">found</span><span class="p">,</span> <span class="s">&#39;dclick&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
399        <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span> <span class="o">=</span> <span class="n">found</span>
400
401    <span class="k">def</span> <span class="nf">_onRelease</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
402        <span class="sd">&quot;&quot;&quot;</span>
403<span class="sd">        Process release release</span>
404<span class="sd">        &quot;&quot;&quot;</span>
405        <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span><span class="p">,</span> <span class="s">&#39;release&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
406        <span class="bp">self</span><span class="o">.</span><span class="n">_hasclick</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
407           
408    <span class="k">def</span> <span class="nf">_onKey</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
409        <span class="sd">&quot;&quot;&quot;</span>
410<span class="sd">        Process key click</span>
411<span class="sd">        &quot;&quot;&quot;</span>
412        <span class="c"># TODO: Do we really want keyboard focus separate from mouse focus?</span>
413        <span class="c"># TODO: Do we need an explicit focus command for keyboard?</span>
414        <span class="c"># TODO: Can we tab between items?</span>
415        <span class="c"># TODO: How do unhandled events get propogated to axes, figure and</span>
416        <span class="c"># TODO: finally to application?  Do we need to implement a full tags</span>
417        <span class="c"># TODO: architecture a la Tk?</span>
418        <span class="c"># TODO: Do modifiers cause a grab?  Does the artist see the modifiers?</span>
419        <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;alt&#39;</span><span class="p">,</span> <span class="s">&#39;meta&#39;</span><span class="p">,</span> <span class="s">&#39;control&#39;</span><span class="p">,</span> <span class="s">&#39;shift&#39;</span><span class="p">):</span>
420            <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
421            <span class="k">return</span>
422
423        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span><span class="p">:</span>
424            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span>
425        <span class="k">else</span><span class="p">:</span>
426            <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_current</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
427        <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="n">found</span><span class="p">,</span> <span class="s">&#39;key&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
428        <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span> <span class="o">=</span> <span class="n">found</span>
429   
430    <span class="k">def</span> <span class="nf">_onKeyRelease</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
431        <span class="sd">&quot;&quot;&quot;</span>
432<span class="sd">        Process key release</span>
433<span class="sd">        &quot;&quot;&quot;</span>
434        <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;alt&#39;</span><span class="p">,</span> <span class="s">&#39;meta&#39;</span><span class="p">,</span> <span class="s">&#39;control&#39;</span><span class="p">,</span> <span class="s">&#39;shift&#39;</span><span class="p">):</span>
435            <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
436            <span class="k">return</span>
437       
438        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span><span class="p">:</span>
439            <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span><span class="p">,</span> <span class="s">&#39;keyup&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
440        <span class="bp">self</span><span class="o">.</span><span class="n">_haskey</span> <span class="o">=</span> <span class="n">Selection</span><span class="p">()</span>
441
442    <span class="k">def</span> <span class="nf">_onScroll</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
443        <span class="sd">&quot;&quot;&quot;</span>
444<span class="sd">        Process scroll event</span>
445<span class="sd">        &quot;&quot;&quot;</span>
446        <span class="n">found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_current</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
447        <span class="bp">self</span><span class="o">.</span><span class="n">trigger</span><span class="p">(</span><span class="n">found</span><span class="p">,</span> <span class="s">&#39;scroll&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span></div>
448</pre></div>
449
450          </div>
451        </div>
452      </div>
453      <div class="sphinxsidebar">
454        <div class="sphinxsidebarwrapper">
455<div id="searchbox" style="display: none">
456  <h3>Quick search</h3>
457    <form class="search" action="../../../search.html" method="get">
458      <input type="text" name="q" />
459      <input type="submit" value="Go" />
460      <input type="hidden" name="check_keywords" value="yes" />
461      <input type="hidden" name="area" value="default" />
462    </form>
463    <p class="searchtip" style="font-size: 90%">
464    Enter search terms or a module, class or function name.
465    </p>
466</div>
467<script type="text/javascript">$('#searchbox').show(0);</script>
468        </div>
469      </div>
470      <div class="clearer"></div>
471    </div>
472    <div class="related">
473      <h3>Navigation</h3>
474      <ul>
475        <li class="right" style="margin-right: 10px">
476          <a href="../../../genindex.html" title="General Index"
477             >index</a></li>
478        <li class="right" >
479          <a href="../../../py-modindex.html" title="Python Module Index"
480             >modules</a> |</li>
481        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
482          <li><a href="../../index.html" >Module code</a> &raquo;</li> 
483      </ul>
484    </div>
485    <div class="footer">
486        &copy; Copyright 2013, The SasView Project.
487      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
488    </div>
489  </body>
490</html>
Note: See TracBrowser for help on using the repository browser.