Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activity.py148
-rw-r--r--char.py5
-rw-r--r--document.py10
-rw-r--r--ground.py5
-rw-r--r--icons/mamamedia.svg203
-rw-r--r--messenger.py2
-rw-r--r--montage.py8
-rw-r--r--port/COPYING340
-rw-r--r--port/README18
-rw-r--r--port/__init__.py0
-rw-r--r--port/activity.py305
-rw-r--r--port/chooser.py66
-rw-r--r--port/json.py33
-rw-r--r--port/pixbuf.py213
-rw-r--r--port/scrolledbox.py179
-rw-r--r--port/tarball.py159
-rw-r--r--port/temposlider.py215
-rw-r--r--sound.py3
18 files changed, 306 insertions, 1606 deletions
diff --git a/activity.py b/activity.py
index 970397d..c30a8ce 100644
--- a/activity.py
+++ b/activity.py
@@ -21,8 +21,11 @@ logger = logging.getLogger('cartoon-builder')
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.toggletoolbutton import ToggleToolButton
from sugar.activity.activity import ActivityToolbox
-from port.activity import SharedActivity
-from port.temposlider import TempoSlider
+
+from widgets.temposlider import TempoSlider
+from toolkit.activity import SharedActivity
+from toolkit.toolbarbox import ToolbarBox
+from toolkit.activity_widgets import *
import montage
import lessons
@@ -34,6 +37,7 @@ import theme
from messenger import Messenger, SERVICE
from utils import *
+
class CartoonBuilderActivity(SharedActivity):
def __init__(self, handle):
self.notebook = gtk.Notebook()
@@ -49,20 +53,41 @@ class CartoonBuilderActivity(SharedActivity):
self.lessons.show()
self.notebook.append_page(self.lessons)
- toolbox = ActivityToolbox(self)
+ toolbox = ToolbarBox()
toolbox.show()
- toolbox.connect('current-toolbar-changed', self._toolbar_changed_cb)
- self.set_toolbox(toolbox)
- montage_bar = MontageToolbar(self.montage)
- montage_bar.show()
- toolbox.add_toolbar(_('Montage'), montage_bar)
+ toolbox.toolbar.insert(ActivityToolbarButton(self), -1)
+
+ separator = gtk.SeparatorToolItem()
+ separator.set_draw(False)
+ toolbox.toolbar.insert(separator, -1)
+
+ lessons_button = ToggleToolButton('mamamedia')
+ lessons_button.connect('toggled', self.__toggled_lessons_button_cb)
+ lessons_button.set_tooltip(_('Lessons'))
+ toolbox.toolbar.insert(lessons_button, -1)
+
+ separator = gtk.SeparatorToolItem()
+ separator.set_draw(False)
+ toolbox.toolbar.insert(separator, -1)
+
+ self.notebook_toolbar = gtk.Notebook()
+ self.notebook_toolbar.props.show_border = False
+ self.notebook_toolbar.props.show_tabs = False
+ self.notebook_toolbar.append_page(self._create_montage_toolbar())
+ self.notebook_toolbar.append_page(self._create_lessons_toolbar())
+ self.notebook_toolbar.show()
- lessons_bar = LessonsToolbar()
- lessons_bar.show()
- toolbox.add_toolbar(_('Lessons'), lessons_bar)
+ notebook_item = gtk.ToolItem()
+ notebook_item.set_expand(True)
+ notebook_item.add(self.notebook_toolbar)
+ notebook_item.show()
+ toolbox.toolbar.insert(notebook_item, -1)
- toolbox.set_current_toolbar(1)
+ toolbox.toolbar.insert(StopButton(self), -1)
+
+ toolbox.show_all()
+ self.toolbar_box = toolbox
def new_instance(self):
logger.debug('new_instance')
@@ -84,90 +109,85 @@ class CartoonBuilderActivity(SharedActivity):
logger.debug('share_instance')
self.messenger = Messenger(tube_conn, initiating, self.montage)
- def _toolbar_changed_cb(self, widget, index):
- if index == 2:
- self.notebook.set_current_page(1)
- else:
- self.notebook.set_current_page(0)
-
-class MontageToolbar(gtk.Toolbar):
- def __init__(self, montage):
- gtk.Toolbar.__init__(self)
- self.montage = montage
+ def _create_montage_toolbar(self):
+ toolbar = gtk.Toolbar()
- self.playButton = ToggleToolButton('media-playback-start')
- self.playButton.connect('toggled', self._play_cb)
- self.insert(self.playButton, -1)
- self.playButton.set_tooltip(_('Play / Pause'))
+ playButtonImg = gtk.Image()
+ playButtonImg.show()
+ playButtonImg.set_from_icon_name('media-playback-start',
+ gtk.ICON_SIZE_LARGE_TOOLBAR)
- # Play button Image
- self.playButtonImg = gtk.Image()
- self.playButtonImg.show()
- self.playButtonImg.set_from_icon_name('media-playback-start', gtk.ICON_SIZE_LARGE_TOOLBAR)
+ pauseButtonImg = gtk.Image()
+ pauseButtonImg.show()
+ pauseButtonImg.set_from_icon_name('media-playback-pause',
+ gtk.ICON_SIZE_LARGE_TOOLBAR)
- # Pause button Image
- self.pauseButtonImg = gtk.Image()
- self.pauseButtonImg.show()
- self.pauseButtonImg.set_from_icon_name('media-playback-pause', gtk.ICON_SIZE_LARGE_TOOLBAR)
+ playButton = ToggleToolButton('media-playback-start')
+ playButton.connect('toggled', self.__play_cb, playButtonImg,
+ pauseButtonImg)
+ toolbar.insert(playButton, -1)
+ playButton.set_tooltip(_('Play / Pause'))
tempo = TempoSlider(0, 10)
- tempo.adjustment.connect("value-changed", self._tempo_cb)
+ tempo.adjustment.connect("value-changed", self.__tempo_cb)
tempo.set_size_request(250, -1)
tempo.set_value(5)
tempo_item = gtk.ToolItem()
tempo_item.add(tempo)
- self.insert(tempo_item, -1)
+ toolbar.insert(tempo_item, -1)
separator = gtk.SeparatorToolItem()
- self.insert(separator,-1)
+ toolbar.insert(separator,-1)
clear_tape = ToolButton('sl-reset')
- clear_tape.connect('clicked', self._clear_tape_cb)
+ clear_tape.connect('clicked', self.__clear_tape_cb)
clear_tape.set_tooltip(_('Reset'))
- self.insert(clear_tape, -1)
+ toolbar.insert(clear_tape, -1)
+
+ toolbar.show_all()
- self.show_all()
+ return toolbar
- def _clear_tape_cb(self, widget):
+ def __clear_tape_cb(self, widget):
for i in range(theme.TAPE_COUNT):
self.montage.props.frame = (i, None)
- def _tempo_cb(self, widget):
+ def __tempo_cb(self, widget):
self.montage.set_tempo(widget.value)
- def _play_cb(self, widget):
+ def __play_cb(self, widget, playButtonImg, pauseButtonImg):
if widget.get_active():
- widget.set_icon_widget(self.pauseButtonImg)
+ widget.set_icon_widget(pauseButtonImg)
sound.play()
self.montage.play()
else:
- widget.set_icon_widget(self.playButtonImg)
+ widget.set_icon_widget(playButtonImg)
sound.stop()
self.montage.stop()
-class LessonsToolbar(gtk.Toolbar):
- def __init__(self):
- gtk.Toolbar.__init__(self)
- self._mask = False
+ def _create_lessons_toolbar(self):
+ toolbar = gtk.Toolbar()
for lesson in lessons.THEMES:
- button = gtk.ToggleToolButton()
+ button = gtk.RadioToolButton()
button.set_label(lesson.name)
- button.connect('clicked', self._lessons_cb, lesson)
- self.insert(button, -1)
+ if toolbar.get_n_items():
+ button.props.group = toolbar.get_nth_item(0)
+ button.connect('clicked', self.__lesson_clicked_cb, lesson)
+ toolbar.insert(button, -1)
- self.get_nth_item(0).set_active(True)
- self.show_all()
+ toolbar.get_nth_item(0).set_active(True)
+ toolbar.show_all()
- def _lessons_cb(self, widget, lesson):
- if self._mask:
- return
- self._mask = True
+ return toolbar
- for i, j in enumerate(lessons.THEMES):
- if j != lesson:
- self.get_nth_item(i).set_active(False)
-
- widget.props.active = True
+ def __lesson_clicked_cb(self, widget, lesson):
lesson.change()
- self._mask = False
+
+ def __toggled_lessons_button_cb(self, button):
+ page = button.props.active and 1 or 0
+ self.notebook_toolbar.set_current_page(page)
+ self.notebook.set_current_page(page)
+
+ sound.stop()
+ self.montage.stop()
diff --git a/char.py b/char.py
index 2ee1543..131c14d 100644
--- a/char.py
+++ b/char.py
@@ -17,11 +17,12 @@ import gtk
import glob
from gettext import gettext as _
-import port.chooser as chooser
-import port.pixbuf as pixbuf
+import toolkit.chooser as chooser
+from toolkit import pixbuf
import theme
+
def load():
from document import Document
diff --git a/document.py b/document.py
index d751eb9..99f1a04 100644
--- a/document.py
+++ b/document.py
@@ -14,12 +14,9 @@
import os
import gtk
-
import logging
-logger = logging.getLogger('cartoon-builder')
-import port.json as json
-from port.tarball import Tarball
+import toolkit.json as json
import theme
from sound import *
@@ -27,6 +24,11 @@ from ground import *
from utils import *
from char import *
+from toolkit.tarball import Tarball
+
+logger = logging.getLogger('cartoon-builder')
+
+
class Document:
tape = []
ground = None
diff --git a/ground.py b/ground.py
index a65b657..25139fe 100644
--- a/ground.py
+++ b/ground.py
@@ -16,11 +16,12 @@ import os
import gtk
from gettext import gettext as _
-import port.chooser as chooser
-import port.pixbuf as pixbuf
+import toolkit.chooser as chooser
+from toolkit import pixbuf
import theme
+
def load():
from document import Document
diff --git a/icons/mamamedia.svg b/icons/mamamedia.svg
new file mode 100644
index 0000000..a74f45a
--- /dev/null
+++ b/icons/mamamedia.svg
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ width="55.009"
+ height="55.163"
+ viewBox="0 0 55.009 55.163"
+ overflow="visible"
+ enable-background="new 0 0 55.009 55.163"
+ xml:space="preserve"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="mamamedia.svg"><metadata
+ id="metadata67"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs65"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 27.581499 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="55.008999 : 27.581499 : 1"
+ inkscape:persp3d-origin="27.504499 : 18.387666 : 1"
+ id="perspective69" /></defs><sodipodi:namedview
+ pagecolor="#585858"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0.72941176"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1278"
+ inkscape:window-height="719"
+ id="namedview63"
+ showgrid="false"
+ inkscape:zoom="4.7314325"
+ inkscape:cx="-9.4821852"
+ inkscape:cy="27.581499"
+ inkscape:window-x="0"
+ inkscape:window-y="16"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_2" />
+
+<polygon
+ points="32.844,28.597 45.426,29.053 44.282,16.243 37.533,16.472 34.102,16.7 "
+ id="polygon5"
+ transform="matrix(1.0199805,0,0,1.0199805,-1.2887202,1.0567637)"
+ style="fill:#000000;stroke:#ffffff;stroke-width:3" />
+<polyline
+ points="33.631,19.106 18.647,19.335 17.847,18.992 "
+ id="polyline7"
+ transform="matrix(1.0199805,0,0,1.0199805,-1.2887202,1.0567637)"
+ style="fill:#000000;stroke:#ffffff;stroke-width:3" />
+<circle
+ cx="16.875"
+ cy="19.02"
+ r="0.40000001"
+ id="circle9"
+ sodipodi:cx="16.875"
+ sodipodi:cy="19.02"
+ sodipodi:rx="0.40000001"
+ sodipodi:ry="0.40000001"
+ transform="matrix(1.0199805,0,0,1.0199805,-1.2887202,1.0567637)"
+ style="fill:#000000;stroke:#ffffff;stroke-width:3" />
+<path
+ clip-rule="evenodd"
+ d="m 33.963846,3.5628558 c 0.46409,0.3753528 0.926142,-0.210116 1.315774,0.2376554 0.753766,-0.7354058 1.657469,-2.404094 3.230278,-2.0756603 0.729287,0.1509571 1.664609,0.9200224 1.588111,2.0756603 0.594648,0.089759 0.247854,0.9220624 0.605868,1.2474361 -0.0041,0.5609894 0.300894,0.8129246 0.282534,1.3871735 0.51101,-0.2794746 0.180537,-0.9577617 0.371274,-1.3871735 2.189898,-4.92344582 4.67967,-1.7145872 3.455693,1.4799919 0.113217,0.6568674 0.502851,1.0413999 0.55997,1.7564064 0.930222,-0.3437335 2.53567,-2.09504 4.034022,-1.8737043 1.005701,0.467151 0.180537,3.6423507 -0.580368,4.5562527 0.849643,0.592608 4.796968,2.915104 -0.279475,3.514852 -0.249895,-0.573228 0.607908,-0.776205 0.373313,-2.03486 -0.08465,-0.453892 -0.717047,-0.903703 -0.745606,-1.387173 -0.03468,-0.55997 1.163798,-2.6305303 -0.187677,-3.0528022 -1.384114,-0.4314517 -1.393293,1.2260166 -2.894704,0.9251223 -0.09485,0.2203158 0.898603,0.6466677 0.747646,0.9251224 -1.551391,0.1193377 -3.217019,0.3141535 -4.948946,0.4620515 -1.322914,0.114237 -2.812086,0.383513 -3.827986,0.277434 -2.053222,-0.214196 -3.193559,-1.9522424 -4.293098,-2.8671649 3.401635,-0.1631969 7.421377,-0.1417772 10.828113,0 0.406972,0.3376136 0.813943,0.6731872 1.213776,1.0179405 C 44.922516,8.1609279 44.339088,7.7202963 44.251369,6.9910102 44.108572,5.7884532 44.857237,4.4726784 43.597561,4.2156433 42.420504,3.9749279 41.722838,5.1887047 41.822795,6.7125556 41.500481,6.9777505 41.036391,7.1032082 40.51722,7.1735867 40.307104,6.057728 40.221426,4.8153919 38.837313,4.8623109 c 0.0357,-0.988361 -0.04998,-1.7696661 -0.653808,-1.9420429 -1.206637,-0.3437333 -1.696227,1.623809 -2.427554,2.0338412 -0.03774,0.5008104 0.375353,0.942462 0.09282,1.3871735 C 35.070527,5.6640156 34.332062,4.9479893 33.048926,4.7684727 32.447138,4.0616263 32.921428,2.5520552 31.835149,2.3643787 31.26294,2.2654407 30.71113,2.6754728 30.341898,3.1966828 30.810069,4.1534245 29.72787,4.544077 29.595272,5.1387257 c -0.225416,0.9985609 0.760905,1.9440828 0.09384,3.0528016 -0.160137,-0.00408 -0.241735,0.067319 -0.280494,0.1846165 C 27.645067,8.4200033 28.278475,5.7303144 26.234435,6.3412827 25.570427,5.6354562 25.021677,5.118326 24.182233,5.3233422 c -0.314154,0.078539 -0.758865,0.4997904 -0.841483,0.833324 -0.09894,0.3947324 0.214196,0.6946068 0.279474,1.3871735 0.04182,0.4375716 -0.160137,0.9088026 -0.09384,1.202557 0.09894,0.4467515 0.772126,0.7507057 0.840464,1.1097388 0.189717,0.9883605 -0.869022,1.1505375 -1.213776,1.4799915 -0.658907,-0.458991 -1.586069,-1.103619 -2.427554,-0.370253 -0.754785,-0.767025 -0.805784,-2.2276371 -2.239877,-2.1266591 -1.129118,0.078539 -1.411652,1.4463321 -1.02712,2.5897301 0.179516,0.53141 0.717046,0.875144 0.933282,1.479992 0.09384,0.259076 0.01327,0.588529 0.09384,0.831283 0.193796,0.58343 0.753765,1.003661 0.559969,1.665628 1.499373,-0.848624 3.710689,-2.679488 5.600714,-3.976903 1.407573,-0.966941 2.722327,-1.860444 3.827986,0 -0.781305,2.229677 -2.147059,2.992622 -4.014643,4.347157 -0.793544,0.574249 -2.401034,2.005281 -2.987523,2.034861 -0.763964,0.03774 -1.967542,-1.070979 -2.987522,-1.479993 -1.156658,-0.46511 -3.232318,-1.341274 -3.360836,0.184618 -0.04589,0.548749 0.52121,0.869023 0.653808,1.201537 0.05712,0.611988 -0.526311,0.589548 -0.55997,1.108718 0.212156,1.05466 0.854743,1.680928 1.773746,2.036901 0.07853,0.476331 0.121378,0.988361 0.09384,1.570771 -0.48755,0.628307 -2.111358,0.128518 -2.614209,0.740506 -0.588529,1.829845 0.935323,2.330655 2.053222,2.775367 -0.0031,0.303953 -0.157078,0.46001 -0.09282,0.831283 -0.642588,0.54671 -1.882884,0.497751 -1.867584,1.478971 0.01327,0.778246 0.877182,1.10464 2.148078,1.018962 0.373312,0.539569 0.558949,2.490792 -0.05202,2.984462 -0.965922,-1.043439 0.191756,-1.308635 -0.322314,-2.431632 -1.657469,0.132597 -2.566271,-0.477351 -2.333715,-2.218459 0.430431,-0.590568 1.065878,-0.978161 1.866563,-1.202557 -1.314755,-0.517129 -3.747408,-1.148498 -3.373075,-3.339415 0.282534,-0.923083 3.153779,-0.671148 4.026884,-1.007741 0.0663,-0.342714 -0.160137,-0.396773 -0.09282,-0.740506 -6.397317,-0.624228 -2.430614,-2.123599 -1.399413,-3.422035 -0.369233,-0.436552 -2.199079,-2.761087 -2.096061,-3.66581 0.53141,-1.270896 4.048303,0.633408 5.454856,1.446332 0.395753,-0.599748 -0.322314,-1.01794 -0.466131,-1.479991 -0.09384,-0.299875 0.01836,-0.636468 -0.09384,-0.924102 -0.421251,-1.08832 -2.443872,-3.2822972 -1.993041,-5.0897026 0.876163,-2.1949981 2.325556,-0.9067627 2.792707,-1.2453963 1.776806,-0.1570769 4.600111,4.5062729 3.012002,-1.6605282 0.318234,-0.3631131 1.251517,-1.7849658 1.642169,-2.0756603 2.018541,-0.4885707 2.482633,2.6397095 4.16152,2.4867125 0.895543,0.315174 0.400852,-0.155037 1.095459,0.3590331 0.398813,-0.7333659 -0.533449,-1.3514741 -0.295794,-2.5142519 0.380453,-0.5140702 0.927162,0.2957944 0.731326,-0.7925248 0.780285,-1.6829679 5.556853,-1.6921478 4.986685,0.8180243 z"
+ id="path11"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 32.114621,8.0997291 c 0.835364,0.7139863 1.788027,1.3127148 2.522412,2.1256389 -0.265195,0.846584 -0.446751,1.777826 -0.744586,2.58973 -0.764986,-0.415132 -1.413693,-0.945521 -2.150118,-1.386153 -0.06528,-0.210116 -0.08261,-0.472251 -0.184617,-0.647687 -0.178498,0.0765 -0.250916,-0.167277 -0.374333,-0.185637 -1.08322,-0.159117 -1.594229,0.770085 -2.332695,1.109738 -0.431452,-1.141357 1.438172,-1.9971208 2.891645,-1.572809 0.201954,-0.6017884 0.265194,-1.3412741 0.372292,-2.0328209 z"
+ id="path13"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 35.105205,10.502803 c 0.511009,0.110158 0.875141,0.365153 1.398392,0.463071 -0.0663,0.796604 -0.240715,1.487132 -0.279475,2.313315 -0.598728,-0.116277 -1.229076,-0.200936 -1.772726,-0.370252 0.257035,-0.760906 0.483471,-1.55649 0.653809,-2.406134 z"
+ id="path15"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 7.9625029,20.930064 c -0.4069723,0.183595 -2.2470171,0.530389 -2.8253461,0.544669 0.105058,-3.288417 -2.0124215,-7.210243 -0.00204,-10.416041 1.459592,-0.606888 2.4734527,0.327414 2.3337153,2.219477 -0.1713567,2.331677 -0.2396954,6.052565 0.4936706,7.651895 z"
+ id="path17"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 28.849663,11.892016 c 0.646668,0.864943 1.177058,2.984463 0.09384,3.790248 -0.624228,-1.273956 -1.152577,-2.649909 -0.09384,-3.790248 z"
+ id="path19"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 50.880223,17.717125 c -0.233577,-0.351894 -0.201957,-0.971021 -0.746626,-1.017941 -0.350874,0.478372 0.0357,0.668087 0.09485,1.201537 0.53549,4.955065 -2.227636,8.715734 -3.64031,12.02455 -0.361072,-0.01837 -0.689507,-0.0041 -0.936342,0.09281 -1.056699,0.614029 -1.075059,1.528951 -1.584029,2.311276 -0.730306,1.117898 -2.177659,2.843707 -3.500574,3.570951 -1.264776,0.698688 -2.499971,0.907784 -3.970783,1.146459 -1.443273,0.234596 -2.521392,0.182577 -3.733129,0.278455 -3.974864,0.311094 -7.915049,-1.447352 -10.45684,-2.959984 -0.701747,-0.417172 -1.489172,-1.085259 -2.054241,-1.108718 -0.763965,-0.03264 -1.346374,0.669107 -2.147059,0.369232 -0.912883,-0.343732 -0.940422,-1.842084 -0.186657,-2.59075 0.643608,-0.134638 1.09138,-0.460011 1.868605,-0.461032 0.286615,-0.209095 0.536509,-0.45593 0.745605,-0.742544 0.238676,-2.609111 0.467152,-5.715972 1.866564,-7.674334 0.509991,-0.713987 1.518752,-1.287215 2.334736,-1.943063 0.800685,-0.642588 1.60851,-1.273956 2.333716,-1.849224 1.489171,-1.181137 3.013022,-2.813106 4.857147,-3.514854 1.734986,-0.659927 4.15132,-0.742545 6.348358,-0.925122 2.218458,-0.183597 4.583793,-0.396772 6.720652,-0.462051 0.437571,-0.01327 2.04914,0.698686 2.61421,1.108719 0.317214,0.231536 0.819044,1.147478 1.305575,1.203577 0.539569,0.0612 1.000601,-0.661968 1.494271,-0.647687 1.246417,0.03876 1.537111,2.106259 0.372294,2.58973 z m -26.233899,4.255359 c -1.247437,3.262917 0.997541,5.945465 2.894704,6.657412 3.205799,1.201538 6.020946,-1.032221 6.720652,-2.867165 1.600349,-4.182939 -1.958362,-7.352019 -5.600713,-6.843049 -1.991002,0.277434 -3.507713,1.732947 -4.014643,3.052802 z m -5.78635,11.005589 c 0.299875,-0.50489 0.760906,-0.848624 0.840464,-1.57179 -0.820064,-0.476331 -1.778846,1.175018 -0.840464,1.57179 z"
+ id="path21"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 38.773054,19.491892 c -0.08057,4.320636 8.216962,5.312058 8.219003,0.07344 9.85e-4,-2.575451 -1.868605,-4.292078 -4.414476,-3.971804 -2.458154,0.310075 -3.766788,1.825765 -3.804527,3.898366 z"
+ id="path23"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 42.577581,15.520087 c 2.545871,-0.321293 4.66845,1.403493 4.482813,3.971805 -0.409011,5.680271 -7.823249,4.247198 -8.219002,-0.07344 -0.188695,-2.0624 1.278035,-3.588291 3.736189,-3.898366 z m 1.862484,1.180118 c -0.02345,-0.611989 -0.364132,-1.046501 -1.211736,-0.832305 -2.369415,0.594649 1.303535,3.309837 1.211736,0.832305 z"
+ id="path25"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 42.66836,15.91176 c 1.239276,-0.384534 1.737026,0.394731 1.771705,1.493251 0.134638,4.447115 -5.23352,-0.425333 -1.771705,-1.493251 z"
+ id="path27"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 17.925673,16.700205 c 1.079139,0.595668 2.180717,1.168896 3.360835,1.664608 0.156057,1.01692 0.233575,2.112379 0.374333,3.144599 -0.555889,-0.0663 -0.917983,-0.324354 -1.401454,-0.462051 0.258055,-0.292735 0.473272,-1.156658 0,-1.387174 -0.579348,0.277435 -0.451851,1.046501 -0.653807,1.572811 -0.193796,0.50591 -0.52223,0.96592 -0.745606,1.479991 -0.785385,1.798226 -0.857803,3.539333 -0.654827,5.917927 0.0459,0.54263 0.457972,1.706427 -0.559969,1.664608 -0.55283,-3.585231 -0.170337,-7.290821 1.400432,-9.526618 -0.203995,-0.228475 -0.643608,-0.224395 -0.840463,-0.462051 -0.126478,-1.168897 -0.292734,-2.299037 -0.279474,-3.60665 z"
+ id="path29"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 28.660967,18.920701 c 3.642351,-0.508969 7.202082,2.66011 5.600713,6.84305 -0.699706,1.833924 -3.514853,4.068702 -6.720652,2.867165 -1.898183,-0.711946 -4.142141,-3.394495 -2.894704,-6.657413 0.50693,-1.320874 2.023641,-2.776387 4.014643,-3.052802 z"
+ id="path31"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 30.62137,22.064281 c 1.627888,-1.371873 -2.281697,-2.855944 -1.678889,-0.462051 0.01224,0.051 0.212156,0.130558 0.185637,0.370254 0.534469,0.351893 1.144418,0.386571 1.493252,0.09179 z"
+ id="path33"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 29.186258,23.102622 c 0.04079,-0.388613 -0.276415,-0.518151 -0.297835,-0.602808 -0.960822,-3.896326 5.276359,-1.479993 2.680508,0.752744 -0.557928,0.479392 -1.532011,0.422273 -2.382673,-0.149936 z"
+ id="path35"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="M 4.2018348,21.786846 C 3.9040004,22.543673 3.1063756,22.861906 2.7085833,23.637091 2.35159,24.330679 2.5739458,25.319039 1.8681194,25.856569 -1.6028743,25.007945 1.2459312,18.551469 4.2018348,21.786846 z"
+ id="path37"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 9.803568,23.174021 c 0.213175,1.743145 -0.3845335,3.934063 0.279474,5.735349 0.191756,0.518151 1.167878,1.356574 1.399413,2.034862 0.189717,0.549769 0.161157,1.417773 -0.372292,1.572809 C 10.348238,32.736338 9.7260493,31.5654 9.4302544,31.128848 8.476573,29.719235 8.2460574,30.572958 7.3515345,29.654976 7.5820501,29.004229 7.8523449,28.45446 7.7493269,27.891431 7.5963299,27.046886 8.0747007,26.545056 8.0298215,25.857589 7.9849424,25.162983 7.2791159,24.852908 7.5626704,24.19298 c -0.7782451,0.184617 -1.4779516,0.446752 -1.9604025,0.925123 -0.072419,0.844544 0.02244,1.482032 -0.3733129,1.850245 -0.6262679,0.580369 -2.2204975,0.218275 -2.4265335,-0.740506 -0.4997904,-2.298016 2.2225375,-4.889786 4.5735925,-4.71741 1.1342183,0.0816 1.4391926,1.0822 2.427554,1.663589 z"
+ id="path39"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 6.1632573,26.504256 c -0.3498534,-1.583009 1.0464999,-1.708467 1.306595,-0.832303 0.2570351,0.865963 -0.7792652,2.223557 -0.093838,2.958963"
+ id="path41"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 3.505188,26.556276 c 0.3508733,0.416152 0.734386,0.800685 0.9496019,1.350454 0.577309,0.361073 1.4157329,0.150958 1.5850497,0.726226 0.4691911,1.614629 -3.5005732,1.264776 -4.4348752,0.625248 C 1.1551529,28.95017 0.67984202,28.146425 0.65434255,27.594616 0.56866412,25.672972 1.8110005,25.918789 3.505188,26.556276 z"
+ id="path43"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 42.208348,29.838573 c -0.911862,0.716026 -0.973062,1.349435 -1.792106,1.809445 -1.494271,0.840464 -3.735169,1.213777 -5.229439,1.121979 -0.60179,-0.03672 -3.028323,-1.920623 -3.73619,-1.868604 -3.463853,0.258054 -1.0414,3.443453 1.326995,4.116641 1.224997,0.348833 2.752927,0.374332 3.733129,0.184616 1.549351,-0.298854 4.097261,-1.386152 4.855107,-2.218457 0.320275,-0.351893 0.950622,-0.881264 1.199498,-1.242337 0.368212,-0.53039 0.665026,-0.887382 0.483471,-1.811486 -0.403914,-0.414111 -0.57017,-0.307013 -0.840465,-0.09179 z"
+ id="path45"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 46.400468,41.48675 c -0.256015,0.208076 -0.595668,0.336594 -0.934302,0.464092 -0.700727,-0.484492 -0.762946,-1.485093 -1.587091,-1.666649 -2.073619,-0.454911 -2.126658,4.245159 -4.480773,2.127679 0.50693,-0.852703 1.527931,-1.199497 1.959383,-2.127679 -1.218877,-0.47735 -1.718668,2.273538 -3.733129,1.477951 -0.490611,-0.191755 -1.13014,-1.010799 -1.02814,-1.477951 0.289673,-1.287215 0.352913,0.110158 1.01692,-0.977141 -0.606888,-0.827204 0.156057,-0.410033 -0.643608,-0.132597 -1.142378,0.398812 -2.461213,1.565669 -3.920805,1.203576 -0.240716,-0.0612 -0.882283,-0.586488 -0.935322,-0.924102 -0.147898,-0.997541 1.696228,-0.578328 2.231717,-0.647688 0.207057,-0.0255 0.900643,-0.245814 1.636049,-0.225416 5.631312,0.168297 7.694733,-3.917744 8.924829,-5.971984 0.350874,-0.58547 0.481432,-2.276598 2.052201,-1.942044 0.833324,0.177477 1.425933,1.58607 0.842503,2.312295 -0.591588,0.733367 -1.320874,0.628308 -1.775785,0.925124 -0.635449,0.413091 -0.833324,1.431031 -0.833324,2.392874 0,0.961841 1.00672,1.523851 1.204598,2.489772 0.265193,1.283135 -0.764987,1.59219 0.0041,2.699888 z"
+ id="path47"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 19.700438,31.406283 c -0.08058,0.723166 -0.540589,1.0669 -0.840464,1.57179 -0.938382,-0.396772 0.02041,-2.048121 0.840464,-1.57179 z"
+ id="path49"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 18.391803,34.365246 c -0.120357,0.53549 -0.651768,1.198478 -0.186656,1.758447 1.02202,0.07548 1.310675,-1.03426 2.333716,-0.648708 0.185636,1.04956 -0.965922,0.876163 -0.746627,1.758446 0.305995,1.228057 1.804346,-0.213175 2.334736,-0.648707 0.693587,0.0918 0.51305,0.651767 1.120958,0.648707 0.643608,-0.0051 0.915943,-1.274976 1.679908,-0.741526 -0.182575,1.031201 -1.970602,1.841065 -2.800866,0.833325 -0.386573,1.05466 -4.125821,4.319618 -2.893685,-0.648708 -1.636048,1.141358 -2.814126,-2.525471 -0.841484,-2.311276 z"
+ id="path51"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 53.376115,54.722018 c -1.247436,0.531409 -2.416334,0.192775 -3.986085,-0.55487 -1.096477,-0.52325 -2.809025,-2.007321 -3.578091,-2.65195 -1.834945,-1.534049 -4.883666,-4.171719 -5.272279,-4.893866 -0.185636,0.55589 -3.63011,-0.324354 -4.68987,-0.324354 0.339653,-0.998561 0.50999,-2.1032 -0.03264,-2.801886 0.964903,-0.653808 0.648708,-0.670127 1.914504,-0.460011 2.078721,3.176219 4.066662,0.752745 4.842867,-0.439612 0.866984,0.744586 0.989381,0.752746 1.928783,1.426953 0.389633,0.722145 1.63095,3.516893 2.080761,4.236999 0.398813,0.640548 1.409612,1.172977 2.179697,1.474892 -0.05508,-1.096479 -1.432052,-3.165001 -1.988961,-4.086042 -0.57527,-0.953682 -1.147479,-1.918583 -1.773746,-2.776387 0.645646,-0.716026 2.686628,-1.927763 2.739668,-3.229259 1.812505,-0.413092 2.63461,3.503633 3.259856,4.560334 1.003662,1.698266 0.953683,1.845145 2.105241,3.383274 0.929202,1.240296 2.02772,5.398757 0.270295,7.135785 z"
+ id="path53"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 27.727685,46.480575 c 1.172977,0.626268 2.641749,0.960822 4.575633,0.832304 -0.52937,1.453473 -0.764986,3.989144 -2.14808,4.902026 -4.273717,0.834344 -3.048722,-3.403675 -2.427553,-5.73433 z"
+ id="path55"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 38.745514,52.121067 c -0.308034,0.620148 -0.261115,1.59321 -0.560989,2.220498 -1.53201,0.210115 -3.449574,0.03672 -5.134583,0.09282 0.704808,-2.384716 2.097081,-5.783292 2.820248,-8.151685 0.08465,0.07344 4.686809,-1.423893 4.754128,-0.166257"
+ id="path57"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 12.230102,30.665777 c 0.09384,0 0.187676,0 0.280493,0 1.384115,2.63155 2.538732,5.630292 4.107462,8.230223 0.787425,1.306595 1.331074,2.495892 2.61421,3.144599 3.992203,-0.329454 7.250022,-1.388193 10.641457,-2.312295 0.353932,0.950622 0.746625,1.648288 1.493251,2.312295 1.05466,0.934303 3.1395,1.399414 3.269038,2.868186 0.051,0.565069 -0.597709,1.872684 -0.839445,2.496912 -0.900643,2.323516 -1.884923,4.70211 -2.709067,7.027666 -2.64583,0 -5.679252,0 -8.494399,0 -0.856782,0 -1.890023,0.237656 -2.427553,-0.370253 0.196856,-0.922063 0.929204,-1.59423 1.400433,-2.403075 0.920023,-1.57485 1.752327,-3.173159 2.707028,-4.809206 0.407992,-0.699708 1.352495,-1.548331 0.840465,-2.495894 -3.332276,1.913484 -5.81083,2.798827 -8.280202,2.056281 C 16.201905,46.2215 12.923688,42.777025 12.350458,41.99776 10.957165,40.109777 9.3333565,37.867859 7.8676447,35.895217 6.9088629,34.601882 8.5724511,34.416245 9.2415584,32.517041 c 0.4957109,0.182577 1.1107586,0.989382 2.1480786,0.740507 0.488571,-0.118319 0.53957,-0.453892 0.933282,-0.740507 0.03468,-0.682366 -0.02346,-1.271914 -0.09281,-1.851264 z"
+ id="path59"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+<path
+ clip-rule="evenodd"
+ d="m 35.372439,27.819012 c 2.240897,1.49427 3.829006,1.588109 5.136622,0 1.307614,-1.58811 1.306595,-2.055261 0.373313,-3.455694"
+ id="path61"
+ style="fill:#000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.01998043" />
+</svg> \ No newline at end of file
diff --git a/messenger.py b/messenger.py
index 35f36f8..c03005e 100644
--- a/messenger.py
+++ b/messenger.py
@@ -17,7 +17,7 @@ import dbus
from dbus.gobject_service import ExportedGObject
from dbus.service import method, signal
-import port.json as json
+import toolkit.json as json
from sugar.presence import presenceservice
import char
diff --git a/montage.py b/montage.py
index b403fc7..9f5fdbc 100644
--- a/montage.py
+++ b/montage.py
@@ -23,7 +23,7 @@ import gobject
import logging
from gobject import SIGNAL_RUN_FIRST, TYPE_PYOBJECT
-from port.scrolledbox import VScrolledBox
+from widgets.scrolledbox import VScrolledBox
import theme
import char
@@ -38,9 +38,9 @@ logger = logging.getLogger('cartoon-builder')
class View(gtk.EventBox):
__gsignals__ = {
- 'frame-changed' : (SIGNAL_RUN_FIRST, None, 2*[TYPE_PYOBJECT]),
- 'ground-changed': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
- 'sound-changed' : (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]) }
+ 'frame-changed' : (SIGNAL_RUN_FIRST, None, 2*[TYPE_PYOBJECT]),
+ 'ground-changed': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]),
+ 'sound-changed' : (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]) }
def set_frame(self, value):
tape_num, frame = value
diff --git a/port/COPYING b/port/COPYING
deleted file mode 100644
index 623b625..0000000
--- a/port/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/port/README b/port/README
deleted file mode 100644
index 256200d..0000000
--- a/port/README
+++ /dev/null
@@ -1,18 +0,0 @@
-About
------
-
-A set of sugar components/libraries/etc to simplify writing activities.
-
-Cornerstone purposes for this project:
-* Total backwards compatibility for sugar-port API
-* Run on all sugar platforms beginning from 0.82
-
-In most cases sugar-port could be embedded to activity's directory tree.
-There is no need to include the whole sugar-port project only top level
-files/directories you are using directly - sugar-port's top level entities
-don't import each other.
-
-Get it
-------
-
-http://wiki.sugarlabs.org/go/Development_Team/sugar-port
diff --git a/port/__init__.py b/port/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/port/__init__.py
+++ /dev/null
diff --git a/port/activity.py b/port/activity.py
deleted file mode 100644
index e3b6fdd..0000000
--- a/port/activity.py
+++ /dev/null
@@ -1,305 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""Extend sugar-toolkit activity class"""
-
-import gtk
-import logging
-import telepathy
-import gobject
-
-import sugar.activity.activity as toolkit
-from sugar.presence.sugartubeconn import SugarTubeConnection
-from sugar.graphics.alert import ConfirmationAlert, NotifyAlert
-
-_NEW_INSTANCE = 0
-_NEW_INSTANCE = 1
-_PRE_INSTANCE = 2
-_POST_INSTANCE = 3
-
-class CursorFactory:
- __shared_state = {"cursors": {}}
-
- def __init__(self):
- self.__dict__ = self.__shared_state
-
- def get_cursor(self, cur_type):
- if not self.cursors.has_key(cur_type):
- cur = gtk.gdk.Cursor(cur_type)
- self.cursors[cur_type] = cur
- return self.cursors[cur_type]
-
-class Activity(toolkit.Activity):
- """Basic activity class"""
-
- def new_instance(self):
- """
- New instance was created.
-
- Will be invoked after __init__() instead of resume_instance().
- Subclass should implement this method to catch creation stage.
- """
- pass
-
- def resume_instance(self, filepath):
- """
- Instance was resumed.
-
- Will be invoked after __init__() instead of new_instance().
- Subclass should implement this method to catch resuming stage.
-
- """
- pass
-
- def save_instance(self, filepath):
- """
- Save activity instance.
-
- Subclass should implement this method to save activity data.
- """
- raise NotImplementedError
-
- def on_save_instance(self, cb, *args):
- """ Register callback which will be invoked before save_instance """
- self.__on_save_instance.append((cb, args))
-
- def share_instance(self, connection, is_initiator):
- """
- Activity was shared/joined.
-
- connection -- SugarTubeConnection object
- wich represents telepathy connection
-
- is_initiator -- boolean
- if True activity was shared and
- (current activity is an initiator of sharing)
- otherwise activity was joined(to existed sharing session)
-
- Will be invoked after __init__() and {new,resume}_instance().
- Subclass should implement this method to catch sharing stage.
- """
- pass
-
- def notify_alert(self, title, msg):
- """Raise standard notify alert"""
- alert = NotifyAlert(title=title, msg=msg)
-
- def response(alert, response_id, self):
- self.remove_alert(alert)
-
- alert.connect('response', response, self)
- alert.show_all()
- self.add_alert(alert)
-
- def confirmation_alert(self, title, msg, cb, *cb_args):
- """Raise standard confirmation alert"""
- alert = ConfirmationAlert(title=title, msg=msg)
-
- def response(alert, response_id, self, cb, *cb_args):
- self.remove_alert(alert)
- if response_id is gtk.RESPONSE_OK:
- cb(*cb_args)
-
- alert.connect('response', response, self, cb, *cb_args)
- alert.show_all()
- self.add_alert(alert)
-
- def get_cursor(self):
- return self._cursor
-
- def set_cursor(self, cursor):
- if not isinstance(cursor, gtk.gdk.Cursor):
- cursor = CursorFactory().get_cursor(cursor)
-
- if self._cursor != cursor:
- self._cursor = cursor
- self.window.set_cursor(self._cursor)
-
- def __init__(self, canvas, handle):
- """
- Initialise the Activity.
-
- canvas -- gtk.Widget
- root widget for activity content
-
- handle -- sugar.activity.activityhandle.ActivityHandle
- instance providing the activity id and access to the
- presence service which *may* provide sharing for this
- application
-
- """
- toolkit.Activity.__init__(self, handle)
-
- if handle.object_id:
- self.__state = _NEW_INSTANCE
- else:
- self.__state = _NEW_INSTANCE
-
- self.__resume_filename = None
- self.__postponed_share = []
- self.__on_save_instance = []
-
- self._cursor = None
- self.set_cursor(gtk.gdk.LEFT_PTR)
-
- # XXX do it after(possible) read_file() invoking
- # have to rely on calling read_file() from map_cb in sugar-toolkit
- canvas.connect_after('map', self.__map_canvasactivity_cb)
- self.set_canvas(canvas)
-
- def __instance(self):
- logging.debug('Activity.__instance')
-
- if self.__resume_filename:
- self.resume_instance(self.__resume_filename)
- else:
- self.new_instance()
-
- for i in self.__postponed_share:
- self.share_instance(*i)
- self.__postponed_share = []
-
- self.__state = _POST_INSTANCE
-
- def read_file(self, filepath):
- """Subclass should not override this method"""
- logging.debug('Activity.read_file state=%s' % self.__state)
-
- self.__resume_filename = filepath
-
- if self.__state == _NEW_INSTANCE:
- self.__state = _PRE_INSTANCE
- elif self.__state == _PRE_INSTANCE:
- self.__instance();
-
- def write_file(self, filepath):
- """Subclass should not override this method"""
- for cb, args in self.__on_save_instance:
- cb(*args)
- self.save_instance(filepath)
-
- def __map_canvasactivity_cb(self, widget):
- logging.debug('Activity.__map_canvasactivity_cb state=%s' % \
- self.__state)
-
- if self.__state == _NEW_INSTANCE:
- self.__instance()
- elif self.__state == _NEW_INSTANCE:
- self.__state = _PRE_INSTANCE
- elif self.__state == _PRE_INSTANCE:
- self.__instance();
-
- return False
-
- def _share(self, tube_conn, initiator):
- logging.debug('Activity._share state=%s' % self.__state)
-
- if self.__state == _NEW_INSTANCE:
- self.__postponed_share.append((tube_conn, initiator))
- self.__state = _PRE_INSTANCE
- elif self.__state == _PRE_INSTANCE:
- self.__postponed_share.append((tube_conn, initiator))
- self.__instance();
- elif self.__state == _POST_INSTANCE:
- self.share_instance(tube_conn, initiator)
-
-class SharedActivity(Activity):
- """Basic activity class with sharing features"""
-
- def __init__(self, canvas, service, handle):
- """
- Initialise the Activity.
-
- canvas -- gtk.Widget
- root widget for activity content
-
- service -- string
- dbus service for activity
-
- handle -- sugar.activity.activityhandle.ActivityHandle
- instance providing the activity id and access to the
- presence service which *may* provide sharing for this
- application
-
- """
- Activity.__init__(self, canvas, handle)
- self.service = service
-
- self.connect('shared', self._shared_cb)
-
- # Owner.props.key
- if self._shared_activity:
- # We are joining the activity
- self.connect('joined', self._joined_cb)
- if self.get_shared():
- # We've already joined
- self._joined_cb()
-
- def _shared_cb(self, activity):
- logging.debug('My activity was shared')
- self.__initiator = True
- self._sharing_setup()
-
- logging.debug('This is my activity: making a tube...')
- id = self._tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(
- self.service, {})
-
- def _joined_cb(self, activity):
- if not self._shared_activity:
- return
-
- logging.debug('Joined an existing shared activity')
-
- self.__initiator = False
- self._sharing_setup()
-
- logging.debug('This is not my activity: waiting for a tube...')
- self._tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes(
- reply_handler=self._list_tubes_reply_cb,
- error_handler=self._list_tubes_error_cb)
-
- def _sharing_setup(self):
- if self._shared_activity is None:
- logging.error('Failed to share or join activity')
- return
- self._conn = self._shared_activity.telepathy_conn
- self._tubes_chan = self._shared_activity.telepathy_tubes_chan
- self._text_chan = self._shared_activity.telepathy_text_chan
-
- self._tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal(
- 'NewTube', self._new_tube_cb)
-
- def _list_tubes_reply_cb(self, tubes):
- for tube_info in tubes:
- self._new_tube_cb(*tube_info)
-
- def _list_tubes_error_cb(self, e):
- logging.error('ListTubes() failed: %s', e)
-
- def _new_tube_cb(self, id, initiator, type, service, params, state):
- logging.debug('New tube: ID=%d initator=%d type=%d service=%s '
- 'params=%r state=%d', id, initiator, type, service,
- params, state)
-
- if (type == telepathy.TUBE_TYPE_DBUS and
- service == self.service):
- if state == telepathy.TUBE_STATE_LOCAL_PENDING:
- self._tubes_chan[telepathy.CHANNEL_TYPE_TUBES] \
- .AcceptDBusTube(id)
-
- tube_conn = SugarTubeConnection(self._conn,
- self._tubes_chan[telepathy.CHANNEL_TYPE_TUBES], id,
- group_iface=self._text_chan[telepathy.CHANNEL_INTERFACE_GROUP])
-
- self._share(tube_conn, self.__initiator)
diff --git a/port/chooser.py b/port/chooser.py
deleted file mode 100644
index e2df259..0000000
--- a/port/chooser.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""Object chooser method"""
-
-import gtk
-import logging
-
-from sugar import mime
-from sugar.graphics.objectchooser import ObjectChooser
-
-TEXT = hasattr(mime, 'GENERIC_TYPE_TEXT') and mime.GENERIC_TYPE_TEXT or None
-IMAGE = hasattr(mime, 'GENERIC_TYPE_IMAGE') and mime.GENERIC_TYPE_IMAGE or None
-AUDIO = hasattr(mime, 'GENERIC_TYPE_AUDIO') and mime.GENERIC_TYPE_AUDIO or None
-VIDEO = hasattr(mime, 'GENERIC_TYPE_VIDEO') and mime.GENERIC_TYPE_VIDEO or None
-LINK = hasattr(mime, 'GENERIC_TYPE_LINK') and mime.GENERIC_TYPE_LINK or None
-
-def pick(cb=None, default=None, parent=None, what=None):
- """
- Opens object chooser.
-
- Method returns:
-
- * cb(jobject), if object was choosen and cb is not None
- * jobject, if object was choosen and cb is None
- * default, otherwise
-
- NOTE: 'what' makes sense only for sugar >= 0.84
- """
- what = what and {'what_filter': what} or {}
- chooser = ObjectChooser(parent=parent, **what)
-
- jobject = None
- out = None
-
- try:
- if chooser.run() == gtk.RESPONSE_ACCEPT:
- jobject = chooser.get_selected_object()
- logging.debug('ObjectChooser: %r' % jobject)
-
- if jobject and jobject.file_path:
- if cb:
- out = cb(jobject)
- else:
- out = jobject
- finally:
- if jobject and id(jobject) != id(out):
- jobject.destroy()
- chooser.destroy()
- del chooser
-
- if out:
- return out
- else:
- return default
diff --git a/port/json.py b/port/json.py
deleted file mode 100644
index d464abb..0000000
--- a/port/json.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""
-Unify usage of simplejson in Python 2.5/2.6
-
-In Python 2.5 it imports simplejson module, in 2.6 native json module.
-
-Usage:
-
- import port.json as json
-
- # and using regular simplejson interface with module json
- json.dumps([])
-
-"""
-
-try:
- from json import *
- dumps
-except (ImportError, NameError):
- from simplejson import *
diff --git a/port/pixbuf.py b/port/pixbuf.py
deleted file mode 100644
index ba6d0f5..0000000
--- a/port/pixbuf.py
+++ /dev/null
@@ -1,213 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""gtk.gdk.Pixbuf extensions"""
-
-import re
-import os
-import cStringIO
-import gtk
-import rsvg
-import cairo
-import logging
-
-from sugar.graphics.xocolor import XoColor
-from sugar.util import LRU
-
-def to_file(pixbuf):
- """Convert pixbuf object to file object"""
-
- def push(pixbuf, buffer):
- buffer.write(pixbuf)
-
- buffer = cStringIO.StringIO()
- pixbuf.save_to_callback(push, 'png', user_data=buffer)
- buffer.seek(0)
-
- return buffer
-
-def to_str(pixbuf):
- """Convert pixbuf object to string"""
- return to_file(pixbuf).getvalue()
-
-def from_str(str):
- """Convert string to pixbuf object"""
-
- loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- loader.write(str)
- loader.close()
-
- return loader.get_pixbuf()
-
-def from_svg_at_size(filename=None, width=None, height=None, handle=None,
- keep_ratio=True):
- """Scale and load SVG into pixbuf"""
-
- if not handle:
- handle = rsvg.Handle(filename)
-
- dimensions = handle.get_dimension_data()
- icon_width = dimensions[0]
- icon_height = dimensions[1]
-
- if icon_width != width or icon_height != height:
- ratio_width = float(width) / icon_width
- ratio_height = float(height) / icon_height
-
- if keep_ratio:
- ratio = min(ratio_width, ratio_height)
- if ratio_width != ratio:
- ratio_width = ratio
- width = int(icon_width * ratio)
- elif ratio_height != ratio:
- ratio_height = ratio
- height = int(icon_height * ratio)
- else:
- ratio_width = 1
- ratio_height = 1
-
- surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
- context = cairo.Context(surface)
- context.scale(ratio_width, ratio_height)
- handle.render_cairo(context)
-
- loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- surface.write_to_png(loader)
- loader.close()
-
- return loader.get_pixbuf()
-
-def sugar_icon(file_name=None, icon_name=None,
- width=None, height=None,
- color=None,
- insensitive_widget=None):
- """Load sugar icon into pixbuf
-
- NOTE: Function can load all image formats but makes sense only for SVG
- (due to color argument, see load_svg())
-
- NOTE: Function caches results
-
- Arguments:
- file_name path to filename with image
- (mutually exclusive for icon_name)
- icon_name name of icon
- (mutually exclusive for icon_name)
- width width of final image
- height height of final image
- color defines stroke and fill colors for final SVG image
- in string notion, could be:
- * tuple of (stroke_color, fill_color)
- * XoColor
- * scalar value for stroke and fill colors
- insensitive_widget render icon in insensitive mode
- """
- def load_svg():
- entities = {}
- if fill_color:
- entities['fill_color'] = fill_color
- if stroke_color:
- entities['stroke_color'] = stroke_color
-
- f = open(icon_filename, 'r')
- icon = f.read()
- f.close()
-
- for entity, value in entities.items():
- xml = '<!ENTITY %s "%s">' % (entity, value)
- icon = re.sub('<!ENTITY %s .*>' % entity, xml, icon)
-
- return rsvg.Handle(data=icon)
-
- def get_insensitive_pixbuf():
- if not (insensitive_widget and insensitive_widget.style):
- return pixbuf
-
- icon_source = gtk.IconSource()
- # Special size meaning "don't touch"
- icon_source.set_size(-1)
- icon_source.set_pixbuf(pixbuf)
- icon_source.set_state(gtk.STATE_INSENSITIVE)
- icon_source.set_direction_wildcarded(False)
- icon_source.set_size_wildcarded(False)
-
- # Please note that the pixbuf returned by this function is leaked
- # with current stable versions of pygtk. The relevant bug is
- # http://bugzilla.gnome.org/show_bug.cgi?id=502871
- # -- 2007-12-14 Benjamin Berg
- pixbuf = insensitive_widget.style.render_icon(icon_source,
- insensitive_widget.get_direction(), gtk.STATE_INSENSITIVE, -1,
- insensitive_widget, "sugar-icon")
-
- return pixbuf
-
- def get_cache_key():
- return (icon_filename, fill_color, stroke_color, width, height,
- insensitive_widget is None)
-
- if isinstance(color, XoColor):
- stroke_color = color.get_stroke_color()
- fill_color = color.get_fill_color()
- elif isinstance(color, tuple):
- stroke_color = color[0]
- fill_color = color[1]
- else:
- stroke_color = color
- fill_color = color
-
- if file_name:
- icon_filename = file_name
- elif icon_name:
- theme = gtk.icon_theme_get_default()
- info = theme.lookup_icon(icon_name, width or 50, 0)
- if info:
- icon_filename = info.get_filename()
- del info
- else:
- logging.warning('No icon with the name %s '
- 'was found in the theme.' % icon_name)
- else:
- return None
-
- cache_key = get_cache_key()
- if cache_key in _sugar_icon_cache:
- return _sugar_icon_cache[cache_key]
-
- logging.debug('sugar_icon: file_name=%s icon_name=%s width=%s height=%s ' \
- 'color=%s' % (file_name, icon_name, width, height, color))
-
- is_svg = icon_filename.endswith('.svg')
-
- if is_svg:
- handle = load_svg()
- if width and height:
- pixbuf = from_svg_at_size(handle=handle, width=width, height=height,
- keep_ratio=True)
- else:
- pixbuf = handle.get_pixbuf()
- else:
- if width and height:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_filename,
- width, height)
- else:
- pixbuf = gtk.gdk.pixbuf_new_from_file(icon_filename)
-
- if insensitive_widget:
- pixbuf = get_insensitive_pixbuf()
-
- _sugar_icon_cache[cache_key] = pixbuf
-
- return pixbuf
-
-_sugar_icon_cache = LRU(50)
diff --git a/port/scrolledbox.py b/port/scrolledbox.py
deleted file mode 100644
index c2bbb38..0000000
--- a/port/scrolledbox.py
+++ /dev/null
@@ -1,179 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import gtk
-
-from sugar.graphics.icon import Icon
-
-class ScrollButton(gtk.ToolButton):
- def __init__(self, icon_name):
- gtk.ToolButton.__init__(self)
-
- icon = Icon(icon_name = icon_name,
- icon_size=gtk.ICON_SIZE_SMALL_TOOLBAR)
- # The alignment is a hack to work around gtk.ToolButton code
- # that sets the icon_size when the icon_widget is a gtk.Image
- alignment = gtk.Alignment(0.5, 0.5)
- alignment.add(icon)
- self.set_icon_widget(alignment)
-
-class ScrolledBox(gtk.EventBox):
- def __init__(self, orientation, arrows_policy = gtk.POLICY_AUTOMATIC):
- gtk.EventBox.__init__(self)
- self.orientation = orientation
- self._viewport = None
- self._abox = None
- self._aviewport = None
- self._aviewport_sig = None
- self._arrows_policy = arrows_policy
- self._left = None
- self._right = None
-
- if orientation == gtk.ORIENTATION_HORIZONTAL:
- box = gtk.HBox()
- else:
- box = gtk.VBox()
- if self._arrows_policy == gtk.POLICY_AUTOMATIC:
- box.connect("size-allocate", self._box_allocate_cb)
- self.add(box)
-
- if self._arrows_policy != gtk.POLICY_NEVER:
- if orientation == gtk.ORIENTATION_HORIZONTAL:
- self._left = ScrollButton('go-left')
- else:
- self._left = ScrollButton('go-up')
- self._left.connect('clicked', self._scroll_cb, 'left')
- box.pack_start(self._left, False, False, 0)
-
- self._scrolled = gtk.ScrolledWindow()
- if orientation == gtk.ORIENTATION_HORIZONTAL:
- self._scrolled.set_policy(arrows_policy, gtk.POLICY_NEVER)
- else:
- self._scrolled.set_policy(gtk.POLICY_NEVER, arrows_policy)
- self._scrolled.connect('scroll-event', self._scroll_event_cb)
- box.pack_start(self._scrolled, True, True, 0)
-
- if orientation == gtk.ORIENTATION_HORIZONTAL:
- self._adj = self._scrolled.get_hadjustment()
- else:
- self._adj = self._scrolled.get_vadjustment()
- self._adj.connect('changed', self._scroll_changed_cb)
- self._adj.connect('value-changed', self._scroll_changed_cb)
-
- if self._arrows_policy != gtk.POLICY_NEVER:
- if orientation == gtk.ORIENTATION_HORIZONTAL:
- self._right = ScrollButton('go-right')
- else:
- self._right = ScrollButton('go-down')
- self._right.connect('clicked', self._scroll_cb, 'right')
- box.pack_start(self._right, False, False, 0)
-
- def modify_fg(self, state, bg):
- gtk.EventBox.modify_fg(self, state, bg)
- self._viewport.get_parent().modify_fg(state, bg)
-
- def modify_bg(self, state, bg):
- gtk.EventBox.modify_bg(self, state, bg)
- self._viewport.get_parent().modify_bg(state, bg)
-
- def set_viewport(self, widget):
- if widget == self._viewport: return
- if self._viewport and self._aviewport_sig:
- self._viewport.disconnect(self._aviewport_sig)
- self._viewport = widget
-
- if self._arrows_policy == gtk.POLICY_AUTOMATIC:
- self._aviewport_sig = self._viewport.connect('size-allocate',
- self._viewport_allocate_cb)
-
- self._scrolled.add_with_viewport(widget)
-
- def get_viewport_allocation(self):
- alloc = self._scrolled.get_allocation()
- alloc.x -= self._adj.get_value()
- return alloc
-
- def get_adjustment(self):
- return self._adj
-
- def _box_allocate_cb(self, w, a):
- self._abox = a
- self._update_arrows()
-
- def _viewport_allocate_cb(self, w, a):
- self._aviewport = a
- self._update_arrows()
-
- def _update_arrows(self):
- if not self._abox or not self._aviewport: return
-
- if self.orientation == gtk.ORIENTATION_HORIZONTAL:
- show_flag = self._abox.width < self._aviewport.width
- else:
- show_flag = self._abox.height < self._aviewport.height
-
- if show_flag:
- self._left.show()
- self._right.show()
- else:
- self._left.hide()
- self._right.hide()
-
- def _scroll_event_cb(self, widget, event):
- if self.orientation == gtk.ORIENTATION_HORIZONTAL:
- if event.direction == gtk.gdk.SCROLL_UP:
- event.direction = gtk.gdk.SCROLL_LEFT
- if event.direction == gtk.gdk.SCROLL_DOWN:
- event.direction = gtk.gdk.SCROLL_RIGHT
- else:
- if event.direction == gtk.gdk.SCROLL_LEFT:
- event.direction = gtk.gdk.SCROLL_UP
- if event.direction == gtk.gdk.SCROLL_RIGHT:
- event.direction = gtk.gdk.SCROLL_DOWN
- return False
-
- def _scroll_cb(self, widget, data):
- if data == 'left':
- val = max(self._adj.get_property('lower'), self._adj.get_value()
- - self._adj.get_property('page_increment'))
- else:
- val = min(self._adj.get_property('upper')
- - self._adj.get_property('page_size'),
- self._adj.get_value()
- + self._adj.get_property('page_increment'))
-
- self._adj.set_value(val)
-
- def _scroll_changed_cb(self, widget):
- val = self._adj.get_value()
- if self._left:
- if val == 0:
- self._left.set_sensitive(False)
- else:
- self._left.set_sensitive(True)
-
- if self._right:
- if val >= self._adj.get_property('upper') - \
- self._adj.get_property('page_size'):
- self._right.set_sensitive(False)
- else:
- self._right.set_sensitive(True)
-
-class HScrolledBox(ScrolledBox):
- def __init__(self, *args):
- ScrolledBox.__init__(self, gtk.ORIENTATION_HORIZONTAL, *args)
-
-class VScrolledBox(ScrolledBox):
- def __init__(self, *args):
- ScrolledBox.__init__(self, gtk.ORIENTATION_VERTICAL, *args)
diff --git a/port/tarball.py b/port/tarball.py
deleted file mode 100644
index 9e842b9..0000000
--- a/port/tarball.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-"""Simplify tarfile module usage"""
-
-import os
-import time
-import tarfile
-import cStringIO
-import gtk
-import zipfile
-import tempfile
-import shutil
-
-class TarballError(Exception):
- """Base Tarball exception."""
- pass
-
-class BadDataTypeError(TarballError):
- """Exception for unsupported data type in read/write methods."""
- pass
-
-class Tarball:
- """
- Wrap standart tarfile module to simplify read/write operations with
- most popular data types.
-
- In read mode Tarball can load zip files as well.
-
- Supprted types:
-
- * string
- * gtk.gdk.Pixbuf
-
- Write usage:
-
- # create Tarball object
- # to see all supported modes use
- # http://docs.python.org/library/tarfile.html#tarfile.open
- tar = Tarball(tarfile, 'w')
-
- # write string to file in tarball
- tar.write('name within tarball', 'string to write')
-
- # write pixbuf to file in tarball
- tar.write('name within tarball', pixbuf_object)
-
- # save and close tarball file
- tar.close()
-
- Read usage:
-
- # create Tarball object
- tar = Tarball(tarfile)
-
- # read content of file in tarball to string
- str_content = tar.read('name within tarball')
-
- # read content of file in tarball to pixbuf object
- pixbuf_content = tar.read_pixbuf('name within tarball')
- """
-
- def __init__(self, name=None, mode='r', mtime=None):
- if not mode.startswith('r') or tarfile.is_tarfile(name):
- self.__tar = tarfile.TarFile(name=name, mode=mode)
- else:
- # convert for tar
-
- if not zipfile.is_zipfile(name):
- raise tarfile.ReadError()
-
- try:
- tmp_dir = tempfile.mkdtemp()
- tmp_fd, tmp_name = tempfile.mkstemp()
- tmp_fo = os.fdopen(tmp_fd, 'w')
-
- zip = zipfile.ZipFile(name)
- zip.extractall(tmp_dir)
-
- tar = tarfile.TarFile(fileobj=tmp_fo, mode='w')
- tar.add(tmp_dir, arcname='')
- tar.close()
-
- self.__tar = tarfile.TarFile(name=tmp_name, mode=mode)
- finally:
- tmp_fo.close()
- os.unlink(tmp_name)
- shutil.rmtree(tmp_dir)
-
- if mtime:
- self.mtime = mtime
- else:
- self.mtime = time.time()
-
- def close(self):
- """Save(if 'r' mode was given) and close tarball file."""
- self.__tar.close()
-
- def getnames(self):
- """Return names of members sorted by creation order."""
- return self.__tar.getnames()
-
- def read(self, arcname):
- """Returns sring with content of given file from tarball."""
- file_o = self.__tar.extractfile(arcname.encode('utf8'))
- if not file_o:
- return None
- out = file_o.read()
- file_o.close()
- return out
-
- def read_pixbuf(self, arcname):
- """Returns pixbuf object of given file from tarball."""
- loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- loader.write(self.read(arcname))
- loader.close()
- return loader.get_pixbuf()
-
- def write(self, arcname, data, mode=0644):
- """
- Stores given object to file in tarball.
- Raises BadDataTypeError exception If data type isn't supported.
- """
- info = tarfile.TarInfo(arcname.encode('utf8'))
- info.mode = mode
- info.mtime = self.mtime
-
- if isinstance(data, str):
- self.__write_str(info, data)
- elif isinstance(data, gtk.gdk.Pixbuf):
- self.__write_pixbuf(info, data)
- else:
- raise BadDataTypeError()
-
- def __write_str(self, info, data):
- info.size = len(data)
- self.__tar.addfile(info, cStringIO.StringIO(data))
-
- def __write_pixbuf(self, info, data):
- def push(pixbuf, buffer):
- buffer.write(pixbuf)
-
- buffer = cStringIO.StringIO()
- data.save_to_callback(push, 'png', user_data=buffer)
-
- info.size = buffer.tell()
- buffer.seek(0)
- self.__tar.addfile(info, buffer)
diff --git a/port/temposlider.py b/port/temposlider.py
deleted file mode 100644
index 6950453..0000000
--- a/port/temposlider.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import gtk
-import rsvg
-import cairo
-
-from sugar.graphics import style
-
-class TempoSlider(gtk.HBox):
- def __init__(self, min_value, max_value):
- gtk.HBox.__init__(self)
-
- self._pixbuf = [None] * 8
- self._image = gtk.Image()
- self._image.show()
-
- # used to store tempo updates while the slider is active
- self._delayed = 0
- self._active = False
-
- self.adjustment = gtk.Adjustment(min_value, min_value, max_value,
- (max_value - min_value) / 8, (max_value - min_value) / 8, 0)
- self._adjustment_h = self.adjustment.connect('value-changed',
- self._changed_cb)
-
- slider = gtk.HScale(adjustment = self.adjustment)
- slider.show()
- slider.set_draw_value(False)
- slider.connect("button-press-event", self._press_cb)
- slider.connect("button-release-event", self._release_cb)
-
- self.pack_start(slider, True, True)
- self.pack_end(self._image, False, False)
-
- def set_value(self, tempo, quiet = False):
- if self._active:
- self._delayed = tempo
- elif quiet:
- self.adjustment.handler_block(self._adjustment_h)
- self.adjustment.set_value(tempo)
- self._update(tempo)
- self.adjustment.handler_unblock(self._adjustment_h)
- else:
- self.adjustment.set_value(tempo)
-
- def _changed_cb(self, widget):
- self._update(widget.get_value())
-
- def _update(self, tempo):
- def map_range(value, ilower, iupper, olower, oupper):
- if value == iupper:
- return oupper
- return olower + int((oupper-olower+1) * (value-ilower) /
- float(iupper-ilower))
-
- img = map_range(tempo, self.adjustment.lower,
- self.adjustment.upper, 0, 7)
-
- if not self._pixbuf[img]:
- svg = rsvg.Handle(data=IMAGE[img])
- self._pixbuf[img] = _from_svg_at_size(handle=svg,
- width=style.STANDARD_ICON_SIZE,
- height=style.STANDARD_ICON_SIZE)
-
- self._image.set_from_pixbuf(self._pixbuf[img])
-
- def _press_cb(self, widget, event):
- self._active = True
-
- def _release_cb(self, widget, event):
- self._active = False
- if self._delayed != 0:
- self.set_value(self._delayed, True)
- self._delayed = 0
-
-def _from_svg_at_size(filename=None, width=None, height=None, handle=None,
- keep_ratio=True):
- """ import from pixbuf.py """
-
- if not handle:
- handle = rsvg.Handle(filename)
-
- dimensions = handle.get_dimension_data()
- icon_width = dimensions[0]
- icon_height = dimensions[1]
-
- if icon_width != width or icon_height != height:
- ratio_width = float(width) / icon_width
- ratio_height = float(height) / icon_height
-
- if keep_ratio:
- ratio = min(ratio_width, ratio_height)
- if ratio_width != ratio:
- ratio_width = ratio
- width = int(icon_width * ratio)
- elif ratio_height != ratio:
- ratio_height = ratio
- height = int(icon_height * ratio)
- else:
- ratio_width = 1
- ratio_height = 1
-
- surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
- context = cairo.Context(surface)
- context.scale(ratio_width, ratio_height)
- handle.render_cairo(context)
-
- loader = gtk.gdk.pixbuf_loader_new_with_mime_type('image/png')
- surface.write_to_png(loader)
- loader.close()
-
- return loader.get_pixbuf()
-
-IMAGE = [None] * 8
-
-IMAGE[0] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M23.5,6.5c3,3,7,7,9,11c-7,5-4,6-3,26c-1,1-8,1-9,0c0,0,2,1,2-1
- c0-3-2-7-2-11c0-2,1-4,1-6c0-3-2-1-2-3c0-3,3-8,3-11c0-2-1-1-2-2v-3H23.5z"/>
-</svg>
-"""
-
-IMAGE[1] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M27.5,44.5v-3C28.5,42.5,28.5,43.5,27.5,44.5z M26.5,10.5
- c2,2,2,6,2,8c0,4-3,11-3,13s4,7,7,10c-2,2-4,3-5,5h-6c1-1,2-3,2-5c0-3-2-9-3-14c0,0,0-1-1,0v-6c0-3,3-8,3-11c0-1-2-2-2-6h3
- C23.5,5.5,26.5,9.5,26.5,10.5z"/>
-</svg>
-"""
-
-IMAGE[2] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M30.5,17.5c0,3-2,2-2,4c0,3,4,14,7,21c-1,0-3,1-5,1c1-1,2,0,2-3
- c0-2-4-7-6-10c-3,3-5,8-7,13c-1,0-3-1-4-1c3-3,7-14,7-18s-1-3-4-4c3-2,4-8,4-14h3C23.5,9.5,30.5,14.5,30.5,17.5z"/>
-</svg>
-"""
-
-IMAGE[3] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M34.5,22.5c-1-1-2-4-5-6c-1,2,0,3,0,6c0,2-3,4-3,7c0,2,4,2,4,4
- c0,3-1,4-2,5c0-1,0-3-1-4c-1,3-2,7-3,10c-4-3,0-6,0-9s-3-11-4-17l-4,4c1-5,8.25-11.12,7.25-16.12c0.68,0.68,3.029,0,2.87,2.12
- C26.5,10.25,33.62,17.75,34.5,22.5z"/>
-</svg>
-"""
-
-IMAGE[4] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M24.5,13.5c2,1,5,3,5,6c0,2-2,3-2,5c0,9,11,4,11,13c-1,0-3-2-4-3
- c-3-1-9,1-10-3c-2,3-5,7-7,11c-3,0-3-1-4-1c0-2,3-3,4-6s4-8,4-10c0-3-1-3-2-5c-1,0-2,1-3,2c0-1,2-3,2-4c1-2,3-5,2-8c0,0,1-1,4-2
- C25.5,9.5,25.5,11.5,24.5,13.5z"/>
-</svg>
-"""
-
-IMAGE[5] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M22.5,10.5c3,2,7,5,7,7c0,3-4,8-4,10c0,3,1,3,1,5h5l2-2l2,2v4
- c-1,0-3-2-5-2c-3,0-5,1-8,1c-1,3-2,7-2,10h-5c1-1,3-3,3-4c1-5,1-11,1-18l-1-1c-1,1-1.75,2.88-2.75,2.88c0,0-0.25-0.63-0.25-1.63
- c4-4,2-8.25,2-13.25c0-1,0.25-2.5,0.38-5.38L22.5,5.5C23.12,6.5,22.5,8.5,22.5,10.5z"/>
-<polygon fill-rule="evenodd" clip-rule="evenodd" fill="#333333" stroke="#333333" stroke-linecap="round" stroke-linejoin="round" points="
- 25,20 25.25,16.75 26.5,17.88 "/>
-</svg>
-"""
-
-IMAGE[6] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M20.5,7.5c1,1,1,3,1,4c10,4,8,6,8,14c0,2,6,9,10,13c-1,2-2,4-4,5
- c1.62-8.88-8.75-13.88-12-15c-1,1-1,0-1,2c0,3,2,5,3,7c-1,1-3,2-6,2c0-1,2-1,2-4c0-2-4-4-4-6c0-3,3-4,5-6c-3-8-8-2-11-6h6
- c0-1,1,0,1-3c0-2-1-1-2-2l1-5H20.5z"/>
-</svg>
-"""
-
-IMAGE[7] = """<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14576) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M20.5,12.5c0.67,0.4,0.4,1.9,1.75,2.25s1.05-0.38,1.5-0.37
- c4.971,0,10.95-0.88,11.75,7.12c-1-2-3-4-5-5l-4,1c1,2,4,4,5,7c1,1,1,4,1,6c3,3,8-1,11,6c-2.88-0.82-4.25-2.62-12.75-2.75
- c-1.561-0.02-2.34-1.561-3.75-1.87c-3.42-0.76-4.67-0.38-5.5-0.38c-3,0-8,7-11,7c-2,0-3-1-3-2c4,2,8-4,9-7c2-1,5-1,8-3c-2-4-6-5-8-3
- l-6-6l2-2c1,1,1,2,1,4c1,0,4.12,0.38,6.12-0.62L16.5,17.5v-5H20.5z"/>
-</svg>
-"""
diff --git a/sound.py b/sound.py
index b473ca9..82c9cfb 100644
--- a/sound.py
+++ b/sound.py
@@ -19,12 +19,13 @@ import shutil
from glob import glob
from gettext import gettext as _
-import port.chooser as chooser
+import toolkit.chooser as chooser
import theme
from utils import *
from sugar.activity.activity import get_bundle_path
+
def load():
from document import Document