[Sugar-devel] [PATCH sugar-toolkit] Replace the hippo-based TimeoutIcon with one based on a gtk.Label and gtk.Alignment

Simon Schampijer simon at schampijer.de
Thu Aug 11 18:32:58 EDT 2011


This patch depends on the addition of the SugarTimeoutIcon
to the artwork where we set the font and background color.

Signed-off-by: Simon Schampijer <simon at laptop.org>
Reviewed-by: Benjamin Berg <benzea at sugarlabs.org>
---
 src/sugar/graphics/alert.py |   88 +++++++++++++++++++++++-------------------
 1 files changed, 48 insertions(+), 40 deletions(-)

diff --git a/src/sugar/graphics/alert.py b/src/sugar/graphics/alert.py
index 5298430..b5aa0c0 100644
--- a/src/sugar/graphics/alert.py
+++ b/src/sugar/graphics/alert.py
@@ -49,7 +49,7 @@ import gettext
 
 import gtk
 import gobject
-import hippo
+import pango
 import math
 
 from sugar.graphics import style
@@ -338,27 +338,43 @@ class ErrorAlert(Alert):
         icon.show()
 
 
-class _TimeoutIcon(hippo.CanvasText, hippo.CanvasItem):
-    """An icon with a round border"""
-    __gtype_name__ = 'AlertTimeoutIcon'
-
-    def __init__(self, **kwargs):
-        hippo.CanvasText.__init__(self, **kwargs)
-
-        self.props.orientation = hippo.ORIENTATION_HORIZONTAL
-        self.props.border_left = style.DEFAULT_SPACING
-        self.props.border_right = style.DEFAULT_SPACING
-
-    def do_paint_background(self, cr, damaged_box):
-        [width, height] = self.get_allocation()
-
-        xval = width * 0.5
-        yval = height * 0.5
-        radius = min(width * 0.5, height * 0.5)
-
-        hippo.cairo_set_source_rgba32(cr, self.props.background_color)
-        cr.arc(xval, yval, radius, 0, 2 * math.pi)
-        cr.fill_preserve()
+class _TimeoutIcon(gtk.Alignment):
+    __gtype_name__ = 'SugarTimeoutIcon'
+
+    def __init__(self):
+        gtk.Alignment.__init__(self, 0, 0, 1, 1)
+        self.set_app_paintable(True)
+        self._text = gtk.Label()
+        self._text.set_alignment(0.5, 0.5)
+        attrlist = pango.AttrList()
+        attrlist.insert(pango.AttrWeight(pango.WEIGHT_BOLD))
+        self._text.set_attributes(attrlist)
+        self.add(self._text)
+        self._text.show()
+        self.connect("expose_event", self.__expose_cb)
+
+    def __expose_cb(self, widget, event):
+        context = widget.window.cairo_create()
+        self._draw(context)
+        return False
+
+    def do_size_request(self, requisition):
+        requisition.height, requisition.width = \
+            gtk.icon_size_lookup(gtk.ICON_SIZE_BUTTON)
+        self._text.size_request()
+
+    def _draw(self, context):
+        rect = self.get_allocation()
+        x = rect.x + rect.width * 0.5
+        y = rect.y + rect.height * 0.5
+        radius = rect.width / 2
+        context.arc(x, y, radius, 0, 2 * math.pi)
+        widget_style = self.get_style()
+        context.set_source_color(widget_style.bg[self.get_state()])
+        context.fill_preserve()
+
+    def set_text(self, text):
+        self._text.set_text(str(text))
 
 
 class TimeoutAlert(Alert):
@@ -412,20 +428,16 @@ class TimeoutAlert(Alert):
         self.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), icon)
         icon.show()
 
-        self._timeout_text = _TimeoutIcon(
-            text=self._timeout,
-            color=style.COLOR_BUTTON_GREY.get_int(),
-            background_color=style.COLOR_WHITE.get_int())
-        canvas = hippo.Canvas()
-        canvas.set_root(self._timeout_text)
-        canvas.show()
-        self.add_button(gtk.RESPONSE_OK, _('Continue'), canvas)
+        self._timeout_text = _TimeoutIcon()
+        self._timeout_text.set_text(self._timeout)
+        self.add_button(gtk.RESPONSE_OK, _('Continue'), self._timeout_text)
+        self._timeout_text.show()
 
         gobject.timeout_add_seconds(1, self.__timeout)
 
     def __timeout(self):
         self._timeout -= 1
-        self._timeout_text.props.text = self._timeout
+        self._timeout_text.set_text(self._timeout)
         if self._timeout == 0:
             self._response(gtk.RESPONSE_OK)
             return False
@@ -461,20 +473,16 @@ class NotifyAlert(Alert):
 
         self._timeout = timeout
 
-        self._timeout_text = _TimeoutIcon(
-            text=self._timeout,
-            color=style.COLOR_BUTTON_GREY.get_int(),
-            background_color=style.COLOR_WHITE.get_int())
-        canvas = hippo.Canvas()
-        canvas.set_root(self._timeout_text)
-        canvas.show()
-        self.add_button(gtk.RESPONSE_OK, _('Ok'), canvas)
+        self._timeout_text = _TimeoutIcon()
+        self._timeout_text.set_text(self._timeout)
+        self.add_button(gtk.RESPONSE_OK, _('Ok'), self._timeout_text)
+        self._timeout_text.show()
 
         gobject.timeout_add(1000, self.__timeout)
 
     def __timeout(self):
         self._timeout -= 1
-        self._timeout_text.props.text = self._timeout
+        self._timeout_text.set_text(self._timeout)
         if self._timeout == 0:
             self._response(gtk.RESPONSE_OK)
             return False
-- 
1.7.4.4



More information about the Sugar-devel mailing list