diff options
author | Ignacio 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) |
commit | d77d304fc94bd96a1ba18eddff93903ef568bc07 (patch) | |
tree | d15ec67a0fc1228ea3b433a443704f30604da76b | |
parent | ede9f3bc56372bddcd02be8bac0cf5b9d1a6dc17 (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.py | 18 | ||||
-rw-r--r-- | 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 |