diff --git a/examples/scene/scene.py b/examples/scene/scene.py index b54c40c9..1f6629eb 100755 --- a/examples/scene/scene.py +++ b/examples/scene/scene.py @@ -7,26 +7,20 @@ import gtk from sugar.scene.Stage import Stage from sugar.scene.Group import Group +from sugar.scene.View import View from sugar.scene.PixbufActor import PixbufActor from sugar.scene.CircleLayout import CircleLayout from sugar.scene.Timeline import Timeline -def __drawing_area_expose_cb(widget, event, stage): - stage.render(widget.window) - def __next_frame_cb(timeline, frame_num, group): angle = math.pi * 2 * frame_num / timeline.get_n_frames() group.get_layout().set_angle(angle) group.do_layout() - drawing_area.window.invalidate_rect(None, False) - def __completed_cb(timeline, group): group.get_layout().set_angle(0) group.do_layout() - drawing_area.window.invalidate_rect(None, False) - stage = Stage() pixbuf = gtk.gdk.pixbuf_new_from_file('background.png') @@ -49,10 +43,9 @@ stage.add(icons_group) window = gtk.Window() window.set_default_size(640, 480) -drawing_area = gtk.DrawingArea() -drawing_area.connect('expose_event', __drawing_area_expose_cb, stage) -window.add(drawing_area) -drawing_area.show() +view = View(stage) +window.add(view) +view.show() window.show() diff --git a/sugar/scene/Actor.py b/sugar/scene/Actor.py index 8ebf796a..a9fd6446 100644 --- a/sugar/scene/Actor.py +++ b/sugar/scene/Actor.py @@ -20,6 +20,7 @@ class Actor(gobject.GObject): def set_position(self, x, y): self._x = x self._y = y + self.notify_changed() def _get_parents(self): parents = [] @@ -39,9 +40,16 @@ class Actor(gobject.GObject): transf = actor._transf return transf.get_position(x, y) + def notify_changed(self): + if self._parent: + self._parent.notify_changed() + else: + self.emit('changed') + def set_size(self, width, height): self._width = width self._height = height + self.notify_changed() def render(self, drawable): pass diff --git a/sugar/scene/View.py b/sugar/scene/View.py new file mode 100644 index 00000000..23470e4d --- /dev/null +++ b/sugar/scene/View.py @@ -0,0 +1,21 @@ +import gtk + +from sugar.scene.Stage import Stage + +class View(gtk.DrawingArea): + def __init__(self, stage): + gtk.DrawingArea.__init__(self) + + self._stage = stage + self._stage.connect('changed', self.__stage_changed_cb) + self.connect('expose_event', self.__expose_cb) + + def __stage_changed_cb(self, stage): + if self.window: + self.window.invalidate_rect(None, False) + + def __expose_cb(self, widget, event): + self._stage.render(widget.window) + + def get_stage(self): + return self._stage