From f6e1df09f5a831c129c49e013ebfde92e283c826 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 8 Feb 2007 16:28:05 +0100 Subject: [PATCH] Refactor a bit the color stuff. Python doesn't seem to like initializing class members with an instance of the class itself. Initial frame control implementation. --- sugar/graphics/Makefile.am | 6 +++-- sugar/graphics/color.py | 32 +++++++++++++++------- sugar/graphics/frame.py | 54 ++++++++++++++++++++++++++++++++++++++ tests/test-frame.py | 36 +++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 12 deletions(-) create mode 100644 sugar/graphics/frame.py create mode 100755 tests/test-frame.py diff --git a/sugar/graphics/Makefile.am b/sugar/graphics/Makefile.am index 5638af7e..384e6701 100644 --- a/sugar/graphics/Makefile.am +++ b/sugar/graphics/Makefile.am @@ -2,9 +2,11 @@ sugardir = $(pythondir)/sugar/graphics sugar_PYTHON = \ __init__.py \ bubble.py \ - button.py \ + button.py \ canvasicon.py \ + color.py \ ClipboardBubble.py \ + frame.py \ grid.py \ iconcolor.py \ menu.py \ @@ -14,5 +16,5 @@ sugar_PYTHON = \ spreadbox.py \ style.py \ stylesheet.py \ - timeline.py \ + timeline.py \ toolbar.py diff --git a/sugar/graphics/color.py b/sugar/graphics/color.py index fa3a8c75..615ed560 100644 --- a/sugar/graphics/color.py +++ b/sugar/graphics/color.py @@ -1,5 +1,6 @@ _system_colors = { - 'toolbar-background' : '#414141' + 'toolbar-background' : '#414141', + 'frame-border' : '#D1D1D2' } def _html_to_rgb(html_color): @@ -17,22 +18,33 @@ def _html_to_rgb(html_color): return (r, g, b) -class Color(object): - RED = Color(1.0, 0.0, 0.0) - GREEN = Color(0.0, 1.0, 0.0) - BLUE = Color(0.0, 0.0, 1.0) +def _rgba_to_int(r, g, b, a): + color = int(a * 255) + (int(b * 255) << 8) + \ + (int(g * 255) << 16) + (int(r * 255) << 24) + return color +class RGBColor(object): def __init__(self, r, g, b, a=1.0): self._r = r self._g = g self._b = b + self._a = a - def to_rgb(self): - return (self._r, self._g, self._b) + def get_rgba(self): + return (self._r, self._g, self._b, self._a) -class SystemColor(Color): - TOOLBAR_BACKGROUND = SystemColor('toolbar-background') + def get_int(self): + return _rgba_to_int(self._r, self._g, self._b, self._a) +class SystemColor(RGBColor): def __init__(self, color_id): rgb = _html_to_rgb(_system_colors[color_id]) - Color.__init__(*rgb) + RGBColor.__init__(self, *rgb) + +class Color(object): + RED = RGBColor(1.0, 0.0, 0.0) + GREEN = RGBColor(0.0, 1.0, 0.0) + BLUE = RGBColor(0.0, 0.0, 1.0) + + TOOLBAR_BACKGROUND = SystemColor('toolbar-background') + FRAME_BORDER = SystemColor('frame-border') diff --git a/sugar/graphics/frame.py b/sugar/graphics/frame.py new file mode 100644 index 00000000..82738849 --- /dev/null +++ b/sugar/graphics/frame.py @@ -0,0 +1,54 @@ +# Copyright (C) 2006, Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +import math + +import hippo + +from sugar.graphics.color import Color + +class Frame(hippo.CanvasBox, hippo.CanvasItem): + __gtype_name__ = 'SugarFrame' + + def __init__(self, **kwargs): + hippo.CanvasBox.__init__(self, **kwargs) + + self._line_width = 3.0 + self._radius = 30 + self._border_color = Color.FRAME_BORDER + + def do_paint_below_children(self, cr, damaged_box): + [width, height] = self.get_allocation() + + x = self._line_width + y = self._line_width + width -= self._line_width * 2 + height -= self._line_width * 2 + + 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, x + 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.set_source_rgba(*self._border_color.get_rgba()) + cr.set_line_width(self._line_width) + cr.stroke() diff --git a/tests/test-frame.py b/tests/test-frame.py new file mode 100755 index 00000000..4a22fd1f --- /dev/null +++ b/tests/test-frame.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +# Copyright (C) 2006, Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import gtk +import hippo + +from sugar.graphics.frame import Frame + +window = gtk.Window() +window.connect("destroy", lambda w: gtk.main_quit()) +window.show() + +canvas = hippo.Canvas() + +frame = Frame() +canvas.set_root(frame) + +window.add(canvas) +canvas.show() + +gtk.main()