import math from gi.repository import Gtk from gi.repository import Gdk from sugar3.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(30) self.border = self._BORDER_DEFAULT self.border_color = style.Color('#000000') self.background_color = None #self.set_reallocate_redraws(True) self.connect("draw", self.__draw_cb) def __draw_cb(self, widget, 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 - (self.props.margin * 2) height = Gdk.Screen.height() - self._BORDER_DEFAULT - \ (self.props.margin * 5) 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, __ = 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, __ = self.border_color.get_rgba() cr.set_source_rgb(r, g, b) cr.set_line_width(self.border) cr.stroke()