<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.sugarlabs.org/index.php?action=history&amp;feed=atom&amp;title=Activity_Team%2FSample_code%2FRuler</id>
	<title>Activity Team/Sample code/Ruler - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sugarlabs.org/index.php?action=history&amp;feed=atom&amp;title=Activity_Team%2FSample_code%2FRuler"/>
	<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;action=history"/>
	<updated>2026-05-14T10:25:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=47054&amp;oldid=prev</id>
		<title>Patrol: moved Walter is a wanker 10/Sample code/Ruler to Activity Team/Sample code/Ruler over redirect: revert</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=47054&amp;oldid=prev"/>
		<updated>2010-02-24T01:43:42Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/index.php?title=Walter_is_a_wanker_10/Sample_code/Ruler&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Walter is a wanker 10/Sample code/Ruler (page does not exist)&quot;&gt;Walter is a wanker 10/Sample code/Ruler&lt;/a&gt; to &lt;a href=&quot;/go/Activity_Team/Sample_code/Ruler&quot; title=&quot;Activity Team/Sample code/Ruler&quot;&gt;Activity Team/Sample code/Ruler&lt;/a&gt; over redirect: revert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:43, 23 February 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Patrol</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=46341&amp;oldid=prev</id>
		<title>Page move vandal: moved Activity Team/Sample code/Ruler to Walter is a wanker 10/Sample code/Ruler:&amp;#32;Walter is a wanker</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=46341&amp;oldid=prev"/>
		<updated>2010-02-24T00:20:13Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/go/Activity_Team/Sample_code/Ruler&quot; title=&quot;Activity Team/Sample code/Ruler&quot;&gt;Activity Team/Sample code/Ruler&lt;/a&gt; to &lt;a href=&quot;/index.php?title=Walter_is_a_wanker_10/Sample_code/Ruler&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Walter is a wanker 10/Sample code/Ruler (page does not exist)&quot;&gt;Walter is a wanker 10/Sample code/Ruler&lt;/a&gt;: Walter is a wanker&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 20:20, 23 February 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Page move vandal</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39355&amp;oldid=prev</id>
		<title>MartinDengler: more --&gt; most, for sense</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39355&amp;oldid=prev"/>
		<updated>2009-10-20T10:35:25Z</updated>

		<summary type="html">&lt;p&gt;more --&amp;gt; most, for sense&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:35, 20 October 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://git.sugarlabs.org/projects/ruler/repos/mainline/trees/master Ruler] is a simple activity that uses Cairo graphics. It is also an example of how to use both the new (0.86+) and old (pre-0,86) toolbar, and simple Journal interaction. Not the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;more &lt;/del&gt;beautiful code, but it works.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://git.sugarlabs.org/projects/ruler/repos/mainline/trees/master Ruler] is a simple activity that uses Cairo graphics. It is also an example of how to use both the new (0.86+) and old (pre-0,86) toolbar, and simple Journal interaction. Not the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;most &lt;/ins&gt;beautiful code, but it works.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Misc. imports. Note that we catch an exception if the new 0.86 toolbars aren&amp;#039;t available.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Misc. imports. Note that we catch an exception if the new 0.86 toolbars aren&amp;#039;t available.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>MartinDengler</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39342&amp;oldid=prev</id>
		<title>Walter at 22:56, 19 October 2009</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39342&amp;oldid=prev"/>
		<updated>2009-10-19T22:56:38Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:56, 19 October 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l41&quot;&gt;Line 41:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 41:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import show_angles&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import show_angles&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SERVICE = &#039;org.sugarlabs.RulerActivity&#039;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;IFACE = SERVICE&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;PATH = &#039;/org/augarlabs/RulerActivity&#039;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Walter</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39340&amp;oldid=prev</id>
		<title>Walter: moved Ruler to Activity Team/Sample code/Ruler:&amp;#32;moving to under the Activity Team pages</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39340&amp;oldid=prev"/>
		<updated>2009-10-19T22:54:58Z</updated>

		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/index.php?title=Ruler&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Ruler (page does not exist)&quot;&gt;Ruler&lt;/a&gt; to &lt;a href=&quot;/go/Activity_Team/Sample_code/Ruler&quot; title=&quot;Activity Team/Sample code/Ruler&quot;&gt;Activity Team/Sample code/Ruler&lt;/a&gt;: moving to under the Activity Team pages&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:54, 19 October 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Walter</name></author>
	</entry>
	<entry>
		<id>https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39338&amp;oldid=prev</id>
		<title>Walter: Created page with &#039;[http://git.sugarlabs.org/projects/ruler/repos/mainline/trees/master Ruler] is a simple activity that uses Cairo graphics. It is also an example of how to use both the new (0.86+…&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.sugarlabs.org/index.php?title=Activity_Team/Sample_code/Ruler&amp;diff=39338&amp;oldid=prev"/>
		<updated>2009-10-19T22:52:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;[http://git.sugarlabs.org/projects/ruler/repos/mainline/trees/master Ruler] is a simple activity that uses Cairo graphics. It is also an example of how to use both the new (0.86+…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[http://git.sugarlabs.org/projects/ruler/repos/mainline/trees/master Ruler] is a simple activity that uses Cairo graphics. It is also an example of how to use both the new (0.86+) and old (pre-0,86) toolbar, and simple Journal interaction. Not the more beautiful code, but it works.&lt;br /&gt;
&lt;br /&gt;
Misc. imports. Note that we catch an exception if the new 0.86 toolbars aren&amp;#039;t available.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import pygtk&lt;br /&gt;
pygtk.require(&amp;#039;2.0&amp;#039;)&lt;br /&gt;
import gtk&lt;br /&gt;
import gobject&lt;br /&gt;
import cairo&lt;br /&gt;
import os.path&lt;br /&gt;
&lt;br /&gt;
import sugar&lt;br /&gt;
from sugar.activity import activity&lt;br /&gt;
try: # 0.86+ toolbar widgets&lt;br /&gt;
    from sugar.bundle.activitybundle import ActivityBundle&lt;br /&gt;
    from sugar.activity.widgets import ActivityToolbarButton&lt;br /&gt;
    from sugar.activity.widgets import StopButton&lt;br /&gt;
    from sugar.graphics.toolbarbox import ToolbarBox&lt;br /&gt;
    from sugar.graphics.toolbarbox import ToolbarButton&lt;br /&gt;
except ImportError:&lt;br /&gt;
    pass&lt;br /&gt;
from sugar.graphics.toolbutton import ToolButton&lt;br /&gt;
from sugar.graphics.menuitem import MenuItem&lt;br /&gt;
from sugar.graphics.icon import Icon&lt;br /&gt;
from sugar.datastore import datastore&lt;br /&gt;
try:&lt;br /&gt;
    from sugar.graphics import style&lt;br /&gt;
    GRID_CELL_SIZE = style.GRID_CELL_SIZE&lt;br /&gt;
except:&lt;br /&gt;
    GRID_CELL_SIZE = 0&lt;br /&gt;
&lt;br /&gt;
import logging&lt;br /&gt;
_logger = logging.getLogger(&amp;quot;ruler-activity&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
from gettext import gettext as _&lt;br /&gt;
&lt;br /&gt;
import util&lt;br /&gt;
import show_rulers&lt;br /&gt;
import show_grids&lt;br /&gt;
import show_checkers&lt;br /&gt;
import show_angles&lt;br /&gt;
&lt;br /&gt;
SERVICE = &amp;#039;org.sugarlabs.RulerActivity&amp;#039;&lt;br /&gt;
IFACE = SERVICE&lt;br /&gt;
PATH = &amp;#039;/org/augarlabs/RulerActivity&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Cairo canvas event handler. All the drawing happens in here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Create a GTK+ widget on which we will draw using Cairo&lt;br /&gt;
class MyCanvas(gtk.DrawingArea):&lt;br /&gt;
&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        gtk.DrawingArea.__init__(self)&lt;br /&gt;
        self._draw_ruler = False&lt;br /&gt;
        self._object = None&lt;br /&gt;
        self.connect(&amp;#039;expose-event&amp;#039;, self.__expose_event_cb)&lt;br /&gt;
        self.dpi = 200&lt;br /&gt;
&lt;br /&gt;
    def __expose_event_cb(self, drawing_area, event):&lt;br /&gt;
        cr = self.window.cairo_create()&lt;br /&gt;
&lt;br /&gt;
        if self._draw_ruler:&lt;br /&gt;
            # draw lines to create a star&lt;br /&gt;
            self._object.draw(cr,self._dpi)&lt;br /&gt;
&lt;br /&gt;
        # Restrict Cairo to the exposed area; avoid extra work&lt;br /&gt;
        cr.rectangle(event.area.x, event.area.y,&lt;br /&gt;
                     event.area.width, event.area.height)&lt;br /&gt;
        cr.clip()&lt;br /&gt;
&lt;br /&gt;
    def add_a_ruler(self,r):&lt;br /&gt;
        self._draw_ruler = True&lt;br /&gt;
        self._object = r&lt;br /&gt;
        self.queue_draw()     &lt;br /&gt;
&lt;br /&gt;
    def get_dpi(self):&lt;br /&gt;
        return self._dpi&lt;br /&gt;
&lt;br /&gt;
    def set_dpi(self, dpi):&lt;br /&gt;
        self._dpi = dpi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The main activity.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Sugar activity&lt;br /&gt;
#&lt;br /&gt;
class RulerActivity(activity.Activity):&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, handle):&lt;br /&gt;
        super(RulerActivity,self).__init__(handle)&lt;br /&gt;
&lt;br /&gt;
        _font = &amp;#039;helvetica 12&amp;#039;&lt;br /&gt;
        _font_bold = &amp;#039;helvetica bold 12&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        #&lt;br /&gt;
        # We need a canvas&lt;br /&gt;
        #&lt;br /&gt;
        self._canvas = MyCanvas()&lt;br /&gt;
        self.set_canvas(self._canvas)&lt;br /&gt;
        self._canvas.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How to find out the size of the canvas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        _width = gtk.gdk.screen_width()&lt;br /&gt;
        _height = gtk.gdk.screen_height()-GRID_CELL_SIZE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check to see if there is metadata available. Since we are not using file data, we don&amp;#039;t need to use &amp;lt;code&amp;gt;read_file&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # Read the dpi from the Journal&lt;br /&gt;
        try:&lt;br /&gt;
            dpi = self.metadata[&amp;#039;dpi&amp;#039;]&lt;br /&gt;
            _logger.debug(&amp;quot;Read dpi: &amp;quot; + str(dpi))&lt;br /&gt;
            self._canvas.set_dpi(int(dpi))&lt;br /&gt;
        except:&lt;br /&gt;
            if os.path.exists(&amp;#039;/sys/power/olpc-pm&amp;#039;):&lt;br /&gt;
                self._canvas.set_dpi(200) # OLPC XO&lt;br /&gt;
            else:&lt;br /&gt;
                self._canvas.set_dpi(100) # Just a guess&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Initialize the subclasses used for drawing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        # Create instances of our graphics&lt;br /&gt;
        self._r = show_rulers.ScreenOfRulers(_font,_font_bold,_width,_height)&lt;br /&gt;
        self._gcm = show_grids.ScreenGrid_cm(_font,_font_bold,_width,_height)&lt;br /&gt;
        self._gmm = show_grids.ScreenGrid_mm(_font,_font_bold,_width,_height)&lt;br /&gt;
        self._a90 = show_angles.Angles90(_font,_font_bold,_width,_height)&lt;br /&gt;
        self._a360 = show_angles.Angles360(_font,_font_bold,_width,_height)&lt;br /&gt;
        self._c = show_checkers.ScreenOfCircles(_font,_font_bold,_width,_height)&lt;br /&gt;
&lt;br /&gt;
        # start with a ruler&lt;br /&gt;
        self._current = self._r&lt;br /&gt;
        self._canvas.add_a_ruler(self._current)&lt;br /&gt;
&lt;br /&gt;
        # other settings&lt;br /&gt;
        self._grids_mode = &amp;quot;cm&amp;quot;&lt;br /&gt;
        self._angles_mode = &amp;quot;90&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We&amp;#039;ll get a NameError if the new toolbars are not available.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        #&lt;br /&gt;
        # We need some toolbars&lt;br /&gt;
        #&lt;br /&gt;
        try:&lt;br /&gt;
            # Use 0.86 toolbar design&lt;br /&gt;
            toolbar_box = ToolbarBox()&lt;br /&gt;
&lt;br /&gt;
            # Buttons added to the Activity toolbar&lt;br /&gt;
            activity_button = ActivityToolbarButton(self)&lt;br /&gt;
            toolbar_box.toolbar.insert(activity_button, 0)&lt;br /&gt;
            activity_button.show()&lt;br /&gt;
&lt;br /&gt;
            # Show rulers&lt;br /&gt;
            self.rulers = ToolButton( &amp;quot;ruler&amp;quot; )&lt;br /&gt;
            self.rulers.set_tooltip(_(&amp;#039;Ruler&amp;#039;))&lt;br /&gt;
            self.rulers.props.sensitive = True&lt;br /&gt;
            self.rulers.connect(&amp;#039;clicked&amp;#039;, self._rulers_cb)&lt;br /&gt;
            toolbar_box.toolbar.insert(self.rulers, -1)&lt;br /&gt;
            self.rulers.show()&lt;br /&gt;
&lt;br /&gt;
            # Show grids&lt;br /&gt;
            self.grids = ToolButton( &amp;quot;grid-a&amp;quot; )&lt;br /&gt;
            self.grids.set_tooltip(_(&amp;#039;Grid&amp;#039;))&lt;br /&gt;
            self.grids.props.sensitive = True&lt;br /&gt;
            self.grids.connect(&amp;#039;clicked&amp;#039;, self._grids_cb)&lt;br /&gt;
            toolbar_box.toolbar.insert(self.grids, -1)&lt;br /&gt;
            self.grids.show()&lt;br /&gt;
&lt;br /&gt;
            # Show angles&lt;br /&gt;
            self.angles = ToolButton( &amp;quot;angles-90&amp;quot; )&lt;br /&gt;
            self.angles.set_tooltip(_(&amp;#039;Angles&amp;#039;))&lt;br /&gt;
            self.angles.props.sensitive = True&lt;br /&gt;
            self.angles.connect(&amp;#039;clicked&amp;#039;, self._angles_cb)&lt;br /&gt;
            toolbar_box.toolbar.insert(self.angles, -1)&lt;br /&gt;
            self.angles.show()&lt;br /&gt;
&lt;br /&gt;
            # Show checker&lt;br /&gt;
            self.checker = ToolButton( &amp;quot;checker&amp;quot; )&lt;br /&gt;
            self.checker.set_tooltip(_(&amp;#039;Checker&amp;#039;))&lt;br /&gt;
            self.checker.props.sensitive = True&lt;br /&gt;
            self.checker.connect(&amp;#039;clicked&amp;#039;, self._checker_cb)&lt;br /&gt;
            toolbar_box.toolbar.insert(self.checker, -1)&lt;br /&gt;
            self.checker.show()&lt;br /&gt;
&lt;br /&gt;
            separator = gtk.SeparatorToolItem()&lt;br /&gt;
            separator.show()&lt;br /&gt;
            toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
&lt;br /&gt;
            dpi = self._canvas.get_dpi()&lt;br /&gt;
            self._dpi_spin_adj = gtk.Adjustment(dpi, 72, 200, 2, 32, 0)&lt;br /&gt;
            self._dpi_spin = gtk.SpinButton(self._dpi_spin_adj, 0, 0)&lt;br /&gt;
            self._dpi_spin_id = self._dpi_spin.connect(&amp;#039;value-changed&amp;#039;,&lt;br /&gt;
                                                       self._dpi_spin_cb)&lt;br /&gt;
            self._dpi_spin.set_numeric(True)&lt;br /&gt;
            self._dpi_spin.show()&lt;br /&gt;
            self.tool_item_dpi = gtk.ToolItem()&lt;br /&gt;
            self.tool_item_dpi.add(self._dpi_spin)&lt;br /&gt;
            toolbar_box.toolbar.insert(self.tool_item_dpi, -1)&lt;br /&gt;
            self.tool_item_dpi.show()&lt;br /&gt;
&lt;br /&gt;
            separator = gtk.SeparatorToolItem()&lt;br /&gt;
            separator.props.draw = False&lt;br /&gt;
            separator.set_expand(True)&lt;br /&gt;
            separator.show()&lt;br /&gt;
            toolbar_box.toolbar.insert(separator, -1)&lt;br /&gt;
&lt;br /&gt;
            # The ever-present Stop Button&lt;br /&gt;
            stop_button = StopButton(self)&lt;br /&gt;
            stop_button.props.accelerator = &amp;#039;&amp;lt;Ctrl&amp;gt;Q&amp;#039;&lt;br /&gt;
            toolbar_box.toolbar.insert(stop_button, -1)&lt;br /&gt;
            stop_button.show()&lt;br /&gt;
&lt;br /&gt;
            self.set_toolbar_box(toolbar_box)&lt;br /&gt;
            toolbar_box.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The old toolbars...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        except NameError:&lt;br /&gt;
            # Use pre-0.86 toolbar design&lt;br /&gt;
            toolbox = activity.ActivityToolbox(self)&lt;br /&gt;
            self.set_toolbox(toolbox)&lt;br /&gt;
&lt;br /&gt;
            self.projectToolbar = ProjectToolbar(self)&lt;br /&gt;
            toolbox.add_toolbar( _(&amp;#039;Rulers&amp;#039;), self.projectToolbar )&lt;br /&gt;
&lt;br /&gt;
            toolbox.show()&lt;br /&gt;
            toolbox.set_current_toolbar(1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Without this &amp;lt;code&amp;gt;show_all()&amp;lt;/code&amp;gt; the toolbars won&amp;#039;t be drawn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        self.show_all() &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Button call-backs that talk to the Cairo canvas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    #&lt;br /&gt;
    # Button callbacks&lt;br /&gt;
    #&lt;br /&gt;
    def _rulers_cb(self, button):&lt;br /&gt;
        self._current = self._r&lt;br /&gt;
        self._canvas.add_a_ruler(self._current)&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def _grids_cb(self, button):&lt;br /&gt;
        if self._grids_mode == &amp;quot;cm&amp;quot;:&lt;br /&gt;
            self._current = self._gcm&lt;br /&gt;
            self.grids.set_icon(&amp;quot;grid-c&amp;quot;)&lt;br /&gt;
            self._grids_mode = &amp;quot;mm&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            self._current = self._gmm&lt;br /&gt;
            self.grids.set_icon(&amp;quot;grid-a&amp;quot;)&lt;br /&gt;
            self._grids_mode = &amp;quot;cm&amp;quot;&lt;br /&gt;
        self._canvas.add_a_ruler(self._current)&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def _angles_cb(self, button):&lt;br /&gt;
        if self._angles_mode == &amp;quot;90&amp;quot;:&lt;br /&gt;
            self._current = self._a90&lt;br /&gt;
            self.angles.set_icon(&amp;quot;angles-360&amp;quot;)&lt;br /&gt;
            self._angles_mode = &amp;quot;360&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            self._current = self._a360&lt;br /&gt;
            self.angles.set_icon(&amp;quot;angles-90&amp;quot;)&lt;br /&gt;
            self._angles_mode = &amp;quot;90&amp;quot;&lt;br /&gt;
        self._canvas.add_a_ruler(self._current)&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def _checker_cb(self, button):&lt;br /&gt;
        self._current = self._c&lt;br /&gt;
        self._canvas.add_a_ruler(self._current)&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    def _dpi_spin_cb(self, button):&lt;br /&gt;
        self._canvas.set_dpi(self._dpi_spin.get_value_as_int())&lt;br /&gt;
        self._canvas.add_a_ruler(self._current)&lt;br /&gt;
        return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Saving metadata to the Journal: &amp;lt;code&amp;gt;write_file&amp;lt;/code&amp;gt; gets called automatically when your activity is exited.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Write the dpi to the Journal&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def write_file(self, file_path):&lt;br /&gt;
        dpi =  self._canvas.get_dpi()&lt;br /&gt;
        _logger.debug(&amp;quot;Write dpi: &amp;quot; + str(dpi))&lt;br /&gt;
        self.metadata[&amp;#039;dpi&amp;#039;] = str(dpi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code handles the pre-0.86 toolbars&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Project toolbar for pre-0.86 toolbars&lt;br /&gt;
#&lt;br /&gt;
class ProjectToolbar(gtk.Toolbar):&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, pc):&lt;br /&gt;
        gtk.Toolbar.__init__(self)&lt;br /&gt;
        self.activity = pc&lt;br /&gt;
&lt;br /&gt;
        # Ruler&lt;br /&gt;
        self.activity.rulers = ToolButton( &amp;quot;ruler&amp;quot; )&lt;br /&gt;
        self.activity.rulers.set_tooltip(_(&amp;#039;Ruler&amp;#039;))&lt;br /&gt;
        self.activity.rulers.props.sensitive = True&lt;br /&gt;
        self.activity.rulers.connect(&amp;#039;clicked&amp;#039;, self.activity._rulers_cb)&lt;br /&gt;
        self.insert(self.activity.rulers, -1)&lt;br /&gt;
        self.activity.rulers.show()&lt;br /&gt;
&lt;br /&gt;
        # Grid&lt;br /&gt;
        self.activity.grids = ToolButton( &amp;quot;grid-a&amp;quot; )&lt;br /&gt;
        self.activity.grids.set_tooltip(_(&amp;#039;Grid&amp;#039;))&lt;br /&gt;
        self.activity.grids.props.sensitive = True&lt;br /&gt;
        self.activity.grids.connect(&amp;#039;clicked&amp;#039;, self.activity._grids_cb)&lt;br /&gt;
        self.insert(self.activity.grids, -1)&lt;br /&gt;
        self.activity.grids.show()&lt;br /&gt;
&lt;br /&gt;
        # Angles&lt;br /&gt;
        self.activity.angles = ToolButton( &amp;quot;angles-90&amp;quot; )&lt;br /&gt;
        self.activity.angles.set_tooltip(_(&amp;#039;Angles&amp;#039;))&lt;br /&gt;
        self.activity.angles.props.sensitive = True&lt;br /&gt;
        self.activity.angles.connect(&amp;#039;clicked&amp;#039;, self.activity._angles_cb)&lt;br /&gt;
        self.insert(self.activity.angles, -1)&lt;br /&gt;
        self.activity.angles.show()&lt;br /&gt;
&lt;br /&gt;
        # Checker&lt;br /&gt;
        self.activity.checker = ToolButton( &amp;quot;checker&amp;quot; )&lt;br /&gt;
        self.activity.checker.set_tooltip(_(&amp;#039;Checker&amp;#039;))&lt;br /&gt;
        self.activity.checker.props.sensitive = True&lt;br /&gt;
        self.activity.checker.connect(&amp;#039;clicked&amp;#039;, self.activity._checker_cb)&lt;br /&gt;
        self.insert(self.activity.checker, -1)&lt;br /&gt;
        self.activity.checker.show()&lt;br /&gt;
&lt;br /&gt;
        separator = gtk.SeparatorToolItem()&lt;br /&gt;
        separator.set_draw(True)&lt;br /&gt;
        self.insert(separator, -1)&lt;br /&gt;
        separator.show()&lt;br /&gt;
&lt;br /&gt;
        dpi = self.activity._canvas.get_dpi()&lt;br /&gt;
        self.activity._dpi_spin_adj = gtk.Adjustment(dpi, 72, 200, 2, 32, 0)&lt;br /&gt;
        self.activity._dpi_spin = \&lt;br /&gt;
            gtk.SpinButton(self.activity._dpi_spin_adj, 0, 0)&lt;br /&gt;
        self.activity._dpi_spin_id = self.activity._dpi_spin.connect(&lt;br /&gt;
                                    &amp;#039;value-changed&amp;#039;, self.activity._dpi_spin_cb)&lt;br /&gt;
        self.activity._dpi_spin.set_numeric(True)&lt;br /&gt;
        self.activity._dpi_spin.show()&lt;br /&gt;
        self.activity.tool_item_dpi = gtk.ToolItem()&lt;br /&gt;
        self.activity.tool_item_dpi.add(self.activity._dpi_spin)&lt;br /&gt;
        self.insert(self.activity.tool_item_dpi, -1)&lt;br /&gt;
        self.activity.tool_item_dpi.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Walter</name></author>
	</entry>
</feed>