Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPootle daemon <pootle@pootle.sugarlabs.org>2012-07-27 04:30:30 (GMT)
committer Pootle daemon <pootle@pootle.sugarlabs.org>2012-07-27 04:30:30 (GMT)
commit264c6311d8be66ba6975bc72de3b1086cfe22dad (patch)
treec278e76f606a28a4aa12d354bda4170137504d96
parenta022187cf69cd201765165e15804c00538650a9d (diff)
parentd233a2714d60c9123654010fcd57a55636a922e8 (diff)
Merge branch 'master' of git.sugarlabs.org:portfolio/portfolio
-rw-r--r--PortfolioActivity.py324
-rw-r--r--icons/favorite-off.svg6
-rw-r--r--icons/favorite-on.svg6
-rw-r--r--icons/go-next-inactive.svg33
-rw-r--r--icons/go-next.svg32
-rw-r--r--icons/go-previous-inactive.svg34
-rw-r--r--icons/go-previous.svg33
7 files changed, 382 insertions, 86 deletions
diff --git a/PortfolioActivity.py b/PortfolioActivity.py
index 16d0a38..3ffc7a8 100644
--- a/PortfolioActivity.py
+++ b/PortfolioActivity.py
@@ -16,6 +16,7 @@ import gobject
import subprocess
import os
import time
+import string
from shutil import copyfile
from math import sqrt, ceil
@@ -88,6 +89,29 @@ MIDDLE = 2
BOTTOM = 1
HIDE = 0
+DEAD_KEYS = ['grave', 'acute', 'circumflex', 'tilde', 'diaeresis', 'abovering']
+DEAD_DICTS = [{'A': 192, 'E': 200, 'I': 204, 'O': 210, 'U': 217, 'a': 224,
+ 'e': 232, 'i': 236, 'o': 242, 'u': 249},
+ {'A': 193, 'E': 201, 'I': 205, 'O': 211, 'U': 218, 'a': 225,
+ 'e': 233, 'i': 237, 'o': 243, 'u': 250},
+ {'A': 194, 'E': 202, 'I': 206, 'O': 212, 'U': 219, 'a': 226,
+ 'e': 234, 'i': 238, 'o': 244, 'u': 251},
+ {'A': 195, 'O': 211, 'N': 209, 'U': 360, 'a': 227, 'o': 245,
+ 'n': 241, 'u': 361},
+ {'A': 196, 'E': 203, 'I': 207, 'O': 211, 'U': 218, 'a': 228,
+ 'e': 235, 'i': 239, 'o': 245, 'u': 252},
+ {'A': 197, 'a': 229}]
+NOISE_KEYS = ['Shift_L', 'Shift_R', 'Control_L', 'Caps_Lock', 'Pause',
+ 'Alt_L', 'Alt_R', 'KP_Enter', 'ISO_Level3_Shift', 'KP_Divide',
+ 'Escape', 'Return', 'KP_Page_Up', 'Up', 'Down', 'Menu',
+ 'Left', 'Right', 'KP_Home', 'KP_End', 'KP_Up', 'Super_L',
+ 'KP_Down', 'KP_Left', 'KP_Right', 'KP_Page_Down', 'Scroll_Lock',
+ 'Page_Down', 'Page_Up']
+WHITE_SPACE = ['space', 'Tab']
+
+CURSOR = '█'
+RETURN = '⏎'
+NEWLINE = '\n'
class PortfolioActivity(activity.Activity):
''' Make a slideshow from starred Journal entries. '''
@@ -113,6 +137,11 @@ class PortfolioActivity(activity.Activity):
self._dirty = False
+ self._keypress = None
+ self._selected_spr = None
+ self._dead_key = ''
+ self._saved_string = ''
+
def _setup_canvas(self):
''' Create a canvas '''
self._canvas = gtk.DrawingArea()
@@ -131,6 +160,9 @@ class PortfolioActivity(activity.Activity):
self._canvas.connect("button-press-event", self._button_press_cb)
self._canvas.connect("button-release-event", self._button_release_cb)
self._canvas.connect("motion-notify-event", self._mouse_move_cb)
+ self._canvas.connect("key-press-event", self._keypress_cb)
+
+ self._canvas.grab_focus()
def _setup_workspace(self):
''' Prepare to render the datastore entries. '''
@@ -163,13 +195,36 @@ class PortfolioActivity(activity.Activity):
else:
star_size = int(150. / int(ceil(sqrt(self._nobjects))))
self._fav_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
- os.path.join(activity.get_bundle_path(),
+ os.path.join(activity.get_bundle_path(), 'icons',
'favorite-on.svg'), star_size, star_size)
self._unfav_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
- os.path.join(activity.get_bundle_path(),
+ os.path.join(activity.get_bundle_path(), 'icons',
'favorite-off.svg'), star_size, star_size)
self._make_stars()
+ self.prev_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ os.path.join(activity.get_bundle_path(), 'icons',
+ 'go-previous.svg'), 55, 55)
+ self.next_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ os.path.join(activity.get_bundle_path(), 'icons',
+ 'go-next.svg'), 55, 55)
+ self.prev_off_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ os.path.join(activity.get_bundle_path(), 'icons',
+ 'go-previous-inactive.svg'), 55, 55)
+ self.next_off_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
+ os.path.join(activity.get_bundle_path(), 'icons',
+ 'go-next-inactive.svg'), 55, 55)
+
+ self._prev = Sprite(
+ self._sprites, 0, int((self._height - 55)/ 2), self.prev_off_pixbuf)
+ self._prev.set_layer(DRAG)
+ self._prev.type = 'prev'
+ self._next = Sprite(
+ self._sprites, self._width - 55,
+ int((self._height - 55)/ 2), self.next_pixbuf)
+ self._next.set_layer(DRAG)
+ self._next.type = 'next'
+
self._help = Sprite(
self._sprites,
int((self._width - int(PREVIEWW * self._scale)) / 2),
@@ -184,6 +239,7 @@ class PortfolioActivity(activity.Activity):
self.colors)))
self._title.set_label_attributes(int(titlef * self._scale),
rescale=False)
+ self._title.type = 'title'
self._preview = Sprite(self._sprites,
int((self._width - int(PREVIEWW * self._scale)) / 2),
int(PREVIEWY * self._scale), svg_str_to_pixbuf(genblank(
@@ -198,6 +254,7 @@ class PortfolioActivity(activity.Activity):
int(DESCRIPTIONH * self._scale),
self.colors)))
self._description.set_label_attributes(int(descriptionf * self._scale))
+ self._description.type = 'description'
self._my_canvas = Sprite(
self._sprites, 0, 0, svg_str_to_pixbuf(genblank(
@@ -260,22 +317,18 @@ class PortfolioActivity(activity.Activity):
toolbox.set_current_toolbar(1)
self.toolbar = primary_toolbar
- self._prev_button = button_factory(
- 'go-previous-inactive', self.toolbar, self._prev_cb,
- tooltip=_('Prev slide'), accelerator='<Ctrl>P')
+ if HAVE_TOOLBOX:
+ toolbox.toolbar.insert(record_toolbar_button, -1)
+ toolbox.toolbar.insert(adjust_toolbar_button, -1)
- self._next_button = button_factory(
- 'go-next', self.toolbar, self._next_cb,
- tooltip=_('Next slide'), accelerator='<Ctrl>N')
+ button_factory('view-fullscreen', self.toolbar,
+ self.do_fullscreen_cb, tooltip=_('Fullscreen'),
+ accelerator='<Alt>Return')
self._auto_button = button_factory(
'media-playback-start', self.toolbar,
self._autoplay_cb, tooltip=_('Autoplay'))
- if HAVE_TOOLBOX:
- toolbox.toolbar.insert(adjust_toolbar_button, -1)
- toolbox.toolbar.insert(record_toolbar_button, -1)
-
label = label_factory(adjust_toolbar, _('Adjust playback speed'))
label.show()
@@ -302,35 +355,8 @@ class PortfolioActivity(activity.Activity):
tooltip=_('Thumbnail view'),
group=slide_button)
- button_factory('view-fullscreen', self.toolbar,
- self.do_fullscreen_cb, tooltip=_('Fullscreen'),
- accelerator='<Alt>Return')
-
separator_factory(self.toolbar)
- journal_button = button_factory(
- 'write-journal', self.toolbar, self._do_journal_cb,
- tooltip=_('Update description'))
- self._palette = journal_button.get_palette()
- msg_box = gtk.HBox()
-
- sw = gtk.ScrolledWindow()
- sw.set_size_request(int(gtk.gdk.screen_width() / 2),
- 2 * style.GRID_CELL_SIZE)
- sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- self._text_view = gtk.TextView()
- self._text_view.set_left_margin(style.DEFAULT_PADDING)
- self._text_view.set_right_margin(style.DEFAULT_PADDING)
- self._text_view.set_wrap_mode(gtk.WRAP_WORD_CHAR)
- self._text_view.connect('focus-out-event',
- self._text_view_focus_out_event_cb)
- sw.add(self._text_view)
- sw.show()
- msg_box.pack_start(sw, expand=False)
- msg_box.show_all()
-
- self._palette.set_content(msg_box)
-
label_factory(record_toolbar, _('Record a sound') + ':')
self._record_button = button_factory(
'media-record', record_toolbar,
@@ -365,24 +391,6 @@ class PortfolioActivity(activity.Activity):
toolbox.toolbar.insert(stop_button, -1)
stop_button.show()
- def _do_journal_cb(self, button):
- self._dirty = True
- if self._palette:
- if not self._palette.is_up():
- self._palette.popup(immediate=True,
- state=self._palette.SECONDARY)
- else:
- self._palette.popdown(immediate=True)
- return
-
- def _text_view_focus_out_event_cb(self, widget, event):
- buffer = self._text_view.get_buffer()
- start_iter = buffer.get_start_iter()
- end_iter = buffer.get_end_iter()
- self.dsobjects[self.i].metadata['description'] = \
- buffer.get_text(start_iter, end_iter)
- self._show_slide()
-
def _destroy_cb(self, win, event):
''' Clean up on the way out. '''
gtk.main_quit()
@@ -401,6 +409,10 @@ class PortfolioActivity(activity.Activity):
self.dsobjects, self._nobjects = datastore.find({'keep': '1'})
_logger.debug('found %d starred items', self._nobjects)
+ def _first_cb(self, button=None):
+ self.i = 0
+ self._show_slide(direction=-1)
+
def _prev_cb(self, button=None):
''' The previous button has been clicked; goto previous slide. '''
if self.i > 0:
@@ -413,6 +425,10 @@ class PortfolioActivity(activity.Activity):
self.i += 1
self._show_slide()
+ def _last_cb(self, button=None):
+ self.i = self._nobjects - 1
+ self._show_slide()
+
def _rescan_cb(self, button=None):
''' Rescan the Journal for changes in starred items. '''
self._help.hide()
@@ -464,7 +480,6 @@ class PortfolioActivity(activity.Activity):
else:
tmp_file = save_pdf(self, profile.get_nick_name())
- _logger.debug('copying PDF file to Journal...')
dsobject = datastore.create()
dsobject.metadata['title'] = profile.get_nick_name() + ' ' + \
_('Portfolio')
@@ -502,8 +517,8 @@ class PortfolioActivity(activity.Activity):
self._clear_screen()
if self._nobjects == 0:
- self._prev_button.set_icon('go-previous-inactive')
- self._next_button.set_icon('go-next-inactive')
+ self._prev.set_image(self.prev_off_pixbuf)
+ self._next.set_image(self.next_off_pixbuf)
self._description.set_label(
_('Do you have any items in your Journal starred?'))
self._help.set_layer(TOP)
@@ -511,12 +526,9 @@ class PortfolioActivity(activity.Activity):
return
# Skip slide if unstarred
- # To do: make this check loop (but not forever)
- # if self._favorites[self.i].type == 'unstar':
- if self.dsobjects[self.i].metadata['keep'] == '0':
+ if self._favorites[self.i].type == 'unstar':
counter = 0
- while self.dsobjects[self.i].metadata['keep'] == '0':
- # while self._favorites[self.i].type == 'unstar':
+ while self._favorites[self.i].type == 'unstar':
self.i += direction
if self.i < 0:
self.i = self._nobjects - 1
@@ -525,19 +537,17 @@ class PortfolioActivity(activity.Activity):
counter += 1
if counter == self._nobjects:
_logger.debug('No _favorites: nothing to show')
- # No _favorites
return
- if self.i == 0:
- self._prev_button.set_icon('go-previous-inactive')
+ if self.i == 0:
+ self._prev.set_image(self.prev_off_pixbuf)
else:
- self._prev_button.set_icon('go-previous')
+ self._prev.set_image(self.prev_pixbuf)
if self.i == self._nobjects - 1:
- self._next_button.set_icon('go-next-inactive')
+ self._next.set_image(self.next_off_pixbuf)
else:
- self._next_button.set_icon('go-next')
+ self._next.set_image(self.next_pixbuf)
- # _logger.debug('Showing slide %d', self.i)
pixbuf = None
media_object = False
mimetype = None
@@ -568,9 +578,6 @@ class PortfolioActivity(activity.Activity):
self._description.set_label(
self.dsobjects[self.i].metadata['description'])
self._description.set_layer(MIDDLE)
- text_buffer = gtk.TextBuffer()
- text_buffer.set_text(self.dsobjects[self.i].metadata['description'])
- self._text_view.set_buffer(text_buffer)
else:
self._description.set_label('')
self._description.hide()
@@ -600,8 +607,8 @@ class PortfolioActivity(activity.Activity):
self._thumbnail_mode = True
self._clear_screen()
- self._prev_button.set_icon('go-previous-inactive')
- self._next_button.set_icon('go-next-inactive')
+ self._prev.hide()
+ self._next.hide()
n = int(ceil(sqrt(self._nobjects)))
if n > 0:
@@ -622,6 +629,9 @@ class PortfolioActivity(activity.Activity):
x = x_off
y += h
self.i = 0 # Reset position in slideshow to the beginning
+ else:
+ self._prev.set_layer(DRAG)
+ self._next.set_layer(DRAG)
return False
def _show_thumb(self, x, y, w, h):
@@ -702,7 +712,6 @@ class PortfolioActivity(activity.Activity):
def _button_press_cb(self, win, event):
''' The mouse button was pressed. Is it on a thumbnail sprite? '''
- win.grab_focus()
x, y = map(int, event.get_coords())
self._dragpos = [x, y]
@@ -712,6 +721,27 @@ class PortfolioActivity(activity.Activity):
self._press = None
self._release = None
+ # Are we clicking on a title or description?
+ if spr.type == 'title' or spr.type == 'description':
+ if spr == self._selected_spr:
+ return True
+ elif self._selected_spr is not None:
+ self._unselect()
+ self._selected_spr = spr
+ self._saved_string = spr.labels[0]
+ label = '%s%s' % (self._selected_spr.labels[0], CURSOR)
+ self._selected_spr.set_label(label)
+ else:
+ self._unselect()
+
+ # Are we clicking on a button?
+ if spr.type == 'next':
+ self._next_cb()
+ return True
+ elif spr.type == 'prev':
+ self._prev_cb()
+ return True
+
# Are we clicking on a star?
if spr.type == 'star':
spr.set_shape(self._unfav_pixbuf)
@@ -788,8 +818,6 @@ class PortfolioActivity(activity.Activity):
self._press.set_layer(TOP)
self._press = None
self._release = None
- else:
- self._next_cb()
return False
def _unit_combo_cb(self, arg=None):
@@ -888,8 +916,8 @@ class PortfolioActivity(activity.Activity):
jobject = datastore.get(i.object_id)
if 'description' in i.metadata:
jobject.metadata['description'] = i.metadata['description']
- if 'keep' in i.metadata:
- jobject.metadata['keep'] = i.metadata['keep']
+ if 'title' in i.metadata:
+ jobject.metadata['title'] = i.metadata['title']
datastore.write(jobject, update_mtime=False,
reply_handler=self.datastore_write_cb,
error_handler=self.datastore_write_error_cb)
@@ -907,3 +935,135 @@ class PortfolioActivity(activity.Activity):
self._alert.props.msg = msg
self.add_alert(self._alert)
self._alert.show()
+
+ def _keypress_cb(self, area, event):
+ ''' Keyboard '''
+ keyname = gtk.gdk.keyval_name(event.keyval)
+ keyunicode = gtk.gdk.keyval_to_unicode(event.keyval)
+ if event.get_state() & gtk.gdk.MOD1_MASK:
+ alt_mask = True
+ alt_flag = 'T'
+ else:
+ alt_mask = False
+ alt_flag = 'F'
+ self._key_press(alt_mask, keyname, keyunicode)
+ return keyname
+
+ def _key_press(self, alt_mask, keyname, keyunicode):
+ if keyname is None:
+ return False
+ self._keypress = keyname
+ if alt_mask:
+ if keyname == 'q':
+ exit()
+ elif self._selected_spr is not None:
+ self.process_alphanumeric_input(keyname, keyunicode)
+ elif not self._thumbnail_mode:
+ if keyname == 'Home':
+ self._first_cb()
+ elif keyname == 'Left':
+ self._prev_cb()
+ elif keyname == 'Right' or keyname == 'space':
+ self._next_cb()
+ elif keyname == 'End':
+ self._last_cb()
+ return True
+
+ def process_alphanumeric_input(self, keyname, keyunicode):
+ ''' Make sure alphanumeric input is properly parsed. '''
+ if len(self._selected_spr.labels[0]) > 0:
+ c = self._selected_spr.labels[0].count(CURSOR)
+ if c == 0:
+ oldleft = self._selected_spr.labels[0]
+ oldright = ''
+ elif len(self._selected_spr.labels[0]) == 1:
+ oldleft = ''
+ oldright = ''
+ elif CURSOR in self._selected_spr.labels[0]:
+ oldleft, oldright = \
+ self._selected_spr.labels[0].split(CURSOR)
+ else: # Where did our cursor go?
+ oldleft = self._selected_spr.labels[0]
+ oldright = ''
+ else:
+ oldleft = ''
+ oldright = ''
+ newleft = oldleft
+ if keyname in ['Shift_L', 'Shift_R', 'Control_L', 'Caps_Lock', \
+ 'Alt_L', 'Alt_R', 'KP_Enter', 'ISO_Level3_Shift']:
+ keyname = ''
+ keyunicode = 0
+ # Hack until I sort out input and unicode and dead keys,
+ if keyname[0:5] == 'dead_':
+ self._dead_key = keyname
+ keyname = ''
+ keyunicode = 0
+ if keyname == 'space':
+ keyunicode = 32
+ elif keyname == 'Tab':
+ keyunicode = 9
+ if keyname == 'BackSpace':
+ if len(oldleft) > 1:
+ newleft = oldleft[:len(oldleft) - 1]
+ else:
+ newleft = ''
+ if keyname == 'Delete':
+ if len(oldright) > 0:
+ oldright = oldright[1:]
+ elif keyname == 'Home':
+ oldright = oldleft + oldright
+ newleft = ''
+ elif keyname == 'Left':
+ if len(oldleft) > 0:
+ oldright = oldleft[len(oldleft) - 1:] + oldright
+ newleft = oldleft[:len(oldleft) - 1]
+ elif keyname == 'Right':
+ if len(oldright) > 0:
+ newleft = oldleft + oldright[0]
+ oldright = oldright[1:]
+ elif keyname == 'End':
+ newleft = oldleft + oldright
+ oldright = ''
+ elif keyname == 'Return':
+ newleft = oldleft + NEWLINE
+ elif keyname == 'Down':
+ if NEWLINE in oldright:
+ parts = oldright.split(NEWLINE)
+ newleft = oldleft + string.join(parts[0:2], NEWLINE)
+ oldright = NEWLINE + string.join(parts[2:], NEWLINE)
+ elif keyname == 'Up':
+ if NEWLINE in oldleft:
+ parts = oldleft.split(NEWLINE)
+ newleft = string.join(parts[0:-1], NEWLINE)
+ oldright = NEWLINE + parts[-1] + oldright
+ elif keyname == 'Escape': # Restore previous state
+ self._selected_spr.set_label(self._saved_string)
+ self._unselect()
+ return
+ else:
+ if self._dead_key is not '':
+ keyunicode = \
+ DEAD_DICTS[DEAD_KEYS.index(self._dead_key[5:])][keyname]
+ self._dead_key = ''
+ if keyunicode > 0:
+ if unichr(keyunicode) != '\x00':
+ newleft = oldleft + unichr(keyunicode)
+ else:
+ newleft = oldleft
+ elif keyunicode == -1: # clipboard text
+ if keyname == NEWLINE:
+ newleft = oldleft + NEWLINE
+ else:
+ newleft = oldleft + keyname
+ self._selected_spr.set_label("%s%s%s" % (newleft, CURSOR, oldright))
+
+ def _unselect(self):
+ if self._selected_spr is not None:
+ if CURSOR in self._selected_spr.labels[0]:
+ parts = self._selected_spr.labels[0].split(CURSOR)
+ self._selected_spr.set_label(string.join(parts))
+ self.dsobjects[self.i].metadata[self._selected_spr.type] = \
+ self._selected_spr.labels[0]
+ self._dirty = True
+ self._selected_spr = None
+ self._saved_string = ''
diff --git a/icons/favorite-off.svg b/icons/favorite-off.svg
new file mode 100644
index 0000000..d89dd8b
--- /dev/null
+++ b/icons/favorite-off.svg
@@ -0,0 +1,6 @@
+<?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 "#666666">
+ <!ENTITY fill_color "#ffffff">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="emblem-favorite">
+ <polygon fill="&fill_color;" points="27.5,5.149 34.76,19.865 51,22.224 39.251,33.68 42.025,49.852 27.5,42.215 12.976,49.852 15.75,33.68 4,22.224 20.237,19.865 " stroke="&stroke_color;" stroke-linecap="round" stroke-width="3.5"/>
+</g></svg> \ No newline at end of file
diff --git a/icons/favorite-on.svg b/icons/favorite-on.svg
new file mode 100644
index 0000000..46577fb
--- /dev/null
+++ b/icons/favorite-on.svg
@@ -0,0 +1,6 @@
+<?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 "#000000">
+ <!ENTITY fill_color "#ffff00">
+]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="emblem-favorite">
+ <polygon fill="&fill_color;" points="27.5,5.149 34.76,19.865 51,22.224 39.251,33.68 42.025,49.852 27.5,42.215 12.976,49.852 15.75,33.68 4,22.224 20.237,19.865 " stroke="&stroke_color;" stroke-linecap="round" stroke-width="3.5"/>
+</g></svg> \ No newline at end of file
diff --git a/icons/go-next-inactive.svg b/icons/go-next-inactive.svg
index 9f1fafb..a1eed16 100644
--- a/icons/go-next-inactive.svg
+++ b/icons/go-next-inactive.svg
@@ -1,3 +1,32 @@
-<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="go-next">
- <path d="M27.497,50.004C39.927,50.004,50,39.937,50,27.508C50,15.076,39.927,4.997,27.497,4.997 C15.071,4.997,5,15.076,5,27.508C5,39.937,15.071,50.004,27.497,50.004z M20.733,17.551l19.629,9.965L20.733,37.758V17.551z" fill="#808080"/>
+<?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"
+ viewBox="0 0 55 55"
+ id="svg2"
+ xml:space="preserve"><metadata
+ id="metadata11"><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="defs9" /><rect
+ width="30"
+ height="30"
+ x="12.5"
+ y="12.5"
+ id="rect2988"
+ style="fill:#282828;fill-opacity:1;stroke:none" /><g
+ id="go-next"
+ style="fill:#808080;fill-opacity:1;display:block">
+ <path
+ d="M 27.497,50.004 C 39.927,50.004 50,39.937 50,27.508 50,15.076 39.927,4.997 27.497,4.997 15.071,4.997 5,15.076 5,27.508 5,39.937 15.071,50.004 27.497,50.004 z M 20.733,17.551 40.362,27.516 20.733,37.758 V 17.551 z"
+ id="path5"
+ style="fill:#808080;fill-opacity:1" />
</g></svg> \ No newline at end of file
diff --git a/icons/go-next.svg b/icons/go-next.svg
new file mode 100644
index 0000000..a478936
--- /dev/null
+++ b/icons/go-next.svg
@@ -0,0 +1,32 @@
+<?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"
+ viewBox="0 0 55 55"
+ id="svg2"
+ xml:space="preserve"><metadata
+ id="metadata11"><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="defs9" /><rect
+ width="30"
+ height="30"
+ x="12.5"
+ y="12.5"
+ id="rect2988"
+ style="fill:#282828;fill-opacity:1;stroke:none" /><g
+ id="go-next"
+ style="fill:#ffffff;fill-opacity:1;display:block">
+ <path
+ d="M 27.497,50.004 C 39.927,50.004 50,39.937 50,27.508 50,15.076 39.927,4.997 27.497,4.997 15.071,4.997 5,15.076 5,27.508 5,39.937 15.071,50.004 27.497,50.004 z M 20.733,17.551 40.362,27.516 20.733,37.758 V 17.551 z"
+ id="path5"
+ style="fill:#ffffff;fill-opacity:1" />
+</g></svg> \ No newline at end of file
diff --git a/icons/go-previous-inactive.svg b/icons/go-previous-inactive.svg
index e806670..bc2eb9b 100644
--- a/icons/go-previous-inactive.svg
+++ b/icons/go-previous-inactive.svg
@@ -1,3 +1,33 @@
-<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="go-previous">
- <path d="M27.503,4.997C15.073,4.997,5,15.064,5,27.493c0,12.432,10.073,22.511,22.503,22.511 C39.929,50.004,50,39.925,50,27.493C50,15.064,39.929,4.997,27.503,4.997z M34.267,37.449l-19.629-9.965l19.629-10.242V37.449z" display="inline" fill="#808080"/>
+<?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"
+ viewBox="0 0 55 55"
+ id="svg2"
+ xml:space="preserve"><metadata
+ id="metadata11"><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="defs9" /><rect
+ width="30"
+ height="30"
+ x="12.5"
+ y="12.5"
+ id="rect2988"
+ style="fill:#282828;fill-opacity:1;stroke:none" /><g
+ transform="matrix(-1,0,0,1,55,0)"
+ id="go-next"
+ style="fill:#808080;fill-opacity:1;display:block">
+ <path
+ d="M 27.497,50.004 C 39.927,50.004 50,39.937 50,27.508 50,15.076 39.927,4.997 27.497,4.997 15.071,4.997 5,15.076 5,27.508 5,39.937 15.071,50.004 27.497,50.004 z M 20.733,17.551 40.362,27.516 20.733,37.758 V 17.551 z"
+ id="path5"
+ style="fill:#808080;fill-opacity:1" />
</g></svg> \ No newline at end of file
diff --git a/icons/go-previous.svg b/icons/go-previous.svg
new file mode 100644
index 0000000..6f3a384
--- /dev/null
+++ b/icons/go-previous.svg
@@ -0,0 +1,33 @@
+<?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"
+ viewBox="0 0 55 55"
+ id="svg2"
+ xml:space="preserve"><metadata
+ id="metadata11"><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="defs9" /><rect
+ width="30"
+ height="30"
+ x="12.5"
+ y="12.5"
+ id="rect2988"
+ style="fill:#282828;fill-opacity:1;stroke:none" /><g
+ transform="matrix(-1,0,0,1,55,0)"
+ id="go-next"
+ style="fill:#ffffff;fill-opacity:1;display:block">
+ <path
+ d="M 27.497,50.004 C 39.927,50.004 50,39.937 50,27.508 50,15.076 39.927,4.997 27.497,4.997 15.071,4.997 5,15.076 5,27.508 5,39.937 15.071,50.004 27.497,50.004 z M 20.733,17.551 40.362,27.516 20.733,37.758 V 17.551 z"
+ id="path5"
+ style="fill:#ffffff;fill-opacity:1" />
+</g></svg> \ No newline at end of file