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

Ignacio Rodríguez ignacio at sugarlabs.org
Thu Jan 10 07:19:49 EST 2013


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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20130110/925fe77c/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: XoSkins.zip
Type: application/zip
Size: 86052 bytes
Desc: not available
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20130110/925fe77c/attachment-0001.zip>


More information about the Sugar-devel mailing list