Ticket #1592: two-axis-view.patch

File two-axis-view.patch, 9.2 KB (added by alsroot, 11 years ago)
  • extensions/cpsection/aboutme/view.py

    diff --git a/extensions/cpsection/aboutme/view.py b/extensions/cpsection/aboutme/view.py
    index cabd66a..4f22fab 100644
    a b from gettext import gettext as _ 
    2020
    2121from sugar.graphics.icon import Icon
    2222from sugar.graphics import style
    23 from sugar.graphics.xocolor import XoColor
     23from sugar.graphics import xocolor
    2424
    2525from jarabe.controlpanel.sectionview import SectionView
    2626from jarabe.controlpanel.inlinealert import InlineAlert
    2727
    28 class EventIcon(gtk.EventBox):
    29     __gtype_name__ = "SugarEventIcon"   
    30     def __init__(self, **kwargs):         
    31         gtk.EventBox.__init__(self)
     28_DIRECTION_TOP = 0
     29_DIRECTION_BOTTOM = 1
     30_DIRECTION_CENTER = 2
     31_DIRECTION_LEFT = 3
     32_DIRECTION_RIGHT = 4
    3233
    33         self.icon = Icon(pixel_size = style.XLARGE_ICON_SIZE, **kwargs)
    34        
    35         self.set_visible_window(False)
    36         self.set_app_paintable(True)
    37         self.set_events(gtk.gdk.BUTTON_PRESS_MASK)
     34class ColorPicker(gtk.EventBox):
    3835
    39         self.add(self.icon)
    40         self.icon.show()
     36    __gtype_name__ = "SugarEventIcon"
    4137
    42 class ColorPicker(EventIcon):
    4338    __gsignals__ = {
    4439        'color-changed': (gobject.SIGNAL_RUN_FIRST,
    4540                          gobject.TYPE_NONE,
    46                           ([str]))
     41                          ([int, int]))
    4742    }
    48     def __init__(self, xocolor=None):
    49         EventIcon.__init__(self)
    50         self.icon.props.xo_color = xocolor
    51         self.icon.props.icon_name = 'computer-xo'
    52         self.icon.props.pixel_size = style.XLARGE_ICON_SIZE
     43
     44    def __init__(self, direction):
     45        gtk.EventBox.__init__(self)
     46
     47        self._direction = direction
     48        self._icon = Icon(icon_name='computer-xo')
     49
     50        if direction == _DIRECTION_CENTER:
     51            self._icon.props.pixel_size = style.XLARGE_ICON_SIZE
     52        else:
     53            self._icon.props.pixel_size = style.STANDARD_ICON_SIZE
     54
     55        self.set_visible_window(False)
     56        self.set_app_paintable(True)
     57        self.set_events(gtk.gdk.BUTTON_PRESS_MASK)
     58
     59        self.add(self._icon)
     60        self._icon.show()
     61
    5362        self.connect('button_press_event', self.__pressed_cb)
    5463
     64    def update(self, stroke, fill):
     65        if self._direction == _DIRECTION_CENTER:
     66            arrow_stroke = stroke.value
     67            arrow_fill = fill.value
     68        elif self._direction == _DIRECTION_TOP:
     69            arrow_stroke = stroke.get_prev()
     70            arrow_fill = style.COLOR_WHITE.get_html()
     71        elif self._direction == _DIRECTION_BOTTOM:
     72            arrow_stroke = stroke.get_next()
     73            arrow_fill = style.COLOR_WHITE.get_html()
     74        elif self._direction == _DIRECTION_LEFT:
     75            arrow_stroke = style.COLOR_WHITE.get_html()
     76            arrow_fill = fill.get_prev()
     77        elif self._direction == _DIRECTION_RIGHT:
     78            arrow_stroke = style.COLOR_WHITE.get_html()
     79            arrow_fill = fill.get_next()
     80        self._icon.props.stroke_color = arrow_stroke
     81        self._icon.props.fill_color = arrow_fill
     82
    5583    def __pressed_cb(self, button, event):
    56         self._set_random_colors()
     84        if self._direction == _DIRECTION_CENTER:
     85            self.emit('color-changed', 0, 0)
     86        elif self._direction == _DIRECTION_TOP:
     87            self.emit('color-changed', -1, 0)
     88        elif self._direction == _DIRECTION_BOTTOM:
     89            self.emit('color-changed', +1, 0)
     90        elif self._direction == _DIRECTION_LEFT:
     91            self.emit('color-changed', 0, -1)
     92        elif self._direction == _DIRECTION_RIGHT:
     93            self.emit('color-changed', 0, +1)
    5794
    58     def _set_random_colors(self):
    59         xocolor = XoColor()
    60         self.icon.props.xo_color = xocolor
    61         self.emit('color-changed', xocolor.to_string())
    6295
    6396class AboutMe(SectionView):
    6497    def __init__(self, model, alerts):
    class AboutMe(SectionView): 
    69102        self._nick_sid = 0
    70103        self._color_valid = True
    71104        self._nick_valid = True
    72         self._color_change_handler = None
    73         self._nick_change_handler = None
     105        self._handlers = []
    74106
    75107        self.set_border_width(style.DEFAULT_SPACING * 2)
    76108        self.set_spacing(style.DEFAULT_SPACING)
    class AboutMe(SectionView): 
    84116
    85117        self._color_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
    86118        self._color_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
    87         self._color_picker = None
    88119        self._color_alert = None
    89         self._setup_color()       
    90120
     121        initial_color = xocolor.XoColor(self._model.get_color_xo())
     122        self._stroke_range = xocolor.StrokeColor(initial_color.stroke)
     123        self._fill_range = xocolor.FillColor(initial_color.fill)
     124
     125        self._pickers = {
     126                _DIRECTION_CENTER: ColorPicker(_DIRECTION_CENTER),
     127                _DIRECTION_TOP: ColorPicker(_DIRECTION_TOP),
     128                _DIRECTION_BOTTOM: ColorPicker(_DIRECTION_BOTTOM),
     129                _DIRECTION_LEFT: ColorPicker(_DIRECTION_LEFT),
     130                _DIRECTION_RIGHT: ColorPicker(_DIRECTION_RIGHT)}
     131
     132        self._setup_color()
     133        self._update_colors()
    91134        self.setup()
    92135
    93136    def _setup_nick(self):
    class AboutMe(SectionView): 
    130173                              style.COLOR_SELECTION_GREY.get_gdk_color())
    131174        self._group.add_widget(label_color)
    132175        self._color_box.pack_start(label_color, expand=False)
    133         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()
     176
     177        table = gtk.Table(3, 3, False)
     178        self._color_box.pack_start(table, expand=False)
     179        table.attach(self._pickers[_DIRECTION_LEFT],
     180                0, 1, 1, 2, gtk.SHRINK, gtk.SHRINK, 0, 0)
     181        table.attach(self._pickers[_DIRECTION_RIGHT],
     182                2, 3, 1, 2, gtk.SHRINK, gtk.SHRINK, 0, 0)
     183        table.attach(self._pickers[_DIRECTION_TOP],
     184                1, 2, 0, 1, gtk.SHRINK, gtk.SHRINK, 0, 0)
     185        table.attach(self._pickers[_DIRECTION_BOTTOM],
     186                1, 2, 2, 3, gtk.SHRINK, gtk.SHRINK, 0, 0)
     187        table.attach(self._pickers[_DIRECTION_CENTER],
     188                1, 2, 1, 2, gtk.SHRINK, gtk.SHRINK, 0, style.DEFAULT_SPACING)
    138189
    139190        label_color_error = gtk.Label()
    140191        self._group.add_widget(label_color_error)
    class AboutMe(SectionView): 
    149200
    150201        self.pack_start(self._color_box, False)
    151202        self.pack_start(self._color_alert_box, False)       
    152         self._color_box.show()
     203        self._color_box.show_all()
    153204        self._color_alert_box.show()
    154205   
    155206    def setup(self):
    156207        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 
    160208        self._color_valid = True
    161209        self._nick_valid = True
    162210        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)
     211
     212        def connect(widget, signal, cb):
     213            self._handlers.append((widget, widget.connect(signal, cb)))
     214
     215        connect(self._nick_entry, 'changed', self.__nick_changed_cb)
     216        for picker in self._pickers.values():
     217            connect(picker, 'color-changed', self.__color_changed_cb)
    167218
    168219    def undo(self):
    169         self._color_picker.disconnect(self._color_change_handler)
    170         self._nick_entry.disconnect(self._nick_change_handler)
     220        for widget, handler in self._handlers:
     221            widget.disconnect(handler)
    171222        self._model.undo()
    172223        self._nick_alert.hide()
    173224        self._color_alert.hide()       
    class AboutMe(SectionView): 
    178229        else:
    179230            self.props.is_valid = False
    180231
     232    def _update_colors(self):
     233        for picker in self._pickers.values():
     234            picker.update(self._stroke_range, self._fill_range)
     235
    181236    def __nick_changed_cb(self, widget, data=None):       
    182237        if self._nick_sid:
    183238            gobject.source_remove(self._nick_sid)
    class AboutMe(SectionView): 
    203258        self._nick_alert.show()
    204259        return False
    205260
    206     def __color_changed_cb(self, colorpicker, xocolor):       
    207         self._model.set_color_xo(xocolor)
     261    def __color_changed_cb(self, colorpicker, stroke_delta, fill_delta):
     262
     263        def next():
     264            if stroke_delta:
     265                self._stroke_range.next(stroke_delta)
     266            elif fill_delta:
     267                self._fill_range.next(fill_delta)
     268            else:
     269                self._stroke_range.value, self._fill_range.value = \
     270                        self._fill_range.value, self._stroke_range.value
     271
     272        next()
     273        while self._stroke_range.value == self._fill_range.value:
     274            next()
     275        self._update_colors()
     276
     277        color = xocolor.XoColor()
     278        color.stroke = self._stroke_range.value
     279        color.fill = self._fill_range.value
     280
     281        self._model.set_color_xo(color.to_string())
    208282        self.needs_restart = True
    209283        self._color_alert.props.msg = self.restart_msg
    210284        self._color_valid = True