[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