Ticket #1592: 0001-moved-_get_next-prev-methods-from-xocolor.patch
File 0001-moved-_get_next-prev-methods-from-xocolor.patch, 14.7 KB (added by walter, 13 years ago) |
---|
-
extensions/cpsection/aboutme/view.py
From 34b370e36ab2b73161c2ed879c966c41dbdd32f6 Mon Sep 17 00:00:00 2001 From: Walter Bender <walter@sugarlabs.org> Date: Tue, 10 Aug 2010 10:17:37 -0400 Subject: [PATCH] moved _get_next/prev methods from xocolor --- extensions/cpsection/aboutme/view.py | 264 +++++++++++++++++++++++++--------- 1 files changed, 198 insertions(+), 66 deletions(-) diff --git a/extensions/cpsection/aboutme/view.py b/extensions/cpsection/aboutme/view.py index cabd66a..50aff4c 100644
a b 1 1 # Copyright (C) 2008, OLPC 2 # Copyright (C) 2010, Sugar Labs 2 3 # 3 4 # This program is free software; you can redistribute it and/or modify 4 5 # it under the terms of the GNU General Public License as published by … … from gettext import gettext as _ 20 21 21 22 from sugar.graphics.icon import Icon 22 23 from sugar.graphics import style 23 from sugar.graphics.xocolor import XoColor 24 from sugar.graphics.xocolor import XoColor, colors 24 25 25 26 from jarabe.controlpanel.sectionview import SectionView 26 27 from jarabe.controlpanel.inlinealert import InlineAlert 27 28 29 _STROKE_COLOR = 0 30 _FILL_COLOR = 1 31 32 33 def _get_next_stroke_color(color): 34 """ Return the next color pair in the list that shares the same fill 35 as color. """ 36 current_index = _get_index(color) 37 if current_index == -1: 38 return "%s,%s" % (color.stroke, color.fill) 39 next_index = _next_index(current_index) 40 while(colors[next_index][_FILL_COLOR] != \ 41 colors[current_index][_FILL_COLOR]): 42 next_index = _next_index(next_index) 43 return "%s,%s" % (colors[next_index][_STROKE_COLOR], 44 colors[next_index][_FILL_COLOR]) 45 46 47 def _get_prev_stroke_color(color): 48 """ Return the prev color pair in the list that shares the same fill 49 as color. """ 50 current_index = _get_index(color) 51 if current_index == -1: 52 return "%s,%s" % (color.stroke, color.fill) 53 prev_index = _prev_index(current_index) 54 while (colors[prev_index][_FILL_COLOR] != \ 55 colors[current_index][_FILL_COLOR]): 56 prev_index = _prev_index(prev_index) 57 return "%s,%s" % (colors[prev_index][_STROKE_COLOR], 58 colors[prev_index][_FILL_COLOR]) 59 60 61 def _get_next_fill_color(color): 62 """ Return the next color pair in the list that shares the same stroke 63 as color. """ 64 current_index = _get_index(color) 65 if current_index == -1: 66 return "%s,%s" % (color.stroke, color.fill) 67 next_index = _next_index(current_index) 68 while (colors[next_index][_STROKE_COLOR] != \ 69 colors[current_index][_STROKE_COLOR]): 70 next_index = _next_index(next_index) 71 return "%s,%s" % (colors[next_index][_STROKE_COLOR], 72 colors[next_index][_FILL_COLOR]) 73 74 75 def _get_prev_fill_color(color): 76 """ Return the prev color pair in the list that shares the same stroke 77 as color. """ 78 current_index = _get_index(color) 79 if current_index == -1: 80 return "%s,%s" % (color.stroke, color.fill) 81 prev_index = _prev_index(current_index) 82 while (colors[prev_index][_STROKE_COLOR] != \ 83 colors[current_index][_STROKE_COLOR]): 84 prev_index = _prev_index(prev_index) 85 return "%s,%s" % (colors[prev_index][_STROKE_COLOR], 86 colors[prev_index][_FILL_COLOR]) 87 88 89 def _next_index(current_index): 90 next_index = current_index + 1 91 if next_index == len(colors): 92 next_index = 0 93 return next_index 94 95 96 def _prev_index(current_index): 97 prev_index = current_index - 1 98 if prev_index < 0: 99 prev_index = len(colors)-1 100 return prev_index 101 102 103 def _get_index(color): 104 for index in range(0, len(colors)): 105 if colors[index] == [color.stroke, color.fill]: 106 return index 107 return -1 108 109 110 _PREV_FILL_COLOR = 0 111 _NEXT_FILL_COLOR = 1 112 _CURRENT_COLOR = 2 113 _NEXT_STROKE_COLOR = 3 114 _PREV_STROKE_COLOR = 4 115 116 28 117 class EventIcon(gtk.EventBox): 29 __gtype_name__ = "SugarEventIcon" 30 def __init__(self, **kwargs): 118 __gtype_name__ = "SugarEventIcon" 119 120 def __init__(self, **kwargs): 31 121 gtk.EventBox.__init__(self) 32 122 33 self.icon = Icon(pixel_size =style.XLARGE_ICON_SIZE, **kwargs)34 123 self.icon = Icon(pixel_size=style.XLARGE_ICON_SIZE, **kwargs) 124 35 125 self.set_visible_window(False) 36 126 self.set_app_paintable(True) 37 127 self.set_events(gtk.gdk.BUTTON_PRESS_MASK) … … class EventIcon(gtk.EventBox): 39 129 self.add(self.icon) 40 130 self.icon.show() 41 131 132 42 133 class ColorPicker(EventIcon): 43 134 __gsignals__ = { 44 135 'color-changed': (gobject.SIGNAL_RUN_FIRST, 45 136 gobject.TYPE_NONE, 46 ([str])) 47 } 48 def __init__(self, xocolor=None): 137 ([object])) 138 } 139 140 def __init__(self, picker): 49 141 EventIcon.__init__(self) 50 self.icon.props.xo_color = xocolor 142 51 143 self.icon.props.icon_name = 'computer-xo' 144 self._picker = picker 145 self._color = None 146 52 147 self.icon.props.pixel_size = style.XLARGE_ICON_SIZE 53 self.connect('button_press_event', self.__pressed_cb)54 148 55 def __pressed_cb(self, button, event): 56 self._set_random_colors() 149 self.connect('button_press_event', self.__pressed_cb, picker) 150 151 def update(self, color): 152 if self._picker == _PREV_FILL_COLOR: 153 self._color = XoColor(_get_prev_fill_color(color)) 154 elif self._picker == _PREV_STROKE_COLOR: 155 self._color = XoColor(_get_prev_stroke_color(color)) 156 elif self._picker == _NEXT_FILL_COLOR: 157 self._color = XoColor(_get_next_fill_color(color)) 158 elif self._picker == _NEXT_STROKE_COLOR: 159 self._color = XoColor(_get_next_stroke_color(color)) 160 else: 161 self._color = color 162 self.icon.props.xo_color = self._color 163 164 def __pressed_cb(self, button, event, picker): 165 if picker != _CURRENT_COLOR: 166 self.emit('color-changed', self._color) 57 167 58 def _set_random_colors(self):59 xocolor = XoColor()60 self.icon.props.xo_color = xocolor61 self.emit('color-changed', xocolor.to_string())62 168 63 169 class AboutMe(SectionView): 170 64 171 def __init__(self, model, alerts): 65 172 SectionView.__init__(self) 66 173 … … class AboutMe(SectionView): 69 176 self._nick_sid = 0 70 177 self._color_valid = True 71 178 self._nick_valid = True 72 self._color_change_handler = None 73 self._nick_change_handler = None 179 self._handlers = [] 74 180 75 181 self.set_border_width(style.DEFAULT_SPACING * 2) 76 182 self.set_spacing(style.DEFAULT_SPACING) 77 183 self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) 78 184 185 self._color_label = gtk.HBox(spacing=style.DEFAULT_SPACING) 186 self._color_box = gtk.HBox(spacing=style.DEFAULT_SPACING) 187 self._color_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) 188 self._color_alert = None 189 190 self._pickers = { 191 _PREV_FILL_COLOR: ColorPicker(_PREV_FILL_COLOR), 192 _NEXT_FILL_COLOR: ColorPicker(_NEXT_FILL_COLOR), 193 _CURRENT_COLOR: ColorPicker(_CURRENT_COLOR), 194 _NEXT_STROKE_COLOR: ColorPicker(_NEXT_STROKE_COLOR), 195 _PREV_STROKE_COLOR: ColorPicker(_PREV_STROKE_COLOR) 196 } 197 198 self._setup_color() 199 initial_color = XoColor(self._model.get_color_xo()) 200 self._update_pickers(initial_color) 201 79 202 self._nick_box = gtk.HBox(spacing=style.DEFAULT_SPACING) 80 203 self._nick_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) 81 204 self._nick_entry = None 82 205 self._nick_alert = None 83 206 self._setup_nick() 84 85 self._color_box = gtk.HBox(spacing=style.DEFAULT_SPACING)86 self._color_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)87 self._color_picker = None88 self._color_alert = None89 self._setup_color()90 91 207 self.setup() 92 208 93 209 def _setup_nick(self): 94 label_entry = gtk.Label(_('Name:')) 95 label_entry.modify_fg(gtk.STATE_NORMAL, 96 style.COLOR_SELECTION_GREY.get_gdk_color()) 97 self._group.add_widget(label_entry) 98 label_entry.set_alignment(1, 0.5) 99 self._nick_box.pack_start(label_entry, expand=False) 100 label_entry.show() 101 102 self._nick_entry = gtk.Entry() 103 self._nick_entry.modify_bg(gtk.STATE_INSENSITIVE, 210 self._nick_entry = gtk.Entry() 211 self._nick_entry.modify_bg(gtk.STATE_INSENSITIVE, 104 212 style.COLOR_WHITE.get_gdk_color()) 105 self._nick_entry.modify_base(gtk.STATE_INSENSITIVE, 213 self._nick_entry.modify_base(gtk.STATE_INSENSITIVE, 106 214 style.COLOR_WHITE.get_gdk_color()) 107 215 self._nick_entry.set_width_chars(25) 108 216 self._nick_box.pack_start(self._nick_entry, expand=False) 109 self._nick_entry.show() 217 self._nick_entry.show() 110 218 111 219 label_entry_error = gtk.Label() 112 220 self._group.add_widget(label_entry_error) … … class AboutMe(SectionView): 119 227 self._nick_alert.props.msg = self.restart_msg 120 228 self._nick_alert.show() 121 229 122 self.pack_start(self._nick_box, False) 230 self._center_in_panel = gtk.Alignment(0.5) 231 self._center_in_panel.add(self._nick_box) 232 self.pack_start(self._center_in_panel, False) 123 233 self.pack_start(self._nick_alert_box, False) 124 234 self._nick_box.show() 125 235 self._nick_alert_box.show() 126 127 def _setup_color(self): 236 self._center_in_panel.show() 237 238 def _setup_color(self): 128 239 label_color = gtk.Label(_('Click to change your color:')) 129 label_color.modify_fg(gtk.STATE_NORMAL, 240 label_color.modify_fg(gtk.STATE_NORMAL, 130 241 style.COLOR_SELECTION_GREY.get_gdk_color()) 131 242 self._group.add_widget(label_color) 132 self._color_ box.pack_start(label_color, expand=False)243 self._color_label.pack_start(label_color, expand=False) 133 244 label_color.show() 134 135 self._color_picker = ColorPicker() 136 self._color_box.pack_start(self._color_picker, expand=False) 137 self._color_picker.show() 245 246 for p in sorted(self._pickers.keys()): 247 if p == _CURRENT_COLOR: 248 left_separator = gtk.SeparatorToolItem() 249 left_separator.show() 250 self._color_box.pack_start(left_separator, expand=False) 251 252 picker = self._pickers[p] 253 picker.show() 254 self._color_box.pack_start(picker, expand=False) 255 256 if p == _CURRENT_COLOR: 257 right_separator = gtk.SeparatorToolItem() 258 right_separator.show() 259 self._color_box.pack_start(right_separator, expand=False) 138 260 139 261 label_color_error = gtk.Label() 140 262 self._group.add_widget(label_color_error) … … class AboutMe(SectionView): 147 269 self._color_alert.props.msg = self.restart_msg 148 270 self._color_alert.show() 149 271 150 self.pack_start(self._color_box, False) 151 self.pack_start(self._color_alert_box, False) 272 self._center_in_panel = gtk.Alignment(0.5) 273 self._center_in_panel.add(self._color_box) 274 self.pack_start(self._color_label, False) 275 self.pack_start(self._center_in_panel, False) 276 self.pack_start(self._color_alert_box, False) 277 self._color_label.show() 152 278 self._color_box.show() 153 279 self._color_alert_box.show() 154 280 self._center_in_panel.show() 281 155 282 def setup(self): 156 283 self._nick_entry.set_text(self._model.get_nick()) 157 color = XoColor(self._model.get_color_xo())158 self._color_picker.icon.props.xo_color = color159 160 284 self._color_valid = True 161 285 self._nick_valid = True 162 286 self.needs_restart = False 163 self._nick_change_handler = self._nick_entry.connect( \ 164 'changed', self.__nick_changed_cb) 165 self._color_change_handler = self._color_picker.connect( \ 166 'color-changed', self.__color_changed_cb) 287 288 def connect(widget, signal, cb): 289 self._handlers.append((widget, widget.connect(signal, cb))) 290 291 connect(self._nick_entry, 'changed', self.__nick_changed_cb) 292 for picker in self._pickers.values(): 293 connect(picker, 'color-changed', self.__color_changed_cb) 167 294 168 295 def undo(self): 169 self._color_picker.disconnect(self._color_change_handler)170 self._nick_entry.disconnect(self._nick_change_handler)171 296 self._model.undo() 172 297 self._nick_alert.hide() 173 self._color_alert.hide() 298 self._color_alert.hide() 299 300 def _update_pickers(self, color): 301 for picker in self._pickers.values(): 302 picker.update(color) 174 303 175 304 def _validate(self): 176 305 if self._nick_valid and self._color_valid: … … class AboutMe(SectionView): 178 307 else: 179 308 self.props.is_valid = False 180 309 181 def __nick_changed_cb(self, widget, data=None): 310 def __nick_changed_cb(self, widget, data=None): 182 311 if self._nick_sid: 183 312 gobject.source_remove(self._nick_sid) 184 self._nick_sid = gobject.timeout_add(self._APPLY_TIMEOUT, 313 self._nick_sid = gobject.timeout_add(self._APPLY_TIMEOUT, 185 314 self.__nick_timeout_cb, widget) 186 315 187 def __nick_timeout_cb(self, widget): 316 def __nick_timeout_cb(self, widget): 188 317 self._nick_sid = 0 189 318 190 319 if widget.get_text() == self._model.get_nick(): … … class AboutMe(SectionView): 193 322 self._model.set_nick(widget.get_text()) 194 323 except ValueError, detail: 195 324 self._nick_alert.props.msg = detail 196 self._nick_valid = False 325 self._nick_valid = False 197 326 else: 198 327 self._nick_alert.props.msg = self.restart_msg 199 self._nick_valid = True 328 self._nick_valid = True 200 329 self.needs_restart = True 201 330 self.restart_alerts.append('nick') 202 331 self._validate() 203 332 self._nick_alert.show() 204 333 return False 205 334 206 def __color_changed_cb(self, colorpicker, xocolor):207 self._model.set_color_xo( xocolor)335 def __color_changed_cb(self, colorpicker, color): 336 self._model.set_color_xo(color.to_string()) 208 337 self.needs_restart = True 209 338 self._color_alert.props.msg = self.restart_msg 210 339 self._color_valid = True … … class AboutMe(SectionView): 212 341 213 342 self._validate() 214 343 self._color_alert.show() 344 345 self._update_pickers(color) 346 215 347 return False