diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-04-02 10:44:59 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2008-04-02 12:44:34 (GMT) |
commit | 0162e14a1cf8e109d142ccfbd56a0f17267665c6 (patch) | |
tree | 7764bef32dc8a13f11cc9443f4387f0d64420e49 /src | |
parent | e79aea7e6bb84d5a24c2566592fa17693e042c4b (diff) |
Add PulsingIcon and use it in the frame
Diffstat (limited to 'src')
-rw-r--r-- | src/view/frame/activitiestray.py | 28 | ||||
-rw-r--r-- | src/view/pulsingicon.py | 156 |
2 files changed, 144 insertions, 40 deletions
diff --git a/src/view/frame/activitiestray.py b/src/view/frame/activitiestray.py index e2a40cc..03d1e81 100644 --- a/src/view/frame/activitiestray.py +++ b/src/view/frame/activitiestray.py @@ -21,10 +21,11 @@ import gtk from sugar.graphics import style from sugar.graphics.tray import HTray +from sugar.graphics.xocolor import XoColor from sugar.graphics.radiotoolbutton import RadioToolButton -from sugar.graphics.icon import Icon from view.palettes import JournalPalette, CurrentActivityPalette +from view.pulsingicon import PulsingIcon from view.frame.frameinvoker import FrameWidgetInvoker class ActivityButton(RadioToolButton): @@ -33,13 +34,17 @@ class ActivityButton(RadioToolButton): self._home_activity = home_activity - icon = Icon(xo_color=home_activity.get_icon_color()) + self._icon = PulsingIcon() + self._icon.props.base_color = home_activity.get_icon_color() + self._icon.props.pulse_color = \ + XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(), + style.COLOR_TRANSPARENT.get_svg())) if home_activity.get_icon_path(): - icon.props.file = home_activity.get_icon_path() + self._icon.props.file = home_activity.get_icon_path() else: - icon.props.icon_name = 'image-missing' - self.set_icon_widget(icon) - icon.show() + self._icon.props.icon_name = 'image-missing' + self.set_icon_widget(self._icon) + self._icon.show() if self._home_activity.get_type() == "org.laptop.JournalActivity": palette = JournalPalette(self, self._home_activity) @@ -49,6 +54,17 @@ class ActivityButton(RadioToolButton): palette.set_group_id('frame') self.set_palette(palette) + if home_activity.props.launching: + self._icon.props.pulsing = True + self._notify_launching_hid = home_activity.connect('notify::launching', + self.__notify_launching_cb) + else: + self._notify_launching_hid = None + + def __notify_launching_cb(self, home_activity, pspec): + self._icon.props.pulsing = False + home_activity.disconnect(self._notify_launching_hid) + class ActivitiesTray(HTray): def __init__(self, shell): HTray.__init__(self) diff --git a/src/view/pulsingicon.py b/src/view/pulsingicon.py index b937816..6d8e53f 100644 --- a/src/view/pulsingicon.py +++ b/src/view/pulsingicon.py @@ -14,18 +14,48 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import gobject import math -from sugar.graphics.icon import CanvasIcon +import gobject +import gtk + +from sugar.graphics.icon import Icon, 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 + +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 _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))) - _INTERVAL = 100 - _STEP = math.pi / 10 # must be a fraction of pi, for clean caching +class PulsingIcon(Icon): + __gtype_name__ = 'SugarPulsingIcon' __gproperties__ = { 'base-color' : (object, None, None, gobject.PARAM_READWRITE), @@ -43,12 +73,17 @@ class CanvasPulsingIcon(CanvasIcon): self._level = 0 self._phase = 0 - CanvasIcon.__init__(self, **kwargs) + Icon.__init__(self, **kwargs) + + # Hack for sharing code between CanvasPulsingIcon and PulsingIcon + _get_as_rgba = _get_as_rgba + _update_colors = _update_colors + _get_color = _get_color def _start_pulsing(self, restart=False): if restart: self._phase = 0 - self._pulse_hid = gobject.timeout_add(self._INTERVAL, self.__pulse_cb) + self._pulse_hid = gobject.timeout_add(_INTERVAL, self.__pulse_cb) def _stop_pulsing(self): if self._pulse_hid is not None: @@ -56,40 +91,93 @@ class CanvasPulsingIcon(CanvasIcon): 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._phase += _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() + def do_set_property(self, pspec, value): + 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': + if self._paused != value: + self._paused = value + if self._paused: + self._stop_pulsing() + else: + self._start_pulsing(restart=False) 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() + Icon.do_set_property(self, pspec, value) + + def 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: - self.props.xo_color = self._base_color + return Icon.do_get_property(self, pspec) + +class CanvasPulsingIcon(CanvasIcon): + __gtype_name__ = 'SugarCanvasPulsingIcon' + + __gproperties__ = { + 'base-color' : (object, None, None, gobject.PARAM_WRITABLE), + 'pulse-color' : (object, None, None, gobject.PARAM_WRITABLE), + 'pulsing' : (bool, None, None, False, gobject.PARAM_WRITABLE), + 'paused' : (bool, None, None, False, gobject.PARAM_WRITABLE) + } + + def __init__(self, **kwargs): + self._base_color = None + self._pulse_color = None + self._pulse_hid = None + self._paused = False + self._pulsing = False + self._level = 0 + self._phase = 0 + + CanvasIcon.__init__(self, **kwargs) + + # Hack for sharing code between CanvasPulsingIcon and PulsingIcon + _get_as_rgba = _get_as_rgba + _update_colors = _update_colors + _get_color = _get_color + + def _start_pulsing(self, restart=False): + if restart: + self._phase = 0 + self._pulse_hid = gobject.timeout_add(_INTERVAL, self.__pulse_cb) + + def _stop_pulsing(self): + gobject.source_remove(self._pulse_hid) + self._pulse_hid = None + self.props.xo_color = self._base_color + + def __pulse_cb(self): + self._phase += _STEP + self._level = (math.sin(self._phase) + 1) / 2 + self._update_colors() + + return True def do_set_property(self, pspec, value): if pspec.name == 'base-color': |