Stop hg ignoring the build dir.

I want to include the HTML output of sphinx so you can view it without having to install sphinx.
This commit is contained in:
Simon Forman
2019-05-07 17:45:39 -07:00
parent 4f5caf4ab3
commit 21b69ea260
70 changed files with 20213 additions and 3 deletions
@@ -0,0 +1,380 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.core &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.core</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of Thun</span>
<span class="c1">#</span>
<span class="c1"># Thun is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># Thun is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with Thun. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Core</span>
<span class="sd">=====================</span>
<span class="sd">The core module defines a bunch of system-wide &quot;constants&quot; (some colors</span>
<span class="sd">and PyGame event groups), the message classes for Oberon-style message</span>
<span class="sd">passing, a &quot;world&quot; class that holds the main context for the system, and</span>
<span class="sd">a mainloop class that manages the, uh, main loop (the PyGame event queue.)</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="k">import</span> <span class="n">stderr</span>
<span class="kn">from</span> <span class="nn">traceback</span> <span class="k">import</span> <span class="n">format_exc</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">joy.joy</span> <span class="k">import</span> <span class="n">run</span>
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">stack_to_string</span>
<span class="n">COMMITTER</span> <span class="o">=</span> <span class="s1">&#39;Joy &lt;auto-commit@example.com&gt;&#39;</span>
<span class="n">BLACK</span> <span class="o">=</span> <span class="n">FOREGROUND</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
<span class="n">GREY</span> <span class="o">=</span> <span class="mi">127</span><span class="p">,</span> <span class="mi">127</span><span class="p">,</span> <span class="mi">127</span>
<span class="n">WHITE</span> <span class="o">=</span> <span class="n">BACKGROUND</span> <span class="o">=</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span>
<span class="n">BLUE</span> <span class="o">=</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">255</span>
<span class="n">GREEN</span> <span class="o">=</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">70</span>
<span class="n">MOUSE_EVENTS</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">MOUSEMOTION</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">MOUSEBUTTONDOWN</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">MOUSEBUTTONUP</span>
<span class="p">})</span>
<span class="s1">&#39;PyGame mouse events.&#39;</span>
<span class="n">ARROW_KEYS</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">({</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_UP</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_DOWN</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_LEFT</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_RIGHT</span>
<span class="p">})</span>
<span class="s1">&#39;PyGame arrow key events.&#39;</span>
<span class="n">TASK_EVENTS</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">USEREVENT</span><span class="p">,</span> <span class="n">pygame</span><span class="o">.</span><span class="n">NUMEVENTS</span><span class="p">))</span>
<span class="s1">&#39;Keep track of all possible task events.&#39;</span>
<span class="n">AVAILABLE_TASK_EVENTS</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">TASK_EVENTS</span><span class="p">)</span>
<span class="s1">&#39;Task IDs that have not been assigned to a task.&#39;</span>
<span class="n">ALLOWED_EVENTS</span> <span class="o">=</span> <span class="p">[</span><span class="n">pygame</span><span class="o">.</span><span class="n">QUIT</span><span class="p">,</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYUP</span><span class="p">,</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYDOWN</span><span class="p">]</span>
<span class="n">ALLOWED_EVENTS</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">MOUSE_EVENTS</span><span class="p">)</span>
<span class="n">ALLOWED_EVENTS</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">TASK_EVENTS</span><span class="p">)</span>
<span class="s1">&#39;Event &quot;mask&quot; for PyGame event queue, we are only interested in these event types.&#39;</span>
<span class="n">ERROR</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">PENDING</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">SUCCESS</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c1"># &#39;Message status codes... dunno if this is a good idea or not...</span>
<div class="viewcode-block" id="Message"><a class="viewcode-back" href="../../../core.html#joy.vui.core.Message">[docs]</a><span class="k">class</span> <span class="nc">Message</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Message base class. Contains ``sender`` field.&#39;&#39;&#39;</span>
<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">sender</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="n">sender</span></div>
<div class="viewcode-block" id="CommandMessage"><a class="viewcode-back" href="../../../core.html#joy.vui.core.CommandMessage">[docs]</a><span class="k">class</span> <span class="nc">CommandMessage</span><span class="p">(</span><span class="n">Message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;For commands, adds ``command`` field.&#39;&#39;&#39;</span>
<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">sender</span><span class="p">,</span> <span class="n">command</span><span class="p">):</span>
<span class="n">Message</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">command</span></div>
<div class="viewcode-block" id="ModifyMessage"><a class="viewcode-back" href="../../../core.html#joy.vui.core.ModifyMessage">[docs]</a><span class="k">class</span> <span class="nc">ModifyMessage</span><span class="p">(</span><span class="n">Message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> For when resources are modified, adds ``subject`` and ``details``</span>
<span class="sd"> fields.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">sender</span><span class="p">,</span> <span class="n">subject</span><span class="p">,</span> <span class="o">**</span><span class="n">details</span><span class="p">):</span>
<span class="n">Message</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">subject</span> <span class="o">=</span> <span class="n">subject</span>
<span class="bp">self</span><span class="o">.</span><span class="n">details</span> <span class="o">=</span> <span class="n">details</span></div>
<div class="viewcode-block" id="OpenMessage"><a class="viewcode-back" href="../../../core.html#joy.vui.core.OpenMessage">[docs]</a><span class="k">class</span> <span class="nc">OpenMessage</span><span class="p">(</span><span class="n">Message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> For when resources are modified, adds ``name``, content_id``,</span>
<span class="sd"> ``status``, and ``traceback`` fields.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">sender</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="n">Message</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">content_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">thing</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">PENDING</span>
<span class="bp">self</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="PersistMessage"><a class="viewcode-back" href="../../../core.html#joy.vui.core.PersistMessage">[docs]</a><span class="k">class</span> <span class="nc">PersistMessage</span><span class="p">(</span><span class="n">Message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> For when resources are modified, adds ``content_id`` and ``details``</span>
<span class="sd"> fields.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">sender</span><span class="p">,</span> <span class="n">content_id</span><span class="p">,</span> <span class="o">**</span><span class="n">details</span><span class="p">):</span>
<span class="n">Message</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">content_id</span> <span class="o">=</span> <span class="n">content_id</span>
<span class="bp">self</span><span class="o">.</span><span class="n">details</span> <span class="o">=</span> <span class="n">details</span></div>
<div class="viewcode-block" id="ShutdownMessage"><a class="viewcode-back" href="../../../core.html#joy.vui.core.ShutdownMessage">[docs]</a><span class="k">class</span> <span class="nc">ShutdownMessage</span><span class="p">(</span><span class="n">Message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Signals that the system is shutting down.&#39;&#39;&#39;</span></div>
<span class="c1"># Joy Interpreter &amp; Context</span>
<div class="viewcode-block" id="World"><a class="viewcode-back" href="../../../core.html#joy.vui.core.World">[docs]</a><span class="k">class</span> <span class="nc">World</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> This object contains the system context, the stack, dictionary, a</span>
<span class="sd"> reference to the display broadcast method, and the log.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">stack_id</span><span class="p">,</span> <span class="n">stack_holder</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">,</span> <span class="n">notify</span><span class="p">,</span> <span class="n">log</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span> <span class="o">=</span> <span class="n">stack_holder</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dictionary</span> <span class="o">=</span> <span class="n">dictionary</span>
<span class="bp">self</span><span class="o">.</span><span class="n">notify</span> <span class="o">=</span> <span class="n">notify</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stack_id</span> <span class="o">=</span> <span class="n">stack_id</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">lines</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log_id</span> <span class="o">=</span> <span class="n">log</span><span class="o">.</span><span class="n">content_id</span>
<div class="viewcode-block" id="World.handle"><a class="viewcode-back" href="../../../core.html#joy.vui.core.World.handle">[docs]</a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Deal with updates to the stack and commands.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ModifyMessage</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">subject</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_log_lines</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> &lt;-&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_stack</span><span class="p">())</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">CommandMessage</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">dictionary</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_log_lines</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;-&gt; </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">c</span><span class="p">,))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">_</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dictionary</span> <span class="o">=</span> <span class="n">run</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
<span class="n">mm</span> <span class="o">=</span> <span class="n">ModifyMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">,</span> <span class="n">content_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">stack_id</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">notify</span><span class="p">(</span><span class="n">mm</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_log_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">lines</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">notify</span><span class="p">(</span><span class="n">ModifyMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">,</span> <span class="n">content_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">log_id</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">format_stack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">stack_to_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span> <span class="o">&gt;&gt;</span> <span class="n">stderr</span><span class="p">,</span> <span class="n">format_exc</span><span class="p">()</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span></div>
<div class="viewcode-block" id="push"><a class="viewcode-back" href="../../../core.html#joy.vui.core.push">[docs]</a><span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">notify</span><span class="p">,</span> <span class="n">stack_name</span><span class="o">=</span><span class="s1">&#39;stack.pickle&#39;</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Helper function to push an item onto the system stack with message.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">om</span> <span class="o">=</span> <span class="n">OpenMessage</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">stack_name</span><span class="p">)</span>
<span class="n">notify</span><span class="p">(</span><span class="n">om</span><span class="p">)</span>
<span class="k">if</span> <span class="n">om</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">SUCCESS</span><span class="p">:</span>
<span class="n">om</span><span class="o">.</span><span class="n">thing</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">item</span><span class="p">,</span> <span class="n">om</span><span class="o">.</span><span class="n">thing</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">notify</span><span class="p">(</span><span class="n">ModifyMessage</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">om</span><span class="o">.</span><span class="n">thing</span><span class="p">,</span> <span class="n">content_id</span><span class="o">=</span><span class="n">om</span><span class="o">.</span><span class="n">content_id</span><span class="p">))</span>
<span class="k">return</span> <span class="n">om</span><span class="o">.</span><span class="n">status</span></div>
<div class="viewcode-block" id="open_viewer_on_string"><a class="viewcode-back" href="../../../core.html#joy.vui.core.open_viewer_on_string">[docs]</a><span class="k">def</span> <span class="nf">open_viewer_on_string</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">notify</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Helper function to open a text viewer on a string.</span>
<span class="sd"> Typically used to show tracebacks.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">push</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">notify</span><span class="p">)</span>
<span class="n">notify</span><span class="p">(</span><span class="n">CommandMessage</span><span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="s1">&#39;good_viewer_location open_viewer&#39;</span><span class="p">))</span></div>
<span class="c1"># main loop</span>
<div class="viewcode-block" id="TheLoop"><a class="viewcode-back" href="../../../core.html#joy.vui.core.TheLoop">[docs]</a><span class="k">class</span> <span class="nc">TheLoop</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> The main loop manages tasks and the PyGame event queue</span>
<span class="sd"> and framerate clock.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">FRAME_RATE</span> <span class="o">=</span> <span class="mi">24</span>
<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">display</span><span class="p">,</span> <span class="n">clock</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span> <span class="o">=</span> <span class="n">display</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clock</span> <span class="o">=</span> <span class="n">clock</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tasks</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">running</span> <span class="o">=</span> <span class="kc">False</span>
<div class="viewcode-block" id="TheLoop.install_task"><a class="viewcode-back" href="../../../core.html#joy.vui.core.TheLoop.install_task">[docs]</a> <span class="k">def</span> <span class="nf">install_task</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">F</span><span class="p">,</span> <span class="n">milliseconds</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Install a task to run every so many milliseconds.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">task_event_id</span> <span class="o">=</span> <span class="n">AVAILABLE_TASK_EVENTS</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;out of task ids&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tasks</span><span class="p">[</span><span class="n">task_event_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">F</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">set_timer</span><span class="p">(</span><span class="n">task_event_id</span><span class="p">,</span> <span class="n">milliseconds</span><span class="p">)</span>
<span class="k">return</span> <span class="n">task_event_id</span></div>
<div class="viewcode-block" id="TheLoop.remove_task"><a class="viewcode-back" href="../../../core.html#joy.vui.core.TheLoop.remove_task">[docs]</a> <span class="k">def</span> <span class="nf">remove_task</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">task_event_id</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Remove an installed task.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">assert</span> <span class="n">task_event_id</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tasks</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">task_event_id</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">set_timer</span><span class="p">(</span><span class="n">task_event_id</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">tasks</span><span class="p">[</span><span class="n">task_event_id</span><span class="p">]</span>
<span class="n">AVAILABLE_TASK_EVENTS</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">task_event_id</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Best effort to cancel all running tasks.</span>
<span class="k">for</span> <span class="n">task_event_id</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tasks</span><span class="p">:</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">set_timer</span><span class="p">(</span><span class="n">task_event_id</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<div class="viewcode-block" id="TheLoop.run_task"><a class="viewcode-back" href="../../../core.html#joy.vui.core.TheLoop.run_task">[docs]</a> <span class="k">def</span> <span class="nf">run_task</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">task_event_id</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Give a task its time to shine.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">task</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tasks</span><span class="p">[</span><span class="n">task_event_id</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">task</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">traceback</span> <span class="o">=</span> <span class="n">format_exc</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remove_task</span><span class="p">(</span><span class="n">task_event_id</span><span class="p">)</span>
<span class="nb">print</span> <span class="o">&gt;&gt;</span> <span class="n">stderr</span><span class="p">,</span> <span class="n">traceback</span>
<span class="nb">print</span> <span class="o">&gt;&gt;</span> <span class="n">stderr</span><span class="p">,</span> <span class="s1">&#39;TASK removed due to ERROR&#39;</span><span class="p">,</span> <span class="n">task</span>
<span class="n">open_viewer_on_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">traceback</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">)</span></div>
<div class="viewcode-block" id="TheLoop.loop"><a class="viewcode-back" href="../../../core.html#joy.vui.core.TheLoop.loop">[docs]</a> <span class="k">def</span> <span class="nf">loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> The actual main loop machinery.</span>
<span class="sd"> Maintain a ``running`` flag, pump the PyGame event queue and</span>
<span class="sd"> handle the events (dispatching to the display), tick the clock.</span>
<span class="sd"> When the loop is exited (by clicking the window close button or</span>
<span class="sd"> pressing the ``escape`` key) it broadcasts a ``ShutdownMessage``.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">running</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">running</span><span class="p">:</span>
<span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">QUIT</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">running</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYUP</span> <span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_ESCAPE</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">running</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tasks</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">run_task</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">dispatch_event</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clock</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">FRAME_RATE</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">ShutdownMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span></div></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>
@@ -0,0 +1,604 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.display &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.display</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of Thun</span>
<span class="c1">#</span>
<span class="c1"># Thun is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># Thun is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with Thun. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Display</span>
<span class="sd">=================</span>
<span class="sd">This module implements a simple visual display system modeled on Oberon.</span>
<span class="sd">Refer to Chapter 4 of the Project Oberon book for more information.</span>
<span class="sd">There is a Display object that manages a pygame surface and N vertical</span>
<span class="sd">tracks each of which manages zero or more viewers.</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">copy</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="k">import</span> <span class="n">stderr</span>
<span class="kn">from</span> <span class="nn">traceback</span> <span class="k">import</span> <span class="n">format_exc</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">.core</span> <span class="k">import</span> <span class="p">(</span>
<span class="n">open_viewer_on_string</span><span class="p">,</span>
<span class="n">GREY</span><span class="p">,</span>
<span class="n">MOUSE_EVENTS</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">.viewer</span> <span class="k">import</span> <span class="n">Viewer</span>
<span class="kn">from</span> <span class="nn">joy.vui</span> <span class="k">import</span> <span class="n">text_viewer</span>
<div class="viewcode-block" id="Display"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display">[docs]</a><span class="k">class</span> <span class="nc">Display</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Manage tracks and viewers on a screen (Pygame surface.)</span>
<span class="sd"> The size and number of tracks are defined by passing in at least two</span>
<span class="sd"> ratios, e.g. Display(screen, 1, 4, 4) would create three tracks, one</span>
<span class="sd"> small one on the left and two larger ones of the same size, each four</span>
<span class="sd"> times wider than the left one.</span>
<span class="sd"> All tracks take up the whole height of the display screen. Tracks</span>
<span class="sd"> manage zero or more Viewers. When you &quot;grow&quot; a viewer a new track is</span>
<span class="sd"> created that overlays or hides one or two existing tracks, and when</span>
<span class="sd"> the last viewer in an overlay track is closed the track closes too</span>
<span class="sd"> and reveals the hidden tracks (and their viewers, if any.)</span>
<span class="sd"> In order to facilitate command underlining while mouse dragging the</span>
<span class="sd"> lookup parameter must be a function that accepts a string and returns</span>
<span class="sd"> a Boolean indicating whether that string is a valid Joy function name.</span>
<span class="sd"> Typically you pass in the __contains__ method of the Joy dict. This</span>
<span class="sd"> is a case of breaking &quot;loose coupling&quot; to gain efficiency, as otherwise</span>
<span class="sd"> we would have to e.g. send some sort of lookup message to the</span>
<span class="sd"> World context object, going through the whole Display.broadcast()</span>
<span class="sd"> machinery, etc. Not something you want to do on each MOUSEMOTION</span>
<span class="sd"> event.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">screen</span><span class="p">,</span> <span class="n">lookup</span><span class="p">,</span> <span class="o">*</span><span class="n">track_ratios</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">screen</span> <span class="o">=</span> <span class="n">screen</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">screen</span><span class="o">.</span><span class="n">get_width</span><span class="p">(),</span> <span class="n">screen</span><span class="o">.</span><span class="n">get_height</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lookup</span> <span class="o">=</span> <span class="n">lookup</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracks</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># (x, track)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handlers</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># Non-viewers that should receive messages.</span>
<span class="c1"># Create the tracks.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">track_ratios</span><span class="p">:</span> <span class="n">track_ratios</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span>
<span class="n">x</span><span class="p">,</span> <span class="n">total</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">sum</span><span class="p">(</span><span class="n">track_ratios</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ratio</span> <span class="ow">in</span> <span class="n">track_ratios</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
<span class="n">track_width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">*</span> <span class="n">ratio</span> <span class="o">/</span> <span class="n">total</span>
<span class="k">assert</span> <span class="n">track_width</span> <span class="o">&gt;=</span> <span class="mi">10</span> <span class="c1"># minimum width 10 pixels</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_open_track</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">track_width</span><span class="p">)</span>
<span class="n">x</span> <span class="o">+=</span> <span class="n">track_width</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_open_track</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="n">x</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_open_track</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">w</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Helper function to create the pygame surface and Track.&#39;&#39;&#39;</span>
<span class="n">track_surface</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">screen</span><span class="o">.</span><span class="n">subsurface</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">Track</span><span class="p">(</span><span class="n">track_surface</span><span class="p">)))</span>
<div class="viewcode-block" id="Display.open_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.open_viewer">[docs]</a> <span class="k">def</span> <span class="nf">open_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">class_</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Open a viewer of class_ at the x, y location on the display,</span>
<span class="sd"> return the viewer.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">track</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_track_at</span><span class="p">(</span><span class="n">x</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">V</span> <span class="o">=</span> <span class="n">track</span><span class="o">.</span><span class="n">open_viewer</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">class_</span><span class="p">)</span>
<span class="n">V</span><span class="o">.</span><span class="n">focus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="n">V</span></div>
<div class="viewcode-block" id="Display.close_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.close_viewer">[docs]</a> <span class="k">def</span> <span class="nf">close_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Close the viewer.&#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="k">if</span> <span class="n">track</span><span class="o">.</span><span class="n">close_viewer</span><span class="p">(</span><span class="n">viewer</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">track</span><span class="o">.</span><span class="n">viewers</span> <span class="ow">and</span> <span class="n">track</span><span class="o">.</span><span class="n">hiding</span><span class="p">:</span>
<span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="o">.</span><span class="n">index</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">track</span><span class="o">.</span><span class="n">hiding</span>
<span class="k">assert</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">exposed_track</span> <span class="ow">in</span> <span class="n">track</span><span class="o">.</span><span class="n">hiding</span><span class="p">:</span>
<span class="n">exposed_track</span><span class="o">.</span><span class="n">redraw</span><span class="p">()</span>
<span class="k">if</span> <span class="n">viewer</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">break</span></div>
<div class="viewcode-block" id="Display.change_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.change_viewer">[docs]</a> <span class="k">def</span> <span class="nf">change_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">relative</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Adjust the top of the viewer to a new y within the boundaries of</span>
<span class="sd"> its neighbors.</span>
<span class="sd"> If relative is False new_y should be in screen coords, else new_y</span>
<span class="sd"> should be relative to the top of the viewer.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="k">if</span> <span class="n">track</span><span class="o">.</span><span class="n">change_viewer</span><span class="p">(</span><span class="n">viewer</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">relative</span><span class="p">):</span>
<span class="k">break</span></div>
<div class="viewcode-block" id="Display.grow_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.grow_viewer">[docs]</a> <span class="k">def</span> <span class="nf">grow_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Cause the viewer to take up its whole track or, if it does</span>
<span class="sd"> already, take up another track, up to the whole screen.</span>
<span class="sd"> This is the inverse of closing a viewer. &quot;Growing&quot; a viewer</span>
<span class="sd"> actually creates a new copy and a new track to hold it. The old</span>
<span class="sd"> tracks and viewers are retained, and they get restored when the</span>
<span class="sd"> covering track closes, which happens automatically when the last</span>
<span class="sd"> viewer in the covering track is closed.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">V</span> <span class="ow">in</span> <span class="n">track</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="k">if</span> <span class="n">V</span> <span class="ow">is</span> <span class="n">viewer</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_grow_viewer</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">,</span> <span class="n">viewer</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_grow_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Helper function to &quot;grow&quot; a viewer.&#39;&#39;&#39;</span>
<span class="n">new_viewer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">viewer</span><span class="o">.</span><span class="n">h</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">:</span>
<span class="c1"># replace the track with a new track that contains</span>
<span class="c1"># a copy of the viewer at full height.</span>
<span class="n">new_track</span> <span class="o">=</span> <span class="n">Track</span><span class="p">(</span><span class="n">track</span><span class="o">.</span><span class="n">surface</span><span class="p">)</span> <span class="c1"># Reuse it, why not?</span>
<span class="n">new_viewer</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="n">viewer</span><span class="p">)</span>
<span class="n">new_track</span><span class="o">.</span><span class="n">_grow_by</span><span class="p">(</span><span class="n">new_viewer</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">-</span> <span class="n">viewer</span><span class="o">.</span><span class="n">h</span><span class="p">)</span>
<span class="n">new_track</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">new_viewer</span><span class="p">))</span>
<span class="n">new_track</span><span class="o">.</span><span class="n">hiding</span> <span class="o">=</span> <span class="p">[(</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">)]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="o">.</span><span class="n">index</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">))]</span> <span class="o">=</span> <span class="n">x</span><span class="p">,</span> <span class="n">new_track</span>
<span class="k">elif</span> <span class="n">viewer</span><span class="o">.</span><span class="n">w</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">:</span>
<span class="c1"># replace two tracks</span>
<span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="o">.</span><span class="n">index</span><span class="p">((</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span> <span class="c1"># prefer the one on the right</span>
<span class="n">xx</span><span class="p">,</span> <span class="n">xtrack</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">i</span> <span class="o">-=</span> <span class="mi">1</span> <span class="c1"># okay, the one on the left</span>
<span class="n">xx</span><span class="p">,</span> <span class="n">xtrack</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">hiding</span> <span class="o">=</span> <span class="p">[(</span><span class="n">xx</span><span class="p">,</span> <span class="n">xtrack</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">)]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">hiding</span> <span class="o">=</span> <span class="p">[(</span><span class="n">x</span><span class="p">,</span> <span class="n">track</span><span class="p">),</span> <span class="p">(</span><span class="n">xx</span><span class="p">,</span> <span class="n">xtrack</span><span class="p">)]</span>
<span class="c1"># We know there has to be at least one other track because it</span>
<span class="c1"># there weren&#39;t then that implies that the one track takes up</span>
<span class="c1"># the whole display screen (the only way you can get just one</span>
<span class="c1"># track is by growing a viewer to cover the whole screen.)</span>
<span class="c1"># Ergo, viewer.w == self.w, so this branch doesn&#39;t run.</span>
<span class="n">new_x</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">xx</span><span class="p">)</span>
<span class="n">new_w</span> <span class="o">=</span> <span class="n">track</span><span class="o">.</span><span class="n">w</span> <span class="o">+</span> <span class="n">xtrack</span><span class="o">.</span><span class="n">w</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">new_x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">new_w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span>
<span class="n">new_track</span> <span class="o">=</span> <span class="n">Track</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">screen</span><span class="o">.</span><span class="n">subsurface</span><span class="p">(</span><span class="n">r</span><span class="p">))</span>
<span class="n">new_viewer</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="n">viewer</span><span class="p">)</span>
<span class="n">r</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">new_w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span>
<span class="n">new_viewer</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="n">new_track</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">(</span><span class="n">r</span><span class="p">))</span>
<span class="n">new_track</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">new_viewer</span><span class="p">))</span>
<span class="n">new_track</span><span class="o">.</span><span class="n">hiding</span> <span class="o">=</span> <span class="n">hiding</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">[(</span><span class="n">new_x</span><span class="p">,</span> <span class="n">new_track</span><span class="p">)]</span>
<span class="n">new_viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">return</span> <span class="n">new_viewer</span>
<span class="k">def</span> <span class="nf">_move_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">to</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">_x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Helper function to move (really copy) a viewer to a new location.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">to</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">rel_y</span><span class="p">)</span>
<span class="n">new_viewer</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="n">viewer</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">Track</span><span class="p">):</span>
<span class="n">to</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">T</span> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">T</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">V</span> <span class="ow">in</span> <span class="n">T</span><span class="o">.</span><span class="n">viewers</span>
<span class="k">if</span> <span class="n">V</span> <span class="ow">is</span> <span class="n">to</span><span class="p">)</span>
<span class="n">new_viewer</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="n">to</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">to</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)))</span>
<span class="n">to</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">y</span><span class="p">,</span> <span class="n">new_viewer</span><span class="p">))</span>
<span class="n">to</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="c1"># bisect.insort() would be overkill here.</span>
<span class="n">new_viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">close_viewer</span><span class="p">(</span><span class="n">viewer</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_track_at</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Return the track at x along with the track-relative x coordinate,</span>
<span class="sd"> raise ValueError if x is off-screen.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">track_x</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">track_x</span> <span class="o">+</span> <span class="n">track</span><span class="o">.</span><span class="n">w</span><span class="p">:</span>
<span class="k">return</span> <span class="n">track</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="n">track_x</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x outside display: </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">x</span><span class="p">,))</span>
<div class="viewcode-block" id="Display.at"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.at">[docs]</a> <span class="k">def</span> <span class="nf">at</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Return the viewer (which can be a Track) at the x, y location,</span>
<span class="sd"> along with the relative-to-viewer-surface x and y coordinates.</span>
<span class="sd"> If there is no viewer at the location the Track will be returned</span>
<span class="sd"> instead.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">track</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_track_at</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">viewer</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">track</span><span class="o">.</span><span class="n">viewer_at</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
<span class="k">return</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span></div>
<div class="viewcode-block" id="Display.iter_viewers"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.iter_viewers">[docs]</a> <span class="k">def</span> <span class="nf">iter_viewers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Iterate through all viewers yielding (viewer, x, y) three-tuples.</span>
<span class="sd"> The x and y coordinates are screen pixels of the top-left corner</span>
<span class="sd"> of the viewer.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">T</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="k">for</span> <span class="n">y</span><span class="p">,</span> <span class="n">V</span> <span class="ow">in</span> <span class="n">T</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">V</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span></div>
<div class="viewcode-block" id="Display.done_resizing"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.done_resizing">[docs]</a> <span class="k">def</span> <span class="nf">done_resizing</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Helper method called directly by ``MenuViewer.mouse_up()`` to (hackily)</span>
<span class="sd"> update the display when done resizing a viewer.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span> <span class="c1"># This should be done by a Message?</span>
<span class="k">if</span> <span class="n">track</span><span class="o">.</span><span class="n">resizing_viewer</span><span class="p">:</span>
<span class="n">track</span><span class="o">.</span><span class="n">resizing_viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="n">track</span><span class="o">.</span><span class="n">resizing_viewer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">break</span></div>
<div class="viewcode-block" id="Display.broadcast"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.broadcast">[docs]</a> <span class="k">def</span> <span class="nf">broadcast</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Broadcast a message to all viewers (except the sender) and all</span>
<span class="sd"> registered handlers.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="n">track</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">for</span> <span class="n">handler</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">handlers</span><span class="p">:</span>
<span class="n">handler</span><span class="p">(</span><span class="n">message</span><span class="p">)</span></div>
<div class="viewcode-block" id="Display.redraw"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.redraw">[docs]</a> <span class="k">def</span> <span class="nf">redraw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Redraw all tracks (which will redraw all viewers.)</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">track</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tracks</span><span class="p">:</span>
<span class="n">track</span><span class="o">.</span><span class="n">redraw</span><span class="p">()</span></div>
<div class="viewcode-block" id="Display.focus"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.focus">[docs]</a> <span class="k">def</span> <span class="nf">focus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Set system focus to a given viewer (or no viewer if a track.)</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">viewer</span><span class="p">,</span> <span class="n">Track</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="o">.</span><span class="n">unfocus</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="n">viewer</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="o">.</span><span class="n">unfocus</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span> <span class="o">=</span> <span class="n">viewer</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">focus</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="Display.dispatch_event"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.dispatch_event">[docs]</a> <span class="k">def</span> <span class="nf">dispatch_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Display event handling.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="ow">in</span> <span class="p">{</span><span class="n">pygame</span><span class="o">.</span><span class="n">KEYUP</span><span class="p">,</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYDOWN</span><span class="p">}:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_keyboard_event</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="ow">in</span> <span class="n">MOUSE_EVENTS</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mouse_event</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span> <span class="o">&gt;&gt;</span> <span class="n">stderr</span><span class="p">,</span> <span class="p">(</span>
<span class="s1">&#39;received event </span><span class="si">%s</span><span class="s1"> Use pygame.event.set_allowed().&#39;</span>
<span class="o">%</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">event_name</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># Catch all exceptions and open a viewer.</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">format_exc</span><span class="p">()</span>
<span class="nb">print</span> <span class="o">&gt;&gt;</span> <span class="n">stderr</span><span class="p">,</span> <span class="n">err</span> <span class="c1"># To be safe just print it right away.</span>
<span class="n">open_viewer_on_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">broadcast</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_keyboard_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_PAUSE</span> <span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYUP</span><span class="p">:</span>
<span class="c1"># At least on my keyboard the break/pause key sends K_PAUSE.</span>
<span class="c1"># The main use of this is to open a TextViewer if you</span>
<span class="c1"># accidentally close all the viewers, so you can recover.</span>
<span class="k">raise</span> <span class="ne">KeyboardInterrupt</span><span class="p">(</span><span class="s1">&#39;break&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYUP</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="o">.</span><span class="n">key_up</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="n">event</span><span class="o">.</span><span class="n">mod</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KEYDOWN</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="o">.</span><span class="n">key_down</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">unicode</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="n">event</span><span class="o">.</span><span class="n">mod</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_mouse_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">V</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="o">*</span><span class="n">event</span><span class="o">.</span><span class="n">pos</span><span class="p">)</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">MOUSEMOTION</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">V</span><span class="p">,</span> <span class="n">Track</span><span class="p">):</span>
<span class="n">V</span><span class="o">.</span><span class="n">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">rel</span> <span class="o">+</span> <span class="n">event</span><span class="o">.</span><span class="n">buttons</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">MOUSEBUTTONDOWN</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">button</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">focus</span><span class="p">(</span><span class="n">V</span><span class="p">)</span>
<span class="n">V</span><span class="o">.</span><span class="n">mouse_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">button</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">MOUSEBUTTONUP</span>
<span class="c1"># Check for moving viewer.</span>
<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="mi">2</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span>
<span class="ow">and</span> <span class="n">V</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span>
<span class="ow">and</span> <span class="n">V</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span> <span class="o">&lt;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">V</span><span class="o">.</span><span class="n">h</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_move_viewer</span><span class="p">(</span><span class="n">V</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">focused_viewer</span><span class="p">,</span> <span class="o">*</span><span class="n">event</span><span class="o">.</span><span class="n">pos</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">V</span><span class="o">.</span><span class="n">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">button</span><span class="p">)</span>
<div class="viewcode-block" id="Display.init_text"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Display.init_text">[docs]</a> <span class="k">def</span> <span class="nf">init_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pt</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Open and return a ``TextViewer`` on a given file (which must be present</span>
<span class="sd"> in the ``JOYHOME`` directory.)</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">viewer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_viewer</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">text_viewer</span><span class="o">.</span><span class="n">TextViewer</span><span class="p">)</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">content_id</span><span class="p">,</span> <span class="n">viewer</span><span class="o">.</span><span class="n">lines</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">return</span> <span class="n">viewer</span></div></div>
<div class="viewcode-block" id="Track"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track">[docs]</a><span class="k">class</span> <span class="nc">Track</span><span class="p">(</span><span class="n">Viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Manage a vertical strip of the display, and the viewers on it.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">surface</span><span class="p">):</span>
<span class="n">Viewer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">viewers</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># (y, viewer)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hiding</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing_viewer</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<div class="viewcode-block" id="Track.split"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.split">[docs]</a> <span class="k">def</span> <span class="nf">split</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Split the Track at the y coordinate and return the height</span>
<span class="sd"> available for a new viewer. Tracks manage a vertical strip of</span>
<span class="sd"> the display screen so they don&#39;t resize their surface when split.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span>
<span class="k">assert</span> <span class="n">h</span> <span class="o">&gt;</span> <span class="n">y</span>
<span class="k">return</span> <span class="n">h</span> <span class="o">-</span> <span class="n">y</span></div>
<div class="viewcode-block" id="Track.draw"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.draw">[docs]</a> <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rect</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Draw the track onto its surface, clearing all content.</span>
<span class="sd"> If rect is passed only draw to that area. This supports e.g.</span>
<span class="sd"> closing a viewer that then exposes part of the track.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">GREY</span><span class="p">,</span> <span class="n">rect</span><span class="o">=</span><span class="n">rect</span><span class="p">)</span></div>
<div class="viewcode-block" id="Track.viewer_at"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.viewer_at">[docs]</a> <span class="k">def</span> <span class="nf">viewer_at</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Return the viewer at y along with the viewer-relative y coordinate,</span>
<span class="sd"> if there&#39;s no viewer at y return this track and y.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">viewer_y</span><span class="p">,</span> <span class="n">viewer</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="k">if</span> <span class="n">viewer_y</span> <span class="o">&lt;</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="n">viewer_y</span> <span class="o">+</span> <span class="n">viewer</span><span class="o">.</span><span class="n">h</span><span class="p">:</span>
<span class="k">return</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="n">viewer_y</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">,</span> <span class="n">y</span></div>
<div class="viewcode-block" id="Track.open_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.open_viewer">[docs]</a> <span class="k">def</span> <span class="nf">open_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">class_</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Open and return a viewer of class at y.&#39;&#39;&#39;</span>
<span class="c1"># Todo: if y coincides with some other viewer&#39;s y replace it.</span>
<span class="n">viewer</span><span class="p">,</span> <span class="n">viewer_y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewer_at</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">viewer</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">viewer_y</span><span class="p">)</span>
<span class="n">new_viewer</span> <span class="o">=</span> <span class="n">class_</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)))</span>
<span class="n">new_viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">y</span><span class="p">,</span> <span class="n">new_viewer</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span> <span class="c1"># Could use bisect module but how many</span>
<span class="c1"># viewers will you ever have?</span>
<span class="k">return</span> <span class="n">new_viewer</span></div>
<div class="viewcode-block" id="Track.close_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.close_viewer">[docs]</a> <span class="k">def</span> <span class="nf">close_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Close the viewer, reuse the freed space.&#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">y</span><span class="p">,</span> <span class="n">V</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="k">if</span> <span class="n">V</span> <span class="ow">is</span> <span class="n">viewer</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_close_viewer</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">V</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<span class="k">def</span> <span class="nf">_close_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Helper function to do the actual closing.&#39;&#39;&#39;</span>
<span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">index</span><span class="p">((</span><span class="n">y</span><span class="p">,</span> <span class="n">viewer</span><span class="p">))</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="n">i</span><span class="p">:</span> <span class="c1"># The previous viewer gets the space.</span>
<span class="n">previous_y</span><span class="p">,</span> <span class="n">previous_viewer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_grow_by</span><span class="p">(</span><span class="n">previous_viewer</span><span class="p">,</span> <span class="n">previous_y</span><span class="p">,</span> <span class="n">viewer</span><span class="o">.</span><span class="n">h</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># This track gets the space.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="n">viewer</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">get_height</span><span class="p">()))</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_grow_by</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">h</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Grow a viewer (located at y) by height h.</span>
<span class="sd"> This might seem like it should be a method of the viewer, but</span>
<span class="sd"> the viewer knows nothing of its own y location on the screen nor</span>
<span class="sd"> the parent track&#39;s surface (to make a new subsurface) so it has</span>
<span class="sd"> to be a method of the track, which has both.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">viewer</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">get_height</span><span class="p">()</span> <span class="o">+</span> <span class="n">h</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">surface</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="c1"># subsurface rectangle outside surface area</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="n">surface</span><span class="p">)</span>
<span class="k">if</span> <span class="n">h</span> <span class="o">&lt;=</span> <span class="n">viewer</span><span class="o">.</span><span class="n">last_touch</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="n">viewer</span><span class="o">.</span><span class="n">last_touch</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<div class="viewcode-block" id="Track.change_viewer"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.change_viewer">[docs]</a> <span class="k">def</span> <span class="nf">change_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">new_y</span><span class="p">,</span> <span class="n">relative</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Adjust the top of the viewer to a new y within the boundaries of</span>
<span class="sd"> its neighbors.</span>
<span class="sd"> If relative is False new_y should be in screen coords, else new_y</span>
<span class="sd"> should be relative to the top of the viewer.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">old_y</span><span class="p">,</span> <span class="n">V</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="k">if</span> <span class="n">V</span> <span class="ow">is</span> <span class="n">viewer</span><span class="p">:</span>
<span class="k">if</span> <span class="n">relative</span><span class="p">:</span> <span class="n">new_y</span> <span class="o">+=</span> <span class="n">old_y</span>
<span class="k">if</span> <span class="n">new_y</span> <span class="o">!=</span> <span class="n">old_y</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_change_viewer</span><span class="p">(</span><span class="n">new_y</span><span class="p">,</span> <span class="n">old_y</span><span class="p">,</span> <span class="n">V</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">return</span> <span class="kc">False</span></div>
<span class="k">def</span> <span class="nf">_change_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_y</span><span class="p">,</span> <span class="n">old_y</span><span class="p">,</span> <span class="n">viewer</span><span class="p">):</span>
<span class="n">new_y</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">,</span> <span class="n">new_y</span><span class="p">))</span>
<span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="o">.</span><span class="n">index</span><span class="p">((</span><span class="n">old_y</span><span class="p">,</span> <span class="n">viewer</span><span class="p">))</span>
<span class="k">if</span> <span class="n">new_y</span> <span class="o">&lt;</span> <span class="n">old_y</span><span class="p">:</span> <span class="c1"># Enlarge self, shrink upper neighbor.</span>
<span class="k">if</span> <span class="n">i</span><span class="p">:</span>
<span class="n">previous_y</span><span class="p">,</span> <span class="n">previous_viewer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="n">new_y</span> <span class="o">-</span> <span class="n">previous_y</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">previous_viewer</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">previous_viewer</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">new_y</span> <span class="o">-</span> <span class="n">previous_y</span><span class="p">)</span>
<span class="n">previous_viewer</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing_viewer</span> <span class="o">=</span> <span class="n">previous_viewer</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">old_y</span> <span class="o">-</span> <span class="n">new_y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_grow_by</span><span class="p">(</span><span class="n">viewer</span><span class="p">,</span> <span class="n">new_y</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># Shink self, enlarge upper neighbor.</span>
<span class="c1"># Enforce invariant.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">h</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span> <span class="c1"># No next viewer.</span>
<span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span>
<span class="k">if</span> <span class="n">h</span> <span class="o">-</span> <span class="n">new_y</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span><span class="p">:</span>
<span class="k">return</span>
<span class="c1"># Change the viewer and adjust the upper viewer or track.</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">new_y</span> <span class="o">-</span> <span class="n">old_y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_grow_by</span><span class="p">(</span><span class="n">viewer</span><span class="p">,</span> <span class="n">new_y</span><span class="p">,</span> <span class="o">-</span><span class="n">h</span><span class="p">)</span> <span class="c1"># grow by negative height!</span>
<span class="k">if</span> <span class="n">i</span><span class="p">:</span>
<span class="n">previous_y</span><span class="p">,</span> <span class="n">previous_viewer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">previous_viewer</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_grow_by</span><span class="p">(</span><span class="n">previous_viewer</span><span class="p">,</span> <span class="n">previous_y</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
<span class="n">previous_viewer</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing_viewer</span> <span class="o">=</span> <span class="n">previous_viewer</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="n">old_y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_y</span><span class="p">,</span> <span class="n">viewer</span>
<span class="c1"># self.viewers.sort() # Not necessary, invariant holds.</span>
<span class="k">assert</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span>
<div class="viewcode-block" id="Track.broadcast"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.broadcast">[docs]</a> <span class="k">def</span> <span class="nf">broadcast</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Broadcast a message to all viewers on this track (except the sender.)</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">viewer</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="k">if</span> <span class="n">viewer</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">sender</span><span class="p">:</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="n">message</span><span class="p">)</span></div>
<div class="viewcode-block" id="Track.redraw"><a class="viewcode-back" href="../../../display.html#joy.vui.display.Track.redraw">[docs]</a> <span class="k">def</span> <span class="nf">redraw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Redraw the track and all of its viewers.&#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">viewer</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">viewers</span><span class="p">:</span>
<span class="n">viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span></div></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>
@@ -0,0 +1,274 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.main &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.main</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of Thun</span>
<span class="c1">#</span>
<span class="c1"># Thun is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># Thun is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with Thun. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Main Module</span>
<span class="sd">======================================</span>
<span class="sd">Pulls everything together.</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">traceback</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">joy.library</span> <span class="k">import</span> <span class="n">initialize</span><span class="p">,</span> <span class="n">DefinitionWrapper</span><span class="p">,</span> <span class="n">SimpleFunctionWrapper</span>
<span class="kn">from</span> <span class="nn">joy.vui</span> <span class="k">import</span> <span class="n">core</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">persist_task</span>
<span class="n">FULLSCREEN</span> <span class="o">=</span> <span class="s1">&#39;-f&#39;</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span>
<span class="n">JOY_HOME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;JOY_HOME&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">JOY_HOME</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">JOY_HOME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s1">&#39;~/.thun&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">JOY_HOME</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;what directory?&#39;</span><span class="p">)</span>
<div class="viewcode-block" id="load_definitions"><a class="viewcode-back" href="../../../main.html#joy.vui.main.load_definitions">[docs]</a><span class="k">def</span> <span class="nf">load_definitions</span><span class="p">(</span><span class="n">pt</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Load definitions from ``definitions.txt``.&#39;&#39;&#39;</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;definitions.txt&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
<span class="k">if</span> <span class="s1">&#39;==&#39;</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
<span class="n">DefinitionWrapper</span><span class="o">.</span><span class="n">add_def</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">)</span></div>
<div class="viewcode-block" id="load_primitives"><a class="viewcode-back" href="../../../main.html#joy.vui.main.load_primitives">[docs]</a><span class="k">def</span> <span class="nf">load_primitives</span><span class="p">(</span><span class="n">home</span><span class="p">,</span> <span class="n">name_space</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Load primitives from ``library.py``.&#39;&#39;&#39;</span>
<span class="n">fn</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">home</span><span class="p">,</span> <span class="s1">&#39;library.py&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">fn</span><span class="p">):</span>
<span class="n">execfile</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="n">name_space</span><span class="p">)</span></div>
<div class="viewcode-block" id="init"><a class="viewcode-back" href="../../../main.html#joy.vui.main.init">[docs]</a><span class="k">def</span> <span class="nf">init</span><span class="p">():</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Initialize the system.</span>
<span class="sd"> </span>
<span class="sd"> * Init PyGame</span>
<span class="sd"> * Create main window</span>
<span class="sd"> * Start the PyGame clock</span>
<span class="sd"> * Set the event mask</span>
<span class="sd"> * Create the PersistTask</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="nb">print</span> <span class="s1">&#39;Initializing Pygame...&#39;</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="nb">print</span> <span class="s1">&#39;Creating window...&#39;</span>
<span class="k">if</span> <span class="n">FULLSCREEN</span><span class="p">:</span>
<span class="n">screen</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">screen</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="mi">1024</span><span class="p">,</span> <span class="mi">768</span><span class="p">))</span>
<span class="n">clock</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">Clock</span><span class="p">()</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">set_allowed</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">set_allowed</span><span class="p">(</span><span class="n">core</span><span class="o">.</span><span class="n">ALLOWED_EVENTS</span><span class="p">)</span>
<span class="n">pt</span> <span class="o">=</span> <span class="n">persist_task</span><span class="o">.</span><span class="n">PersistTask</span><span class="p">(</span><span class="n">JOY_HOME</span><span class="p">)</span>
<span class="k">return</span> <span class="n">screen</span><span class="p">,</span> <span class="n">clock</span><span class="p">,</span> <span class="n">pt</span></div>
<div class="viewcode-block" id="init_context"><a class="viewcode-back" href="../../../main.html#joy.vui.main.init_context">[docs]</a><span class="k">def</span> <span class="nf">init_context</span><span class="p">(</span><span class="n">screen</span><span class="p">,</span> <span class="n">clock</span><span class="p">,</span> <span class="n">pt</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> More initialization</span>
<span class="sd"> * Create the Joy dictionary</span>
<span class="sd"> * Create the Display</span>
<span class="sd"> * Open the log, menu, and scratch text viewers, and the stack pickle</span>
<span class="sd"> * Start the main loop</span>
<span class="sd"> * Create the World object</span>
<span class="sd"> * Register PersistTask and World message handlers with the Display</span>
<span class="sd"> * Load user function definitions.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">D</span> <span class="o">=</span> <span class="n">initialize</span><span class="p">()</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">display</span><span class="o">.</span><span class="n">Display</span><span class="p">(</span>
<span class="n">screen</span><span class="p">,</span>
<span class="n">D</span><span class="o">.</span><span class="n">__contains__</span><span class="p">,</span>
<span class="o">*</span><span class="p">((</span><span class="mi">144</span> <span class="o">-</span> <span class="mi">89</span><span class="p">,</span> <span class="mi">144</span><span class="p">,</span> <span class="mi">89</span><span class="p">)</span> <span class="k">if</span> <span class="n">FULLSCREEN</span> <span class="k">else</span> <span class="p">(</span><span class="mi">89</span><span class="p">,</span> <span class="mi">144</span><span class="p">))</span>
<span class="p">)</span>
<span class="n">log</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">init_text</span><span class="p">(</span><span class="n">pt</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;log.txt&#39;</span><span class="p">)</span>
<span class="n">tho</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">init_text</span><span class="p">(</span><span class="n">pt</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">h</span> <span class="o">/</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">&#39;menu.txt&#39;</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">init_text</span><span class="p">(</span><span class="n">pt</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">w</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;scratch.txt&#39;</span><span class="p">)</span>
<span class="n">loop</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">TheLoop</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">clock</span><span class="p">)</span>
<span class="n">stack_id</span><span class="p">,</span> <span class="n">stack_holder</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;stack.pickle&#39;</span><span class="p">)</span>
<span class="n">world</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">World</span><span class="p">(</span><span class="n">stack_id</span><span class="p">,</span> <span class="n">stack_holder</span><span class="p">,</span> <span class="n">D</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">broadcast</span><span class="p">,</span> <span class="n">log</span><span class="p">)</span>
<span class="n">loop</span><span class="o">.</span><span class="n">install_task</span><span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">task_run</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span> <span class="c1"># save files every ten seconds</span>
<span class="n">d</span><span class="o">.</span><span class="n">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="n">d</span><span class="o">.</span><span class="n">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">world</span><span class="o">.</span><span class="n">handle</span><span class="p">)</span>
<span class="n">load_definitions</span><span class="p">(</span><span class="n">pt</span><span class="p">,</span> <span class="n">D</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">locals</span><span class="p">()</span></div>
<div class="viewcode-block" id="error_guard"><a class="viewcode-back" href="../../../main.html#joy.vui.main.error_guard">[docs]</a><span class="k">def</span> <span class="nf">error_guard</span><span class="p">(</span><span class="n">loop</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Run a loop function, retry for ``n`` exceptions.</span>
<span class="sd"> Prints tracebacks on ``sys.stderr``.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">error_count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">error_count</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">loop</span><span class="p">()</span>
<span class="k">break</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="n">error_count</span> <span class="o">+=</span> <span class="mi">1</span></div>
<div class="viewcode-block" id="FileFaker"><a class="viewcode-back" href="../../../main.html#joy.vui.main.FileFaker">[docs]</a><span class="k">class</span> <span class="nc">FileFaker</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Pretends to be a file object but writes to log instead.&#39;&#39;&#39;</span>
<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">log</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="n">log</span>
<div class="viewcode-block" id="FileFaker.write"><a class="viewcode-back" href="../../../main.html#joy.vui.main.FileFaker.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Write text to log.&#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">text</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../../../main.html#joy.vui.main.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">screen</span><span class="p">,</span> <span class="n">clock</span><span class="p">,</span> <span class="n">pt</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Main function.</span>
<span class="sd"> * Call ``init_context()``</span>
<span class="sd"> * Load primitives</span>
<span class="sd"> * Create an ``evaluate`` function that lets you just eval some Python code</span>
<span class="sd"> * Redirect ``stdout`` to the log using a ``FileFaker`` object, and...</span>
<span class="sd"> * Start the main loop.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">name_space</span> <span class="o">=</span> <span class="n">init_context</span><span class="p">(</span><span class="n">screen</span><span class="p">,</span> <span class="n">clock</span><span class="p">,</span> <span class="n">pt</span><span class="p">)</span>
<span class="n">load_primitives</span><span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">home</span><span class="p">,</span> <span class="n">name_space</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span>
<span class="nd">@SimpleFunctionWrapper</span>
<span class="k">def</span> <span class="nf">evaluate</span><span class="p">(</span><span class="n">stack</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Evaluate the Python code text on the top of the stack.&#39;&#39;&#39;</span>
<span class="n">code</span><span class="p">,</span> <span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span>
<span class="n">exec</span> <span class="n">code</span> <span class="ow">in</span> <span class="n">name_space</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">return</span> <span class="n">stack</span>
<span class="n">name_space</span><span class="p">[</span><span class="s1">&#39;D&#39;</span><span class="p">][</span><span class="s1">&#39;evaluate&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">evaluate</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">old_stdout</span> <span class="o">=</span> <span class="n">FileFaker</span><span class="p">(</span><span class="n">name_space</span><span class="p">[</span><span class="s1">&#39;log&#39;</span><span class="p">]),</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">error_guard</span><span class="p">(</span><span class="n">name_space</span><span class="p">[</span><span class="s1">&#39;loop&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">loop</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">old_stdout</span>
<span class="k">return</span> <span class="n">name_space</span><span class="p">[</span><span class="s1">&#39;d&#39;</span><span class="p">]</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>
@@ -0,0 +1,372 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.persist_task &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.persist_task</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of Thun</span>
<span class="c1">#</span>
<span class="c1"># Thun is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># Thun is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with Thun. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Persist Task</span>
<span class="sd">===========================</span>
<span class="sd">This module deals with persisting the &quot;resources&quot; (text files and the</span>
<span class="sd">stack) to the git repo in the ``JOY_HOME`` directory.</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">pickle</span><span class="o">,</span> <span class="nn">traceback</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">Counter</span>
<span class="kn">from</span> <span class="nn">dulwich.errors</span> <span class="k">import</span> <span class="n">NotGitRepository</span>
<span class="kn">from</span> <span class="nn">dulwich.repo</span> <span class="k">import</span> <span class="n">Repo</span>
<span class="kn">from</span> <span class="nn">joy.vui</span> <span class="k">import</span> <span class="n">core</span><span class="p">,</span> <span class="n">init_joy_home</span>
<div class="viewcode-block" id="open_repo"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.open_repo">[docs]</a><span class="k">def</span> <span class="nf">open_repo</span><span class="p">(</span><span class="n">repo_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">initialize</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Open, or create, and return a Dulwich git repo object for the given</span>
<span class="sd"> directory. If the dir path doesn&#39;t exist it will be created. If it</span>
<span class="sd"> does exist but isn&#39;t a repo the result depends on the ``initialize``</span>
<span class="sd"> argument. If it is ``False`` (the default) a ``NotGitRepository``</span>
<span class="sd"> exception is raised, otherwise ``git init`` is effected in the dir.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">,</span> <span class="mi">0700</span><span class="p">)</span>
<span class="k">return</span> <span class="n">init_repo</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Repo</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">)</span>
<span class="k">except</span> <span class="n">NotGitRepository</span><span class="p">:</span>
<span class="k">if</span> <span class="n">initialize</span><span class="p">:</span>
<span class="k">return</span> <span class="n">init_repo</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">)</span>
<span class="k">raise</span></div>
<div class="viewcode-block" id="init_repo"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.init_repo">[docs]</a><span class="k">def</span> <span class="nf">init_repo</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Initialize a git repository in the directory. Stage and commit all</span>
<span class="sd"> files (toplevel, not those in subdirectories if any) in the dir.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">repo</span> <span class="o">=</span> <span class="n">Repo</span><span class="o">.</span><span class="n">init</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">)</span>
<span class="n">init_joy_home</span><span class="o">.</span><span class="n">initialize</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">)</span>
<span class="n">repo</span><span class="o">.</span><span class="n">stage</span><span class="p">([</span>
<span class="n">fn</span>
<span class="k">for</span> <span class="n">fn</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">)</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">repo_dir</span><span class="p">,</span> <span class="n">fn</span><span class="p">))</span>
<span class="p">])</span>
<span class="n">repo</span><span class="o">.</span><span class="n">do_commit</span><span class="p">(</span><span class="s1">&#39;Initial commit.&#39;</span><span class="p">,</span> <span class="n">committer</span><span class="o">=</span><span class="n">core</span><span class="o">.</span><span class="n">COMMITTER</span><span class="p">)</span>
<span class="k">return</span> <span class="n">repo</span></div>
<div class="viewcode-block" id="make_repo_relative_path_maker"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.make_repo_relative_path_maker">[docs]</a><span class="k">def</span> <span class="nf">make_repo_relative_path_maker</span><span class="p">(</span><span class="n">repo</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Helper function to return a function that returns a path given a path,</span>
<span class="sd"> that&#39;s relative to the repository.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">controldir</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">repo_relative_path</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">commonprefix</span><span class="p">((</span><span class="n">c</span><span class="p">,</span> <span class="n">path</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">repo_relative_path</span></div>
<div class="viewcode-block" id="Resource"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.Resource">[docs]</a><span class="k">class</span> <span class="nc">Resource</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Handle the content of a text files as a list of lines, deal with</span>
<span class="sd"> saving it and staging the changes to a repo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<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">filename</span><span class="p">,</span> <span class="n">repo_relative_filename</span><span class="p">,</span> <span class="n">thing</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
<span class="bp">self</span><span class="o">.</span><span class="n">repo_relative_filename</span> <span class="o">=</span> <span class="n">repo_relative_filename</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thing</span> <span class="o">=</span> <span class="n">thing</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_from_file</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_from_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
<span class="k">return</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_to_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">thing</span><span class="p">:</span>
<span class="nb">print</span> <span class="o">&gt;&gt;</span> <span class="n">f</span><span class="p">,</span> <span class="n">line</span>
<div class="viewcode-block" id="Resource.persist"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.Resource.persist">[docs]</a> <span class="k">def</span> <span class="nf">persist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">repo</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Save the lines to the file and stage the file in the repo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">os</span><span class="o">.</span><span class="n">chmod</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="mi">0600</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_to_file</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="n">f</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="n">os</span><span class="o">.</span><span class="n">fsync</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span>
<span class="c1"># For goodness&#39;s sake, write it to the disk already!</span>
<span class="n">repo</span><span class="o">.</span><span class="n">stage</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">repo_relative_filename</span><span class="p">])</span></div></div>
<div class="viewcode-block" id="PickledResource"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PickledResource">[docs]</a><span class="k">class</span> <span class="nc">PickledResource</span><span class="p">(</span><span class="n">Resource</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> A ``Resource`` subclass that uses ``pickle`` on its file/thing.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">def</span> <span class="nf">_from_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)]</span>
<span class="k">def</span> <span class="nf">_to_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">thing</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">f</span><span class="p">)</span></div>
<div class="viewcode-block" id="PersistTask"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask">[docs]</a><span class="k">class</span> <span class="nc">PersistTask</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> This class deals with saving changes to the git repo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">LIMIT</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">MAX_SAVE</span> <span class="o">=</span> <span class="mi">10</span>
<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">home</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">home</span> <span class="o">=</span> <span class="n">home</span>
<span class="bp">self</span><span class="o">.</span><span class="n">repo</span> <span class="o">=</span> <span class="n">open_repo</span><span class="p">(</span><span class="n">home</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_r</span> <span class="o">=</span> <span class="n">make_repo_relative_path_maker</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">repo</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">store</span> <span class="o">=</span> <span class="p">{}</span>
<div class="viewcode-block" id="PersistTask.open"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.open">[docs]</a> <span class="k">def</span> <span class="nf">open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Look up the named file in home and return its content_id and data.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">fn</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">home</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="n">content_id</span> <span class="o">=</span> <span class="n">name</span> <span class="c1"># hash(fn)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">R</span> <span class="o">=</span> <span class="n">PickledResource</span> <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.pickle&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="n">Resource</span>
<span class="n">resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">R</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_r</span><span class="p">(</span><span class="n">fn</span><span class="p">))</span>
<span class="k">return</span> <span class="n">content_id</span><span class="p">,</span> <span class="n">resource</span><span class="o">.</span><span class="n">thing</span></div>
<div class="viewcode-block" id="PersistTask.handle"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.handle">[docs]</a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Handle messages, dispatch to ``handle_FOO()`` methods.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">core</span><span class="o">.</span><span class="n">OpenMessage</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">core</span><span class="o">.</span><span class="n">ModifyMessage</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handle_modify</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">core</span><span class="o">.</span><span class="n">PersistMessage</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handle_persist</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">core</span><span class="o">.</span><span class="n">ShutdownMessage</span><span class="p">):</span>
<span class="k">for</span> <span class="n">content_id</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span><span class="o">.</span><span class="n">persist</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">repo</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commit</span><span class="p">(</span><span class="s1">&#39;shutdown&#39;</span><span class="p">)</span></div>
<div class="viewcode-block" id="PersistTask.handle_open"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.handle_open">[docs]</a> <span class="k">def</span> <span class="nf">handle_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Foo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">message</span><span class="o">.</span><span class="n">content_id</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">thing</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">message</span><span class="o">.</span><span class="n">traceback</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
<span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">ERROR</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">SUCCESS</span></div>
<div class="viewcode-block" id="PersistTask.handle_modify"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.handle_modify">[docs]</a> <span class="k">def</span> <span class="nf">handle_modify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Foo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">content_id</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">details</span><span class="p">[</span><span class="s1">&#39;content_id&#39;</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">content_id</span><span class="p">:</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">counter</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">LIMIT</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">persist</span><span class="p">(</span><span class="n">content_id</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commit</span><span class="p">(</span><span class="s1">&#39;due to activity&#39;</span><span class="p">)</span></div>
<div class="viewcode-block" id="PersistTask.handle_persist"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.handle_persist">[docs]</a> <span class="k">def</span> <span class="nf">handle_persist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Foo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">[</span><span class="n">message</span><span class="o">.</span><span class="n">content_id</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_persist_new</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="n">resource</span><span class="o">.</span><span class="n">persist</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">repo</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commit</span><span class="p">(</span><span class="s1">&#39;by request from </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">sender</span><span class="p">,))</span></div>
<div class="viewcode-block" id="PersistTask.handle_persist_new"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.handle_persist_new">[docs]</a> <span class="k">def</span> <span class="nf">handle_persist_new</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Foo.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">content_id</span>
<span class="n">check_filename</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">fn</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</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">home</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="n">thing</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">details</span><span class="p">[</span><span class="s1">&#39;thing&#39;</span><span class="p">]</span>
<span class="n">R</span> <span class="o">=</span> <span class="n">PickledResource</span> <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.pickle&#39;</span><span class="p">)</span> <span class="k">else</span> <span class="n">Resource</span> <span class="c1"># !!! refactor!</span>
<span class="n">resource</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">R</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_r</span><span class="p">(</span><span class="n">fn</span><span class="p">),</span> <span class="n">thing</span><span class="p">)</span>
<span class="k">return</span> <span class="n">resource</span></div>
<div class="viewcode-block" id="PersistTask.persist"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.persist">[docs]</a> <span class="k">def</span> <span class="nf">persist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content_id</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Persist a resource.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">[</span><span class="n">content_id</span><span class="p">]</span><span class="o">.</span><span class="n">persist</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">repo</span><span class="p">)</span></div>
<div class="viewcode-block" id="PersistTask.task_run"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.task_run">[docs]</a> <span class="k">def</span> <span class="nf">task_run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Stage any outstanding changes.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">content_id</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">counter</span><span class="o">.</span><span class="n">most_common</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">MAX_SAVE</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">persist</span><span class="p">(</span><span class="n">content_id</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span></div>
<div class="viewcode-block" id="PersistTask.commit"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.commit">[docs]</a> <span class="k">def</span> <span class="nf">commit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="s1">&#39;auto-commit&#39;</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Commit.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">repo</span><span class="o">.</span><span class="n">do_commit</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">committer</span><span class="o">=</span><span class="n">core</span><span class="o">.</span><span class="n">COMMITTER</span><span class="p">)</span></div>
<div class="viewcode-block" id="PersistTask.scan"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.PersistTask.scan">[docs]</a> <span class="k">def</span> <span class="nf">scan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Return a sorted list of all the files in the home dir.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">return</span> <span class="nb">sorted</span><span class="p">([</span>
<span class="n">fn</span>
<span class="k">for</span> <span class="n">fn</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">home</span><span class="p">)</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</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">home</span><span class="p">,</span> <span class="n">fn</span><span class="p">))</span>
<span class="p">])</span></div></div>
<div class="viewcode-block" id="check_filename"><a class="viewcode-back" href="../../../persist_task.html#joy.vui.persist_task.check_filename">[docs]</a><span class="k">def</span> <span class="nf">check_filename</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Sanity checks for filename.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="c1"># TODO: improve this...</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">64</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;bad name </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,))</span>
<span class="n">left</span><span class="p">,</span> <span class="n">dot</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">left</span><span class="o">.</span><span class="n">isalnum</span><span class="p">()</span> <span class="ow">or</span> <span class="n">dot</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">right</span><span class="o">.</span><span class="n">isalnum</span><span class="p">():</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;bad name </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,))</span></div>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
<span class="n">JOY_HOME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s1">&#39;~/.thun&#39;</span><span class="p">)</span>
<span class="n">pt</span> <span class="o">=</span> <span class="n">PersistTask</span><span class="p">(</span><span class="n">JOY_HOME</span><span class="p">)</span>
<span class="n">content_id</span><span class="p">,</span> <span class="n">thing</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;stack.pickle&#39;</span><span class="p">)</span>
<span class="n">pt</span><span class="o">.</span><span class="n">persist</span><span class="p">(</span><span class="n">content_id</span><span class="p">)</span>
<span class="nb">print</span> <span class="n">pt</span><span class="o">.</span><span class="n">counter</span>
<span class="n">mm</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">ModifyMessage</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">content_id</span><span class="o">=</span><span class="n">content_id</span><span class="p">)</span>
<span class="n">pt</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="n">mm</span><span class="p">)</span>
<span class="nb">print</span> <span class="n">pt</span><span class="o">.</span><span class="n">counter</span>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>
@@ -0,0 +1,175 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.stack_viewer &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.stack_viewer</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of Thun</span>
<span class="c1">#</span>
<span class="c1"># Thun is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># Thun is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with Thun. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Stack Viewer</span>
<span class="sd">=================</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">expression_to_string</span><span class="p">,</span> <span class="n">iter_stack</span>
<span class="kn">from</span> <span class="nn">joy.vui</span> <span class="k">import</span> <span class="n">core</span><span class="p">,</span> <span class="n">text_viewer</span>
<span class="n">MAX_WIDTH</span> <span class="o">=</span> <span class="mi">64</span>
<div class="viewcode-block" id="fsi"><a class="viewcode-back" href="../../../stack_viewer.html#joy.vui.stack_viewer.fsi">[docs]</a><span class="k">def</span> <span class="nf">fsi</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Format Stack Item&#39;&#39;&#39;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="n">expression_to_string</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">item</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">assert</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">unicode</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">MAX_WIDTH</span><span class="p">:</span>
<span class="k">return</span> <span class="n">res</span><span class="p">[:</span><span class="n">MAX_WIDTH</span> <span class="o">-</span> <span class="mi">3</span><span class="p">]</span> <span class="o">+</span> <span class="s1">&#39;...&#39;</span>
<span class="k">return</span> <span class="n">res</span></div>
<div class="viewcode-block" id="StackViewer"><a class="viewcode-back" href="../../../stack_viewer.html#joy.vui.stack_viewer.StackViewer">[docs]</a><span class="k">class</span> <span class="nc">StackViewer</span><span class="p">(</span><span class="n">text_viewer</span><span class="o">.</span><span class="n">TextViewer</span><span class="p">):</span>
<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">surface</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">StackViewer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">surface</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">content_id</span> <span class="o">=</span> <span class="s1">&#39;stack viewer&#39;</span>
<span class="k">def</span> <span class="nf">_attach</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">om</span> <span class="o">=</span> <span class="n">core</span><span class="o">.</span><span class="n">OpenMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;stack.pickle&#39;</span><span class="p">)</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">om</span><span class="p">)</span>
<span class="k">if</span> <span class="n">om</span><span class="o">.</span><span class="n">status</span> <span class="o">!=</span> <span class="n">core</span><span class="o">.</span><span class="n">SUCCESS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s1">&#39;stack unavailable&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span> <span class="o">=</span> <span class="n">om</span><span class="o">.</span><span class="n">thing</span>
<span class="k">def</span> <span class="nf">_update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[:]</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">fsi</span><span class="p">,</span> <span class="n">iter_stack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span> <span class="ow">or</span> <span class="p">[</span><span class="s1">&#39;&#39;</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">focus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_attach</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">StackViewer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">focus</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">core</span><span class="o">.</span><span class="n">ModifyMessage</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">subject</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack_holder</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>
@@ -0,0 +1,799 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.text_viewer &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.text_viewer</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of Thun</span>
<span class="c1">#</span>
<span class="c1"># Thun is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># Thun is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with Thun. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Text Viewer</span>
<span class="sd">=================</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">import</span> <span class="nn">string</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">joy.utils.stack</span> <span class="k">import</span> <span class="n">expression_to_string</span>
<span class="kn">from</span> <span class="nn">joy.vui.core</span> <span class="k">import</span> <span class="p">(</span>
<span class="n">ARROW_KEYS</span><span class="p">,</span>
<span class="n">BACKGROUND</span> <span class="k">as</span> <span class="n">BG</span><span class="p">,</span>
<span class="n">FOREGROUND</span> <span class="k">as</span> <span class="n">FG</span><span class="p">,</span>
<span class="n">CommandMessage</span><span class="p">,</span>
<span class="n">ModifyMessage</span><span class="p">,</span>
<span class="n">OpenMessage</span><span class="p">,</span>
<span class="n">SUCCESS</span><span class="p">,</span>
<span class="n">push</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="nn">joy.vui</span> <span class="k">import</span> <span class="n">viewer</span><span class="p">,</span> <span class="n">font_data</span>
<span class="c1">#reload(viewer)</span>
<span class="n">MenuViewer</span> <span class="o">=</span> <span class="n">viewer</span><span class="o">.</span><span class="n">MenuViewer</span>
<span class="n">SELECTION_COLOR</span> <span class="o">=</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">32</span>
<span class="n">SELECTION_KEYS</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F1</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F2</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F3</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F4</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">STACK_CHATTER_KEYS</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F5</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F6</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F7</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">K_F8</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">_is_command</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">word</span><span class="p">):</span>
<span class="k">return</span> <span class="n">display</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> <span class="ow">or</span> <span class="n">word</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="ow">or</span> <span class="nb">all</span><span class="p">(</span>
<span class="ow">not</span> <span class="n">s</span> <span class="ow">or</span> <span class="n">s</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">word</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span>
<span class="k">def</span> <span class="nf">format_stack_item</span><span class="p">(</span><span class="n">content</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="n">expression_to_string</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Font</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">IMAGE</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">font_data</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="s1">&#39;Iosevka12.BMP&#39;</span><span class="p">)</span>
<span class="n">LOOKUP</span> <span class="o">=</span> <span class="p">(</span><span class="n">string</span><span class="o">.</span><span class="n">ascii_letters</span> <span class="o">+</span>
<span class="n">string</span><span class="o">.</span><span class="n">digits</span> <span class="o">+</span>
<span class="sd">&#39;&#39;&#39;@#$&amp;_~|`&#39;&quot;%^=-+*/\\&lt;&gt;[]{}(),.;:!?&#39;&#39;&#39;</span><span class="p">)</span>
<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">char_w</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">char_h</span><span class="o">=</span><span class="mi">19</span><span class="p">,</span> <span class="n">line_h</span><span class="o">=</span><span class="mi">19</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char_w</span> <span class="o">=</span> <span class="n">char_w</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char_h</span> <span class="o">=</span> <span class="n">char_h</span>
<span class="bp">self</span><span class="o">.</span><span class="n">line_h</span> <span class="o">=</span> <span class="n">line_h</span>
<span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">char_w</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">text</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">line_h</span>
<span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="n">surface</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">text</span><span class="p">))</span>
<span class="n">surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">BG</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">ch</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ch</span><span class="o">.</span><span class="n">isspace</span><span class="p">():</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">LOOKUP</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="c1"># render a lil box...</span>
<span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">line_h</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mi">3</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">char_w</span> <span class="o">-</span> <span class="mi">2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">line_h</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">rect</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">FG</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">iy</span><span class="p">,</span> <span class="n">ix</span> <span class="o">=</span> <span class="nb">divmod</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">26</span><span class="p">)</span>
<span class="n">ix</span> <span class="o">*=</span> <span class="bp">self</span><span class="o">.</span><span class="n">char_w</span>
<span class="n">iy</span> <span class="o">*=</span> <span class="bp">self</span><span class="o">.</span><span class="n">char_h</span>
<span class="n">area</span> <span class="o">=</span> <span class="n">ix</span><span class="p">,</span> <span class="n">iy</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">char_h</span>
<span class="n">surface</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">IMAGE</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">area</span><span class="p">)</span>
<span class="n">x</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">char_w</span>
<span class="k">return</span> <span class="n">surface</span>
<span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">char</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">char</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">char</span><span class="p">)</span>
<span class="k">return</span> <span class="n">char</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">LOOKUP</span>
<span class="n">FONT</span> <span class="o">=</span> <span class="n">Font</span><span class="p">()</span>
<div class="viewcode-block" id="TextViewer"><a class="viewcode-back" href="../../../text_viewer.html#joy.vui.text_viewer.TextViewer">[docs]</a><span class="k">class</span> <span class="nc">TextViewer</span><span class="p">(</span><span class="n">MenuViewer</span><span class="p">):</span>
<span class="n">MINIMUM_HEIGHT</span> <span class="o">=</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span> <span class="o">+</span> <span class="mi">3</span>
<span class="n">CLOSE_TEXT</span> <span class="o">=</span> <span class="n">FONT</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">&#39;close&#39;</span><span class="p">)</span>
<span class="n">GROW_TEXT</span> <span class="o">=</span> <span class="n">FONT</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">&#39;grow&#39;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Cursor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<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">viewer</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span> <span class="o">=</span> <span class="n">viewer</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mem</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_fade</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">set_to</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mem</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">body_surface</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">body_surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">FG</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_fade</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">fade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_fade</span><span class="p">:</span>
<span class="n">dest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">screen_y</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">body_surface</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mem</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_fade</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">screen_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">row</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span>
<span class="k">return</span> <span class="p">(</span><span class="n">row</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">at_line</span><span class="p">)</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="k">def</span> <span class="nf">up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">]))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">]))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_scroll</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">left</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_scroll</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">right</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">]):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_scroll</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_check_scroll</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">at_line</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">scroll_down</span><span class="p">()</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">at_line</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">h_in_lines</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span><span class="o">.</span><span class="n">scroll_up</span><span class="p">()</span>
<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">surface</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">Cursor</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">MenuViewer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">content_id</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bg</span> <span class="o">=</span> <span class="n">BG</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="n">MenuViewer</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="n">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">CLOSE_TEXT</span><span class="o">.</span><span class="n">get_size</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">close_rect</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">Rect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">-</span> <span class="n">w</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
<span class="n">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">GROW_TEXT</span><span class="o">.</span><span class="n">get_size</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">grow_rect</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">Rect</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span> <span class="o">=</span> <span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">line_w</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">w</span> <span class="o">/</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span> <span class="o">+</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">h_in_lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">h</span> <span class="o">/</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span> <span class="o">-</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">super</span><span class="p">(</span><span class="n">TextViewer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ModifyMessage</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">message</span><span class="o">.</span><span class="n">subject</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span>
<span class="p">):</span>
<span class="c1"># TODO: check self.at_line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span>
<span class="c1"># Drawing</span>
<span class="k">def</span> <span class="nf">draw_menu</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1">#MenuViewer.draw_menu(self)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">GROW_TEXT</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">CLOSE_TEXT</span><span class="p">,</span>
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_rect</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">content_id</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">FONT</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">&#39;| &#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">content_id</span><span class="p">),</span>
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">grow_rect</span><span class="o">.</span><span class="n">w</span> <span class="o">+</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span> <span class="o">+</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span> <span class="c1"># light grey background</span>
<span class="p">(</span><span class="mi">196</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">196</span><span class="p">),</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span><span class="p">),</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">BLEND_MULT</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">draw_body</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">MenuViewer</span><span class="o">.</span><span class="n">draw_body</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">ys</span> <span class="o">=</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">height</span><span class="p">,</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span><span class="p">)</span>
<span class="n">ls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">at_line</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">h_in_lines</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]</span>
<span class="k">for</span> <span class="n">y</span><span class="p">,</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">ys</span><span class="p">,</span> <span class="n">ls</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_line</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">line</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">draw_line</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">line</span><span class="p">):</span>
<span class="n">surface</span> <span class="o">=</span> <span class="n">FONT</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">line</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">line_w</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_redraw_line</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span> <span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">row</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span> <span class="n">line</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">line_w</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">line_w</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">line</span> <span class="o">=</span> <span class="n">line</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="n">n</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(</span><span class="n">row</span><span class="p">),</span> <span class="n">line</span><span class="p">)</span>
<span class="c1"># General Functionality</span>
<span class="k">def</span> <span class="nf">focus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">v</span> <span class="o">=</span> <span class="bp">self</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">unfocus</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">scroll_up</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fade_command</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deselect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span><span class="o">.</span><span class="n">scroll</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span><span class="p">)</span>
<span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">h_in_lines</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_redraw_line</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_redraw_line</span><span class="p">(</span><span class="n">row</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">scroll_down</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_line</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fade_command</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deselect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span><span class="o">.</span><span class="n">scroll</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_redraw_line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">at_line</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">command_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span><span class="o">.</span><span class="n">collidepoint</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fade_command</span><span class="p">()</span>
<span class="n">line</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">_row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">word_start</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">word_end</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
<span class="k">if</span> <span class="n">word_end</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="n">word_end</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="n">word</span> <span class="o">=</span> <span class="n">line</span><span class="p">[</span><span class="n">word_start</span><span class="p">:</span><span class="n">word_end</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_is_command</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">word</span><span class="p">):</span>
<span class="k">return</span>
<span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">Rect</span><span class="p">(</span>
<span class="n">word_start</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span> <span class="c1"># x</span>
<span class="n">y</span> <span class="o">/</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span><span class="p">,</span> <span class="c1"># y</span>
<span class="nb">len</span><span class="p">(</span><span class="n">word</span><span class="p">)</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span> <span class="c1"># w</span>
<span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span> <span class="c1"># h</span>
<span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span><span class="p">,</span> <span class="n">FG</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">bottomleft</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">bottomright</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="n">word</span>
<span class="k">def</span> <span class="nf">command_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">command</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">command</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fade_command</span><span class="p">()</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">CommandMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_fade_command</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">r</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">command_rect</span><span class="p">,</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">r</span><span class="p">:</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span><span class="p">,</span> <span class="n">BG</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">bottomleft</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">bottomright</span><span class="p">)</span>
<div class="viewcode-block" id="TextViewer.at"><a class="viewcode-back" href="../../../text_viewer.html#joy.vui.text_viewer.TextViewer.at">[docs]</a> <span class="k">def</span> <span class="nf">at</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Given screen coordinates return the line, row, and column of the</span>
<span class="sd"> character there.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">+</span> <span class="n">y</span> <span class="o">/</span> <span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">row</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">row</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">row</span><span class="p">]</span>
<span class="n">column</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">column</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">x</span> <span class="o">/</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="k">return</span> <span class="n">line</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">row</span></div>
<span class="c1"># Event Processing</span>
<span class="k">def</span> <span class="nf">body_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">_line</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">set_to</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="n">row</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">if</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_mods</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scroll_up</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scroll_down</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command_down</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">scroll_down</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">scroll_up</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">menu_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">MenuViewer</span><span class="o">.</span><span class="n">menu_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">MenuViewer</span><span class="o">.</span><span class="n">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">3</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">collidepoint</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command_up</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">rel_x</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span> <span class="n">button0</span><span class="p">,</span> <span class="n">button1</span><span class="p">,</span> <span class="n">button2</span><span class="p">):</span>
<span class="k">if</span> <span class="n">MenuViewer</span><span class="o">.</span><span class="n">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">rel_x</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span>
<span class="n">button0</span><span class="p">,</span> <span class="n">button1</span><span class="p">,</span> <span class="n">button2</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">if</span> <span class="p">(</span><span class="n">button0</span>
<span class="ow">and</span> <span class="n">display</span><span class="o">.</span><span class="n">focused_viewer</span> <span class="ow">is</span> <span class="bp">self</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">collidepoint</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">bx</span><span class="p">,</span> <span class="n">by</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">topleft</span>
<span class="n">_line</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">row</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">bx</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="n">by</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">set_to</span><span class="p">(</span><span class="n">column</span><span class="p">,</span> <span class="n">row</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">button2</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">collidepoint</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="n">bx</span><span class="p">,</span> <span class="n">by</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">topleft</span>
<span class="bp">self</span><span class="o">.</span><span class="n">command_down</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="n">bx</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="n">by</span><span class="p">)</span>
<div class="viewcode-block" id="TextViewer.close"><a class="viewcode-back" href="../../../text_viewer.html#joy.vui.text_viewer.TextViewer.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="kc">None</span></div>
<span class="k">def</span> <span class="nf">key_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">uch</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">SELECTION_KEYS</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selection_key</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">STACK_CHATTER_KEYS</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_stack_chatter_key</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ARROW_KEYS</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_arrow_key</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">line</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span>
<span class="n">modified</span> <span class="o">=</span> <span class="p">()</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_RETURN</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_return_key</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="n">modified</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_BACKSPACE</span><span class="p">:</span>
<span class="n">modified</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_backspace_key</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_DELETE</span><span class="p">:</span>
<span class="n">modified</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delete_key</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_INSERT</span><span class="p">:</span>
<span class="n">modified</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_insert_key</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">uch</span> <span class="ow">and</span> <span class="n">uch</span> <span class="ow">in</span> <span class="n">FONT</span> <span class="ow">or</span> <span class="n">uch</span> <span class="o">==</span> <span class="s1">&#39; &#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_printable_key</span><span class="p">(</span><span class="n">uch</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="n">modified</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span> <span class="s1">&#39;</span><span class="si">%r</span><span class="s1"> </span><span class="si">%i</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">uch</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="nb">bin</span><span class="p">(</span><span class="n">mod</span><span class="p">))</span>
<span class="k">if</span> <span class="n">modified</span><span class="p">:</span>
<span class="c1"># The selection is fragile.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deselect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">ModifyMessage</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">,</span> <span class="n">content_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">content_id</span><span class="p">)</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_stack_chatter_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F5</span><span class="p">:</span>
<span class="k">if</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;roll&lt;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;swap&#39;</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F6</span><span class="p">:</span>
<span class="k">if</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;roll&gt;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;dup&#39;</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F7</span><span class="p">:</span>
<span class="k">if</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;tuck&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">command</span> <span class="o">=</span> <span class="s1">&#39;over&#39;</span>
<span class="c1">## elif key == pygame.K_F8:</span>
<span class="c1">## if mod &amp; pygame.KMOD_SHIFT:</span>
<span class="c1">## command = &#39;&#39;</span>
<span class="c1">## else:</span>
<span class="c1">## command = &#39;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">CommandMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">))</span>
<span class="c1"># Selection Handling</span>
<span class="k">def</span> <span class="nf">_selection_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deselect</span><span class="p">()</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F1</span><span class="p">:</span> <span class="c1"># set sel start</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_selection</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F2</span><span class="p">:</span> <span class="c1"># set sel end</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_selection</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F3</span><span class="p">:</span> <span class="c1"># copy</span>
<span class="k">if</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_parse_selection</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_copy_selection</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_update_selection</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_F4</span><span class="p">:</span> <span class="c1"># cut or delete</span>
<span class="k">if</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_delete_selection</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cut_selection</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_deselect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_selection</span><span class="p">():</span>
<span class="n">srow</span><span class="p">,</span> <span class="n">erow</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># Just erase the whole selection.</span>
<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">srow</span><span class="p">,</span> <span class="n">erow</span><span class="p">),</span> <span class="nb">max</span><span class="p">(</span><span class="n">srow</span><span class="p">,</span> <span class="n">erow</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_redraw_line</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_copy_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">if</span> <span class="n">push</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_selection</span><span class="p">(),</span> <span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">)</span> <span class="o">==</span> <span class="n">SUCCESS</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="c1">## om = OpenMessage(self, &#39;stack.pickle&#39;)</span>
<span class="c1">## display.broadcast(om)</span>
<span class="c1">## if om.status == SUCCESS:</span>
<span class="c1">## selection = self._get_selection()</span>
<span class="c1">## om.thing[0] = selection, om.thing[0]</span>
<span class="c1">## display.broadcast(ModifyMessage(</span>
<span class="c1">## self, om.thing, content_id=om.content_id))</span>
<span class="k">def</span> <span class="nf">_parse_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_selection</span><span class="p">():</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_copy_selection</span><span class="p">(</span><span class="n">display</span><span class="p">):</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">CommandMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;parse&#39;</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_cut_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_selection</span><span class="p">():</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_copy_selection</span><span class="p">(</span><span class="n">display</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_delete_selection</span><span class="p">(</span><span class="n">display</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_delete_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_selection</span><span class="p">():</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="n">srow</span><span class="p">,</span> <span class="n">scolumn</span><span class="p">,</span> <span class="n">erow</span><span class="p">,</span> <span class="n">ecolumn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selection_coords</span><span class="p">()</span>
<span class="k">if</span> <span class="n">srow</span> <span class="o">==</span> <span class="n">erow</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">]</span> <span class="o">=</span> <span class="n">line</span><span class="p">[:</span><span class="n">scolumn</span><span class="p">]</span> <span class="o">+</span> <span class="n">line</span><span class="p">[</span><span class="n">ecolumn</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">left</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">][:</span><span class="n">scolumn</span><span class="p">]</span>
<span class="n">right</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">erow</span><span class="p">][</span><span class="n">ecolumn</span><span class="p">:]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">:</span><span class="n">erow</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">left</span> <span class="o">+</span> <span class="n">right</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">set_to</span><span class="p">(</span><span class="n">srow</span><span class="p">,</span> <span class="n">scolumn</span><span class="p">)</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">ModifyMessage</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">,</span> <span class="n">content_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">content_id</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_has_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_get_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Return the current selection if any as a single string.&#39;&#39;&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_selection</span><span class="p">():</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span>
<span class="n">srow</span><span class="p">,</span> <span class="n">scolumn</span><span class="p">,</span> <span class="n">erow</span><span class="p">,</span> <span class="n">ecolumn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selection_coords</span><span class="p">()</span>
<span class="k">if</span> <span class="n">srow</span> <span class="o">==</span> <span class="n">erow</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">][</span><span class="n">scolumn</span><span class="p">:</span><span class="n">ecolumn</span><span class="p">])</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">assert</span> <span class="n">srow</span> <span class="o">&lt;</span> <span class="n">erow</span>
<span class="k">while</span> <span class="n">srow</span> <span class="o">&lt;=</span> <span class="n">erow</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">]</span>
<span class="n">e</span> <span class="o">=</span> <span class="n">ecolumn</span> <span class="k">if</span> <span class="n">srow</span> <span class="o">==</span> <span class="n">erow</span> <span class="k">else</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="n">scolumn</span><span class="p">:</span><span class="n">e</span><span class="p">])</span>
<span class="n">scolumn</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">srow</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_selection_coords</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="p">(</span><span class="n">srow</span><span class="p">,</span> <span class="n">scolumn</span><span class="p">),</span> <span class="p">(</span><span class="n">erow</span><span class="p">,</span> <span class="n">ecolumn</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span>
<span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span><span class="p">),</span>
<span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">srow</span><span class="p">,</span> <span class="n">scolumn</span><span class="p">,</span> <span class="n">erow</span><span class="p">,</span> <span class="n">ecolumn</span>
<span class="k">def</span> <span class="nf">_update_selection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_start</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sel_end</span><span class="p">:</span>
<span class="k">for</span> <span class="n">rect</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_iter_selection_rectangles</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span>
<span class="n">SELECTION_COLOR</span><span class="p">,</span>
<span class="n">rect</span><span class="p">,</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">BLEND_RGBA_MULT</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">_iter_selection_rectangles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">):</span>
<span class="n">srow</span><span class="p">,</span> <span class="n">scolumn</span><span class="p">,</span> <span class="n">erow</span><span class="p">,</span> <span class="n">ecolumn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selection_coords</span><span class="p">()</span>
<span class="k">if</span> <span class="n">srow</span> <span class="o">==</span> <span class="n">erow</span><span class="p">:</span>
<span class="k">yield</span> <span class="p">(</span>
<span class="n">scolumn</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(</span><span class="n">srow</span><span class="p">),</span>
<span class="p">(</span><span class="n">ecolumn</span> <span class="o">-</span> <span class="n">scolumn</span><span class="p">)</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span>
<span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="p">)</span>
<span class="k">return</span>
<span class="n">lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">srow</span><span class="p">:</span><span class="n">erow</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">2</span>
<span class="n">first_line</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">yield</span> <span class="p">(</span>
<span class="n">scolumn</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(</span><span class="n">srow</span><span class="p">),</span>
<span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">first_line</span><span class="p">)</span> <span class="o">-</span> <span class="n">scolumn</span><span class="p">)</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span>
<span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="p">)</span>
<span class="k">yield</span> <span class="p">(</span>
<span class="mi">0</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(</span><span class="n">erow</span><span class="p">),</span>
<span class="n">ecolumn</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span>
<span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
<span class="n">srow</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">yield</span> <span class="p">(</span>
<span class="mi">0</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(</span><span class="n">srow</span><span class="p">),</span>
<span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="o">*</span> <span class="n">FONT</span><span class="o">.</span><span class="n">char_w</span><span class="p">,</span>
<span class="n">FONT</span><span class="o">.</span><span class="n">line_h</span>
<span class="p">)</span>
<span class="c1"># Key Handlers</span>
<span class="k">def</span> <span class="nf">_printable_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">uch</span><span class="p">,</span> <span class="n">_mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">uch</span> <span class="o">+</span> <span class="n">line</span><span class="p">[</span><span class="n">i</span><span class="p">:]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(),</span> <span class="n">line</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_backspace_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">i</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="p">[:</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">line</span><span class="p">[</span><span class="n">i</span><span class="p">:]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(),</span> <span class="n">line</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">:</span>
<span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span>
<span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span><span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span><span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">left</span> <span class="o">+</span> <span class="n">right</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">left</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">_delete_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">line</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">screen_y</span><span class="p">(),</span> <span class="n">line</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span>
<span class="n">left</span><span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">y</span><span class="p">:</span><span class="n">y</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">y</span><span class="p">:</span><span class="n">y</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">left</span> <span class="o">+</span> <span class="n">right</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="n">res</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span> <span class="nf">_arrow_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_UP</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">up</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_DOWN</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">down</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_LEFT</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">left</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_RIGHT</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">right</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_return_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_mod</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="c1"># Ignore the mods for now.</span>
<span class="n">n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">n</span><span class="p">:</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="p">[:</span><span class="n">i</span><span class="p">],</span> <span class="n">line</span><span class="p">[</span><span class="n">i</span><span class="p">:]]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">at_line</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">h_in_lines</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">scroll_up</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_insert_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">_line</span><span class="p">,</span> <span class="n">_i</span><span class="p">):</span>
<span class="n">om</span> <span class="o">=</span> <span class="n">OpenMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;stack.pickle&#39;</span><span class="p">)</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">om</span><span class="p">)</span>
<span class="k">if</span> <span class="n">om</span><span class="o">.</span><span class="n">status</span> <span class="o">!=</span> <span class="n">SUCCESS</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">stack</span> <span class="o">=</span> <span class="n">om</span><span class="o">.</span><span class="n">thing</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">stack</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">format_stack_item</span><span class="p">(</span><span class="n">stack</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">content</span><span class="p">):</span>
<span class="k">if</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_SHIFT</span><span class="p">:</span>
<span class="n">display</span><span class="o">.</span><span class="n">broadcast</span><span class="p">(</span><span class="n">CommandMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;pop&#39;</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">basestring</span><span class="p">),</span> <span class="nb">repr</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">if</span> <span class="n">content</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="n">row</span><span class="p">,</span> <span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span>
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">row</span><span class="p">]</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">(</span><span class="n">line</span><span class="p">[:</span><span class="n">column</span><span class="p">]</span> <span class="o">+</span> <span class="n">content</span> <span class="o">+</span> <span class="n">line</span><span class="p">[</span><span class="n">column</span><span class="p">:])</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="n">row</span><span class="p">:</span><span class="n">row</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">lines</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">row</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="o">+</span> <span class="n">column</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">fade</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lines</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">cursor</span><span class="o">.</span><span class="n">y</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">content</span><span class="p">)</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>
@@ -0,0 +1,345 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>joy.vui.viewer &#8212; Joy VUI 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for joy.vui.viewer</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="c1">#</span>
<span class="c1"># Copyright © 2019 Simon Forman</span>
<span class="c1">#</span>
<span class="c1"># This file is part of joy.py</span>
<span class="c1">#</span>
<span class="c1"># joy.py is free software: you can redistribute it and/or modify</span>
<span class="c1"># it under the terms of the GNU General Public License as published by</span>
<span class="c1"># the Free Software Foundation, either version 3 of the License, or</span>
<span class="c1"># (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># joy.py is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with joy.py. If not see &lt;http://www.gnu.org/licenses/&gt;.</span>
<span class="c1">#</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Viewer</span>
<span class="sd">=================</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">joy.vui.core</span> <span class="k">import</span> <span class="n">BACKGROUND</span><span class="p">,</span> <span class="n">FOREGROUND</span>
<div class="viewcode-block" id="Viewer"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.Viewer">[docs]</a><span class="k">class</span> <span class="nc">Viewer</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Base Viewer class</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">MINIMUM_HEIGHT</span> <span class="o">=</span> <span class="mi">11</span>
<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">surface</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="n">surface</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_touch</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">=</span> <span class="n">surface</span><span class="o">.</span><span class="n">get_width</span><span class="p">(),</span> <span class="n">surface</span><span class="o">.</span><span class="n">get_height</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span> <span class="o">=</span> <span class="n">surface</span>
<div class="viewcode-block" id="Viewer.split"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.Viewer.split">[docs]</a> <span class="k">def</span> <span class="nf">split</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Split the viewer at the y coordinate (which is relative to the</span>
<span class="sd"> viewer&#39;s surface and must be inside it somewhere) and return the</span>
<span class="sd"> remaining height. The upper part of the viewer remains (and gets</span>
<span class="sd"> redrawn on a new surface) and the lower space is now available</span>
<span class="sd"> for e.g. a new viewer.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">assert</span> <span class="n">y</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span>
<span class="n">new_viewer_h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">-</span> <span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span><span class="p">,</span> <span class="n">y</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_touch</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_touch</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="k">return</span> <span class="n">new_viewer_h</span></div>
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="k">assert</span> <span class="bp">self</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">sender</span>
<span class="k">pass</span>
<div class="viewcode-block" id="Viewer.draw"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.Viewer.draw">[docs]</a> <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Draw the viewer onto its surface.&#39;&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">BACKGROUND</span><span class="p">)</span>
<span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">-</span> <span class="mi">1</span>
<span class="c1"># Right-hand side.</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="p">,</span> <span class="n">FOREGROUND</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">h</span><span class="p">))</span>
<span class="c1"># Between header and body.</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="p">,</span> <span class="n">FOREGROUND</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">))</span>
<span class="c1"># Bottom.</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">line</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="p">,</span> <span class="n">FOREGROUND</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">h</span><span class="p">))</span></div>
<div class="viewcode-block" id="Viewer.close"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.Viewer.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Close the viewer and release any resources, etc...&#39;&#39;&#39;</span></div>
<span class="k">def</span> <span class="nf">focus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">unfocus</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="c1"># Event handling.</span>
<span class="k">def</span> <span class="nf">mouse_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last_touch</span> <span class="o">=</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span>
<span class="k">def</span> <span class="nf">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">button0</span><span class="p">,</span> <span class="n">button1</span><span class="p">,</span> <span class="n">button2</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">key_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_q</span> <span class="ow">and</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_CTRL</span><span class="p">:</span> <span class="c1"># Ctrl-q</span>
<span class="n">display</span><span class="o">.</span><span class="n">close_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="n">pygame</span><span class="o">.</span><span class="n">K_g</span> <span class="ow">and</span> <span class="n">mod</span> <span class="o">&amp;</span> <span class="n">pygame</span><span class="o">.</span><span class="n">KMOD_CTRL</span><span class="p">:</span> <span class="c1"># Ctrl-g</span>
<span class="n">display</span><span class="o">.</span><span class="n">grow_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">key_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">uch</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MenuViewer"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.MenuViewer">[docs]</a><span class="k">class</span> <span class="nc">MenuViewer</span><span class="p">(</span><span class="n">Viewer</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> MenuViewer class</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">MINIMUM_HEIGHT</span> <span class="o">=</span> <span class="mi">26</span>
<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">surface</span><span class="p">):</span>
<span class="n">Viewer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bg</span> <span class="o">=</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">100</span>
<span class="k">def</span> <span class="nf">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">):</span>
<span class="n">Viewer</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="n">n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span> <span class="o">-</span> <span class="mi">2</span>
<span class="bp">self</span><span class="o">.</span><span class="n">close_rect</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">Rect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">-</span> <span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">grow_rect</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">Rect</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span> <span class="o">=</span> <span class="n">pygame</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">Rect</span><span class="p">(</span>
<span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">h</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
<div class="viewcode-block" id="MenuViewer.draw"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.MenuViewer.draw">[docs]</a> <span class="k">def</span> <span class="nf">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;Draw the viewer onto its surface.&#39;&#39;&#39;</span>
<span class="n">Viewer</span><span class="o">.</span><span class="n">draw</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">resizing</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_menu</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_body</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">draw_menu</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># menu buttons</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">rect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="p">,</span> <span class="n">FOREGROUND</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_rect</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">rect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="p">,</span> <span class="n">FOREGROUND</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">grow_rect</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">draw_body</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bg</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">mouse_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="n">Viewer</span><span class="o">.</span><span class="n">mouse_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">)</span>
<span class="k">if</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">MINIMUM_HEIGHT</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">menu_click</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">bx</span><span class="p">,</span> <span class="n">by</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_rect</span><span class="o">.</span><span class="n">topleft</span>
<span class="bp">self</span><span class="o">.</span><span class="n">body_click</span><span class="p">(</span><span class="n">display</span><span class="p">,</span> <span class="n">x</span> <span class="o">-</span> <span class="n">bx</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="n">by</span><span class="p">,</span> <span class="n">button</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">body_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw_an_a</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">menu_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_rect</span><span class="o">.</span><span class="n">collidepoint</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="n">display</span><span class="o">.</span><span class="n">close_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">grow_rect</span><span class="o">.</span><span class="n">collidepoint</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="n">display</span><span class="o">.</span><span class="n">grow_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">button</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">resizing</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
<span class="n">display</span><span class="o">.</span><span class="n">done_resizing</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">rel_x</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span> <span class="n">button0</span><span class="p">,</span> <span class="n">button1</span><span class="p">,</span> <span class="n">button2</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="ow">and</span> <span class="n">button0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">display</span><span class="o">.</span><span class="n">change_viewer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span> <span class="n">relative</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizing</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1">#self.draw_an_a(x, y)</span>
<span class="k">def</span> <span class="nf">key_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">if</span> <span class="n">Viewer</span><span class="o">.</span><span class="n">key_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">draw_an_a</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="c1"># Draw a crude letter A.</span>
<span class="n">lw</span><span class="p">,</span> <span class="n">lh</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">14</span>
<span class="k">try</span><span class="p">:</span> <span class="n">surface</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">surface</span><span class="o">.</span><span class="n">subsurface</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="n">lw</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="n">lh</span><span class="p">,</span> <span class="n">lw</span><span class="p">,</span> <span class="n">lh</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="k">return</span>
<span class="n">draw_a</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">blend</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="SomeViewer"><a class="viewcode-back" href="../../../viewer.html#joy.vui.viewer.SomeViewer">[docs]</a><span class="k">class</span> <span class="nc">SomeViewer</span><span class="p">(</span><span class="n">MenuViewer</span><span class="p">):</span>
<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">surface</span><span class="p">):</span>
<span class="n">MenuViewer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">):</span>
<span class="n">MenuViewer</span><span class="o">.</span><span class="n">resurface</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">surface</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">draw_menu</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">MenuViewer</span><span class="o">.</span><span class="n">draw_menu</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">draw_body</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">body_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">menu_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">MenuViewer</span><span class="o">.</span><span class="n">menu_click</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">if</span> <span class="n">MenuViewer</span><span class="o">.</span><span class="n">mouse_up</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">button</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">rel_x</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span> <span class="n">button0</span><span class="p">,</span> <span class="n">button1</span><span class="p">,</span> <span class="n">button2</span><span class="p">):</span>
<span class="k">if</span> <span class="n">MenuViewer</span><span class="o">.</span><span class="n">mouse_motion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">rel_x</span><span class="p">,</span> <span class="n">rel_y</span><span class="p">,</span>
<span class="n">button0</span><span class="p">,</span> <span class="n">button1</span><span class="p">,</span> <span class="n">button2</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">key_down</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">display</span><span class="p">,</span> <span class="n">uch</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">mod</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span> <span class="nb">chr</span><span class="p">(</span><span class="n">key</span><span class="p">),</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">pass</span></div>
<span class="c1"># Note that Oberon book says that if you split at the exact top of a viewer</span>
<span class="c1"># it should close, and I think this implies the new viewer gets the old</span>
<span class="c1"># viewer&#39;s whole height. I haven&#39;t implemented that yet, so the edge-case</span>
<span class="c1"># in the code is broken by &quot;intent&quot; for now..</span>
<span class="k">def</span> <span class="nf">draw_a</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">FOREGROUND</span><span class="p">,</span> <span class="n">blend</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">=</span> <span class="n">surface</span><span class="o">.</span><span class="n">get_width</span><span class="p">()</span> <span class="o">-</span> <span class="mi">2</span><span class="p">,</span> <span class="n">surface</span><span class="o">.</span><span class="n">get_height</span><span class="p">()</span> <span class="o">-</span> <span class="mi">2</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">draw</span><span class="o">.</span><span class="n">aalines</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="p">(</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="n">w</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">h</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
<span class="p">),</span> <span class="n">blend</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../index.html">Joy VUI</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../core.html">Core</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../main.html">Main Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display.html">Display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../viewer.html">Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../text_viewer.html">Text Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../stack_viewer.html">Stack Viewer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../persist_task.html">Persist Task</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
<li><a href="../../index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simon Forman.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
</div>
</body>
</html>