Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgnacio Rodríguez <ignacio@sugarlabs.org>2013-01-10 11:40:16 (GMT)
committer Ajay Garg <ajay@activitycentral.com>2013-03-22 06:06:05 (GMT)
commitd77d304fc94bd96a1ba18eddff93903ef568bc07 (patch)
treed15ec67a0fc1228ea3b433a443704f30604da76b
parentede9f3bc56372bddcd02be8bac0cf5b9d1a6dc17 (diff)
Add support for selecting new XO icon skin
This patch adds the ability fo the Sugar user to select a new skin for the XO icon from a collection of icons in ~/.sugar/skins. It is an extension of the aboutme panel, where the user is also able to change colors and the nick. This patch contains the modifications to model.py and view.py. It does not include the sample icons. Caveat: We need to discuss the mechanism for actually changing the icon, which is currently stored in /usr/share/icons/sugar/, which is read-only to Sugar users. Two ideas have been discussed so far: (1) to make the xo-computer.svg icon read-write; and (2) to add ~/.sugar/icons/ to the head of the icon-themes list, so if a modified xo-computer is found there, it will be used to override the on ein /usr/share. This code assumes solution #1 above. For that reason try (for now) to do: chmod -R 777 /usr/share/icons/sugar/scalable/device/computer-xo.svg
-rw-r--r--extensions/cpsection/aboutme/model.py18
-rw-r--r--extensions/cpsection/aboutme/view.py146
2 files changed, 153 insertions, 11 deletions
diff --git a/extensions/cpsection/aboutme/model.py b/extensions/cpsection/aboutme/model.py
index ad1de66..7395ae9 100644
--- a/extensions/cpsection/aboutme/model.py
+++ b/extensions/cpsection/aboutme/model.py
@@ -17,6 +17,8 @@
from gettext import gettext as _
from gi.repository import GConf
+import shutil
+import os
_COLORS = {
@@ -123,3 +125,19 @@ def set_color_xo(color):
client = GConf.Client.get_default()
client.set_string('/desktop/sugar/user/color', color)
return 1
+
+
+def set_xo_icon(path, icon_name):
+ """ Replace computer-xo.svg icon """
+ pt = os.path.join(os.path.expanduser('~'), '.current')
+ fd = open(pt, 'w')
+ fd.write(icon_name)
+ fd.close()
+ if os.path.exists('/usr/share/icons/sugar/scalable/device/'):
+ iconpath = '/usr/share/icons/sugar/scalable/device/computer-xo.svg'
+ shutil.copy(path, iconpath)
+ if os.path.exists('/opt/sweets/sugar-artwork/share/icons/sugar/scalable/device'):
+ iconpath = '/opt/sweets/sugar-artwork/share/icons/sugar/scalable/device/computer-xo.svg'
+ shutil.copy(path, iconpath)
+ else:
+ pass
diff --git a/extensions/cpsection/aboutme/view.py b/extensions/cpsection/aboutme/view.py
index 2d4b1e8..ac01bc2 100644
--- a/extensions/cpsection/aboutme/view.py
+++ b/extensions/cpsection/aboutme/view.py
@@ -16,15 +16,19 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GConf
from gi.repository import GObject
from gettext import gettext as _
from sugar3.graphics import style
from sugar3.graphics.xocolor import XoColor, colors
from sugar3.graphics.icon import CanvasIcon
+from sugar3.graphics.icon import Icon
from jarabe.controlpanel.sectionview import SectionView
from jarabe.controlpanel.inlinealert import InlineAlert
+import os
_STROKE_COLOR = 0
_FILL_COLOR = 1
@@ -118,8 +122,8 @@ class ColorPicker(CanvasIcon):
([object])),
}
- def __init__(self, picker):
- CanvasIcon.__init__(self, icon_name='computer-xo',
+ def __init__(self, picker, icon):
+ CanvasIcon.__init__(self, icon_name=icon,
pixel_size=style.XLARGE_ICON_SIZE)
self._picker = picker
self._color = None
@@ -156,25 +160,58 @@ class AboutMe(SectionView):
self._nick_valid = True
self.set_border_width(style.DEFAULT_SPACING * 2)
- self.set_spacing(style.DEFAULT_SPACING)
+ #self.set_spacing(style.DEFAULT_SPACING)
self._group = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
self._color_label = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._color_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._color_alert_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._color_alert = None
+ # Examples. #
+ self._scroll_icon = Gtk.ScrolledWindow()
+ self._scroll_icon.set_policy(Gtk.PolicyType.AUTOMATIC,
+ Gtk.PolicyType.NEVER)
+ self._hbox_icon = Gtk.HBox(spacing=style.DEFAULT_SPACING)
+ self._scroll_icon.add_with_viewport(self._hbox_icon)
+ self._frame_icon = Gtk.Frame()
+ self._vbox_icon = Gtk.VBox()
+ self._vbox_icon.pack_start(self._scroll_icon, True, True, 0)
+
+ self._alert = InlineAlert()
+ label_color = \
+Gtk.Label(_('Example icons: Copyright (c) TheNounProject'))
+ label_color.modify_fg(Gtk.StateType.NORMAL,
+ style.COLOR_SELECTION_GREY.get_gdk_color())
+ self._vbox_icon.pack_start(label_color, False, False, 0)
+ self._vbox_icon.pack_start(self._alert, False, False, 0)
+
+ self._frame_icon.add(self._vbox_icon)
+ self._widgets = []
+ self._widget = []
+ self._icons_images = []
+ self._join = os.path.join(os.path.expanduser('~'), '.sugar', 'skins')
+ if os.path.exists(os.path.join(self._join)):
+ self._path = self._join
+ self._icons = os.listdir(self._path)
+ self._icons.sort()
+
+ for x in self._icons:
+ if "svg" in x:
+ self._create_pixbuf_button(x[:-4])
+ else:
+ pass
self._pickers = {
- _PREVIOUS_FILL_COLOR: ColorPicker(_PREVIOUS_FILL_COLOR),
- _NEXT_FILL_COLOR: ColorPicker(_NEXT_FILL_COLOR),
- _CURRENT_COLOR: ColorPicker(_CURRENT_COLOR),
- _NEXT_STROKE_COLOR: ColorPicker(_NEXT_STROKE_COLOR),
- _PREVIOUS_STROKE_COLOR: ColorPicker(_PREVIOUS_STROKE_COLOR),
+ _PREVIOUS_FILL_COLOR: ColorPicker(_PREVIOUS_FILL_COLOR, 'computer-xo'),
+ _NEXT_FILL_COLOR: ColorPicker(_NEXT_FILL_COLOR, 'computer-xo'),
+ _CURRENT_COLOR: ColorPicker(_CURRENT_COLOR, 'computer-xo'),
+ _NEXT_STROKE_COLOR: ColorPicker(_NEXT_STROKE_COLOR, 'computer-xo'),
+ _PREVIOUS_STROKE_COLOR: ColorPicker(_PREVIOUS_STROKE_COLOR, 'computer-xo'),
}
self._setup_color()
- initial_color = XoColor(self._model.get_color_xo())
- self._update_pickers(initial_color)
+ self.initial_color = XoColor(self._model.get_color_xo())
+ self._update_pickers(self.initial_color)
self._nick_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)
self._nick_alert_box = Gtk.HBox(spacing=style.DEFAULT_SPACING)
@@ -182,6 +219,82 @@ class AboutMe(SectionView):
self._nick_alert = None
self._setup_nick()
self.setup()
+ self.pack_end(self._frame_icon, False, False, style.DEFAULT_SPACING)
+ self._frame_icon.show_all()
+ self._alert.hide()
+
+ def _update_icon(self, widget, event):
+ self._icon_name = widget.get_tooltip_text()
+ self._current.set_sensitive(True)
+ widget.set_sensitive(False)
+ # Removes. #
+ for x in self._widget:
+ self._color_alert_box.remove(x)
+ self.remove(self._color_box)
+ for x in self._widgets:
+ self._color_box.remove(x)
+ try:
+ self._color_label.remove(x)
+ except:
+ pass
+ try:
+ self._group.remove_widget(x)
+ except:
+ pass
+
+ self._pickers = {
+ _PREVIOUS_FILL_COLOR: ColorPicker(_PREVIOUS_FILL_COLOR, self._icon_name),
+ _NEXT_FILL_COLOR: ColorPicker(_NEXT_FILL_COLOR, self._icon_name),
+ _CURRENT_COLOR: ColorPicker(_CURRENT_COLOR, self._icon_name),
+ _NEXT_STROKE_COLOR: ColorPicker(_NEXT_STROKE_COLOR, self._icon_name),
+ _PREVIOUS_STROKE_COLOR: ColorPicker(_PREVIOUS_STROKE_COLOR, self._icon_name),
+ }
+ try:
+ self._update_pickers(self._current_color)
+ except AttributeError:
+ self._update_pickers(self.initial_color)
+ self.setup()
+ self._setup_color()
+ self.show()
+ self._current = widget
+ self.restart_alerts.append('icon')
+ if 'icon' in self.restart_alerts:
+ self._alert.props.msg = self.restart_msg
+ self._alert.show()
+ path = self._path + "/" + self._icon_name + ".svg"
+ self._model.set_xo_icon(path, self._icon_name)
+ self.needs_restart = True
+
+ def _create_pixbuf_button(self, name):
+ icon_theme = Gtk.IconTheme.get_default()
+ icon_theme.append_search_path(self._path)
+ self._icon_area = Gtk.EventBox()
+ try:
+ pt = os.path.join(os.path.expanduser('~'), '.current')
+ fd = open(pt, 'r')
+ self._ex_icon = fd.read()
+ fd.close()
+ except:
+ self._ex_icon = '1xo'
+ if name == self._ex_icon:
+ self._icon_area.set_sensitive(False)
+ self._current = self._icon_area
+ if name == '1xo' and self._ex_icon == '1xo':
+ self._icon_area.set_sensitive(False)
+ self._image = Icon(icon_name=name)
+ self._current = self._icon_area
+ self._image = Icon(icon_name=name, pixel_size=100)
+ self._client = GConf.Client.get_default()
+ color = self._client.get_string('/desktop/sugar/user/color')
+ self._color = XoColor(color)
+ self._icon_area.set_events(Gdk.EventMask.BUTTON_PRESS_MASK)
+ self._icon_area.connect('button-press-event', self._update_icon)
+ self._icon_area.set_tooltip_text(name)
+ self._icon_area.props.has_tooltip = False
+ self._image.set_xo_color(self._color)
+ self._icon_area.add(self._image)
+ self._hbox_icon.pack_start(self._icon_area, True, True, 0)
+ self._icons_images.append(self._image)
def _setup_nick(self):
self._nick_entry = Gtk.Entry()
@@ -215,32 +328,37 @@ class AboutMe(SectionView):
self._group.add_widget(label_color)
self._color_label.pack_start(label_color, False, True, 0)
label_color.show()
+ self._widgets.append(label_color)
for picker_index in sorted(self._pickers.keys()):
if picker_index == _CURRENT_COLOR:
left_separator = Gtk.SeparatorToolItem()
left_separator.show()
self._color_box.pack_start(left_separator, False, True, 0)
-
+ self._widgets.append(left_separator)
picker = self._pickers[picker_index]
picker.show()
self._color_box.pack_start(picker, False, True, 0)
+ self._widgets.append(picker)
if picker_index == _CURRENT_COLOR:
right_separator = Gtk.SeparatorToolItem()
right_separator.show()
self._color_box.pack_start(right_separator, False, True, 0)
+ self._widgets.append(right_separator)
label_color_error = Gtk.Label()
self._group.add_widget(label_color_error)
self._color_alert_box.pack_start(label_color_error, False, True, 0)
label_color_error.show()
+ self._widgets.append(label_color)
self._color_alert = InlineAlert()
self._color_alert_box.pack_start(self._color_alert, True, True, 0)
if 'color' in self.restart_alerts:
self._color_alert.props.msg = self.restart_msg
self._color_alert.show()
+ self._widgets.append(self._color_alert)
self._center_in_panel = Gtk.Alignment.new(0.5, 0, 0, 0)
self._center_in_panel.add(self._color_box)
@@ -266,6 +384,9 @@ class AboutMe(SectionView):
self._model.undo()
self._nick_alert.hide()
self._color_alert.hide()
+ self._alert.hide()
+ path = self._path + "/" + self._ex_icon + '.svg'
+ self._model.set_xo_icon(path, self._ex_icon)
def _update_pickers(self, color):
for picker in self._pickers.values():
@@ -304,6 +425,9 @@ class AboutMe(SectionView):
def __color_changed_cb(self, colorpicker, color):
self._model.set_color_xo(color.to_string())
+ for x in self._icons_images:
+ x.set_xo_color(color)
+ x.show()
self.needs_restart = True
self._color_alert.props.msg = self.restart_msg
self._color_valid = True