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

Reply via email to