diff options
author | Aleksey Lim <alsroot@member.fsf.org> | 2009-12-16 19:36:06 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@member.fsf.org> | 2009-12-16 19:36:06 (GMT) |
commit | f699b1f6dc897a96e4323db65961190e65690eef (patch) | |
tree | 8c457dc2e20f02e7716a3185f15bbabef9df1080 | |
parent | 33cc7c69a7af607d129c43072187f44e5c99c066 (diff) |
Switch to services
-rw-r--r-- | activity.py | 148 | ||||
-rw-r--r-- | char.py | 5 | ||||
-rw-r--r-- | document.py | 10 | ||||
-rw-r--r-- | ground.py | 5 | ||||
-rw-r--r-- | icons/mamamedia.svg | 203 | ||||
-rw-r--r-- | messenger.py | 2 | ||||
-rw-r--r-- | montage.py | 8 | ||||
-rw-r--r-- | port/COPYING | 340 | ||||
-rw-r--r-- | port/README | 18 | ||||
-rw-r--r-- | port/__init__.py | 0 | ||||
-rw-r--r-- | port/activity.py | 305 | ||||
-rw-r--r-- | port/chooser.py | 66 | ||||
-rw-r--r-- | port/json.py | 33 | ||||
-rw-r--r-- | port/pixbuf.py | 213 | ||||
-rw-r--r-- | port/scrolledbox.py | 179 | ||||
-rw-r--r-- | port/tarball.py | 159 | ||||
-rw-r--r-- | port/temposlider.py | 215 | ||||
-rw-r--r-- | sound.py | 3 |
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() @@ -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 @@ -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 @@ -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> -""" @@ -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 |