[Sugar-devel] [PATCH] add clock to frame
Martin Dengler
martin at martindengler.com
Wed Apr 29 14:31:50 EDT 2009
---
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
More information about the Sugar-devel
mailing list