Update of /cvsroot/freevo/kaa/canvas/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18302/src
Modified Files:
canvasobject.py
Log Message:
Add clip support to objects. Containers can be clipped too, which is much
more impressive than it sounds.
Index: canvasobject.py
===================================================================
RCS file: /cvsroot/freevo/kaa/canvas/src/canvasobject.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** canvasobject.py 14 Jul 2005 05:27:48 -0000 1.5
--- canvasobject.py 14 Jul 2005 19:07:17 -0000 1.6
***************
*** 24,33 ****
def __init__(self):
! self._supported_properties = ["pos", "visible", "layer", "color",
"size", "name"]
self._properties = {}
self._changed_since_sync = {}
self._properties_serial = 0
self._relative_values_cache = { "serial": -1 }
self._o = self._canvas = self._parent = None
self["pos"] = (0, 0)
--- 24,35 ----
def __init__(self):
! self._supported_sync_properties = ["pos", "visible", "layer",
"color", "size", "name", "clip"]
self._properties = {}
self._changed_since_sync = {}
self._properties_serial = 0
self._relative_values_cache = { "serial": -1 }
+
self._o = self._canvas = self._parent = None
+ self._clip_object = None
self["pos"] = (0, 0)
***************
*** 36,39 ****
--- 38,42 ----
self["visible"] = True
self["layer"] = 0
+ self["clip"] = None
***************
*** 72,76 ****
if self._changed_since_sync != None:
self._changed_since_sync[key] = True
! if self._o:
self._sync_properties()
self._queue_render()
--- 75,79 ----
if self._changed_since_sync != None:
self._changed_since_sync[key] = True
! if self.get_evas():
self._sync_properties()
self._queue_render()
***************
*** 87,90 ****
--- 90,94 ----
self._o._canvas_object = weakref(self)
self._sync_properties()
+ self._apply_parent_clip()
self._queue_render()
***************
*** 170,176 ****
self._changed_since_sync = None
! print "SYNC PROPERTIES", self, changed
! for prop in self._supported_properties:
if prop not in changed:
continue
--- 174,180 ----
self._changed_since_sync = None
! #print "SYNC PROPERTIES", self, changed
! for prop in self._supported_sync_properties:
if prop not in changed:
continue
***************
*** 183,196 ****
def _sync_property_pos(self):
! self._o.move(self._get_relative_values()["pos"])
def _sync_property_visible(self):
! self._o.visible_set(self._get_relative_values()["visible"])
def _sync_property_layer(self):
! self._o.layer_set(self._get_relative_values()["layer"])
def _sync_property_color(self):
! self._o.color_set(*self._get_relative_values()["color"])
def _sync_property_size(self):
--- 187,208 ----
def _sync_property_pos(self):
! abs_pos = self._get_relative_values()["pos"]
! if isinstance(self._o, evas.Object):
! self._o.move(abs_pos)
! if self._clip_object:
! clip_pos = map(lambda x,y: x+y, self["clip"][0], abs_pos)
! self._clip_object.move(clip_pos)
def _sync_property_visible(self):
! if isinstance(self._o, evas.Object):
! self._o.visible_set(self._get_relative_values()["visible"])
def _sync_property_layer(self):
! if isinstance(self._o, evas.Object):
! self._o.layer_set(self._get_relative_values()["layer"])
def _sync_property_color(self):
! if isinstance(self._o, evas.Object):
! self._o.color_set(*self._get_relative_values()["color"])
def _sync_property_size(self):
***************
*** 198,206 ****
return
! self._o.resize(self._get_computed_size(self["size"]))
def _sync_property_name(self):
self._canvas._register_object_name(self["name"], self)
def _get_computed_size(self, (w, h)):
--- 210,258 ----
return
! if isinstance(self._o, evas.Object):
! self._o.resize(self._get_computed_size(self["size"]))
def _sync_property_name(self):
self._canvas._register_object_name(self["name"], self)
+ def _sync_property_clip(self):
+ if self["clip"] == None:
+ if self._clip_object:
+ if isinstance(self._o, evas.Object):
+ self._o.clip_unset()
+ self._clip_object = None
+ self._apply_parent_clip()
+ return
+
+ if not self._clip_object:
+ self._clip_object = self.get_evas().object_rectangle_add()
+ self._clip_object.show()
+ self._apply_parent_clip()
+ if isinstance(self._o, evas.Object):
+ self._o.clip_set(self._clip_object)
+
+ clip_pos, clip_size = self["clip"]
+ clip_pos = map(lambda x,y: x+y, clip_pos,
self._get_relative_values()["pos"])
+
+ self._clip_object.move(clip_pos)
+ self._clip_object.resize(clip_size)
+
+
+ def _apply_parent_clip(self):
+ if not self._o and not self._clip_object:
+ return
+
+ parent = self._parent
+ while parent:
+ if parent._clip_object:
+ if self._clip_object:
+ self._clip_object.clip_set(parent._clip_object)
+ elif isinstance(self._o, evas.Object):
+ self._o.clip_set(parent._clip_object)
+ break
+ parent = parent._parent
+ else:
+ if self._clip_object:
+ self._clip_object.clip_unset()
def _get_computed_size(self, (w, h)):
***************
*** 234,237 ****
--- 286,293 ----
return self._canvas
+ def get_evas(self):
+ if self._canvas:
+ return self._canvas.get_evas()
+
def move(self, (x, y)):
assert(type(x) == int and type(y) == int)
***************
*** 279,285 ****
return self["size"]
! def clip(self, pos = (0, 0), size = (-1, -1), color = None):
! assert( pos != (0, 0) and -1 not in size )
! # TODO: implement me (needs support in kaa-evas first).
--- 335,344 ----
return self["size"]
! def clip(self, pos = (0, 0), size = (-1, -1)):
! assert( -1 not in size )
! self["clip"] = (pos, size)
!
! def unclip(self):
! self["clip"] = None
***************
*** 297,300 ****
--- 356,361 ----
super(CanvasContainer, self).__init__()
+ self._supported_sync_properties = ["clip", "name", "pos"]
+
def _canvased(self, canvas):
***************
*** 332,338 ****
--- 393,416 ----
def _sync_properties(self):
+ super(CanvasContainer, self)._sync_properties()
for child in self._children:
child._sync_properties()
+ def _sync_property_clip(self):
+ super(CanvasContainer, self)._sync_property_clip()
+ self._apply_clip_to_children()
+
+
+ def _apply_clip_to_children(self):
+ for child in self._children:
+ if type(child) == CanvasContainer:
+ child._apply_clip_to_children()
+ else:
+ child._apply_parent_clip()
+
+ def _set_property_size(self, size):
+ if size != (-1, -1):
+ raise CanvasError, "NYI: Can't set size for containers yet."
+
#
***************
*** 368,371 ****
--- 446,450 ----
def _add_common(self, o, kwargs):
+ self.add_child(o)
if "pos" in kwargs: o.move(kwargs["pos"])
if "visible" in kwargs: o.set_visible(kwargs["visible"])
***************
*** 373,377 ****
if "name" in kwargs: o.set_name(kwargs["name"])
if "layer" in kwargs: o.set_layer(kwargs["layer"])
! self.add_child(o)
return o
--- 452,457 ----
if "name" in kwargs: o.set_name(kwargs["name"])
if "layer" in kwargs: o.set_layer(kwargs["layer"])
! if "clip" in kwargs: o.clip(*kwargs["clip"])
! if "size" in kwargs: o.resize(kwargs["size"])
return o
***************
*** 381,391 ****
def add_image(self, image, **kwargs):
! img = CanvasImage(image)
! if "dst_size" in kwargs:
! img.resize(kwargs["dst_size"])
! # TODO: Do src_pos/size via crop
! if "dst_pos" in kwargs:
! kwargs["pos"] = kwargs["dst_pos"]
! return self._add_common(img, kwargs)
def add_text(self, text = None, **kwargs):
--- 461,465 ----
def add_image(self, image, **kwargs):
! return self._add_common(CanvasImage(image), kwargs)
def add_text(self, text = None, **kwargs):
***************
*** 393,399 ****
def add_rectangle(self, **kwargs):
! o = self._add_common(CanvasRectangle(), kwargs)
! if "size" in kwargs:
! o.resize(kwargs["size"])
--- 467,471 ----
def add_rectangle(self, **kwargs):
! return self._add_common(CanvasRectangle(), kwargs)
***************
*** 403,407 ****
super(CanvasText, self).__init__()
! self._supported_properties += [ "text", "font" ]
self.set_font(font, size)
--- 475,479 ----
super(CanvasText, self).__init__()
! self._supported_sync_properties += [ "text", "font" ]
self.set_font(font, size)
***************
*** 484,488 ****
super(CanvasImage, self).__init__()
! self._supported_properties += ["image", "filename", "pixels",
"dirty", "size", "has_alpha"]
self._loaded = False
--- 556,560 ----
super(CanvasImage, self).__init__()
! self._supported_sync_properties += ["image", "filename", "pixels",
"dirty", "size", "has_alpha"]
self._loaded = False
***************
*** 720,723 ****
--- 792,798 ----
del self._names[name]
+ def clip(self, pos = (0,0), size = (-1,-1)):
+ raise CanvasError, "Can't clip whole canvases yet -- looks like a bug
in evas."
+
***************
*** 733,740 ****
- def _sync_property_visible(self):
- self._visibility_on_next_render = self["visible"]
-
-
def _set_property_visible(self, vis):
# Delay window hide/show until next render, because we want the
--- 808,811 ----
***************
*** 766,768 ****
self._visibility_on_next_render = None
-
--- 837,838 ----
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog