[Sugar-devel] [PATCH] add clock to frame

Tomeu Vizoso tomeu at sugarlabs.org
Sat May 2 04:28:06 EDT 2009


Hi Martin,

I was hoping the frame clock could be implemented as a device icon
extension, so people could add it, remove it and customize it more
easily. Why is it inside the shell instead?

Btw, do you want me to ask in olpc-sur how people already using 8.2
would like the clock to look like?

Thanks,

Tomeu

On Wed, Apr 29, 2009 at 20:31, Martin Dengler <martin at martindengler.com> wrote:
> ---
>  src/jarabe/frame/clock.py |  108 +++++++++++++++++++++++++++++++++++++++++++++
>  src/jarabe/frame/frame.py |    7 +++
>  2 files changed, 115 insertions(+), 0 deletions(-)
>  create mode 100644 src/jarabe/frame/clock.py
>
> diff --git a/src/jarabe/frame/clock.py b/src/jarabe/frame/clock.py
> new file mode 100644
> index 0000000..ea8dbb2
> --- /dev/null
> +++ b/src/jarabe/frame/clock.py
> @@ -0,0 +1,108 @@
> +# Copyright (C) 2008 Martin Dengler
> +#
> +# 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
> +
> +from gettext import gettext as _
> +import gconf
> +
> +import gtk
> +import gtk.gdk
> +import pango
> +import pangocairo
> +import time
> +
> +from sugar.graphics import style
> +from sugar.graphics.toolbutton import ToolButton
> +from sugar.graphics.xocolor import XoColor
> +
> +
> +CLOCK_TEXT_FONT = "Bitstream Vera Sans 36"
> +
> +
> +class TextIcon(gtk.Image):
> +    def __init__(self, *args, **kwargs):
> +        gtk.Image.__init__(self, *args, **kwargs)
> +        client = gconf.client_get_default()
> +        mycolor = XoColor(client.get_string('/desktop/sugar/user/color'))
> +        self._fill_rgba = style.Color(mycolor.fill).get_rgba()
> +        self._stroke_rgba = style.Color(mycolor.stroke).get_rgba()
> +
> +    def my_expose_event(self, widget_, event):
> +        x, y, w, h = event.area
> +        cr = self.window.cairo_create()
> +        redraw_region = gtk.gdk.region_rectangle(self.allocation)
> +        exposed_region = gtk.gdk.region_rectangle(event.area)
> +        redraw_region.intersect(exposed_region)
> +        cr.region(redraw_region)
> +        cr.clip()
> +        x, y, w_, h_ = self.allocation
> +        cr.translate(x, y)
> +        self.texticon_draw(cr)
> +
> +    def write(self, cr, text, x=0, y=0, font=None):
> +        cr.save()
> +        pcr = pangocairo.CairoContext(cr)
> +        layout = pcr.create_layout()
> +        if font is None:
> +            font = CLOCK_TEXT_FONT
> +        layout.set_font_description(pango.FontDescription(font))
> +        layout.set_markup(text)
> +        if x != 0 or y != 0:
> +            cr.move_to(x, y)
> +        pcr.layout_path(layout)
> +        cr.set_source_rgba(*self._stroke_rgba)
> +        cr.set_line_width(0.5)
> +        cr.stroke_preserve()
> +        cr.set_source_rgba(*self._fill_rgba)
> +        cr.fill()
> +        cr.restore()
> +        self.set_size_request(*layout.get_pixel_size())
> +
> +    def texticon_draw(self, cr):
> +        """
> +        draw the widget on the provided cairo surface
> +
> +        Should be overridden by subclasses; example:
> +
> +        def texticon_draw(self, cr):
> +            self.write(cr, time.strftime(_("%m/%d %H:%M"), time.localtime()))
> +        """
> +        raise Exception("TextIcon.texticon_draw(): subclasses must"
> +                        " override this method")
> +
> +
> +class DigitalClock(TextIcon):
> +    def texticon_draw(self, cr):
> +        self.write(cr, time.strftime(_("%m/%d %H:%M"), time.localtime()))
> +
> +
> +class DigitalClockTrayItem(ToolButton):
> +
> +    FRAME_POSITION_RELATIVE = 50 # all the way on the right
> +
> +    def __init__(self):
> +        ToolButton.__init__(self)
> +        self._icon = DigitalClock()
> +        self.set_icon_widget(self._icon)
> +
> +        # TODO: consider what happens when composite manager is involved
> +        self.connect("expose-event", self._icon.my_expose_event)
> +
> +        self.props.sensitive = False
> +        self._icon.show()
> +
> +
> +def setup(tray):
> +    tray.add_device(DigitalClockTrayItem())
> diff --git a/src/jarabe/frame/frame.py b/src/jarabe/frame/frame.py
> index 0bb8d92..79b508b 100644
> --- a/src/jarabe/frame/frame.py
> +++ b/src/jarabe/frame/frame.py
> @@ -190,6 +190,13 @@ class Frame(object):
>                 hippo.PACK_EXPAND)
>         activities_tray.show()
>
> +        import sys; sys.path.insert(0, ".")
> +        from clock import DigitalClockTrayItem as clock
> +        clockwidget = clock()
> +        panel.append(hippo.CanvasWidget(widget=clockwidget), hippo.PACK_END)
> +        clockwidget.show()
> +        del sys.path[0]
> +
>         return panel
>
>     def _create_bottom_panel(self):
> --
> 1.6.0.6
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
>


More information about the Sugar-devel mailing list