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