[sugar] Sugar Clock
Martin Dengler
martin at martindengler.com
Tue Oct 14 19:03:48 EDT 2008
On Tue, Oct 14, 2008 at 08:32:31PM +0100, Martin Dengler wrote:
> PS - we should all stop arguing and just make a clock widget,
> finally.
http://dev.laptop.org/~mdengler/clock/screenshot_clock_01.png
Halfway done...now to stop arguing :)
From 346eea009cb645e176c2106386596dada9aeeed8 Mon Sep 17 00:00:00 2001
From: Martin Dengler <martin at martindengler.com>
Date: Tue, 14 Oct 2008 22:35:30 +0000
Subject: [PATCH] add clock frame device
---
model/devices/clock.py | 26 ++++++++++++
model/devices/devicesmodel.py | 6 +++
view/devices/clock.py | 88 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 120 insertions(+), 0 deletions(-)
create mode 100644 model/devices/clock.py
create mode 100644 view/devices/clock.py
diff --git a/model/devices/clock.py b/model/devices/clock.py
new file mode 100644
index 0000000..ce32855
--- /dev/null
+++ b/model/devices/clock.py
@@ -0,0 +1,26 @@
+# 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
+
+import gobject
+
+from model.devices import device
+
+class Device(device.Device):
+ def __init__(self):
+ device.Device.__init__(self)
+
+ def get_type(self):
+ return 'clock'
diff --git a/model/devices/devicesmodel.py b/model/devices/devicesmodel.py
index 1dd3c45..8f9615d 100644
--- a/model/devices/devicesmodel.py
+++ b/model/devices/devicesmodel.py
@@ -23,6 +23,7 @@ from model.devices import device
from model.devices.network import wireless
from model.devices.network import mesh
from model.devices import battery
+from model.devices import clock
from model.devices import reloadbutton
from model.devices import speaker
from model.devices import wirelessstrength
@@ -63,6 +64,11 @@ class DevicesModel(gobject.GObject):
logging.error("could not initialize reloadbutton device: %s" %
reloadbutton_fail_msg)
+ try:
+ self.add_device(clock.Device())
+ except Exception, clock_fail_msg:
+ logging.error("could not initialize clock device: %s" %
+ clock_fail_msg)
try:
self.add_device(wirelessstrength.Device())
diff --git a/view/devices/clock.py b/view/devices/clock.py
new file mode 100644
index 0000000..6fd71d6
--- /dev/null
+++ b/view/devices/clock.py
@@ -0,0 +1,88 @@
+# 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 cairo
+import gobject
+import gtk, gtk.gdk
+import math
+import pango
+import pangocairo
+import time
+
+from sugar import profile
+from sugar.graphics.toolbutton import ToolButton
+from sugar.graphics.style import Color
+
+class DigitalClock(gtk.Image):
+ def __init__(self, *args, **kwargs):
+ gtk.Image.__init__(self, *args, **kwargs)
+ self.connect_after("expose-event", self.do_expose_event)
+ self.timer = gobject.timeout_add(1000, self.__timeout_cb)
+ mycolor = profile.get_color()
+ self._fill_rgba = Color(mycolor.fill).get_rgba()
+ self._stroke_rgba = Color(mycolor.stroke).get_rgba()
+
+ def __timeout_cb(self):
+ if self.window is not None:
+ x, y, w, h = self.allocation
+ self.window.invalidate_rect((x, y, x + w, y + h), False)
+ return True
+
+ def do_expose_event(self, widget, event):
+ cr = self.window.cairo_create()
+ x, y, w, h = event.area
+ 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()
+ self.draw(cr)
+
+ def write(self, cr, text, x=0, y=0, font="Sans 24"):
+ pcr = pangocairo.CairoContext(cr)
+ layout = pcr.create_layout()
+ font_description = pango.FontDescription(font)
+ layout.set_font_description(font_description)
+ layout.set_markup(text)
+ cr.save()
+ 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 draw(self, cr):
+ x, y, w, h = self.allocation
+ cr.translate(x, y)
+ self.write(cr, time.strftime("%c", time.localtime()))
+
+
+class DeviceView(ToolButton):
+
+ FRAME_POSITION_RELATIVE = 1100
+
+ def __init__(self, model):
+ ToolButton.__init__(self)
+ self._icon = DigitalClock()
+ self.set_icon_widget(self._icon)
+ self._icon.show()
--
1.5.5.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.laptop.org/pipermail/sugar/attachments/20081015/0b715bfb/attachment-0001.pgp
More information about the Sugar
mailing list