[Sugar-devel] [PATCH] Add alpha and scale functionality to the icon, can be used in the launcher to do the animation - v2

godiard at sugarlabs.org godiard at sugarlabs.org
Wed Mar 23 14:37:03 EDT 2011


From: Gonzalo Odiard <godiard at gmail.com>

	Signed-off-by: Gonzalo Odiard <gonzalo at laptop.org>
        Acked-By: Simon Schampijer <simon at laptop.org>
---
 src/sugar/graphics/icon.py |   50 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/src/sugar/graphics/icon.py b/src/sugar/graphics/icon.py
index 870c49e..7d84f2b 100644
--- a/src/sugar/graphics/icon.py
+++ b/src/sugar/graphics/icon.py
@@ -332,6 +332,8 @@ class Icon(gtk.Image):
         # collected while it's still used if it's a sugar.util.TempFilePath.
         # See #1175
         self._file = None
+        self._alpha = 1.0
+        self._scale = 1.0
 
         gobject.GObject.__init__(self, **kwargs)
 
@@ -420,8 +422,22 @@ class Icon(gtk.Image):
             (allocation.height - requisition[1]) * yalign)
 
         cr = self.window.cairo_create()
+
+        if self._scale != 1.0:
+            cr.scale(self._scale, self._scale)
+
+            margin = self._buffer.width * (1 - self._scale) / 2
+            x, y = x + margin, y + margin
+
+            x = x / self._scale
+            y = y / self._scale
+
         cr.set_source_surface(surface, x, y)
-        cr.paint()
+
+        if self._alpha == 1.0:
+            cr.paint()
+        else:
+            cr.paint_with_alpha(self._alpha)
 
     def set_xo_color(self, value):
         """
@@ -524,6 +540,22 @@ class Icon(gtk.Image):
     badge_name = gobject.property(
         type=str, getter=get_badge_name, setter=set_badge_name)
 
+    def set_alpha(self, value):
+        if self._alpha != value:
+            self._alpha = value
+            self.queue_draw()
+
+    alpha = gobject.property(
+        type=float, setter=set_alpha)
+
+    def set_scale(self, value):
+        if self._scale != value:
+            self._scale = value
+            self.queue_draw()
+
+    scale = gobject.property(
+        type=float, setter=set_scale)
+
 
 class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem):
 
@@ -534,6 +566,7 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem):
 
         self._buffer = _IconBuffer()
         self._palette_invoker = CanvasInvoker()
+        self._alpha = 1.0
 
         hippo.CanvasBox.__init__(self, **kwargs)
 
@@ -775,8 +808,6 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem):
         None
 
         """
-        logging.warning(
-            'CanvasIcon: the scale parameter is currently unsupported')
         if self._buffer.scale != value:
             self._buffer.scale = value
             self.emit_request_changed()
@@ -797,6 +828,14 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem):
     scale = gobject.property(
         type=float, getter=get_scale, setter=set_scale)
 
+    def set_alpha(self, alpha):
+        if self._alpha != alpha:
+            self._alpha = alpha
+            self.emit_paint_needed(0, 0, -1, -1)
+
+    alpha = gobject.property(
+        type=float, setter=set_alpha)
+
     def set_cache(self, value):
         """
         Parameters
@@ -878,7 +917,10 @@ class CanvasIcon(hippo.CanvasBox, hippo.CanvasItem):
             y = (height - surface.get_height()) / 2
 
             cr.set_source_surface(surface, x, y)
-            cr.paint()
+            if self._alpha == 1.0:
+                cr.paint()
+            else:
+                cr.paint_with_alpha(self._alpha)
 
     def do_get_content_width_request(self):
         """
-- 
1.7.4



More information about the Sugar-devel mailing list