Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2012-12-07 23:07:17 (GMT)
committer Walter Bender <walter.bender@gmail.com>2012-12-07 23:07:17 (GMT)
commitdfd89075ae0ece7470e8388f14c17445084ae72e (patch)
treefc6e91f442fbfbd506cfeea25fdff4107779a889
parent345fb3ac72c3be548839d7a0160666747ee0332d (diff)
adding more balls
-rw-r--r--FractionBounceActivity.py97
-rw-r--r--NEWS11
-rw-r--r--activity/activity-fractionbounce.svg50
-rw-r--r--activity/activity.info2
-rw-r--r--ball.py2
-rw-r--r--balls/README2
-rw-r--r--balls/baseball.svg271
-rw-r--r--balls/basketball.svg (renamed from basketball.svg)0
-rw-r--r--balls/beachball.svg53
-rw-r--r--balls/soccer.svg (renamed from soccer.svg)0
-rw-r--r--balls/sunball.svg60
-rw-r--r--balls/tennis.svg41
-rw-r--r--bounce.py34
-rw-r--r--svg_utils.py2
-rw-r--r--utils.py53
15 files changed, 612 insertions, 66 deletions
diff --git a/FractionBounceActivity.py b/FractionBounceActivity.py
index 54ff4b2..965d052 100644
--- a/FractionBounceActivity.py
+++ b/FractionBounceActivity.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#Copyright (c) 2011, Walter Bender, Paulina Clares, Chris Rowe
-
+#Copyright (c) 2012, Ignacio Rodriguez
# Ported to GTK3 - 2012:
# Ignacio Rodríguez <ignaciorodriguez@sugarlabs.org>
@@ -19,9 +19,14 @@ from sugar3.activity import activity
from sugar3 import profile
from sugar3.graphics.toolbarbox import ToolbarBox
from sugar3.graphics.toolbarbox import ToolbarButton
+from sugar3.graphics.toolbutton import ToolButton
+from sugar3.graphics.toolbutton import ToolButton
+# This is for test case in sugar 0.96#
+from sugar3.graphics.colorbutton import ColorToolButton
+
from sugar3.activity.widgets import ActivityToolbarButton
from sugar3.activity.widgets import StopButton
-
+import utils
import telepathy
from dbus.service import signal
from dbus.gobject_service import ExportedGObject
@@ -37,15 +42,20 @@ from toolbar_utils import image_factory, separator_factory, combo_factory, \
label_factory, radio_factory, button_factory, entry_factory
# from utils import json_load, json_dump, chooser
+from utils import chooser
from svg_utils import svg_str_to_pixbuf, generate_xo_svg
-
+from utils import rgb2html
+from utils import get_user_fill_color as acolor
+from utils import get_user_stroke_color as bcolor
from bounce import Bounce
-BALLS = [_('basketball'), _('soccer ball'), _('user defined')]
+BALLS = [_('basketball'), _('soccer ball'), _('tennis ball'), _('baseball'),
+ _('beachball'), _('sun ball'), _('user defined')]
SERVICE = 'org.sugarlabs.FractionBounceActivity'
IFACE = SERVICE
PATH = '/org/augarlabs/FractionBounceActivity'
+canvas = Gtk.DrawingArea()
class FractionBounceActivity(activity.Activity):
@@ -107,7 +117,6 @@ class FractionBounceActivity(activity.Activity):
self._load_standard_buttons(self.toolbar)
separator_factory(self.toolbar, expand=True, visible=False)
-
stop_button = StopButton(self)
stop_button.props.accelerator = _('<Ctrl>Q')
self.toolbar.insert(stop_button, -1)
@@ -116,7 +125,12 @@ class FractionBounceActivity(activity.Activity):
toolbox.show()
self._load_custom_buttons(custom_toolbar)
-
+ def unfullscreen(self):
+ utils.full = False
+ activity.Activity.unfullscreen(self)
+ def __fullscreen_clicked_cb(self, button):
+ utils.full = True
+ self.fullscreen()
def _load_standard_buttons(self, toolbar):
''' Load buttons onto whichever toolbar we are using '''
self.fraction_button = radio_factory('fraction', toolbar,
@@ -132,13 +146,17 @@ class FractionBounceActivity(activity.Activity):
tooltip=_('percents'),
group=self.fraction_button)
self.player = image_factory(
- svg_str_to_pixbuf(generate_xo_svg(scale=0.8,
- colors=['#282828', '#000000'])),
+ svg_str_to_pixbuf(generate_xo_svg(scale=1,
+ colors=[acolor(), bcolor()])),
toolbar, tooltip=self.nick)
separator_factory(toolbar, expand=False, visible=True)
self.challenge = label_factory(toolbar, _("Click the ball to start."),
width=400) # FIXME: default not working
+ def _setup_color(self,widget,pspec):
+ Htmlcolor = rgb2html(widget.get_color())
+ canvas.modify_bg(Gtk.StateType.NORMAL,Gdk.color_parse(Htmlcolor))
+ canvas.show()
def _load_custom_buttons(self, toolbar):
''' Entry fields and buttons for adding custom fractions '''
self.numerator = entry_factory('', toolbar, tooltip=_('numerator'))
@@ -155,14 +173,32 @@ class FractionBounceActivity(activity.Activity):
self._ball_selector = combo_factory(BALLS, toolbar, self._combo_cb,
default=_('soccer ball'),
tooltip=_('choose a ball'))
-
+ item_label = Gtk.ToolItem()
+ label = Gtk.Label(_('Color for the screen'))
+ item_label.add(label)
+ item_label.show_all()
+ fullscreen = ToolButton('view-fullscreen')
+ fullscreen.set_tooltip(_('Fullscreen'))
+ fullscreen.connect('clicked',self.__fullscreen_clicked_cb)
+ try:
+ color = ColorToolButton()
+ color.connect('notify::color', self._setup_color)
+ except:
+ pass
+ toolbar.insert(Gtk.SeparatorToolItem(),-1)
+ toolbar.insert(fullscreen,-1)
+ toolbar.insert(Gtk.SeparatorToolItem(),-1)
+ toolbar.insert(item_label,-1)
+ try:
+ toolbar.insert(color,-1)
+ except:
+ pass
+ toolbar.show_all()
def _setup_canvas(self):
''' Create a canvas '''
- canvas = Gtk.DrawingArea()
canvas.set_size_request(Gdk.Screen.width(),
Gdk.Screen.height())
self.set_canvas(canvas)
- canvas.show()
self.show_all()
return canvas
@@ -172,10 +208,22 @@ class FractionBounceActivity(activity.Activity):
return
if BALLS[self._ball_selector.get_active()] == _('basketball'):
self.bounce_window.ball.new_ball(os.path.join(
- activity.get_bundle_path(), 'basketball.svg'))
+ activity.get_bundle_path(), 'balls/basketball.svg'))
elif BALLS[self._ball_selector.get_active()] == _('soccer ball'):
self.bounce_window.ball.new_ball(os.path.join(
- activity.get_bundle_path(), 'soccer.svg'))
+ activity.get_bundle_path(), 'balls/soccer.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('tennis ball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/tennis.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('baseball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/baseball.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('beachball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/beachball.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('sun ball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/sunball.svg'))
else:
chooser(self, '', self._new_ball_from_journal)
@@ -184,12 +232,23 @@ class FractionBounceActivity(activity.Activity):
if self.bounce_window.mode != 'sectors':
return
if BALLS[self._ball_selector.get_active()] == _('soccer ball'):
- self.bounce_window.ball.new_ball(os.path.join(
- activity.get_bundle_path(), 'soccer.svg'))
- else:
- self.bounce_window.ball.new_ball(os.path.join(
- activity.get_bundle_path(), 'basketball.svg'))
-
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/soccer.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('basketball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/basketball.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('tennis ball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/tennis.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('baseball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/baseball.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('beachball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/beachball.svg'))
+ elif BALLS[self._ball_selector.get_active()] == _('sun ball'):
+ self.bounce_window.ball.new_ball(os.path.join(
+ activity.get_bundle_path(), 'balls/sunball.svg'))
def _new_ball_from_journal(self, dsobject):
''' Load an image from the Journal. '''
self.bounce_window.ball.new_ball_from_image(dsobject.file_path)
diff --git a/NEWS b/NEWS
index 8cc733b..62940e3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,14 @@
+16
+
+ENHANCEMENTS:
+* Added Fullscreen mode (Ignacio Rodriguez)
+* Added ColorToolButton to set background screen color (Ignacio Rodriguez)
+* Added more default balls (Ignacio Rodriguez)
+* Edited icon. Now is a real soccer ball :)
+
+BUG FIX:
+* Fixed chooser for loading user-defined balls
+
15
ENHANCEMENT:
diff --git a/activity/activity-fractionbounce.svg b/activity/activity-fractionbounce.svg
index d14bbfa..e341223 100644
--- a/activity/activity-fractionbounce.svg
+++ b/activity/activity-fractionbounce.svg
@@ -1,37 +1,17 @@
-<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
- <!ENTITY stroke_color "#000">
- <!ENTITY fill_color "#eee">
-]><svg height="55px" viewBox="0 0 55 55" width="55px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5" stroke="&stroke_color;" fill="&fill_color;">
- <g
- transform="translate(0.97542099,-0.97645059)"
- id="g3868">
- <path
- d="m 50.074302,28.475804 a 23.549723,23.549723 0 1 1 -7.21e-4,-0.183632"
- id="path2987"
- style="fill:&fill_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <path
- d="m 3.0364599,27.688318 0.4652114,-0.103436 c 0.5126269,4.098471 1.4646813,6.838938 2.9881891,8.802843 -0.034462,2.476361 0.058935,3.36923 0.4954553,5.373578 C 5.0831795,39.018017 3.0543636,33.597062 3.0364599,27.688318 z"
- id="path3757"
- style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- d="m 39.599141,10.951555 c -2.283243,1.127593 -4.040961,2.187136 -6.061441,3.804554 1.542714,3.092957 2.616395,6.350139 3.417953,9.278869 2.873021,0.268382 5.622424,1.096265 8.370979,1.998213 0.56429,-2.028234 1.143276,-4.413302 1.405572,-7.341132 -1.863643,-2.79804 -4.250805,-5.271728 -7.133063,-7.740504 z"
- id="path3761"
- style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- d="m 48.730303,36.60722 c -0.845333,-0.41038 -1.526439,-0.689379 -2.535998,-1.231141 -2.848004,4.335368 -3.626754,5.550434 -6.770366,7.882238 0.04869,1.710494 -0.36245,3.256762 -1.13489,4.737339 0.256712,-0.0084 0.513424,-0.01682 0.770136,-0.02523 4.486416,-2.761792 6.823887,-6.15788 9.671118,-11.363208 z"
- id="path3763"
- style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- d="m 18.894729,30.346805 c -2.079862,2.657921 -3.281334,4.682018 -4.565547,8.097962 2.085741,3.226082 4.373988,5.844647 7.168498,7.855696 3.314335,-0.852116 6.426165,-2.007991 9.335489,-4.075139 0.0405,-3.282181 -0.324013,-6.892815 -1.397295,-10.174996 -3.62152,-0.97453 -7.053358,-1.304028 -10.541145,-1.703523 z"
- id="path3765"
- style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- d="m 10.342723,11.582668 c 2.857119,-1.581181 5.747084,-3.0638267 8.76843,-4.3494003 1.503179,1.6621179 2.349453,2.9957823 3.622716,4.8878173 -2.496242,2.552867 -4.893949,4.777281 -7.193119,7.6586 -2.437673,-0.270044 -4.645429,-0.343017 -7.5100903,-0.02185 0.4093897,-3.250582 1.1472323,-5.450114 2.3120633,-8.17517 z"
- id="path3767"
- style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- d="m 18.442599,50.187489 c 1.503746,0.278257 2.391791,0.292644 3.367794,0.04316 1.392199,0.756102 2.402891,1.180366 3.515932,1.443767 -3.509951,-0.251534 -4.828652,-0.791799 -6.883726,-1.486925 z"
- id="path3757-4"
- style="fill:&stroke_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+<?xml version="1.0" ?><!-- Created with Inkscape (http://www.inkscape.org/) --><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [
+ <!ENTITY stroke_color "#808080">
+ <!ENTITY fill_color "#ffffff">
+]><svg height="55" id="svg2" inkscape:version="0.48.3.1 r9886" sodipodi:docname="activity-fractionbounce.svg" style="fill:&fill_color;;stroke:&stroke_color;;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round" version="1.1" viewBox="0 0 55 55" width="55" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
+ <g id="g3000">
+ <g id="g3868" style="fill:none" transform="matrix(1.13173,0,0,1.1316705,-2.5179586,-4.7252611)">
+ <path d="m 50.074302,28.475804 a 23.549723,23.549723 0 1 1 -7.21e-4,-0.183632" id="path2987" style="fill:&stroke_color;;fill-opacity:1;stroke:&fill_color;;stroke-width:1.50000000000000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 3.0364599,27.688318 0.4652114,-0.103436 c 0.5126269,4.098471 1.4646813,6.838938 2.9881891,8.802843 -0.034462,2.476361 0.058935,3.36923 0.4954553,5.373578 C 5.0831795,39.018017 3.0543636,33.597062 3.0364599,27.688318 z" id="path3757" style="fill:&fill_color;;fill-opacity:1;stroke:none;stroke-width:0.60036891999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ <path d="m 39.599141,10.951555 c -2.283243,1.127593 -4.040961,2.187136 -6.061441,3.804554 1.542714,3.092957 2.616395,6.350139 3.417953,9.278869 2.873021,0.268382 5.622424,1.096265 8.370979,1.998213 0.56429,-2.028234 1.143276,-4.413302 1.405572,-7.341132 -1.863643,-2.79804 -4.250805,-5.271728 -7.133063,-7.740504 z" id="path3761" style="fill:&fill_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036891999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ <path d="m 48.730303,36.60722 c -0.845333,-0.41038 -1.526439,-0.689379 -2.535998,-1.231141 -2.848004,4.335368 -3.626754,5.550434 -6.770366,7.882238 0.04869,1.710494 -0.36245,3.256762 -1.13489,4.737339 0.256712,-0.0084 0.513424,-0.01682 0.770136,-0.02523 4.486416,-2.761792 6.823887,-6.15788 9.671118,-11.363208 z" id="path3763" style="fill:&fill_color;;fill-opacity:1;stroke:none;stroke-width:0.60036891999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ <path d="m 18.894729,30.346805 c -2.079862,2.657921 -3.281334,4.682018 -4.565547,8.097962 2.085741,3.226082 4.373988,5.844647 7.168498,7.855696 3.314335,-0.852116 6.426165,-2.007991 9.335489,-4.075139 0.0405,-3.282181 -0.324013,-6.892815 -1.397295,-10.174996 -3.62152,-0.97453 -7.053358,-1.304028 -10.541145,-1.703523 z" id="path3765" style="fill:&fill_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036891999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ <path d="m 10.342723,11.582668 c 2.857119,-1.581181 5.747084,-3.0638267 8.76843,-4.3494003 1.503179,1.6621179 2.349453,2.9957823 3.622716,4.8878173 -2.496242,2.552867 -4.893949,4.777281 -7.193119,7.6586 -2.437673,-0.270044 -4.645429,-0.343017 -7.5100903,-0.02185 0.4093897,-3.250582 1.1472323,-5.450114 2.3120633,-8.17517 z" id="path3767" style="fill:&fill_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.60036891999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ <path d="m 18.463384,49.236511 c 1.494665,0.320061 2.377347,0.336609 3.347456,0.04964 1.383791,0.869696 2.388379,1.357701 3.4947,1.660673 -3.488755,-0.289323 -4.799492,-0.910757 -6.842156,-1.710315 z" id="path3757-4" inkscape:connector-curvature="0" style="fill:&fill_color;;fill-opacity:1;stroke:&stroke_color;;stroke-width:0.64194268px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"/>
+ </g>
+ <g id="g2997"/>
</g>
</svg>
diff --git a/activity/activity.info b/activity/activity.info
index dffc60f..f44017c 100644
--- a/activity/activity.info
+++ b/activity/activity.info
@@ -1,6 +1,6 @@
[Activity]
name = FractionBounce
-activity_version = 15
+activity_version = 16
license = GPLv3
bundle_id = org.sugarlabs.FractionBounceActivity
exec = sugar-activity FractionBounceActivity.FractionBounceActivity
diff --git a/ball.py b/ball.py
index b17dbfa..9197486 100644
--- a/ball.py
+++ b/ball.py
@@ -129,7 +129,7 @@ class Ball():
r = SIZE / 2.0
self.ball.set_shape(svg_str_to_pixbuf(
svg_header(SIZE, SIZE, 1.0) + \
- svg_sector(r, r, r - 1, 1.999 * pi, '#A0A0A0', '#ff0000') + \
+ svg_sector(r, r, r - 1, 1.999 * pi, '#A0A0A0', '#ff00FF') + \
svg_sector(r, r, r - 1, fraction * 2 * pi, '#ffff00', '#ff0000') + \
svg_footer()))
diff --git a/balls/README b/balls/README
new file mode 100644
index 0000000..d492950
--- /dev/null
+++ b/balls/README
@@ -0,0 +1,2 @@
+sunball.svg is taken from the MIT Scratch project
+
diff --git a/balls/baseball.svg b/balls/baseball.svg
new file mode 100644
index 0000000..c9acda2
--- /dev/null
+++ b/balls/baseball.svg
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+ version="1.1"
+ width="85"
+ height="85"
+ id="svg2">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <filter
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ color-interpolation-filters="sRGB"
+ id="filter3114">
+ <feColorMatrix
+ result="fbSourceGraphic"
+ values="180"
+ type="hueRotate"
+ id="feColorMatrix3116" />
+ <feColorMatrix
+ result="result3"
+ values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0 "
+ in="fbSourceGraphic"
+ id="feColorMatrix3118" />
+ <feBlend
+ in2="result3"
+ mode="lighten"
+ in="fbSourceGraphic"
+ result="result2"
+ id="feBlend3120" />
+ <feBlend
+ in2="result2"
+ mode="multiply"
+ in="result2"
+ result="result1"
+ id="feBlend3122" />
+ <feComposite
+ in2="SourceGraphic"
+ operator="in"
+ id="feComposite3124" />
+ </filter>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3845">
+ <feGaussianBlur
+ stdDeviation="0.35566654"
+ id="feGaussianBlur3847" />
+ </filter>
+ </defs>
+ <path
+ d="m 87.145768,56.016311 a 36.377117,34.756355 0 1 1 0.08117,-0.269879"
+ transform="matrix(1.0298688,0,0,1.0778879,-11.284255,-7.3865709)"
+ id="path3069"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3845)" />
+ <path
+ d="m 6.8389904,37.454052 c 0,0 -0.870849,1.411827 -0.866667,2.2 0.00407,0.767541 0.866667,2.133333 0.866667,2.133333 0,0 -0.958297,1.600001 -0.866667,2.466667 0.098576,0.93236 1.466667,2.4 1.466667,2.4"
+ id="path3853"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 8.3056564,36.587385 -0.866666,2.533334 0.866666,1.666666 -0.8,2.933334 1.133334,2"
+ id="path3855"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 10.03899,35.254052 -1.1999996,2.466667 0.866666,1.8 -1,1.666666 1.3999996,3.133334"
+ id="path3857"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 11.905656,33.920719 -1.333333,3.133333 1,1.533333 -0.266667,2.466667 1.133334,2.066667"
+ id="path3859"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 13.905656,32.387385 -0.533333,2.8 0.666667,2.066667 -1,1.533333 0.6,2.133334 0.933333,1.066666"
+ id="path3861"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 16.572323,30.987385 -0.933333,2.866667 0.8,1.866667 -1.2,1.133333 1.733333,3.866667"
+ id="path3863"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 19.23899,29.787385 -0.733334,2.133334 0.666667,2.066666 -1.133333,1.666667 1.6,3.6"
+ id="path3865"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 22.972323,28.187385 -1.066667,2.466667 0,2 -0.8,0.933333 1.4,4.533334"
+ id="path3867"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 26.505656,27.320719 -0.933333,2.2 0,1.866666 -0.866667,0.8 0.333334,2.466667 0.666666,2.2"
+ id="path3869"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 30.43899,26.187385 -0.933334,1.933334 -0.733333,2.333333 -1,1 0.8,2.266667 0.6,2.2"
+ id="path3871"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 35.03899,26.054052 -1.066667,1.666667 -0.933333,2.533333 c 0,0 -1.266667,0 -1.266667,0.333333 0,0.333334 0.666667,4.466667 0.666667,4.466667"
+ id="path3873"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 39.43899,26.254052 -2.533334,3.4 -1.333333,0.6 0,5.266667"
+ id="path3875"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 43.972323,26.987385 -2.933333,3.666667 -1.4,0.2 -0.933334,5.4"
+ id="path3877"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 47.972323,28.654052 -3.066667,3.2 -1.6,-0.133333 -1.066666,5.6"
+ id="path3879"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 51.972323,30.654052 -3.333333,2.733333 -1.2,-0.266666 -1.6,5.333333"
+ id="path3881"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 55.43899,32.854052 c -0.333334,0.06667 -3.533334,2.133333 -3.533334,2.133333 l -1.266666,-0.133333 -1.8,5"
+ id="path3883"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 58.772323,34.587385 -4,2.733334 -1,-0.466667 -1.933333,4.733333"
+ id="path3885"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 61.905656,38.387385 -4.333333,1.4 -1,-0.6 -2.533333,5.333334"
+ id="path3887"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 64.43899,41.654052 -4.066667,1.466667 -1,-0.466667 -2.933333,4.133333"
+ id="path3889"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 65.972323,45.454052 -3.8,0.933333 -0.6,-0.6 -3.6,4.4"
+ id="path3891"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 67.372323,49.320719 -3.733333,0.6 -0.533334,-0.866667 -3.866666,3.6"
+ id="path3893"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 68.305656,53.254052 -3.666666,0.133333 c 0,0 -0.333334,-1.333333 -0.466667,-1.066666 -0.133333,0.266666 -4.066667,2.933333 -4.066667,2.933333"
+ id="path3895"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 68.505656,56.920719 c -0.266666,0.133333 -3.533333,0.2 -3.533333,0.2 l -0.266667,-0.6 -3.933333,1.933333"
+ id="path3897"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 67.705656,60.787385 -2.666666,-0.333333 -0.4,-0.8 -4.933334,1.666667"
+ id="path3899"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 66.572323,63.987385 -2.733333,-0.133333 0,-0.733333 -3.933334,0.733333"
+ id="path3901"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 64.105656,67.454052 -1.6,-0.4 -0.4,-0.666667 -3.8,0.8"
+ id="path3903"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 62.43899,70.187385 -1.4,-0.4 c 0,0 0,-0.933333 -0.266667,-0.8 -0.266667,0.133334 -4.133333,0.4 -4.133333,0.4"
+ id="path3905"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 59.705656,72.854052 -0.933333,-0.666667 -0.466667,-0.533333 -1.933333,0.6 -1.866667,-0.866667"
+ id="path3907"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 57.23899,75.254052 -1.333334,-0.8 -2,-0.2 -1.866666,-0.466667"
+ id="path3909"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 54.772323,77.120719 -1.666667,-0.933334 -2.266666,0 -1.533334,-1"
+ id="path3911"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 50.772323,78.720719 -0.933333,-0.8 -3.4,-0.933334 0,-0.133333"
+ id="path3913"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 47.905656,79.454052 -4.533333,-1.6"
+ id="path3915"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 43.23899,79.654052 -3,-0.933333"
+ id="path3917"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 39.105656,79.454052 37.172323,78.787385"
+ id="path3919"
+ style="fill:none;stroke:#7d4040;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 49.172323,5.7873851 c 0.4,-0.066667 1.266667,-0.2666666 1.266667,-0.2666666"
+ id="path3921"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 51.905656,6.1873851 53.63899,6.0540518"
+ id="path3923"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 54.572323,7.2540518 c 0.4,0.066667 2.133333,0.066667 2.133333,0.066667"
+ id="path3925"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 57.63899,9.1873851 1.733333,0.2 0.866667,-0.5333333"
+ id="path3927"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 60.572323,11.520719 c 0.333333,-0.133334 1.466667,-0.8 1.466667,-0.8 l 0.4,-0.466667"
+ id="path3929"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 63.505656,13.454052 c 0.933334,0.06667 1.866667,0.2 1.866667,0.2 l -0.6,-1.4"
+ id="path3931"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 66.03899,16.520719 c 0,0 1.266666,-0.333334 1.533333,-0.266667 0.266667,0.06667 -0.06667,-1.6 -0.06667,-1.6"
+ id="path3933"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 68.305656,19.854052 c 0.8,-0.2 2.066667,-0.533333 2.066667,-0.533333 l -0.866667,-2.066667"
+ id="path3935"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 71.972323,20.654052 71.23899,19.387385 z"
+ id="path3937"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 71.172323,23.120719 c 0.266667,-0.06667 1.933333,0.666666 1.933333,0.666666 l 0.866667,-0.8"
+ id="path3939"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 73.772323,26.387385 1.533333,0.266667 0.666667,0.266667 0,-0.733334"
+ id="path3941"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 75.305656,30.054052 c 0,0 0.866667,-0.733333 1.2,-0.666667 0.333334,0.06667 1.133334,1.066667 1.133334,1.066667 l -0.266667,-1.2"
+ id="path3943"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 77.305656,33.587385 1.333334,-0.8 0.133333,-0.666666"
+ id="path3945"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 79.172323,37.520719 0.333333,-0.733334"
+ id="path3947"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 79.705656,39.654052 0.2,-0.4"
+ id="path3949"
+ style="fill:none;stroke:#7d4040;stroke-width:1.875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/basketball.svg b/balls/basketball.svg
index 7ccb8c3..7ccb8c3 100644
--- a/basketball.svg
+++ b/balls/basketball.svg
diff --git a/balls/beachball.svg b/balls/beachball.svg
new file mode 100644
index 0000000..b835ad7
--- /dev/null
+++ b/balls/beachball.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+ version="1.1"
+ width="85"
+ height="85"
+ id="svg2987">
+ <metadata
+ id="metadata2993">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs2991" />
+ <path
+ d="m 80.452924,53.572794 a 39.535206,39.53499 0 1 1 0.08822,-0.306985"
+ id="path3047-1"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <g
+ transform="translate(-2.2507039e-4,2.4371096e-5)"
+ id="g3849">
+ <path
+ d="m 48.28877,62.219251 c 0,0 -1.582829,-3.361509 -1.44385,-5.13369 0.17024,-2.170797 2.727273,-5.935828 2.727273,-5.935828 0,0 -9.567817,-6.020918 -14.278075,-9.144385 C 29.780704,38.349292 24.133542,34.861063 18.930481,30.775401 15.713605,28.249375 9.7860963,22.593583 9.7860963,22.593583 c 0,0 -4.9217576,8.009501 -5.9358289,12.513369 -1.010186,4.486612 -0.7494874,9.259344 0,13.796791 0.4878049,2.953203 1.5346133,5.832745 2.8877005,8.502674 1.7704758,3.493525 6.7379681,9.625669 6.7379681,9.625669 0,0 4.531513,1.587425 6.898396,1.764705 4.234344,0.317153 8.527747,-0.366618 12.673796,-1.283422 C 38.299266,66.3522 48.28877,62.219251 48.28877,62.219251 z"
+ id="path3049"
+ style="fill:#ff4141;fill-opacity:1;stroke:none" />
+ <path
+ d="m 60.962567,45.534759 c 0,0 3.080573,0.959965 4.331551,1.925134 1.084412,0.836659 2.566845,3.208556 2.566845,3.208556 0,0 5.079694,-3.898145 7.219251,-6.256684 2.422531,-2.670474 6.256684,-8.82353 6.256684,-8.82353 0,0 -2.666481,-10.98466 -5.775401,-15.561497 C 72.731711,15.860832 68.514642,12.724107 64.331551,9.9197861 60.437677,7.3093547 51.657754,3.8235294 51.657754,3.8235294 L 48.770053,3.5026738 c 0,0 4.486173,5.9646111 6.096257,9.3048132 2.151476,4.463347 3.571867,9.282076 4.652407,14.117647 0.963363,4.31119 1.401257,8.742234 1.604278,13.15508 0.0836,1.817046 -0.160428,5.454545 -0.160428,5.454545 z"
+ id="path3819"
+ style="fill:#4146ff;fill-opacity:1;stroke:none" />
+ <path
+ d="m 57.433155,66.229947 c 0,0 3.483786,-0.954874 4.973262,-1.925134 1.710925,-1.114514 4.331551,-4.331551 4.331551,-4.331551 0,0 3.05905,1.997341 4.652406,2.887701 1.043842,0.583294 3.208556,1.604278 3.208556,1.604278 0,0 -3.884278,6.235701 -6.57754,8.663101 -2.602383,2.345492 -5.739761,4.132079 -8.983957,5.454546 -2.186166,0.891171 -6.898396,1.604278 -6.898396,1.604278 0,0 2.019306,-4.453916 2.887701,-6.737968 0.901453,-2.371002 2.406417,-7.219251 2.406417,-7.219251 z"
+ id="path3821"
+ style="fill:#ffd941;fill-opacity:1;stroke:none" />
+ <path
+ d="m 78.930895,63.569678 c -3.442202,10.09089 -11.713724,18.909646 -22.483577,23.972573 -10.769853,5.062926 -23.905344,6.30801 -35.703,3.385506 C 8.9466619,88.005253 -1.3682578,80.951198 -7.29828,71.752335 -13.228302,62.553472 -14.701965,51.322298 -11.307824,41.220708 -7.9136829,31.119117 0.30674365,22.270677 11.042082,17.168033 21.77742,12.06539 34.897279,10.771426 46.709045,13.651939 c 11.811765,2.880513 22.170272,9.900243 28.154197,19.081122 5.983925,9.180879 7.519314,20.410098 4.172543,30.524445 z"
+ transform="matrix(0.84108375,0,0,0.98338297,14.06561,-8.9404119)"
+ id="path3047"
+ style="fill:none;stroke:#000000;stroke-width:3.29868078;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/soccer.svg b/balls/soccer.svg
index 0ed65fa..0ed65fa 100644
--- a/soccer.svg
+++ b/balls/soccer.svg
diff --git a/balls/sunball.svg b/balls/sunball.svg
new file mode 100644
index 0000000..1bfaf84
--- /dev/null
+++ b/balls/sunball.svg
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ width="100"
+ height="100"
+ sodipodi:docname="sunball.svg">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1628"
+ inkscape:window-height="577"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="60"
+ inkscape:cy="60.5"
+ inkscape:window-x="-643"
+ inkscape:window-y="24"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <image
+ width="100"
+ height="100"
+ xlink:href="data:image/png;base64,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 "
+ id="image10"
+ x="0"
+ y="0" />
+</svg>
diff --git a/balls/tennis.svg b/balls/tennis.svg
new file mode 100644
index 0000000..fde52d4
--- /dev/null
+++ b/balls/tennis.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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"
+ version="1.1"
+ width="85"
+ height="85"
+ id="svg2">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <g
+ transform="translate(1.0130582,-0.7280399)"
+ id="g3826">
+ <path
+ d="m 83.387392,56.493855 a 36.506237,37.21925 0 1 1 0.08146,-0.289003"
+ transform="matrix(1.080768,0,0,1.0600578,-10.759595,-5.6083131)"
+ id="path3755"
+ style="fill:#b9ff43;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ d="m 64.171123,12.700535 c 0,0 2.403943,3.041675 2.424242,4.848485 0.02126,1.892313 -2.027077,3.427519 -3.422459,4.705882 -2.428535,2.224874 -5.197848,3.138142 -8.413547,3.850267 -3.958186,0.87655 -10.980393,0.998218 -11.97861,0.998218 -0.998218,0 -13.547237,0.855615 -14.402852,0.998217 -0.855615,0.142603 -8.016962,0.574314 -11.550803,2.28164 -2.641531,1.276219 -5.15891,3.209241 -6.702317,5.7041 -2.2926814,3.706033 -3.4224597,12.121212 -3.1372547,12.691622 0.285205,0.57041 1.3840035,6.706468 2.7094474,9.839572 1.4610883,3.453742 3.0248253,7.073118 5.7041003,9.69697 3.542719,3.469436 8.229991,5.839065 12.976827,7.272727 3.605172,1.088851 10.552584,0.713013 11.265597,0.855615 0.713012,0.142603 11.569829,-1.618269 16.969697,-3.707665 3.99203,-1.544655 10.552584,-5.846702 11.122994,-6.417112 0.57041,-0.57041 5.989305,-5.276292 5.989305,-5.276292"
+ id="path3824"
+ style="fill:none;stroke:#949494;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+</svg>
diff --git a/bounce.py b/bounce.py
index d12c75a..9da636a 100644
--- a/bounce.py
+++ b/bounce.py
@@ -16,6 +16,7 @@
# [a fraction to display on the ball,
# the number of segments in the bar,
# the number of times this challenge has been played]
+import os
CHALLENGES = [[['1/2', 2, 0], ['1/3', 3, 0], ['1/4', 4, 0],
['2/4', 4, 0], ['2/3', 3, 0], ['3/4', 4, 0]],
@@ -45,14 +46,16 @@ BOUNCE_PAUSE = 3000 # milliseconds between bounces
DX = 10 # starting step size for horizontal movement
DDX = 1.25 # acceleration during keypress
ACCELEROMETER_DEVICE = '/sys/devices/platform/lis3lv02d/position'
+
CRASH = 'crash.ogg' # wrong answer sound
LAUGH = 'bottle.ogg' # correct answer sound
BUBBLES = 'bubbles.ogg' # Easter Egg sound
+
+
from gi.repository import Gtk, Gdk, GdkPixbuf, GObject
from random import uniform
-import os
-
+import utils
from svg_utils import svg_header, svg_footer, svg_rect, svg_str_to_pixbuf, \
svg_from_file
@@ -71,7 +74,7 @@ try:
GRID_CELL_SIZE = style.GRID_CELL_SIZE
except ImportError:
GRID_CELL_SIZE = 0
-
+from sugar3.graphics.alert import NotifyAlert
from sprites import Sprites, Sprite
@@ -143,7 +146,7 @@ class Bounce():
self.dx = 0. # ball horizontal trajectory
# acceleration (with dampening)
- self.ddy = (6.67 * self.height) / (STEPS * STEPS)
+ self.ddy = (6.7 * self.height) / (STEPS * STEPS)
self.dy = self.ddy * (1 - STEPS) / 2. # initial step size
def _create_sprites(self, path):
@@ -163,7 +166,7 @@ class Bounce():
'#C0C0C0', '#282828') + \
svg_footer())
- self.ball = Ball(self.sprites, os.path.join(path, 'soccer.svg'))
+ self.ball = Ball(self.sprites, os.path.join(path, 'balls/soccer.svg'))
self.current_frame = 0
self.bar = Bar(self.sprites, self.width, self.height, self.scale,
@@ -420,10 +423,23 @@ class Bounce():
if not easter_egg:
spr = Sprite(self.sprites, 0, 0, self.smiley_graphic)
self.correct += 1
+ if utils.full:
+ self.alert = NotifyAlert(3)
+ self.alert.props.title = _('Great')
+ self.alert.props.msg = _('Level up!')
+ self.alert.connect('response', lambda w, i: self.activity.remove_alert(w))
+ self.activity.add_alert(self.alert)
GObject.idle_add(play_audio_from_file, self, self.path_to_success)
else:
if not easter_egg:
spr = Sprite(self.sprites, 0, 0, self.frown_graphic)
+ if utils.full:
+ self.alert = NotifyAlert(3)
+ self.alert.props.title = _('Oh..')
+ self.alert.props.msg = _('Level down')
+ self.alert.connect('response', lambda w, i: self.activity.remove_alert(w))
+ self.activity.add_alert(self.alert)
+
GObject.idle_add(play_audio_from_file, self, self.path_to_failure)
if easter_egg:
@@ -435,12 +451,18 @@ class Bounce():
# after enough correct answers, up the difficulty
if self.correct == len(self.challenges) * 2:
self.challenge += 1
+
+ #
if self.challenge < len(CHALLENGES):
for challenge in CHALLENGES[self.challenge]:
self.challenges.append(challenge)
else:
self.expert = True
-
+ self.alert = NotifyAlert(10)
+ self.alert.props.title = _('Great')
+ self.alert.props.msg = _('Now are in expert levels')
+ self.alert.connect('response', lambda w, i: self.activity.remove_alert(w))
+ self.activity.add_alert(alerta)
self.count += 1
self.dx = 0. # stop horizontal movement between bounces
diff --git a/svg_utils.py b/svg_utils.py
index 662b5e8..1ea67e3 100644
--- a/svg_utils.py
+++ b/svg_utils.py
@@ -56,7 +56,7 @@ def svg_rect(w, h, rx, ry, x, y, fill, stroke):
return svg_string
-def _svg_xo(fill, stroke, width=3.5):
+def _svg_xo(fill, stroke, width=5.5):
''' Returns XO icon graphic '''
svg_string = '<path d="M33.233,35.1l10.102,10.1c0.752,\
0.75,1.217,1.783,1.217,2.932\
diff --git a/utils.py b/utils.py
index 003642e..dc13207 100644
--- a/utils.py
+++ b/utils.py
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2011, Walter Bender
-# Ported to gtk 3: Ignacio Rodríguez
-# <ignaciorodriguez@sugarlabs.org>
+# Copyright (c) 2012, Ignacio Rodriguez
# 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
@@ -15,13 +14,61 @@
from gi.repository import Gtk
-from sugar.graphics.objectchooser import ObjectChooser
+from sugar3.graphics.objectchooser import ObjectChooser
+from sugar3 import profile
+from sugar3.graphics.style import Color
from StringIO import StringIO
import json
json.dumps
from json import load as jload
from json import dump as jdump
+full = False
+
+
+def rgb2html(color):
+ """Returns a html string from a Gdk color"""
+ red = "%x" % int(color.red / 65535.0 * 255)
+ if len(red) == 1:
+ red = "0%s" % red
+
+ green = "%x" % int(color.green / 65535.0 * 255)
+
+ if len(green) == 1:
+ green = "0%s" % green
+
+ blue = "%x" % int(color.blue / 65535.0 * 255)
+
+ if len(blue) == 1:
+ blue = "0%s" % blue
+
+ new_color = "#%s%s%s" % (red, green, blue)
+
+ return new_color
+def get_user_fill_color(type='str'):
+ """Returns the user fill color"""
+ color = profile.get_color()
+
+ if type == 'gdk':
+ rcolor = Color(color.get_fill_color()).get_gdk_color()
+
+ elif type == 'str':
+ rcolor = color.get_fill_color()
+
+ return rcolor
+
+
+def get_user_stroke_color(type='str'):
+ """Returns the user stroke color"""
+ color = profile.get_color()
+
+ if type == 'gdk':
+ rcolor = Color(color.get_stroke_color()).get_gdk_color()
+
+ elif type == 'str':
+ rcolor = color.get_stroke_color()
+
+ return rcolor
def json_load(text):
""" Load JSON data using what ever resources are available. """