diff options
Diffstat (limited to 'src/view/pulsingicon.py')
-rw-r--r-- | src/view/pulsingicon.py | 178 |
1 files changed, 126 insertions, 52 deletions
diff --git a/src/view/pulsingicon.py b/src/view/pulsingicon.py index 9e7b3d9..b937816 100644 --- a/src/view/pulsingicon.py +++ b/src/view/pulsingicon.py @@ -1,4 +1,4 @@ -# Copyright (C) 2006-2007 Red Hat, Inc. +# Copyright (C) 2008 One Laptop Per Child # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -15,76 +15,150 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject +import math from sugar.graphics.icon import CanvasIcon +from sugar.graphics.style import Color +from sugar.graphics.xocolor import XoColor + +class CanvasPulsingIcon(CanvasIcon): + __gtype_name__ = 'SugarCanvasPulsingIcon' + + _INTERVAL = 100 + _STEP = math.pi / 10 # must be a fraction of pi, for clean caching -class PulsingIcon(CanvasIcon): __gproperties__ = { - 'paused' : (bool, None, None, False, - gobject.PARAM_READWRITE), - 'colors' : (object, None, None, - gobject.PARAM_READWRITE), - 'pulse-time' : (float, None, None, - 0.0, 500.0, 0.0, - gobject.PARAM_READWRITE), + 'base-color' : (object, None, None, gobject.PARAM_READWRITE), + 'pulse-color' : (object, None, None, gobject.PARAM_READWRITE), + 'pulsing' : (bool, None, None, False, gobject.PARAM_READWRITE), + 'paused' : (bool, None, None, False, gobject.PARAM_READWRITE) } def __init__(self, **kwargs): + self._base_color = None + self._pulse_color = None + self._pulse_hid = None self._paused = False - self._pulse_time = 0.0 - self._colors = None - self._pulse_sid = 0 - self._pos = 0 + self._pulsing = False + self._level = 0 + self._phase = 0 CanvasIcon.__init__(self, **kwargs) + def _start_pulsing(self, restart=False): + if restart: + self._phase = 0 + self._pulse_hid = gobject.timeout_add(self._INTERVAL, self.__pulse_cb) + + def _stop_pulsing(self): + if self._pulse_hid is not None: + gobject.source_remove(self._pulse_hid) + self._pulse_hid = None + self.props.xo_color = self._base_color + + def _get_color(self, orig_color, target_color): + next_point = (orig_color[0] + self._level * (target_color[0] - orig_color[0]), + orig_color[1] + self._level * (target_color[1] - orig_color[1]), + orig_color[2] + self._level * (target_color[2] - orig_color[2])) + return Color('#%02x%02x%02x' % (int(next_point[0] * 255), + int(next_point[1] * 255), + int(next_point[2] * 255))) + + def __pulse_cb(self): + self._phase += self._STEP + self._level = (math.sin(self._phase) + 1) / 2 + self._update_colors() + + return True + + def _get_as_rgba(self, html_color): + if html_color == 'none': + return Color('#FFFFFF', alpha=1.0).get_rgba() + else: + return Color(html_color).get_rgba() + + def _update_colors(self): + if self._pulsing: + base_stroke = self._get_as_rgba(self._base_color.get_stroke_color()) + pulse_stroke = self._get_as_rgba(self._pulse_color.get_stroke_color()) + base_fill = self._get_as_rgba(self._base_color.get_fill_color()) + pulse_fill = self._get_as_rgba(self._pulse_color.get_fill_color()) + + self.props.stroke_color = \ + self._get_color(base_stroke, pulse_stroke).get_svg() + self.props.fill_color = \ + self._get_color(base_fill, pulse_fill).get_svg() + else: + self.props.xo_color = self._base_color + def do_set_property(self, pspec, value): - CanvasIcon.do_set_property(self, pspec, value) - - if pspec.name == 'pulse-time': - self._pulse_time = value - self._stop() - if not self._paused and self._pulse_time > 0.0: - self._start() - elif pspec.name == 'colors': - self._colors = value - self._pos = 0 - self._update_colors() + if pspec.name == 'base-color': + if self._base_color != value: + self._base_color = value + self._update_colors() + elif pspec.name == 'pulse-color': + if self._pulse_color != value: + self._pulse_color = value + self._update_colors() + elif pspec.name == 'pulsing': + if self._pulsing != value: + self._pulsing = value + if self._pulsing: + self._start_pulsing(restart=True) + else: + self._stop_pulsing() elif pspec.name == 'paused': - self._paused = value - if not self._paused and self._pulse_time > 0.0: - self._start() - else: - self._stop() + if self._paused != value: + self._paused = value + if self._paused: + self._stop_pulsing() + else: + self._start_pulsing(restart=False) + else: + CanvasIcon.do_set_property(self, pspec, value) def do_get_property(self, pspec): - CanvasIcon.do_get_property(self, pspec) + if pspec.name == 'base-color': + return self._base_color + elif pspec.name == 'pulse-color': + return self._pulse_color + elif pspec.name == 'pulsing': + return self._pulsing + elif pspec.name == 'paused': + return self._paused + else: + return CanvasIcon.do_get_property(self, pspec) - if pspec.name == 'pulse-time': - return self._pulse_time - elif pspec.name == 'colors': - return self._colors + """ + def set_base_color(self, base_color): + self._base_color = base_color - def _update_colors(self): - self.props.stroke_color = self._colors[self._pos][0] - self.props.fill_color = self._colors[self._pos][1] + def get_base_color(self): + return self._base_color + base_color = gobject.property(type=object, setter=set_base_color, + getter=get_base_color) - def _pulse_timeout(self): - if self._colors: - self._update_colors() + def set_pulse_color(self, pulse_color): + self._pulse_color = pulse_color - self._pos += 1 - if self._pos == len(self._colors): - self._pos = 0 + def get_pulse_color(self): + return self._pulse_color + pulse_color = gobject.property(type=object, setter=set_pulse_color, + getter=get_pulse_color) - return True + def set_pulsing(self, pulsing): + pass + + def get_pulsing(self): + return self._pulse_hid != None + pulsing = gobject.property(type=bool, default=False, setter=set_pulsing, + getter=get_pulsing) - def _start(self): - if self._pulse_sid == 0: - self._pulse_sid = gobject.timeout_add( - int(self._pulse_time * 1000), self._pulse_timeout) + def set_paused(self, paused): + self._paused = paused - def _stop(self): - if self._pulse_sid: - gobject.source_remove(self._pulse_sid) - self._pulse_sid = 0 + def get_paused(self): + return self._paused + paused = gobject.property(type=bool, default=False, setter=set_paused, + getter=get_paused) + """ |