Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/chat/roundbox.py
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@gmail.com>2012-01-05 13:52:05 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-01-09 12:33:56 (GMT)
commit15f3fc574eefc5553f5d1b63dd06daab451ccc62 (patch)
tree5bb3e48db533df772ac22a4a8e5d7090a6ceec2a /chat/roundbox.py
parent8336ba00cc5e2e200c6c7b677eeb09c4f18f3d6e (diff)
Remove use of hippo (1)
This patch remove the use of CanvasBox containers but does not support smiles and the links are managed by the standard gtk procedure. Smiles and links will be implemented in the next patch. Signed-by-off: Gonzalo Odiard <gonzalo@laptop.org>
Diffstat (limited to 'chat/roundbox.py')
-rw-r--r--chat/roundbox.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/chat/roundbox.py b/chat/roundbox.py
new file mode 100644
index 0000000..71298dd
--- /dev/null
+++ b/chat/roundbox.py
@@ -0,0 +1,96 @@
+import math
+import gtk
+from sugar.graphics import style
+
+
+class RoundBox(gtk.HBox):
+ __gtype_name__ = 'RoundBox'
+
+ _BORDER_DEFAULT = style.LINE_WIDTH
+
+ def __init__(self, **kwargs):
+ gtk.HBox.__init__(self, **kwargs)
+
+ self._radius = style.zoom(10)
+ self.border = self._BORDER_DEFAULT
+ self.border_color = style.COLOR_BLACK
+ self.background_color = None
+ self.set_reallocate_redraws(True)
+ self.set_resize_mode(gtk.RESIZE_PARENT)
+ self.connect("expose_event", self.__expose_cb)
+ self.connect("add", self.__add_cb)
+
+ def __add_cb(self, child, params):
+ child.set_border_width(style.zoom(5))
+
+ def __size_allocate_cb(self, widget, allocation):
+ self._x = allocation.x
+ self._y = allocation.y
+ self._width = allocation.width
+ self._height = allocation.height
+
+ def __expose_cb(self, widget, event):
+ context = widget.window.cairo_create()
+
+ # set a clip region for the expose event
+ context.rectangle(event.area.x, event.area.y,
+ event.area.width, event.area.height)
+ context.clip()
+ self.draw(context)
+ return False
+
+ def draw(self, cr):
+ rect = self.get_allocation()
+ x = rect.x + self._BORDER_DEFAULT / 2
+ y = rect.y + self._BORDER_DEFAULT / 2
+ width = rect.width - self._BORDER_DEFAULT
+ height = rect.height - self._BORDER_DEFAULT
+
+ cr.move_to(x + self._radius, y)
+ cr.arc(x + width - self._radius, y + self._radius,
+ self._radius, math.pi * 1.5, math.pi * 2)
+ cr.arc(x + width - self._radius, y + height - self._radius,
+ self._radius, 0, math.pi * 0.5)
+ cr.arc(x + self._radius, y + height - self._radius,
+ self._radius, math.pi * 0.5, math.pi)
+ cr.arc(x + self._radius, y + self._radius, self._radius,
+ math.pi, math.pi * 1.5)
+ cr.close_path()
+
+ if self.background_color is not None:
+ r, g, b, a = self.background_color.get_rgba()
+ cr.set_source_rgb(r, g, b)
+ cr.fill_preserve()
+
+ if self.border_color is not None:
+ r, g, b, a = self.border_color.get_rgba()
+ cr.set_source_rgb(r, g, b)
+ cr.set_line_width(self.border)
+ cr.stroke()
+
+if __name__ == '__main__':
+
+ win = gtk.Window()
+ win.connect('destroy', gtk.main_quit)
+ win.set_default_size(450, 550)
+ vbox = gtk.VBox()
+
+ box1 = RoundBox()
+ vbox.add(box1)
+ label1 = gtk.Label("Test 1")
+ box1.add(label1)
+
+ rbox = RoundBox()
+ rbox.background_color = style.Color('#FF0000')
+ vbox.add(rbox)
+ label2 = gtk.Label("Test 2")
+ rbox.add(label2)
+
+ bbox = RoundBox()
+ bbox.background_color = style.Color('#aaff33')
+ bbox.border_color = style.Color('#ff3300')
+ vbox.add(bbox)
+
+ win.add(vbox)
+ win.show_all()
+ gtk.main()