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