Ticket #1592: 0001-new-color-selector-for-cpsection.patch

File 0001-new-color-selector-for-cpsection.patch, 11.7 KB (added by walter, 11 years ago)

latest version of cpsection/aboutme/view.py

  • extensions/cpsection/aboutme/view.py

    From 31e9281e8c3439462ed58ec53558b1c47f74c471 Mon Sep 17 00:00:00 2001
    From: Walter Bender <walter@sugarlabs.org>
    Date: Tue, 20 Jul 2010 14:50:47 -0400
    Subject: [PATCH] new color selector for cpsection
    
    ---
     extensions/cpsection/aboutme/view.py |  182 ++++++++++++++++++++++------------
     1 files changed, 117 insertions(+), 65 deletions(-)
    
    diff --git a/extensions/cpsection/aboutme/view.py b/extensions/cpsection/aboutme/view.py
    index cabd66a..caf6d29 100644
    a b from sugar.graphics.xocolor import XoColor 
    2525from jarabe.controlpanel.sectionview import SectionView
    2626from jarabe.controlpanel.inlinealert import InlineAlert
    2727
     28_DIRECTION_LEFT = 0
     29_DIRECTION_TOP = 1
     30_DIRECTION_CENTER = 2
     31_DIRECTION_BOTTOM = 3
     32_DIRECTION_RIGHT = 4
     33
     34
    2835class EventIcon(gtk.EventBox):
    29     __gtype_name__ = "SugarEventIcon"   
    30     def __init__(self, **kwargs):         
     36    __gtype_name__ = "SugarEventIcon"
     37
     38    def __init__(self, **kwargs):
    3139        gtk.EventBox.__init__(self)
    3240
    33         self.icon = Icon(pixel_size = style.XLARGE_ICON_SIZE, **kwargs)
    34        
     41        self.icon = Icon(pixel_size=style.XLARGE_ICON_SIZE, **kwargs)
     42
    3543        self.set_visible_window(False)
    3644        self.set_app_paintable(True)
    3745        self.set_events(gtk.gdk.BUTTON_PRESS_MASK)
    class EventIcon(gtk.EventBox): 
    3947        self.add(self.icon)
    4048        self.icon.show()
    4149
     50
    4251class ColorPicker(EventIcon):
    4352    __gsignals__ = {
    4453        'color-changed': (gobject.SIGNAL_RUN_FIRST,
    4554                          gobject.TYPE_NONE,
    46                           ([str]))
    47     }
    48     def __init__(self, xocolor=None):
     55                          ([object]))
     56        }
     57
     58    def __init__(self, direction):
    4959        EventIcon.__init__(self)
    50         self.icon.props.xo_color = xocolor
     60
    5161        self.icon.props.icon_name = 'computer-xo'
     62        self._direction = direction
     63        self._color = None
     64
    5265        self.icon.props.pixel_size = style.XLARGE_ICON_SIZE
    53         self.connect('button_press_event', self.__pressed_cb)
    5466
    55     def __pressed_cb(self, button, event):
    56         self._set_random_colors()
     67        self.connect('button_press_event', self.__pressed_cb, direction)
     68
     69    def update(self, color):
     70        if self._direction == _DIRECTION_CENTER:
     71            self._color = color
     72        elif self._direction == _DIRECTION_LEFT:
     73            self._color = XoColor(color.get_prev_fill_color())
     74        elif self._direction == _DIRECTION_RIGHT:
     75            self._color = XoColor(color.get_prev_stroke_color())
     76        elif self._direction == _DIRECTION_TOP:
     77            self._color = XoColor(color.get_next_fill_color())
     78        else:
     79            self._color = XoColor(color.get_next_stroke_color())
     80        self.icon.props.xo_color = self._color
     81
     82    def __pressed_cb(self, button, event, direction):
     83        if direction != _DIRECTION_CENTER:
     84            self.emit('color-changed', self._color)
    5785
    58     def _set_random_colors(self):
    59         xocolor = XoColor()
    60         self.icon.props.xo_color = xocolor
    61         self.emit('color-changed', xocolor.to_string())
    6286
    6387class AboutMe(SectionView):
     88
    6489    def __init__(self, model, alerts):
    6590        SectionView.__init__(self)
    6691
    class AboutMe(SectionView): 
    6994        self._nick_sid = 0
    7095        self._color_valid = True
    7196        self._nick_valid = True
    72         self._color_change_handler = None
    73         self._nick_change_handler = None
     97        self._handlers = []
    7498
    7599        self.set_border_width(style.DEFAULT_SPACING * 2)
    76100        self.set_spacing(style.DEFAULT_SPACING)
    77101        self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
    78102
     103        self._color_label = gtk.HBox(spacing=style.DEFAULT_SPACING)
     104        self._color_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
     105        self._color_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
     106        self._color_alert = None
     107
     108        self._pickers = {
     109                _DIRECTION_CENTER: ColorPicker(_DIRECTION_CENTER),
     110                _DIRECTION_LEFT: ColorPicker(_DIRECTION_LEFT),
     111                _DIRECTION_RIGHT: ColorPicker(_DIRECTION_RIGHT),
     112                _DIRECTION_TOP: ColorPicker(_DIRECTION_TOP),
     113                _DIRECTION_BOTTOM: ColorPicker(_DIRECTION_BOTTOM)
     114                }
     115
     116        self._setup_color()
     117        initial_color = XoColor(self._model.get_color_xo())
     118        self._update_pickers(initial_color)
     119
    79120        self._nick_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
    80121        self._nick_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
    81122        self._nick_entry = None
    82123        self._nick_alert = None
    83124        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 
    91125        self.setup()
    92126
    93127    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,
     128        self._nick_entry = gtk.Entry()
     129        self._nick_entry.modify_bg(gtk.STATE_INSENSITIVE,
    104130                                   style.COLOR_WHITE.get_gdk_color())
    105         self._nick_entry.modify_base(gtk.STATE_INSENSITIVE, 
     131        self._nick_entry.modify_base(gtk.STATE_INSENSITIVE,
    106132                                     style.COLOR_WHITE.get_gdk_color())
    107133        self._nick_entry.set_width_chars(25)
    108134        self._nick_box.pack_start(self._nick_entry, expand=False)
    109         self._nick_entry.show()       
     135        self._nick_entry.show()
    110136
    111137        label_entry_error = gtk.Label()
    112138        self._group.add_widget(label_entry_error)
    class AboutMe(SectionView): 
    119145            self._nick_alert.props.msg = self.restart_msg
    120146            self._nick_alert.show()
    121147
    122         self.pack_start(self._nick_box, False)
     148        self._center_in_panel = gtk.Alignment(0.5)
     149        self._center_in_panel.add(self._nick_box)
     150        self.pack_start(self._center_in_panel, False)
    123151        self.pack_start(self._nick_alert_box, False)
    124152        self._nick_box.show()
    125153        self._nick_alert_box.show()
    126    
    127     def _setup_color(self):               
     154        self._center_in_panel.show()
     155
     156    def _setup_color(self):
    128157        label_color = gtk.Label(_('Click to change your color:'))
    129         label_color.modify_fg(gtk.STATE_NORMAL, 
     158        label_color.modify_fg(gtk.STATE_NORMAL,
    130159                              style.COLOR_SELECTION_GREY.get_gdk_color())
    131160        self._group.add_widget(label_color)
    132         self._color_box.pack_start(label_color, expand=False)
     161        self._color_label.pack_start(label_color, expand=False)
    133162        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()
     163
     164        for direction in sorted(self._pickers.keys()):
     165            if direction == _DIRECTION_CENTER:
     166                left_separator = gtk.SeparatorToolItem()
     167                left_separator.show()
     168                self._color_box.pack_start(left_separator, expand=False)
     169
     170            picker = self._pickers[direction]
     171            picker.show()
     172            self._color_box.pack_start(picker, expand=False)
     173
     174            if direction == _DIRECTION_CENTER:
     175                right_separator = gtk.SeparatorToolItem()
     176                right_separator.show()
     177                self._color_box.pack_start(right_separator, expand=False)
    138178
    139179        label_color_error = gtk.Label()
    140180        self._group.add_widget(label_color_error)
    class AboutMe(SectionView): 
    147187            self._color_alert.props.msg = self.restart_msg
    148188            self._color_alert.show()
    149189
    150         self.pack_start(self._color_box, False)
    151         self.pack_start(self._color_alert_box, False)       
     190        self._center_in_panel = gtk.Alignment(0.5)
     191        self._center_in_panel.add(self._color_box)
     192        self.pack_start(self._color_label, False)
     193        self.pack_start(self._center_in_panel, False)
     194        self.pack_start(self._color_alert_box, False)
     195        self._color_label.show()
    152196        self._color_box.show()
    153197        self._color_alert_box.show()
    154    
     198        self._center_in_panel.show()
     199
    155200    def setup(self):
    156201        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 
    160202        self._color_valid = True
    161203        self._nick_valid = True
    162204        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)
     205
     206        def connect(widget, signal, cb):
     207            self._handlers.append((widget, widget.connect(signal, cb)))
     208
     209        connect(self._nick_entry, 'changed', self.__nick_changed_cb)
     210        for picker in self._pickers.values():
     211            connect(picker, 'color-changed', self.__color_changed_cb)
    167212
    168213    def undo(self):
    169         self._color_picker.disconnect(self._color_change_handler)
    170         self._nick_entry.disconnect(self._nick_change_handler)
     214        for widget, handler in self._handlers:
     215            widget.disconnect(handler)
    171216        self._model.undo()
    172217        self._nick_alert.hide()
    173         self._color_alert.hide()       
     218        self._color_alert.hide()
     219
     220    def _update_pickers(self, color):
     221        for picker in self._pickers.values():
     222            picker.update(color)
    174223
    175224    def _validate(self):
    176225        if self._nick_valid and self._color_valid:
    class AboutMe(SectionView): 
    178227        else:
    179228            self.props.is_valid = False
    180229
    181     def __nick_changed_cb(self, widget, data=None):       
     230    def __nick_changed_cb(self, widget, data=None):
    182231        if self._nick_sid:
    183232            gobject.source_remove(self._nick_sid)
    184         self._nick_sid = gobject.timeout_add(self._APPLY_TIMEOUT, 
     233        self._nick_sid = gobject.timeout_add(self._APPLY_TIMEOUT,
    185234                                             self.__nick_timeout_cb, widget)
    186235
    187     def __nick_timeout_cb(self, widget):       
     236    def __nick_timeout_cb(self, widget):
    188237        self._nick_sid = 0
    189238
    190239        if widget.get_text() == self._model.get_nick():
    class AboutMe(SectionView): 
    193242            self._model.set_nick(widget.get_text())
    194243        except ValueError, detail:
    195244            self._nick_alert.props.msg = detail
    196             self._nick_valid = False           
     245            self._nick_valid = False
    197246        else:
    198247            self._nick_alert.props.msg = self.restart_msg
    199             self._nick_valid = True 
     248            self._nick_valid = True
    200249            self.needs_restart = True
    201250            self.restart_alerts.append('nick')
    202251        self._validate()
    203252        self._nick_alert.show()
    204253        return False
    205254
    206     def __color_changed_cb(self, colorpicker, xocolor):       
    207         self._model.set_color_xo(xocolor)
     255    def __color_changed_cb(self, colorpicker, color):
     256        self._model.set_color_xo(color.to_string())
    208257        self.needs_restart = True
    209258        self._color_alert.props.msg = self.restart_msg
    210259        self._color_valid = True
    class AboutMe(SectionView): 
    212261
    213262        self._validate()
    214263        self._color_alert.show()
     264
     265        self._update_pickers(color)
     266
    215267        return False