[Sugar-devel] [PATCH] Add support for selecting new XO icon skin

Alan Jhonn Aguiar Schwyn alanjas at hotmail.com
Thu Jan 10 09:38:38 EST 2013


Good job!
Only one thing to remove:
+    else:+        pass
;-)

Date: Thu, 10 Jan 2013 10:19:49 -0200
From: ignacio at sugarlabs.org
To: sugar-devel at lists.sugarlabs.org
Subject: Re: [Sugar-devel] [PATCH] Add support for selecting new XO icon skin

I attached a couple of skins.
Please extract this file in ~/.sugar/Thx.Ignacio Rodríguez

2013/1/10 Ignacio Rodríguez <ignacio at sugarlabs.org>

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



---

 extensions/cpsection/aboutme/model.py |  18 +++++

 extensions/cpsection/aboutme/view.py  | 146 +++++++++++++++++++++++++++++++---

 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

--

1.7.11.7






_______________________________________________
Sugar-devel mailing list
Sugar-devel at lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20130110/ea021d57/attachment-0001.html>


More information about the Sugar-devel mailing list