From c358520e107b861e6cc05aaf426f31d4d9f9b118 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <[EMAIL PROTECTED]>
Date: Wed, 2 Apr 2008 12:44:59 +0200
Subject: [PATCH] Add PulsingIcon and use it in the frame

---
 src/view/frame/activitiestray.py |   28 ++++++--
 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':
-- 
1.5.2.5

_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar

Reply via email to