Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAgustin Zubiaga <aguz@sugarlabs.org>2013-11-18 20:32:14 (GMT)
committer Agustin Zubiaga <aguz@sugarlabs.org>2013-11-18 20:32:14 (GMT)
commit2767551bf75593d88be8a46b5e62f55c496ffd43 (patch)
tree79a1f72a66124f7dbeeb5b9976f1b63d40990c66
parent6e8a632f38a2301fc4f65bb9d83e4db2103fe60f (diff)
Font change implemented
Tick (X and Y values) colortoolbutton is not working cause SugarPycha does not support (change values color) it yet, it always draw it black. Signed-off-by: Agustin Zubiaga <aguz@sugarlabs.org>
-rw-r--r--activity.py159
-rw-r--r--chart.py25
-rw-r--r--fontcombobox.py309
-rw-r--r--icons/font-text.svg32
-rw-r--r--icons/format-text.svg8
-rw-r--r--icons/labels-font.svg78
-rw-r--r--icons/resize+.svg41
-rw-r--r--icons/resize-.svg43
-rw-r--r--icons/tick-font.svg162
-rw-r--r--icons/title-font.svg141
10 files changed, 995 insertions, 3 deletions
diff --git a/activity.py b/activity.py
index 73450f8..a977b24 100644
--- a/activity.py
+++ b/activity.py
@@ -43,6 +43,7 @@ from sugar3.activity.widgets import StopButton
from sugar3.activity.widgets import ToolbarButton
from sugar3.graphics.toolbarbox import ToolbarBox
from sugar3.graphics.toolbutton import ToolButton
+from sugar3.graphics.toolcombobox import ToolComboBox
from sugar3.graphics.radiotoolbutton import RadioToolButton
from sugar3.graphics.colorbutton import ColorToolButton
from sugar3.graphics.objectchooser import ObjectChooser
@@ -52,6 +53,9 @@ from sugar3.graphics.alert import Alert
from sugar3.datastore import datastore
from sugar3.graphics import style
+from fontcombobox import FontComboBox
+from fontcombobox import FontSize
+
from readers import StopWatchReader
from readers import MeasureReader
from readers import ClipboardReader
@@ -67,6 +71,12 @@ _COLOR1 = utils.get_user_fill_color()
_COLOR2 = utils.get_user_stroke_color()
_WHITE = Gdk.color_parse('white')
+# Font options
+TITLE_FONT = 'title'
+LABELS_FONT = 'labels'
+TICK_FONT = 'ticks'
+
+
# Paths
_ACTIVITY_DIR = os.path.join(activity.get_activity_root(), 'data/')
_CHART_FILE = utils.get_chart_file(_ACTIVITY_DIR)
@@ -77,7 +87,6 @@ _logger.setLevel(logging.DEBUG)
logging.basicConfig()
-
def _invalid_number_alert(activity):
alert = Alert()
@@ -155,8 +164,23 @@ class ChartActivity(activity.Activity):
self.charts_area = None
self.chart_data = []
self.chart_type_buttons = []
+ self._font_options = {
+ 'titleColor': '#000000',
+ 'titleFont': 'Sans',
+ 'titleFontSize': 12,
+ 'yvals': {'fontColor': '#000000'},
+ 'axis': {
+ 'tickFont': 'Sans',
+ 'tickFontSize': 12,
+ 'labelFontSize': 14,
+ 'labelColor': '#666666',
+ 'labelFont': 'Sans',
+ 'lineColor': '#b3b3b3'}}
# TOOLBARS
+ self._labels_font = RadioToolButton()
+ self._title_font = RadioToolButton()
+
toolbarbox = ToolbarBox()
activity_button = ActivityToolbarButton(self)
@@ -283,6 +307,63 @@ class ChartActivity(activity.Activity):
toolbarbox.toolbar.insert(self._options_button, -1)
+ text_toolbar_btn = ToolbarButton()
+ text_toolbar_btn.props.icon_name = 'format-text'
+ text_toolbar_btn.props.label = _('Text')
+ toolbarbox.toolbar.insert(text_toolbar_btn, -1)
+ self._text_options_btn = text_toolbar_btn
+
+ texttoolbar = Gtk.Toolbar()
+
+ self.font_name_combo = FontComboBox()
+ self.font_name_combo.set_font_name('Sans')
+ self.font_name_combo.connect("changed", lambda w:
+ self._set_chart_font_options(font=w.get_font_name()))
+ texttoolbar.insert(ToolComboBox(self.font_name_combo), -1)
+
+ self.font_size = FontSize()
+ self.font_size.connect("changed", lambda w:
+ self._set_chart_font_options(size=w.get_font_size()))
+ texttoolbar.insert(self.font_size, -1)
+
+ self.text_color_btn = ColorToolButton()
+ self.text_color_btn.set_color(style.COLOR_BLACK.get_gdk_color())
+ self.text_color_btn.set_title(_('Font Color'))
+ texttoolbar.insert(self.text_color_btn, -1)
+ GObject.timeout_add(1000, self._connect_color_btn,
+ self.text_color_btn,
+ self._set_text_color)
+
+ # self._title_font created in the top of the file
+ self._title_font.connect('clicked', self._set_font_option,
+ TITLE_FONT)
+ self._title_font.set_tooltip(_('Title font'))
+ self._title_font.props.icon_name = 'title-font'
+ op_group = self._title_font
+
+ texttoolbar.insert(self._title_font, 0)
+
+ # self._labels_font created in the top of the file
+ self._labels_font.connect('clicked', self._set_font_option,
+ LABELS_FONT)
+ self._labels_font.set_tooltip(_('Labels font'))
+ self._labels_font.props.icon_name = 'labels-font'
+ self._labels_font.props.group = op_group
+ texttoolbar.insert(self._labels_font, 1)
+
+ tick_font = RadioToolButton()
+ tick_font.connect('clicked', self._set_font_option, TICK_FONT)
+ tick_font.set_tooltip(_('Tick font'))
+ tick_font.props.icon_name = 'tick-font'
+ tick_font.props.group = op_group
+ texttoolbar.insert(tick_font, 2)
+
+ separator = Gtk.SeparatorToolItem()
+ texttoolbar.insert(separator, 3)
+
+ text_toolbar_btn.props.page = texttoolbar
+ texttoolbar.show_all()
+
separator = Gtk.SeparatorToolItem()
separator.set_draw(True)
separator.set_expand(False)
@@ -402,15 +483,70 @@ class ChartActivity(activity.Activity):
self.show_all()
+ self._set_font_option(TITLE_FONT)
+
Gdk.Screen.get_default().connect('size-changed', self._configure_cb)
self._configure_cb()
+ def _set_text_color(self, *args):
+ self._set_chart_font_options(color=utils.rgb2html(args[-1].get_color()))
+
+ def _set_chart_font_options(self, font=None, size=None, color=None):
+ op = self._font_options
+ if self._font_option == TITLE_FONT:
+ op['titleFont'] = font or op['titleFont']
+ op['titleFontSize'] = size or op['titleFontSize']
+ op['titleColor'] = color or op['titleColor']
+
+ elif self._font_option == LABELS_FONT:
+ op['axis']['labelFont'] = font or op['axis']['labelFont']
+ op['axis']['labelFontSize'] = size or op['axis']['labelFontSize']
+ op['axis']['labelColor'] = color or op['axis']['labelColor']
+
+ elif self._font_option == TICK_FONT:
+ op['axis']['tickFont'] = font or op['axis']['tickFont']
+ op['axis']['tickFontSize'] = size or op['axis']['tickFontSize']
+ op['yvals']['fontColor'] = color or op['yvals']['fontColor']
+
+ self._font_options = op
+ self._render_chart()
+
+ def _get_chart_font_options(self, option):
+ chart_options = self._font_options
+ if option == TITLE_FONT:
+ font = chart_options['titleFont']
+ size = chart_options['titleFontSize']
+ color = chart_options['titleColor']
+
+ elif option == LABELS_FONT:
+ font = chart_options['axis']['labelFont']
+ size = chart_options['axis']['labelFontSize']
+ color = chart_options['axis']['labelColor']
+
+ elif option == TICK_FONT:
+ font = chart_options['axis']['tickFont']
+ size = chart_options['axis']['tickFontSize']
+ color = chart_options['yvals']['fontColor']
+
+ else:
+ return None, None, None
+ return font, size, color
+
+ def _set_font_option(self, *args):
+ self._font_option = args[-1]
+
+ font, size, color = self._get_chart_font_options(self._font_option)
+
+ self.font_name_combo.set_font_name(font)
+ self.font_size.set_font_size(size)
+ self.text_color_btn.set_color(Color(color).get_gdk_color())
+
def _create_chart_buttons(self, toolbar):
add_vbar_chart = RadioToolButton()
+ add_vbar_chart.set_active(True)
add_vbar_chart.connect('clicked', self._add_chart_cb,
charts.VERTICAL_BAR)
add_vbar_chart.set_tooltip(_('Vertical Bar Chart'))
- add_vbar_chart.set_active(True)
add_vbar_chart.props.icon_name = 'vbar'
charts_group = add_vbar_chart
@@ -452,6 +588,7 @@ class ChartActivity(activity.Activity):
btn.set_sensitive(False)
self._options_button.set_sensitive(False)
+ self._text_options_btn.set_sensitive(False)
self._fullscreen_button.set_sensitive(False)
def _show_chart_area(self):
@@ -463,6 +600,7 @@ class ChartActivity(activity.Activity):
btn.set_sensitive(True)
self._options_button.set_sensitive(True)
+ self._text_options_btn.set_sensitive(True)
self._fullscreen_button.set_sensitive(True)
def _create_measure_palette(self, button):
@@ -513,6 +651,14 @@ class ChartActivity(activity.Activity):
self._update_chart_data()
def _add_chart_cb(self, widget, type=charts.VERTICAL_BAR):
+ if type == charts.PIE:
+ if self._font_option == LABELS_FONT:
+ self._title_font.set_active(True)
+ self._set_font_option(TITLE_FONT)
+ self._labels_font.set_sensitive(False)
+ else:
+ self._labels_font.set_sensitive(True)
+
self.current_chart = charts.Chart(type)
self.update_chart()
@@ -572,6 +718,7 @@ class ChartActivity(activity.Activity):
# Set options
self.current_chart.set_color_scheme(color=self.chart_color)
self.current_chart.set_line_color(self.chart_line_color)
+ self.current_chart.set_font_options(self._font_options)
if self.current_chart.type == charts.PIE:
self.current_chart.render(self)
@@ -612,6 +759,7 @@ class ChartActivity(activity.Activity):
self.current_chart.set_title(self.metadata['title'])
self.current_chart.set_x_label(self.x_label)
self.current_chart.set_y_label(self.y_label)
+ self._set_font_option(self._font_option)
self._render_chart()
def _label_changed(self, treeview, path, new_label):
@@ -765,6 +913,11 @@ class ChartActivity(activity.Activity):
self.chart_color = data['chart_color']
self.chart_line_color = data['chart_line_color']
self.current_chart.type = data['current_chart.type']
+
+ # Make it compatible with old Chart instances
+ if 'font_options' in data:
+ self._font_options = data['font_options']
+
chart_data = data['chart_data']
# Update charts buttons
@@ -784,6 +937,7 @@ class ChartActivity(activity.Activity):
elif _type == charts.PIE:
self.chart_type_buttons[3].set_active(True)
self.chart_type_buttons[7].set_active(True)
+ self._labels_font.set_sensitive(False)
# Update the controls in the config subtoolbar
self.chart_color_btn.set_color(Color(self.chart_color).get_gdk_color())
@@ -815,6 +969,7 @@ class ChartActivity(activity.Activity):
data['chart_line_color'] = self.chart_line_color
data['current_chart.type'] = self.current_chart.type
data['chart_data'] = self.chart_data
+ data['font_options'] = self._font_options
f = open(file_path, 'w')
try:
diff --git a/chart.py b/chart.py
index 1abc313..dc980a1 100644
--- a/chart.py
+++ b/chart.py
@@ -55,10 +55,16 @@ class Chart(GObject.GObject):
self.options = {
'legend': {'hide': True},
- 'titleFontSize': 16,
+ 'titleColor': '#000000',
+ 'titleFont': 'Tahoma',
+ 'titleFontSize': 12,
'axis': {
+ 'tickColor': '#F3F3F3',
+ 'tickFont': 'Sans',
'tickFontSize': 12,
'labelFontSize': 14,
+ 'labelColor': '#666666',
+ 'labelFont': 'Sans',
'lineColor': '#b3b3b3',
'x': {
'ticks': [dict(v=i, label=l[0]) for i,
@@ -70,6 +76,7 @@ class Chart(GObject.GObject):
'label': 'Y',
}
},
+ 'yvals': {'fontColor': '#000000'},
'stroke': {
'width': 3
},
@@ -85,6 +92,22 @@ class Chart(GObject.GObject):
},
}
+ def set_font_options(self, op):
+ self.options['titleFont'] = op['titleFont']
+ self.options['titleFontSize'] = op['titleFontSize']
+ self.options['titleColor'] = op['titleColor']
+ self.options['axis']['labelFont'] = op['axis']['labelFont']
+ self.options['axis']['labelFontSize'] = op['axis']['labelFontSize']
+ self.options['axis']['labelColor'] = op['axis']['labelColor']
+ self.options['axis']['tickFont'] = op['axis']['tickFont']
+ self.options['axis']['tickFontSize'] = op['axis']['tickFontSize']
+ self.options['yvals']['fontColor'] = op['yvals']['fontColor']
+
+ if self.type == PIE:
+ self.options['axis']['labelFont'] = op['axis']['tickFont']
+ self.options['axis']['labelFontSize'] = op['axis']['tickFontSize']
+ self.options['axis']['labelColor'] = op['axis']['tickColor']
+
def set_color_scheme(self, color='blue'):
'''Set the chart color scheme'''
self.options['colorScheme']['args'] = {'initialColor': color}
diff --git a/fontcombobox.py b/fontcombobox.py
new file mode 100644
index 0000000..747dc9a
--- /dev/null
+++ b/fontcombobox.py
@@ -0,0 +1,309 @@
+# Copyright (C) 2012 Gonzalo Odiard <gonzalo@laptop.org>
+# Based in code form Flavio Danesse <fdanesse@activitycentral.com>
+# and Ariel Calzada <ariel.calzada@gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import os
+import shutil
+from gettext import gettext as _
+
+from gi.repository import Gtk
+from gi.repository import GObject
+from gi.repository import Gio
+
+from sugar3.graphics.icon import Icon
+from sugar3.graphics.palette import Palette, ToolInvoker
+from sugar3.graphics.palettemenu import PaletteMenuBox
+from sugar3.graphics.palettemenu import PaletteMenuItem
+from sugar3.graphics import style
+from sugar3 import env
+
+DEFAULT_FONTS = ['Sans', 'Serif', 'Monospace']
+USER_FONTS_FILE_PATH = env.get_profile_path('fonts')
+GLOBAL_FONTS_FILE_PATH = '/etc/sugar_fonts'
+
+
+class FontLabel(Gtk.Label):
+
+ def __init__(self, default_font='Sans'):
+ Gtk.Label.__init__(self)
+ self._font = None
+ self.set_font(default_font)
+
+ def set_font(self, font):
+ if self._font != font:
+ self.set_markup('<span font="%s">%s</span>' % (font, font))
+
+
+class FontComboBox(Gtk.ToolItem):
+
+ __gsignals__ = {
+ 'changed': (GObject.SignalFlags.RUN_LAST, None, ([])), }
+
+ def __init__(self):
+ self._palette_invoker = ToolInvoker()
+ Gtk.ToolItem.__init__(self)
+ self._font_label = FontLabel()
+ bt = Gtk.Button('')
+ bt.set_can_focus(False)
+ bt.remove(bt.get_children()[0])
+ box = Gtk.HBox()
+ bt.add(box)
+ icon = Icon(icon_name='font-text')
+ box.pack_start(icon, False, False, 10)
+ box.pack_start(self._font_label, False, False, 10)
+ self.add(bt)
+ self.show_all()
+
+ self._font_name = 'Sans'
+
+ # theme the button, can be removed if add the style to the sugar css
+ if style.zoom(100) == 100:
+ subcell_size = 15
+ else:
+ subcell_size = 11
+ radius = 2 * subcell_size
+ theme = "GtkButton {border-radius: %dpx;}" % radius
+ css_provider = Gtk.CssProvider()
+ css_provider.load_from_data(theme)
+ style_context = bt.get_style_context()
+ style_context.add_provider(css_provider,
+ Gtk.STYLE_PROVIDER_PRIORITY_USER)
+
+ # init palette
+ self._hide_tooltip_on_click = True
+ self._palette_invoker.attach_tool(self)
+ self._palette_invoker.props.toggle_palette = True
+
+ self.palette = Palette(_('Select font'))
+ self.palette.set_invoker(self._palette_invoker)
+
+ # load the fonts in the palette menu
+ self._menu_box = PaletteMenuBox()
+ self.props.palette.set_content(self._menu_box)
+ self._menu_box.show()
+
+ context = self.get_pango_context()
+
+ self._init_font_list()
+
+ tmp_list = []
+ for family in context.list_families():
+ name = family.get_name()
+ if name in self._font_white_list:
+ tmp_list.append(name)
+ for name in sorted(tmp_list):
+ self._add_menu(name, self.__font_selected_cb)
+
+ self._font_label.set_font(self._font_name)
+
+ def _init_font_list(self):
+ self._font_white_list = []
+ self._font_white_list.extend(DEFAULT_FONTS)
+
+ # check if there are a user configuration file
+ if not os.path.exists(USER_FONTS_FILE_PATH):
+ # verify if exists a file in /etc
+ if os.path.exists(GLOBAL_FONTS_FILE_PATH):
+ shutil.copy(GLOBAL_FONTS_FILE_PATH, USER_FONTS_FILE_PATH)
+
+ if os.path.exists(USER_FONTS_FILE_PATH):
+ # get the font names in the file to the white list
+ fonts_file = open(USER_FONTS_FILE_PATH)
+ # get the font names in the file to the white list
+ for line in fonts_file:
+ self._font_white_list.append(line.strip())
+ # monitor changes in the file
+ gio_fonts_file = Gio.File.new_for_path(USER_FONTS_FILE_PATH)
+ self.monitor = gio_fonts_file.monitor_file(
+ Gio.FileMonitorFlags.NONE, None)
+ self.monitor.set_rate_limit(5000)
+ self.monitor.connect('changed', self._reload_fonts)
+
+ def _reload_fonts(self, monitor, gio_file, other_file, event):
+ if event != Gio.FileMonitorEvent.CHANGES_DONE_HINT:
+ return
+ self._font_white_list = []
+ self._font_white_list.extend(DEFAULT_FONTS)
+ fonts_file = open(USER_FONTS_FILE_PATH)
+ for line in fonts_file:
+ self._font_white_list.append(line.strip())
+ # update the menu
+ for child in self._menu_box.get_children():
+ self._menu_box.remove(child)
+ child = None
+ context = self.get_pango_context()
+ tmp_list = []
+ for family in context.list_families():
+ name = family.get_name()
+ if name in self._font_white_list:
+ tmp_list.append(name)
+ for name in sorted(tmp_list):
+ self._add_menu(name, self.__font_selected_cb)
+ return False
+
+ def __font_selected_cb(self, menu, font_name):
+ self._font_name = font_name
+ self._font_label.set_font(font_name)
+ self.emit('changed')
+
+ def _add_menu(self, font_name, activate_cb):
+ label = '<span font="%s">%s</span>' % (font_name, font_name)
+ menu_item = PaletteMenuItem()
+ menu_item.set_label(label)
+ menu_item.connect('activate', activate_cb, font_name)
+ self._menu_box.append_item(menu_item)
+ menu_item.show()
+
+ def __destroy_cb(self, icon):
+ if self._palette_invoker is not None:
+ self._palette_invoker.detach()
+
+ def create_palette(self):
+ return None
+
+ def get_palette(self):
+ return self._palette_invoker.palette
+
+ def set_palette(self, palette):
+ self._palette_invoker.palette = palette
+
+ palette = GObject.property(
+ type=object, setter=set_palette, getter=get_palette)
+
+ def get_palette_invoker(self):
+ return self._palette_invoker
+
+ def set_palette_invoker(self, palette_invoker):
+ self._palette_invoker.detach()
+ self._palette_invoker = palette_invoker
+
+ palette_invoker = GObject.property(
+ type=object, setter=set_palette_invoker, getter=get_palette_invoker)
+
+ def set_font_name(self, font_name):
+ self._font_label.set_font(font_name)
+
+ def get_font_name(self):
+ return self._font_name
+
+
+class FontSize(Gtk.ToolItem):
+
+ __gsignals__ = {
+ 'changed': (GObject.SignalFlags.RUN_LAST, None, ([])), }
+
+ def __init__(self):
+
+ Gtk.ToolItem.__init__(self)
+
+ self._font_sizes = [8, 9, 10, 11, 12, 14, 16, 20, 22, 24, 26, 28, 36,
+ 48, 72]
+
+ # theme the buttons, can be removed if add the style to the sugar css
+ # these are the same values used in gtk-widgets.css.em
+ if style.zoom(100) == 100:
+ subcell_size = 15
+ default_padding = 6
+ else:
+ subcell_size = 11
+ default_padding = 4
+
+ hbox = Gtk.HBox()
+ vbox = Gtk.VBox()
+ self.add(vbox)
+ # add a vbox to set the padding up and down
+ vbox.pack_start(hbox, True, True, default_padding)
+ self._size_down = Gtk.Button()
+ self._size_down.set_can_focus(False)
+ icon = Icon(icon_name='resize-')
+ self._size_down.set_image(icon)
+ self._size_down.connect('clicked', self.__font_sizes_cb, False)
+ hbox.pack_start(self._size_down, False, False, 5)
+
+ # TODO: default?
+ self._default_size = 12
+ self._font_size = self._default_size
+
+ self._size_label = Gtk.Label(str(self._font_size))
+ hbox.pack_start(self._size_label, False, False, 10)
+
+ self._size_up = Gtk.Button()
+ self._size_up.set_can_focus(False)
+ icon = Icon(icon_name='resize+')
+ self._size_up.set_image(icon)
+ self._size_up.connect('clicked', self.__font_sizes_cb, True)
+ hbox.pack_start(self._size_up, False, False, 5)
+
+ radius = 2 * subcell_size
+ theme_up = "GtkButton {border-radius:0px %dpx %dpx 0px;}" % (radius,
+ radius)
+ css_provider_up = Gtk.CssProvider()
+ css_provider_up.load_from_data(theme_up)
+
+ style_context = self._size_up.get_style_context()
+ style_context.add_provider(css_provider_up,
+ Gtk.STYLE_PROVIDER_PRIORITY_USER)
+
+ theme_down = "GtkButton {border-radius: %dpx 0px 0px %dpx;}" % (radius,
+ radius)
+ css_provider_down = Gtk.CssProvider()
+ css_provider_down.load_from_data(theme_down)
+ style_context = self._size_down.get_style_context()
+ style_context.add_provider(css_provider_down,
+ Gtk.STYLE_PROVIDER_PRIORITY_USER)
+
+ self.show_all()
+
+ def __font_sizes_cb(self, button, increase):
+ if self._font_size in self._font_sizes:
+ i = self._font_sizes.index(self._font_size)
+ if increase:
+ if i < len(self._font_sizes) - 1:
+ i += 1
+ else:
+ if i > 0:
+ i -= 1
+ else:
+ i = self._font_sizes.index(self._default_size)
+
+ self._font_size = self._font_sizes[i]
+ self._size_label.set_text(str(self._font_size))
+ self._size_down.set_sensitive(i != 0)
+ self._size_up.set_sensitive(i < len(self._font_sizes) - 1)
+ self.emit('changed')
+
+ def set_font_size(self, size):
+ if size not in self._font_sizes:
+ # assure the font assigned is in the range
+ # if not, assign one close.
+ for font_size in self._font_sizes:
+ if font_size > size:
+ size = font_size
+ break
+ if size > self._font_sizes[-1]:
+ size = self._font_sizes[-1]
+
+ self._font_size = size
+ self._size_label.set_text(str(self._font_size))
+
+ # update the buttons states
+ i = self._font_sizes.index(self._font_size)
+ self._size_down.set_sensitive(i != 0)
+ self._size_up.set_sensitive(i < len(self._font_sizes) - 1)
+ self.emit('changed')
+
+ def get_font_size(self):
+ return self._font_size
diff --git a/icons/font-text.svg b/icons/font-text.svg
new file mode 100644
index 0000000..ad3f9fa
--- /dev/null
+++ b/icons/font-text.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="54.695999"
+ viewBox="0 0 55 54.696"
+ id="svg2"
+ xml:space="preserve"><metadata
+ id="metadata22"><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="defs20" /><text
+ x="-2.6176355"
+ y="43.461388"
+ transform="scale(0.90891499,1.1002129)"
+ id="text3591"
+ xml:space="preserve"
+ style="font-size:49.5765152px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Verdana;-inkscape-font-specification:Verdana"><tspan
+ x="-2.6176355"
+ y="43.461388"
+ id="tspan3593"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Serif;-inkscape-font-specification:Serif"><tspan
+ id="tspan2992"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Sans;-inkscape-font-specification:Sans">F</tspan>F</tspan></text>
+</svg> \ No newline at end of file
diff --git a/icons/format-text.svg b/icons/format-text.svg
new file mode 100644
index 0000000..075465b
--- /dev/null
+++ b/icons/format-text.svg
@@ -0,0 +1,8 @@
+<?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 54.696" height="54.696px" version="1.1" viewBox="0 0 55 54.696" 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="format-text-size">
+ <g display="inline">
+ <path d="M22.263,12.435 h24.656 v3.562 H36.575 V41.59 h-3.969 V15.996 H22.263 V12.435z" fill="#FFFFFF"/>
+ <path d="M8.953,22.435 h16.656 v3.562 h-6.344 V41.59 h-3.969 V25.997 h-6.344 V24.435z" fill="#FFFFFF"/>
+ </g>
+</g></svg>
diff --git a/icons/labels-font.svg b/icons/labels-font.svg
new file mode 100644
index 0000000..b5af879
--- /dev/null
+++ b/icons/labels-font.svg
@@ -0,0 +1,78 @@
+<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="62"
+ height="60"
+ viewBox="0 0 62 60"
+ id="svg2"
+ xml:space="preserve"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="vlabel.svg"><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="928"
+ inkscape:window-height="549"
+ id="namedview10"
+ showgrid="false"
+ inkscape:zoom="3.9333333"
+ inkscape:cx="50.080494"
+ inkscape:cy="30"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><metadata
+ id="metadata15"><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="defs13" /><g
+ transform="matrix(0,-0.58486318,0.47035803,0,0.41665058,-0.65111329)"
+ id="text3780"
+ style="font-size:36.99787903000000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#ffffff;font-family:Serif;-inkscape-font-specification:Serif"><path
+ d="m -47.332874,26.841896 1.264576,-3.19757 -7.171952,-17.5956713 -2.18591,0 0,-1.9329947 8.833966,0 0,1.9329947 -3.071113,0 5.401546,13.2057863 5.401546,-13.2057863 -2.872394,0 0,-1.9329947 7.208082,0 0,1.9329947 -2.149779,0 -8.797835,21.6061833 c -0.602188,1.493398 -1.270606,2.51108 -2.005256,3.053048 -0.734666,0.553996 -1.770413,0.830998 -3.107244,0.831007 -0.566052,-9e-6 -1.150166,-0.04818 -1.752341,-0.144523 -0.590138,-0.09636 -1.186294,-0.234858 -1.788472,-0.415504 l 0,-3.66727 1.698145,0 c 0.07226,0.818959 0.276999,1.403072 0.614223,1.752341 0.34926,0.361301 0.885199,0.541955 1.607818,0.541961 0.662391,-6e-6 1.192308,-0.186682 1.589752,-0.560026 0.409475,-0.361313 0.837022,-1.095971 1.282642,-2.203976"
+ id="path4023"
+ style="stroke:#ffffff;fill:#ffffff"
+ inkscape:connector-curvature="0" /></g><g
+ transform="matrix(0,-0.85575423,0.82155949,0,-22.815196,56.234959)"
+ id="g3820"
+ style="stroke:#ffffff;fill:#ffffff"><path
+ d="m 6.8085107,50.851064 49.0528313,0"
+ id="path3010"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" /><path
+ d="m 49.333554,42.68526 8.211183,8.165804 -8.211183,8.165804"
+ id="path3805"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.50000000000000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" /></g><g
+ transform="matrix(0.57722279,0,0,0.50756203,26.19203,36.321657)"
+ id="text3780-1"
+ style="font-size:36.99787903000000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#ffffff;font-family:Serif;-inkscape-font-specification:Serif"><path
+ style="stroke:#ffffff;fill:#ffffff"
+ inkscape:connector-curvature="0"
+ d="m 11.449192,29.594723 4.028577,-5.546068 -2.583348,0 0,-1.932995 7.388737,0 0,1.932995 -2.547217,0 -5.148631,7.09969 5.997703,8.255875 2.511087,0 0,1.914929 -8.870097,0 0,-1.914929 2.438825,0 -4.173101,-5.744788 -4.1911658,5.744788 2.4930212,0 0,1.914929 -7.2984098,0 0,-1.914929 2.5472173,0 5.2931536,-7.29841 -5.8351147,-8.057155 -2.3665636,0 0,-1.932995 8.5810511,0 0,1.932995 -2.2943021,0 4.0285778,5.546068"
+ id="path3992" /></g><g
+ style="stroke:#ffffff;fill:#ffffff"
+ transform="matrix(0.82155949,0,0,0.85575423,6.6158371,0.14629503)"
+ id="g3820-6"><path
+ inkscape:connector-curvature="0"
+ d="m 6.8085107,50.851064 49.0528313,0"
+ id="path3010-8"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><path
+ inkscape:connector-curvature="0"
+ d="m 49.333554,42.68526 8.211183,8.165804 -8.211183,8.165804"
+ id="path3805-7"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:3.50000000000000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></svg> \ No newline at end of file
diff --git a/icons/resize+.svg b/icons/resize+.svg
new file mode 100644
index 0000000..0fae3c3
--- /dev/null
+++ b/icons/resize+.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55"
+ height="54.695999"
+ viewBox="0 0 55 54.696"
+ id="svg2"
+ xml:space="preserve"><defs
+ id="defs21">
+
+
+
+
+ </defs><g
+ transform="translate(-0.4354,0)"
+ id="g7">
+ <g
+ id="g9">
+ <path
+ d="m 25.263,12.435 h 24.656 v 3.562 H 39.575 V 41.59 H 35.606 V 15.996 H 25.263 v -3.561 z"
+ id="path11"
+ style="fill:#ffffff" />
+ </g>
+ </g><g
+ transform="translate(-8.4356,0)"
+ id="g13">
+ <g
+ id="g15">
+ <path
+ d="m 13.953,24.435 h 16.656 v 3.562 H 24.265 V 41.59 H 20.296 V 27.997 h -6.344 v -3.562 z"
+ id="path17"
+ style="fill:#ffffff" />
+ </g>
+ </g><path
+ d="m 25.5774,23.677763 6,-6.000001 -4,0"
+ id="path3618"
+ style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></svg> \ No newline at end of file
diff --git a/icons/resize-.svg b/icons/resize-.svg
new file mode 100644
index 0000000..e3b719e
--- /dev/null
+++ b/icons/resize-.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="55"
+ height="54.695999"
+ viewBox="0 0 55 54.696"
+ id="svg2"
+ xml:space="preserve"><defs
+ id="defs21">
+
+
+
+
+ </defs><g
+ transform="translate(3.5644,0)"
+ id="g2821"><g
+ transform="matrix(-1,0,0,1,51.871,0)"
+ id="g7">
+ <g
+ id="g9">
+ <path
+ d="m 25.263,12.435 h 24.656 v 3.562 H 39.575 V 41.59 H 35.606 V 15.996 H 25.263 v -3.561 z"
+ id="path11"
+ style="fill:#ffffff" />
+ </g>
+ </g><g
+ transform="matrix(-1,0,0,1,59.8712,0)"
+ id="g13">
+ <g
+ id="g15">
+ <path
+ d="m 13.953,24.435 h 16.656 v 3.562 H 24.265 V 41.59 H 20.296 V 27.997 h -6.344 v -3.562 z"
+ id="path17"
+ style="fill:#ffffff" />
+ </g>
+ </g><path
+ d="m 19.8582,17.677762 6,6.000001 -4,0"
+ id="path3618"
+ style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></svg> \ No newline at end of file
diff --git a/icons/tick-font.svg b/icons/tick-font.svg
new file mode 100644
index 0000000..08d208c
--- /dev/null
+++ b/icons/tick-font.svg
@@ -0,0 +1,162 @@
+<?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: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"
+ version="1.1"
+ width="62"
+ height="60"
+ viewBox="0 0 62 60"
+ id="svg2"
+ xml:space="preserve"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="tick-font.svg"><metadata
+ id="metadata15"><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="defs13"><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3762"><stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3764" /><stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3766" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3762"
+ id="linearGradient3768"
+ x1="46.525425"
+ y1="31.01695"
+ x2="62.033899"
+ y2="31.01695"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1803279,0,0,1,-90.127118,64.957626)" /></defs><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="552"
+ id="namedview11"
+ showgrid="false"
+ inkscape:zoom="3.9333333"
+ inkscape:cx="62.976696"
+ inkscape:cy="37.838983"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" /><g
+ transform="matrix(0,-0.72129104,0.68399603,0,28.627787,5.0501915)"
+ id="activity-browse"
+ style="fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:2.0999999;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:block"><g
+ transform="translate(-128.87712,-22.838983)"
+ id="g7"
+ style="fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:2.0999999;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"><g
+ transform="matrix(0.10822504,0,0,0.09945444,61.358446,34.085169)"
+ id="g6167"
+ style="fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:20.24152946;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"><g
+ transform="matrix(0,1.0881871,-0.9189596,0,426.39011,-308.03653)"
+ id="g3798"
+ style="fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:20.24152946;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"><rect
+ width="81.443176"
+ height="272.19876"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="373.97116"
+ y="55.900478"
+ id="rect2987"
+ style="color:#000000;fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:20.24152946;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><rect
+ width="81.443077"
+ height="360.47952"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="499.32275"
+ y="-32.380226"
+ id="rect3757"
+ style="color:#000000;fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:20.24152946;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><rect
+ width="81.443077"
+ height="500.25723"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="248.61969"
+ y="-172.15802"
+ id="rect3759"
+ style="color:#000000;fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:20.24152946;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><rect
+ width="81.443314"
+ height="215.79736"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="123.26795"
+ y="112.30204"
+ id="rect3761"
+ style="color:#000000;fill:#808080;fill-opacity:1;stroke:#ffffff;stroke-width:20.24152946;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></g></g><text
+ xml:space="preserve"
+ style="font-size:16.25135803px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#999999;fill-opacity:1;stroke:none;font-family:Sans"
+ x="1.7760285"
+ y="8.8148394"
+ id="text3770"
+ sodipodi:linespacing="125%"
+ transform="scale(1.019756,0.98062674)"><tspan
+ sodipodi:role="line"
+ id="tspan3772"
+ x="1.7760285"
+ y="8.8148394" /></text>
+<text
+ xml:space="preserve"
+ style="font-size:13.50810051px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#999999;fill-opacity:1;stroke:none;font-family:Sans"
+ x="2.3738625"
+ y="19.076818"
+ id="text3770-0"
+ sodipodi:linespacing="125%"
+ transform="scale(0.98007967,1.0203252)"><tspan
+ sodipodi:role="line"
+ id="tspan3772-5"
+ x="2.3738625"
+ y="19.076818">43</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-size:13.50810051px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#999999;fill-opacity:1;stroke:none;font-family:Sans"
+ x="2.334285"
+ y="30.80267"
+ id="text3770-0-1"
+ sodipodi:linespacing="125%"
+ transform="scale(0.98007967,1.0203252)"><tspan
+ sodipodi:role="line"
+ x="2.334285"
+ y="30.80267"
+ id="tspan3816">31</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-size:13.50810051px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#999999;fill-opacity:1;stroke:none;font-family:Sans"
+ x="2.1095979"
+ y="42.343838"
+ id="text3770-0-1-3"
+ sodipodi:linespacing="125%"
+ transform="scale(0.98007967,1.0203252)"><tspan
+ sodipodi:role="line"
+ x="2.1095979"
+ y="42.343838"
+ id="tspan3816-4">20</tspan></text>
+<text
+ xml:space="preserve"
+ style="font-size:15.71327019px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#999999;fill-opacity:1;stroke:none;font-family:Sans"
+ x="19.859686"
+ y="59.485451"
+ id="text3879"
+ sodipodi:linespacing="125%"
+ transform="scale(1.0162563,0.98400375)"><tspan
+ sodipodi:role="line"
+ id="tspan3881"
+ x="19.859686"
+ y="59.485451">1234</tspan></text>
+</svg> \ No newline at end of file
diff --git a/icons/title-font.svg b/icons/title-font.svg
new file mode 100644
index 0000000..1f62788
--- /dev/null
+++ b/icons/title-font.svg
@@ -0,0 +1,141 @@
+<?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: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"
+ version="1.1"
+ width="62"
+ height="60"
+ viewBox="0 0 62 60"
+ id="svg2"
+ xml:space="preserve"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="title-font.svg"><metadata
+ id="metadata15"><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="defs13"><linearGradient
+ id="linearGradient3829"><stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3831" /><stop
+ id="stop3837"
+ offset="0.41904762"
+ style="stop-color:#ffffff;stop-opacity:0.49803922;" /><stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3833" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ id="linearGradient3811"><stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3813" /><stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3815" /></linearGradient><linearGradient
+ id="linearGradient3781"><stop
+ style="stop-color:#808080;stop-opacity:1;"
+ offset="0"
+ id="stop3783" /><stop
+ style="stop-color:#808080;stop-opacity:0;"
+ offset="1"
+ id="stop3785" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3811"
+ id="linearGradient3817"
+ x1="-2.0158749"
+ y1="62.855823"
+ x2="62.156137"
+ y2="62.855823"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.3907601,0,0,2.6553042,-62.179267,-151.28022)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3829"
+ id="linearGradient3835"
+ x1="47.779999"
+ y1="-36.255243"
+ x2="60.083341"
+ y2="-36.255243"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5415455,0,0,1.0000003,-136.16089,12.055659)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="806"
+ inkscape:window-height="480"
+ id="namedview11"
+ showgrid="false"
+ inkscape:zoom="2.9763752"
+ inkscape:cx="21.169116"
+ inkscape:cy="24.2801"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" /><g
+ transform="translate(58.093221,29.697223)"
+ id="activity-browse"
+ style="fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:2.29999995;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:block"><g
+ transform="translate(-128.87712,-22.838983)"
+ id="g7"
+ style="fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:2.29999995;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"><g
+ transform="matrix(0.10822504,0,0,0.09945444,61.358446,34.085169)"
+ id="g6167"
+ style="fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:22.16929436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"><g
+ transform="translate(2.7213003,-2.9469823)"
+ id="g3798"
+ style="fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:22.16929436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"><rect
+ width="81.443176"
+ height="272.19876"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="373.97116"
+ y="55.900478"
+ id="rect2987"
+ style="color:#000000;fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:22.16929436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><rect
+ width="81.443077"
+ height="360.47952"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="499.32275"
+ y="-32.380226"
+ id="rect3757"
+ style="color:#000000;fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:22.16929436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><rect
+ width="81.443077"
+ height="500.25723"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="248.61969"
+ y="-172.15802"
+ id="rect3759"
+ style="color:#000000;fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:22.16929436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /><rect
+ width="81.443314"
+ height="215.79736"
+ rx="4.3524833"
+ ry="6.0284276"
+ x="123.26795"
+ y="112.30204"
+ id="rect3761"
+ style="color:#000000;fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:22.16929436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></g></g><rect
+ style="fill:#999999;fill-opacity:1;stroke:#ffffff;stroke-width:1.08714974000000009;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3760"
+ width="49.434883"
+ height="8.756918"
+ x="5.5706935"
+ y="4.3334055" /><rect
+ style="fill:url(#linearGradient3835);fill-opacity:1;stroke:none"
+ id="rect3819"
+ width="18.966162"
+ height="49.520157"
+ x="-62.505836"
+ y="-48.959679"
+ transform="matrix(-0.08853978,-0.99607264,-0.99999958,9.1695853e-4,0,0)" /></svg> \ No newline at end of file