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, 11 years ago)

cleaned up patch

  • 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  
    11# Copyright (C) 2008, OLPC
     2# Copyright (C) 2010, Sugar Labs
    23#
    34# This program is free software; you can redistribute it and/or modify
    45# it under the terms of the GNU General Public License as published by
    from gettext import gettext as _ 
    2021
    2122from sugar.graphics.icon import Icon
    2223from sugar.graphics import style
    23 from sugar.graphics.xocolor import XoColor
     24from sugar.graphics.xocolor import XoColor, colors
    2425
    2526from jarabe.controlpanel.sectionview import SectionView
    2627from jarabe.controlpanel.inlinealert import InlineAlert
    2728
     29_STROKE_COLOR = 0
     30_FILL_COLOR = 1
     31
     32
     33def _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
     47def _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
     61def _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
     75def _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
     89def _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
     96def _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
     103def _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
    28117class EventIcon(gtk.EventBox):
    29     __gtype_name__ = "SugarEventIcon"   
    30     def __init__(self, **kwargs):         
     118    __gtype_name__ = "SugarEventIcon"
     119
     120    def __init__(self, **kwargs):
    31121        gtk.EventBox.__init__(self)
    32122
    33         self.icon = Icon(pixel_size = style.XLARGE_ICON_SIZE, **kwargs)
    34        
     123        self.icon = Icon(pixel_size=style.XLARGE_ICON_SIZE, **kwargs)
     124
    35125        self.set_visible_window(False)
    36126        self.set_app_paintable(True)
    37127        self.set_events(gtk.gdk.BUTTON_PRESS_MASK)
    class EventIcon(gtk.EventBox): 
    39129        self.add(self.icon)
    40130        self.icon.show()
    41131
     132
    42133class ColorPicker(EventIcon):
    43134    __gsignals__ = {
    44135        'color-changed': (gobject.SIGNAL_RUN_FIRST,
    45136                          gobject.TYPE_NONE,
    46                           ([str]))
    47     }
    48     def __init__(self, xocolor=None):
     137                          ([object]))
     138        }
     139
     140    def __init__(self, picker):
    49141        EventIcon.__init__(self)
    50         self.icon.props.xo_color = xocolor
     142
    51143        self.icon.props.icon_name = 'computer-xo'
     144        self._picker = picker
     145        self._color = None
     146
    52147        self.icon.props.pixel_size = style.XLARGE_ICON_SIZE
    53         self.connect('button_press_event', self.__pressed_cb)
    54148
    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)
    57167
    58     def _set_random_colors(self):
    59         xocolor = XoColor()
    60         self.icon.props.xo_color = xocolor
    61         self.emit('color-changed', xocolor.to_string())
    62168
    63169class AboutMe(SectionView):
     170
    64171    def __init__(self, model, alerts):
    65172        SectionView.__init__(self)
    66173
    class AboutMe(SectionView): 
    69176        self._nick_sid = 0
    70177        self._color_valid = True
    71178        self._nick_valid = True
    72         self._color_change_handler = None
    73         self._nick_change_handler = None
     179        self._handlers = []
    74180
    75181        self.set_border_width(style.DEFAULT_SPACING * 2)
    76182        self.set_spacing(style.DEFAULT_SPACING)
    77183        self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
    78184
     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
    79202        self._nick_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
    80203        self._nick_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
    81204        self._nick_entry = None
    82205        self._nick_alert = None
    83206        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 = None
    88         self._color_alert = None
    89         self._setup_color()       
    90 
    91207        self.setup()
    92208
    93209    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,
    104212                                   style.COLOR_WHITE.get_gdk_color())
    105         self._nick_entry.modify_base(gtk.STATE_INSENSITIVE, 
     213        self._nick_entry.modify_base(gtk.STATE_INSENSITIVE,
    106214                                     style.COLOR_WHITE.get_gdk_color())
    107215        self._nick_entry.set_width_chars(25)
    108216        self._nick_box.pack_start(self._nick_entry, expand=False)
    109         self._nick_entry.show()       
     217        self._nick_entry.show()
    110218
    111219        label_entry_error = gtk.Label()
    112220        self._group.add_widget(label_entry_error)
    class AboutMe(SectionView): 
    119227            self._nick_alert.props.msg = self.restart_msg
    120228            self._nick_alert.show()
    121229
    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)
    123233        self.pack_start(self._nick_alert_box, False)
    124234        self._nick_box.show()
    125235        self._nick_alert_box.show()
    126    
    127     def _setup_color(self):               
     236        self._center_in_panel.show()
     237
     238    def _setup_color(self):
    128239        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,
    130241                              style.COLOR_SELECTION_GREY.get_gdk_color())
    131242        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)
    133244        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)
    138260
    139261        label_color_error = gtk.Label()
    140262        self._group.add_widget(label_color_error)
    class AboutMe(SectionView): 
    147269            self._color_alert.props.msg = self.restart_msg
    148270            self._color_alert.show()
    149271
    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()
    152278        self._color_box.show()
    153279        self._color_alert_box.show()
    154    
     280        self._center_in_panel.show()
     281
    155282    def setup(self):
    156283        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 = color
    159 
    160284        self._color_valid = True
    161285        self._nick_valid = True
    162286        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)
    167294
    168295    def undo(self):
    169         self._color_picker.disconnect(self._color_change_handler)
    170         self._nick_entry.disconnect(self._nick_change_handler)
    171296        self._model.undo()
    172297        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)
    174303
    175304    def _validate(self):
    176305        if self._nick_valid and self._color_valid:
    class AboutMe(SectionView): 
    178307        else:
    179308            self.props.is_valid = False
    180309
    181     def __nick_changed_cb(self, widget, data=None):       
     310    def __nick_changed_cb(self, widget, data=None):
    182311        if self._nick_sid:
    183312            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,
    185314                                             self.__nick_timeout_cb, widget)
    186315
    187     def __nick_timeout_cb(self, widget):       
     316    def __nick_timeout_cb(self, widget):
    188317        self._nick_sid = 0
    189318
    190319        if widget.get_text() == self._model.get_nick():
    class AboutMe(SectionView): 
    193322            self._model.set_nick(widget.get_text())
    194323        except ValueError, detail:
    195324            self._nick_alert.props.msg = detail
    196             self._nick_valid = False           
     325            self._nick_valid = False
    197326        else:
    198327            self._nick_alert.props.msg = self.restart_msg
    199             self._nick_valid = True 
     328            self._nick_valid = True
    200329            self.needs_restart = True
    201330            self.restart_alerts.append('nick')
    202331        self._validate()
    203332        self._nick_alert.show()
    204333        return False
    205334
    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())
    208337        self.needs_restart = True
    209338        self._color_alert.props.msg = self.restart_msg
    210339        self._color_valid = True
    class AboutMe(SectionView): 
    212341
    213342        self._validate()
    214343        self._color_alert.show()
     344
     345        self._update_pickers(color)
     346
    215347        return False