Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2014-06-26 22:25:43 (GMT)
committer Walter Bender <walter@sugarlabs.org>2014-06-26 22:25:43 (GMT)
commitc51f9a9d1b5a6516a2de45ed0c1d1cb7e489e395 (patch)
tree6d9d5d592626a875fd8ba0c9b10c0b801ee7cfd2
parent8aa5055f0ce7a48b140b7cfdfa80b6b745ee9934 (diff)
replace combo with palette
-rw-r--r--GNUChessActivity.py286
-rw-r--r--NEWS1
-rw-r--r--icons/timer-0.svg192
-rw-r--r--icons/timer-1.svg123
-rw-r--r--icons/timer-2.svg123
-rw-r--r--icons/timer-3.svg123
6 files changed, 673 insertions, 175 deletions
diff --git a/GNUChessActivity.py b/GNUChessActivity.py
index e0bc23e..38ead14 100644
--- a/GNUChessActivity.py
+++ b/GNUChessActivity.py
@@ -14,20 +14,22 @@
from gi.repository import Gtk, Gdk, GObject
from sugar3.activity import activity
-from sugar3 import profile
from sugar3.graphics.toolbarbox import ToolbarBox
from sugar3.activity.widgets import ActivityToolbarButton
from sugar3.activity.widgets import StopButton
from sugar3.graphics.toolbarbox import ToolbarButton
+from sugar3.graphics.toolbutton import ToolButton
from sugar3.graphics.objectchooser import ObjectChooser
-from sugar3.datastore import datastore
-from sugar3 import mime
+from sugar3.graphics.menuitem import MenuItem
from sugar3.graphics.alert import ConfirmationAlert, NotifyAlert
from sugar3.graphics.icon import Icon
from sugar3.graphics.xocolor import XoColor
+from sugar3.datastore import datastore
+from sugar3 import mime
+from sugar3 import profile
from toolbar_utils import button_factory, label_factory, separator_factory, \
- radio_factory, entry_factory, combo_factory
+ radio_factory, entry_factory
from utils import json_load, json_dump, get_hardware, \
pixbuf_to_base64, base64_to_pixbuf
@@ -51,11 +53,17 @@ SERVICE = 'org.sugarlabs.GNUChessActivity'
IFACE = SERVICE
PATH = '/org/augarlabs/GNUChessActivity'
+PIECES = {'pawn': {'white': _('White Pawn'), 'black': _('Black Pawn')},
+ 'rook': {'white': _('White Rook'), 'black': _('Black Rook')},
+ 'knight': {'white': _('White Knight'), 'black': _('Black Knight')},
+ 'bishop': {'white': _('White Bishop'), 'black': _('Black Bishop')},
+ 'queen': {'white': _('White Queen'), 'black': _('Black Queen')},
+ 'king': {'white': _('White King'), 'black': _('Black King')}}
+
+
class GNUChessActivity(activity.Activity):
''' Gnuchess interface from Sugar '''
- # FIXME: Disable most buttons when joiner
-
def __init__(self, handle):
''' Initialize the toolbars and the gnuchess '''
try:
@@ -84,8 +92,7 @@ class GNUChessActivity(activity.Activity):
# Create a canvas
canvas = Gtk.DrawingArea()
- canvas.set_size_request(Gdk.Screen.width(), \
- Gdk.Screen.height())
+ canvas.set_size_request(Gdk.Screen.width(), Gdk.Screen.height())
self.set_canvas(canvas)
canvas.show()
self.show_all()
@@ -97,13 +104,16 @@ class GNUChessActivity(activity.Activity):
path=activity.get_bundle_path(),
colors=self.colors)
-
if self.shared_activity:
# We're joining
if not self.get_shared():
xocolors = XoColor(profile.get_color().to_string())
share_icon = Icon(icon_name='zoom-neighborhood',
xo_color=xocolors)
+
+ def _alert_cancel_cb(self, alert, response_id):
+ self.remove_alert(alert)
+
self._joined_alert = NotifyAlert()
self._joined_alert.props.icon = share_icon
self._joined_alert.props.title = _('Please wait')
@@ -118,6 +128,7 @@ class GNUChessActivity(activity.Activity):
self.stopwatch_running = False
self.time_interval = None
+ self.timer_panel_visible = False
if self.game_data is not None: # 'saved_game' in self.metadata:
self._restore()
@@ -125,9 +136,6 @@ class GNUChessActivity(activity.Activity):
self._gnuchess.new_game()
self._restoring = False
- def _alert_cancel_cb(self, alert, response_id):
- self.remove_alert(alert)
-
def restore_cursor(self):
''' No longer thinking, so restore standard cursor. '''
self.get_window().set_cursor(self.old_cursor)
@@ -307,26 +315,13 @@ class GNUChessActivity(activity.Activity):
separator_factory(self.adjust_toolbar, False, True)
- self.time_list = [_('Disabled'),
- #TRANS: Lightning chess 30 seconds between moves
- _('Lightning: %d seconds') % (30),
- #TRANS: Blitz chess 3 minutes between moves
- _('Blitz: %d minutes') % (3),
- #TRANS: Tournament chess 10 minutes between moves
- _('Tournament: %d minutes') % (10)]
- self.timer = Gtk.ComboBoxText()
- for t in self.time_list:
- self.timer.append_text(t)
- self.timer.set_tooltip_text(_('Timer'))
- self.timer.set_active(0)
- self.timer.connect("changed", self.set_timer_cb)
-
- toolitem = Gtk.ToolItem()
- toolitem.add(self.timer)
- self.adjust_toolbar.insert(toolitem, -1)
- toolitem.show()
- self.timer.show()
- self.timer.set_sensitive(True)
+ self.timer_button = ToolButton('timer-0')
+ self.timer_button.set_tooltip(_('Timer'))
+ self.timer_button.connect('clicked', self._timer_button_cb)
+ self.toolbar.insert(self.timer_button, -1)
+ self._setup_timer_palette()
+ self.timer_button.show()
+ self.timer_button.set_sensitive(True)
self.robot_button.set_active(True)
@@ -355,119 +350,31 @@ class GNUChessActivity(activity.Activity):
toolbox.toolbar.insert(stop_button, -1)
stop_button.show()
- button_factory('white-pawn',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='white_pawn',
- tooltip=_('White Pawn'))
-
- button_factory('black-pawn',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='black_pawn',
- tooltip=_('Black Pawn'))
-
- button_factory('white-rook',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='white_rook',
- tooltip=_('White Rook'))
-
- button_factory('black-rook',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='black_rook',
- tooltip=_('Black Rook'))
-
- button_factory('white-knight',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='white_knight',
- tooltip=_('White Knight'))
-
- button_factory('black-knight',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='black_knight',
- tooltip=_('Black Knight'))
-
- button_factory('white-bishop',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='white_bishop',
- tooltip=_('White Bishop'))
-
- button_factory('black-bishop',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='black_bishop',
- tooltip=_('Black Bishop'))
-
- button_factory('white-queen',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='white_queen',
- tooltip=_('White Queen'))
-
- button_factory('black-queen',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='black_queen',
- tooltip=_('Black Queen'))
-
- button_factory('white-king',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='white_king',
- tooltip=_('White King'))
-
- button_factory('black-king',
- self.custom_toolbar,
- self._reskin_cb,
- cb_arg='black_king',
- tooltip=_('Black King'))
+ for piece in PIECES.keys():
+ for color in ['white', 'black']:
+ button_factory('%s-%s' % (color, piece),
+ self.custom_toolbar,
+ self._reskin_cb,
+ cb_arg='%s_%s' % (color, piece),
+ tooltip=PIECES[piece][color])
def do_default_skin_cb(self, button=None):
- self._gnuchess.reskin_from_file('black_king',
- '%s/icons/black-king.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('black_queen',
- '%s/icons/black-queen.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('black_bishop',
- '%s/icons/black-bishop.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('black_knight',
- '%s/icons/black-knight.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('black_rook',
- '%s/icons/black-rook.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('black_pawn',
- '%s/icons/black-pawn.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('white_king',
- '%s/icons/white-king.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('white_queen',
- '%s/icons/white-queen.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('white_bishop',
- '%s/icons/white-bishop.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('white_knight',
- '%s/icons/white-knight.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('white_rook',
- '%s/icons/white-rook.svg' % (activity.get_bundle_path()))
- self._gnuchess.reskin_from_file('white_pawn',
- '%s/icons/white-pawn.svg' % (activity.get_bundle_path()))
+ for piece in PIECES.keys():
+ for color in ['white', 'black']:
+ self._gnuchess.reskin_from_file(
+ '%s_%s' % (color, piece),
+ '%s/icons/%s-%s.svg' % (activity.get_bundle_path(),
+ color, piece))
def _black_pieces(self, colors):
- self._gnuchess.reskin_from_svg('black_king', colors, bw='#000000')
- self._gnuchess.reskin_from_svg('black_queen', colors, bw='#000000')
- self._gnuchess.reskin_from_svg('black_bishop', colors, bw='#000000')
- self._gnuchess.reskin_from_svg('black_knight', colors, bw='#000000')
- self._gnuchess.reskin_from_svg('black_rook', colors, bw='#000000')
- self._gnuchess.reskin_from_svg('black_pawn', colors, bw='#000000')
+ for piece in PIECES.keys():
+ self._gnuchess.reskin_from_svg('black_%s' % piece, colors,
+ bw='#000000')
def _white_pieces(self, colors):
- self._gnuchess.reskin_from_svg('white_king', colors, bw='#ffffff')
- self._gnuchess.reskin_from_svg('white_queen', colors, bw='#ffffff')
- self._gnuchess.reskin_from_svg('white_bishop', colors, bw='#ffffff')
- self._gnuchess.reskin_from_svg('white_knight', colors, bw='#ffffff')
- self._gnuchess.reskin_from_svg('white_rook', colors, bw='#ffffff')
- self._gnuchess.reskin_from_svg('white_pawn', colors, bw='#ffffff')
+ for piece in PIECES.keys():
+ self._gnuchess.reskin_from_svg('white_%s' % piece, colors,
+ bw='#ffffff')
def do_sugar_skin_cb(self, button=None):
colors = self.colors
@@ -487,51 +394,73 @@ class GNUChessActivity(activity.Activity):
self._white_pieces(colors)
def do_custom_skin_cb(self, button=None):
- for piece in ['white_pawn', 'black_pawn',
- 'white_rook', 'black_rook',
- 'white_knight', 'black_knight',
- 'white_bishop', 'black_bishop',
- 'white_queen', 'black_queen',
- 'white_king', 'black_king']:
- if piece in self.metadata:
- id = self.metadata[piece]
- jobject = datastore.get(id)
- if jobject is not None and jobject.file_path is not None:
- self._do_reskin(piece, jobject.file_path)
-
- def _do_reskin(self, piece, file_path):
+ for piece in PIECES.keys():
+ for color in ['white', 'black']:
+ name = '%s_%s' % (color, piece)
+ if name in self.metadata:
+ id = self.metadata[name]
+ jobject = datastore.get(id)
+ if jobject is not None and jobject.file_path is not None:
+ self._do_reskin(name, jobject.file_path)
+
+ def _do_reskin(self, name, file_path):
''' If we are sharing, only reskin pieces of your color '''
if self._gnuchess.we_are_sharing and self.buddy is not None:
- if 'white' in piece and self.playing_white:
+ if 'white' in name and self.playing_white:
pixbuf = self._gnuchess.reskin_from_file(
- piece, file_path, return_pixbuf=True)
- self.send_piece(piece, pixbuf)
- elif 'black' in piece and not self.playing_white:
+ name, file_path, return_pixbuf=True)
+ self.send_piece(name, pixbuf)
+ elif 'black' in name and not self.playing_white:
pixbuf = self._gnuchess.reskin_from_file(
- piece, file_path, return_pixbuf=True)
- self.send_piece(piece, pixbuf)
+ name, file_path, return_pixbuf=True)
+ self.send_piece(name, pixbuf)
else:
- self._gnuchess.reskin_from_file(piece, file_path)
+ self._gnuchess.reskin_from_file(name, file_path)
return
- def set_timer_cb(self, widget):
+ def _timer_button_cb(self, button):
+ if not self.timer_palette.is_up() and not self.timer_panel_visible:
+ self.timer_palette.popup(
+ immediate=True, state=self.timer_palette.SECONDARY)
+ self.timer_panel_visible = True
+ else:
+ self.timer_palette.popdown(immediate=True)
+ self.timer_panel_visible = False
+
+ def _setup_timer_palette(self):
+ self.timer_values = [None, 30, 180, 600]
+ self.timer_tooltips = ['', _('30 seconds'), _('3 minutes'),
+ _('10 minutes')]
+ self.timer_labels = [_('Disabled'),
+ #TRANS: Lightning chess 30 seconds between moves
+ _('Lightning: %d seconds') % (30),
+ #TRANS: Blitz chess 3 minutes between moves
+ _('Blitz: %d minutes') % (3),
+ #TRANS: Tournament chess 10 minutes between moves
+ _('Tournament: %d minutes') % (10)]
+ self.timer_palette = self.timer_button.get_palette()
+
+ for i, label in enumerate(self.timer_labels):
+ menu_item = MenuItem(icon_name='timer-%d' % (i),
+ text_label=label)
+ menu_item.connect('activate', self._timer_selected_cb, i)
+ self.timer_palette.menu.append(menu_item)
+ menu_item.show()
+
+ def _timer_selected_cb(self, button, index):
game_already_started = 0
if self.time_interval != None:
game_already_started = 1
- if widget.get_active() >= 0:
- timer_type = widget.get_active_text()
- if timer_type == _('Lightning: %d seconds') % (30):
- self.time_interval = 30
- elif timer_type == _('Blitz: %d minutes') % (3):
- self.time_interval = 3 * 60
- elif timer_type == _('Tournament: %d minutes') % (10):
- self.time_interval = 10 * 60
- else:
- self.time_interval = -1
+ self.time_interval = self.timer_values[index]
+ if self.time_interval is None:
+ self.timer_button.set_tooltip(_('Timer off'))
+ else:
+ self.timer_button.set_tooltip(
+ _('Timer') + ' (' + self.timer_tooltips[index] + ')')
if game_already_started:
- self.alert_reset(timer_type)
- if self.time_interval and self.time_interval == -1:
+ self.alert_reset(self.timer_labels[index])
+ if self.time_interval and self.time_interval is not None:
self.stopwatch(self.time_interval, self.alert_time)
else:
GObject.source_remove(self.stopwatch_timer)
@@ -700,7 +629,9 @@ class GNUChessActivity(activity.Activity):
else:
self.metadata['playing_robot'] = 'False'
+ '''
self.metadata['timer_mode'] = self.timer.get_active_text()
+ '''
def read_file(self, file_path):
''' Read project file on relaunch '''
@@ -723,10 +654,11 @@ class GNUChessActivity(activity.Activity):
if self.metadata['playing_robot'] == 'False':
self.playing_robot = False
self.human_button.set_active(True)
+ '''
if 'timer_mode' in self.metadata:
- self.timer.set_active(self.time_list.index(
- self.metadata['timer_mode']))
-
+ self.timer_intervale.set_active(self.timer_list.index(
+ self.metadata['timer_mode']))
+ '''
self._gnuchess.restore_game(self._parse_move_list(self.game_data))
self.do_custom_skin_cb()
@@ -884,6 +816,10 @@ class GNUChessActivity(activity.Activity):
self.human_button.set_active(True)
self.restoring = False
+ self.easy_button.set_sensitive(False)
+ self.hard_button.set_sensitive(False)
+ self.robot_button.set_sensitive(False)
+
def _list_tubes_reply_cb(self, tubes):
''' Reply to a list request. '''
for tube_info in tubes:
diff --git a/NEWS b/NEWS
index da6b765..2683640 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@
ENHANCEMENT:
* New translations
* Better handling of activity joining behavior
+* Replace combo box with palette
12
diff --git a/icons/timer-0.svg b/icons/timer-0.svg
new file mode 100644
index 0000000..134a0a1
--- /dev/null
+++ b/icons/timer-0.svg
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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"
+ contentScriptType="text/ecmascript"
+ width="55px"
+ zoomAndPan="magnify"
+ contentStyleType="text/css"
+ height="55px"
+ preserveAspectRatio="xMidYMid meet"
+ version="1.1"
+ id="svg2"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="record_timer-duration.svg">
+ <metadata
+ id="metadata23">
+ <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="defs21" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1024"
+ inkscape:window-height="525"
+ id="namedview19"
+ showgrid="false"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="36.253557"
+ inkscape:cy="28.65546"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="all"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="path3791"
+ sodipodi:cx="24.629629"
+ sodipodi:cy="24.25926"
+ sodipodi:rx="21.296297"
+ sodipodi:ry="21.296297"
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.678664)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="timer"
+ style="display:inline">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 27.605804,29.867439 8.04512,-11.042322"
+ id="path3897"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="duration"
+ style="display:none"
+ sodipodi:insensitive="true">
+ <path
+ style="fill:#808080;fill-opacity:1;stroke:none"
+ d="m 36.539789,13.013087 c 9.161862,4.992537 12.541772,16.466949 7.549234,25.628815 L 27.5,29.602112 z"
+ id="path4311"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ inkscape:transform-center-x="-9.4478671"
+ inkscape:transform-center-y="-3.7746184" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4283"
+ d="M 27.571522,30.159444 39.546676,36.73611"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:transform-center-x="-6.1363368"
+ inkscape:transform-center-y="3.4538125" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Capa"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <g
+ style="display:inline"
+ id="g4315">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3811"
+ d="m 27.5,15.555556 0,3.888889"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 41.444444,29.5 -3.888889,0"
+ id="path3823"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3829"
+ d="m 13.555556,29.5 3.888889,0"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 27.5,43.444444 0,-3.888889"
+ id="path3854"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4076"
+ d="m 22.873381,5.940543 9.622594,0"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 38.96491,8.681773 5.209549,3.91786"
+ id="path4080"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4107"
+ d="m 16.03509,8.681773 -5.209549,3.91786"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <path
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.6786635)"
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ sodipodi:ry="21.296297"
+ sodipodi:rx="21.296297"
+ sodipodi:cy="24.25926"
+ sodipodi:cx="24.629629"
+ id="path4380"
+ style="fill:none;stroke:#000000;stroke-width:3.89102697;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="timer2"
+ style="display:inline">
+ <g
+ id="g4198"
+ style="stroke-width:1.69182165;stroke-miterlimit:4;stroke-dasharray:none;display:inline"
+ transform="matrix(0.88661828,0,0,0.88661828,43.331119,7.0338455)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4190"
+ d="m 3.6632464,51.336754 0,-12.532159"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 9.9293259,45.070674 -12.532159,0"
+ id="path4192"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4194"
+ d="M 8.0940337,49.501461 -0.76754091,40.639887"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 8.0940334,40.639887 -8.86157401,8.861574"
+ id="path4196"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/timer-1.svg b/icons/timer-1.svg
new file mode 100644
index 0000000..47057de
--- /dev/null
+++ b/icons/timer-1.svg
@@ -0,0 +1,123 @@
+<?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="55"
+ height="55"
+ id="svg2">
+ <metadata
+ id="metadata23">
+ <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="defs21" />
+ <g
+ id="layer2"
+ style="display:inline">
+ <path
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.678664)"
+ id="path3791"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="layer1"
+ style="display:inline">
+ <path
+ d="M 27.665302,29.407631 27.334698,15.749391"
+ id="path3897"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="layer3"
+ style="display:none">
+ <path
+ d="m 36.539789,13.013087 c 9.161862,4.992537 12.541772,16.466949 7.549234,25.628815 L 27.5,29.602112 z"
+ id="path4311"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ d="M 27.571522,30.159444 39.546676,36.73611"
+ id="path4283"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="layer4"
+ style="display:inline">
+ <g
+ id="g4315"
+ style="display:inline">
+ <path
+ d="m 27.5,15.555556 0,3.888889"
+ id="path3811"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 41.444444,29.5 -3.888889,0"
+ id="path3823"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 13.555556,29.5 3.888889,0"
+ id="path3829"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 27.5,43.444444 0,-3.888889"
+ id="path3854"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 22.873381,5.940543 9.622594,0"
+ id="path4076"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 38.96491,8.681773 5.209549,3.91786"
+ id="path4080"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 16.03509,8.681773 -5.209549,3.91786"
+ id="path4107"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <path
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.6786635)"
+ id="path4380"
+ style="fill:none;stroke:#000000;stroke-width:3.89102697;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ </g>
+ <g
+ id="layer5"
+ style="display:inline">
+ <g
+ transform="matrix(0.88661828,0,0,0.88661828,43.331119,7.0338455)"
+ id="g4198"
+ style="stroke-width:1.69182169;stroke-miterlimit:4;stroke-dasharray:none;display:inline">
+ <path
+ d="m 3.6632464,51.336754 0,-12.532159"
+ id="path4190"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 9.9293259,45.070674 -12.532159,0"
+ id="path4192"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 8.0940337,49.501461 -0.76754091,40.639887"
+ id="path4194"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 8.0940334,40.639887 -8.86157401,8.861574"
+ id="path4196"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/timer-2.svg b/icons/timer-2.svg
new file mode 100644
index 0000000..8526a78
--- /dev/null
+++ b/icons/timer-2.svg
@@ -0,0 +1,123 @@
+<?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="55"
+ height="55"
+ id="svg2">
+ <metadata
+ id="metadata23">
+ <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="defs21" />
+ <g
+ id="layer2"
+ style="display:inline">
+ <path
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.678664)"
+ id="path3791"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="layer1"
+ style="display:inline">
+ <path
+ d="M 27.611054,29.619307 35.167119,18.012589"
+ id="path3897"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="layer3"
+ style="display:none">
+ <path
+ d="m 36.539789,13.013087 c 9.161862,4.992537 12.541772,16.466949 7.549234,25.628815 L 27.5,29.602112 z"
+ id="path4311"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ d="M 27.571522,30.159444 39.546676,36.73611"
+ id="path4283"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="layer4"
+ style="display:inline">
+ <g
+ id="g4315"
+ style="display:inline">
+ <path
+ d="m 27.5,15.555556 0,3.888889"
+ id="path3811"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 41.444444,29.5 -3.888889,0"
+ id="path3823"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 13.555556,29.5 3.888889,0"
+ id="path3829"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 27.5,43.444444 0,-3.888889"
+ id="path3854"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 22.873381,5.940543 9.622594,0"
+ id="path4076"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 38.96491,8.681773 5.209549,3.91786"
+ id="path4080"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 16.03509,8.681773 -5.209549,3.91786"
+ id="path4107"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <path
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.6786635)"
+ id="path4380"
+ style="fill:none;stroke:#000000;stroke-width:3.89102697;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ </g>
+ <g
+ id="layer5"
+ style="display:inline">
+ <g
+ transform="matrix(0.88661828,0,0,0.88661828,43.331119,7.0338455)"
+ id="g4198"
+ style="stroke-width:1.69182169;stroke-miterlimit:4;stroke-dasharray:none;display:inline">
+ <path
+ d="m 3.6632464,51.336754 0,-12.532159"
+ id="path4190"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 9.9293259,45.070674 -12.532159,0"
+ id="path4192"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 8.0940337,49.501461 -0.76754091,40.639887"
+ id="path4194"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 8.0940334,40.639887 -8.86157401,8.861574"
+ id="path4196"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ </g>
+</svg>
diff --git a/icons/timer-3.svg b/icons/timer-3.svg
new file mode 100644
index 0000000..714802f
--- /dev/null
+++ b/icons/timer-3.svg
@@ -0,0 +1,123 @@
+<?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="55"
+ height="55"
+ id="svg2">
+ <metadata
+ id="metadata23">
+ <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="defs21" />
+ <g
+ id="layer2"
+ style="display:inline">
+ <path
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.678664)"
+ id="path3791"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="layer1"
+ style="display:inline">
+ <path
+ d="M 27.611054,29.619307 40.116867,23.139113"
+ id="path3897"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="layer3"
+ style="display:none">
+ <path
+ d="m 36.539789,13.013087 c 9.161862,4.992537 12.541772,16.466949 7.549234,25.628815 L 27.5,29.602112 z"
+ id="path4311"
+ style="fill:#808080;fill-opacity:1;stroke:none" />
+ <path
+ d="M 27.571522,30.159444 39.546676,36.73611"
+ id="path4283"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="layer4"
+ style="display:inline">
+ <g
+ id="g4315"
+ style="display:inline">
+ <path
+ d="m 27.5,15.555556 0,3.888889"
+ id="path3811"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 41.444444,29.5 -3.888889,0"
+ id="path3823"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 13.555556,29.5 3.888889,0"
+ id="path3829"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 27.5,43.444444 0,-3.888889"
+ id="path3854"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 22.873381,5.940543 9.622594,0"
+ id="path4076"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 38.96491,8.681773 5.209549,3.91786"
+ id="path4080"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 16.03509,8.681773 -5.209549,3.91786"
+ id="path4107"
+ style="fill:none;stroke:#000000;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <path
+ d="m 45.925926,24.25926 a 21.296297,21.296297 0 1 1 -42.5925939,0 21.296297,21.296297 0 1 1 42.5925939,0 z"
+ transform="matrix(0.89950544,0,0,0.89950544,5.3455146,7.6786635)"
+ id="path4380"
+ style="fill:none;stroke:#000000;stroke-width:3.89102697;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ </g>
+ <g
+ id="layer5"
+ style="display:inline">
+ <g
+ transform="matrix(0.88661828,0,0,0.88661828,43.331119,7.0338455)"
+ id="g4198"
+ style="stroke-width:1.69182169;stroke-miterlimit:4;stroke-dasharray:none;display:inline">
+ <path
+ d="m 3.6632464,51.336754 0,-12.532159"
+ id="path4190"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 9.9293259,45.070674 -12.532159,0"
+ id="path4192"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="M 8.0940337,49.501461 -0.76754091,40.639887"
+ id="path4194"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ d="m 8.0940334,40.639887 -8.86157401,8.861574"
+ id="path4196"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:1.69182169;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ </g>
+</svg>