davemds pushed a commit to branch master.

commit 0fae488f776c2d3d0eea06f3d9990f62164fe5b5
Author: davemds <[email protected]>
Date:   Sun Apr 14 14:24:44 2013 +0200

    Python-EFL: EdjeEdit, manage the various class 'name' prop in a saner way
    
    Instead of keeping a py object now keep a stringshared char*, so that we can
    pass it directly to the C API without messing with conversions.
---
 efl/edje/efl.edje_edit.pyx            |  78 ++++++++------
 efl/edje/efl.edje_edit_group.pxi      |   5 +-
 efl/edje/efl.edje_edit_part.pxi       | 188 +++++++++++++---------------------
 efl/edje/efl.edje_edit_part_state.pxi |  29 ++++--
 efl/edje/efl.edje_edit_program.pxi    | 132 +++++++++---------------
 include/efl.pxd                       |   1 +
 tests/edje/test_04_edit.py            |   2 -
 7 files changed, 184 insertions(+), 251 deletions(-)

diff --git a/efl/edje/efl.edje_edit.pyx b/efl/edje/efl.edje_edit.pyx
index 224f12a..20532c2 100644
--- a/efl/edje/efl.edje_edit.pyx
+++ b/efl/edje/efl.edje_edit.pyx
@@ -383,52 +383,70 @@ cdef class EdjeEdit(Edje):
 
 cdef class Text_Style(object):
     cdef EdjeEdit edje
-    cdef object name
+    cdef const_char *name
 
-    def __init__(self, EdjeEdit e, name):
+    def __init__(self, EdjeEdit e not None, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
         self.edje = e
-        self.name = name
+        self.name = eina_stringshare_add(name)
+
+    def __dealloc__(self):
+        eina_stringshare_del(self.name)
 
     property tags:
         def __get__(self):
             cdef Eina_List *lst
-            lst = edje_edit_style_tags_list_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            lst = edje_edit_style_tags_list_get(self.edje.obj, self.name)
             ret = convert_eina_list_strings_to_python_list(lst)
             edje_edit_string_list_free(lst)
             return ret
 
-    def tag_get(self, name):
+    def tag_get(self, name not None):
         return Text_Style_Tag(self, name)
 
-    def tag_add(self, name):
+    def tag_add(self, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
         return bool(edje_edit_style_tag_add(self.edje.obj, self.name,
-                              <const_char *>name if name is not None else 
NULL))
+                                            <const_char *>name))
 
-    def tag_del(self, name):
+    def tag_del(self, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
-        edje_edit_style_tag_del(self.edje.obj, self.name,
-                               <const_char *>name if name is not None else 
NULL)
+        edje_edit_style_tag_del(self.edje.obj, self.name, <const_char *>name)
         return True
 
 
 cdef class Text_Style_Tag(object):
     cdef Text_Style text_style
-    cdef object name
+    cdef const_char *name
 
-    def __init__(self, Text_Style text_style, name):
+    def __init__(self, Text_Style text_style not None, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
         self.text_style = text_style
-        self.name = name
+        self.name = eina_stringshare_add(name)
+
+    def __dealloc__(self):
+        eina_stringshare_del(self.name)
+
+    property name:
+        def __get__(self):
+            return _ctouni(self.name)
+
+        def __set__(self, newname):
+            self.rename(newname)
+
+    def rename(self, newname not None):
+        if isinstance(newname, unicode): newname = newname.encode("UTF-8")
+        edje_edit_style_tag_name_set(self.text_style.edje.obj,
+                        self.text_style.name, self.name,
+                        <const_char *>newname)
+        eina_stringshare_replace(&self.name, <const_char *>newname)
+        return True
 
     property value:
         def __get__(self):
             cdef const_char *val
             val =  edje_edit_style_tag_value_get(self.text_style.edje.obj,
-                    self.text_style.name,
-                    <const_char *>self.name if self.name is not None else NULL)
+                                                self.text_style.name, 
self.name)
             ret = _ctouni(val)
             edje_edit_string_free(val)
             return ret
@@ -438,41 +456,35 @@ cdef class Text_Style_Tag(object):
                             self.text_style.name, self.name,
                             <const_char *>value if value is not None else NULL)
 
-    def rename(self, newname):
-        if isinstance(newname, unicode): newname = newname.encode("UTF-8")
-        edje_edit_style_tag_name_set(self.text_style.edje.obj,
-                        self.text_style.name,
-                        <const_char *>self.name if self.name is not None else 
NULL,
-                        <const_char *>newname if newname is not None else NULL)
-        self.name = <const_char *>newname if newname is not None else NULL
-        return True
 
 
 cdef class Color_Class(object):
     cdef EdjeEdit edje
-    cdef object name
+    cdef const_char *name
 
-    def __init__(self, EdjeEdit e, name):
+    def __init__(self, EdjeEdit e not None, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
         self.edje = e
-        self.name = name
+        self.name = eina_stringshare_add(name)
+
+    def __dealloc__(self):
+        eina_stringshare_del(self.name)
 
     property name:
         def __get__(self):
-            return self.name.decode('UTF-8', 'strict')
+            return _ctouni(self.name)
 
         def __set__(self, newname):
             self.rename(newname)
 
-    def rename(self, newname):
+    def rename(self, newname not None):
         cdef Eina_Bool ret
         if isinstance(newname, unicode): newname = newname.encode("UTF-8")
-        ret = edje_edit_color_class_name_set(self.edje.obj,
-                        <const_char *>self.name if self.name is not None else 
NULL,
-                        <const_char *>newname if newname is not None else NULL)
+        ret = edje_edit_color_class_name_set(self.edje.obj, self.name,
+                                             <const_char *>newname)
         if ret == 0:
             return False
-        self.name = newname
+        eina_stringshare_replace(&self.name, <const_char *>newname)
         return True
 
     def colors_get(self):
diff --git a/efl/edje/efl.edje_edit_group.pxi b/efl/edje/efl.edje_edit_group.pxi
index 60eb4b0..9a49dec 100644
--- a/efl/edje/efl.edje_edit_group.pxi
+++ b/efl/edje/efl.edje_edit_group.pxi
@@ -49,8 +49,7 @@ cdef class Group(object):
         def __set__(self, value):
             edje_edit_group_max_h_set(self.edje.obj, value)
 
-    def rename(self, name):
+    def rename(self, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
-        return bool(edje_edit_group_name_set(self.edje.obj,
-                            <const_char *>name if name is not None else NULL))
+        return bool(edje_edit_group_name_set(self.edje.obj, <const_char 
*>name))
 
diff --git a/efl/edje/efl.edje_edit_part.pxi b/efl/edje/efl.edje_edit_part.pxi
index 8332cfb..20b6a16 100644
--- a/efl/edje/efl.edje_edit_part.pxi
+++ b/efl/edje/efl.edje_edit_part.pxi
@@ -18,36 +18,37 @@
 
 cdef class Part(object):
     cdef EdjeEdit edje
-    cdef object name
+    cdef const_char *name
 
-    def __init__(self, EdjeEdit e, name):
+    def __init__(self, EdjeEdit e not None, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
         self.edje = e
-        self.name = name
+        self.name = eina_stringshare_add(name)
+
+    def __dealloc__(self):
+        eina_stringshare_del(self.name)
 
     property name:
         def __get__(self):
-            return self.name.decode('UTF-8', 'strict')
+            return _ctouni(self.name)
         def __set__(self, name):
             self.rename(name)
 
-    def rename(self, newname):
+    def rename(self, newname not None):
         cdef Eina_Bool ret
         if isinstance(newname, unicode): newname = newname.encode("UTF-8")
-        ret = edje_edit_part_name_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        ret = edje_edit_part_name_set(self.edje.obj, self.name,
                     <const_char *>newname if newname is not None else NULL)
         if ret == 0:
             return False
-        self.name = newname
+        eina_stringshare_replace(&self.name, <const_char *>newname)
         return True
 
     def above_get(self):
         cdef:
             const_char *part
             object ret
-        part = edje_edit_part_above_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+        part = edje_edit_part_above_get(self.edje.obj, self.name)
         ret = _ctouni(part)
         edje_edit_string_free(part)
         return ret
@@ -56,31 +57,26 @@ cdef class Part(object):
         cdef:
             const_char *part
             object ret
-        part = edje_edit_part_below_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+        part = edje_edit_part_below_get(self.edje.obj, self.name)
         ret = _ctouni(part)
         edje_edit_string_free(part)
         return ret
 
     def restack_below(self):
-        return bool(edje_edit_part_restack_below(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+        return bool(edje_edit_part_restack_below(self.edje.obj, self.name))
 
     def restack_above(self):
-        return bool(edje_edit_part_restack_above(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+        return bool(edje_edit_part_restack_above(self.edje.obj, self.name))
 
     property type:
         def __get__(self):
-            return edje_edit_part_type_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            return edje_edit_part_type_get(self.edje.obj, self.name)
 
 
     property states:
         def __get__(self):
             cdef Eina_List *lst
-            lst = edje_edit_part_states_list_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            lst = edje_edit_part_states_list_get(self.edje.obj, self.name)
             ret = convert_eina_list_strings_to_python_list(lst)
             edje_edit_string_list_free(lst)
             return ret
@@ -91,38 +87,33 @@ cdef class Part(object):
 
     def state_add(self, sname, double value=0.0):
         if isinstance(sname, unicode): sname = sname.encode("UTF-8")
-        return bool(edje_edit_state_add(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_state_add(self.edje.obj, self.name,
                     <const_char *>sname if sname is not None else NULL,
                     value))
 
     def state_del(self, sname, double value=0.0):
         if isinstance(sname, unicode): sname = sname.encode("UTF-8")
-        return bool(edje_edit_state_del(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_state_del(self.edje.obj, self.name,
                     <const_char *>sname if sname is not None else NULL,
                     value))
 
     def state_exist(self, sname, double value=0.0):
         if isinstance(sname, unicode): sname = sname.encode("UTF-8")
-        return bool(edje_edit_state_exist(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_state_exist(self.edje.obj, self.name,
                     <const_char *>sname if sname is not None else NULL,
                     value))
 
     def state_copy(self, sfrom, double vfrom, sto, double vto):
         if isinstance(sfrom, unicode): sfrom = sfrom.encode("UTF-8")
         if isinstance(sto, unicode): sto = sto.encode("UTF-8")
-        return bool(edje_edit_state_copy(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_state_copy(self.edje.obj, self.name,
                     <const_char *>sfrom if sfrom is not None else NULL, vfrom,
                     <const_char *>sto if sto is not None else NULL, vto))
 
     def state_selected_get(self):
         cdef const_char *sel
         cdef double val
-        sel = edje_edit_part_selected_state_get(self.edje.obj,
-               <const_char *>self.name if self.name is not None else NULL, 
&val)
+        sel = edje_edit_part_selected_state_get(self.edje.obj, self.name, &val)
         if sel == NULL: return None
         r = _ctouni(sel)
         v = val
@@ -131,191 +122,152 @@ cdef class Part(object):
 
     def state_selected_set(self, state, double value=0.0):
         if isinstance(state, unicode): state = state.encode("UTF-8")
-        edje_edit_part_selected_state_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL,
+        edje_edit_part_selected_state_set(self.edje.obj, self.name,
                 <const_char *>state if state is not None else NULL,
                 value)
 
     property clip_to:
         def __get__(self):
             cdef const_char *clipper
-            clipper = edje_edit_part_clip_to_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            clipper = edje_edit_part_clip_to_get(self.edje.obj, self.name)
             ret = _ctouni(clipper)
             edje_edit_string_free(clipper)
             return ret
 
         def __set__(self, clipper):
             if isinstance(clipper, unicode): clipper = clipper.encode("UTF-8")
-            edje_edit_part_clip_to_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+            edje_edit_part_clip_to_set(self.edje.obj, self.name,
                     <const_char *>clipper if clipper is not None else NULL)
 
         def __del__(self):
-            edje_edit_part_clip_to_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    NULL)
+            edje_edit_part_clip_to_set(self.edje.obj, self.name, NULL)
 
     property source:
         def __get__(self):
             cdef const_char *source
-            source = edje_edit_part_source_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            source = edje_edit_part_source_get(self.edje.obj, self.name)
             ret = _ctouni(source)
             edje_edit_string_free(source)
             return ret
 
         def __set__(self, source):
             if isinstance(source, unicode): source = source.encode("UTF-8")
-            edje_edit_part_source_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    <const_char *>source if source is not None else NULL)
+            edje_edit_part_source_set(self.edje.obj, self.name,
+                        <const_char *>source if source is not None else NULL)
 
         def __del__(self):
-            edje_edit_part_source_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    NULL)
+            edje_edit_part_source_set(self.edje.obj, self.name, NULL)
 
     property mouse_events:
         def __get__(self):
-            return bool(edje_edit_part_mouse_events_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+            return bool(edje_edit_part_mouse_events_get(self.edje.obj, 
self.name))
 
         def __set__(self, me):
-            edje_edit_part_mouse_events_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL,
-                1 if me else 0)
+            edje_edit_part_mouse_events_set(self.edje.obj, self.name,
+                                            1 if me else 0)
 
     property repeat_events:
         def __get__(self):
-            return bool(edje_edit_part_repeat_events_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+            return bool(edje_edit_part_repeat_events_get(self.edje.obj, 
self.name))
 
         def __set__(self, re):
-            edje_edit_part_repeat_events_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    1 if re else 0)
+            edje_edit_part_repeat_events_set(self.edje.obj, self.name,
+                                             1 if re else 0)
 
     property effect:
         def __get__(self):
-            return edje_edit_part_effect_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            return edje_edit_part_effect_get(self.edje.obj, self.name)
 
         def __set__(self, effect):
-            edje_edit_part_effect_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    effect)
+            edje_edit_part_effect_set(self.edje.obj, self.name, effect)
 
     property ignore_flags:
         def __get__(self):
-            return edje_edit_part_ignore_flags_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            return edje_edit_part_ignore_flags_get(self.edje.obj, self.name)
 
         def __set__(self, flags):
-            edje_edit_part_ignore_flags_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    flags)
+            edje_edit_part_ignore_flags_set(self.edje.obj, self.name, flags)
 
     property scale:
         def __get__(self):
-            return bool(edje_edit_part_scale_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+            return bool(edje_edit_part_scale_get(self.edje.obj, self.name))
 
         def __set__(self, scale):
-            edje_edit_part_scale_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    1 if scale else 0)
+            edje_edit_part_scale_set(self.edje.obj, self.name,
+                                     1 if scale else 0)
 
     property drag:
         def __get__(self):
             cdef int x, y
-            x = edje_edit_part_drag_x_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
-            y = edje_edit_part_drag_y_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            x = edje_edit_part_drag_x_get(self.edje.obj, self.name)
+            y = edje_edit_part_drag_y_get(self.edje.obj, self.name)
             return (x, y)
 
         def __set__(self, val):
             x, y = val
-            edje_edit_part_drag_x_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, x)
-            edje_edit_part_drag_y_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, y)
+            edje_edit_part_drag_x_set(self.edje.obj, self.name, x)
+            edje_edit_part_drag_y_set(self.edje.obj, self.name, y)
 
     property drag_step:
         def __get__(self):
             cdef int x, y
-            x = edje_edit_part_drag_step_x_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
-            y = edje_edit_part_drag_step_y_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            x = edje_edit_part_drag_step_x_get(self.edje.obj, self.name)
+            y = edje_edit_part_drag_step_y_get(self.edje.obj, self.name)
             return (x, y)
 
         def __set__(self, val):
             x, y = val
-            edje_edit_part_drag_step_x_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, x)
-            edje_edit_part_drag_step_y_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, y)
+            edje_edit_part_drag_step_x_set(self.edje.obj, self.name, x)
+            edje_edit_part_drag_step_y_set(self.edje.obj, self.name, y)
 
     property drag_count:
         def __get__(self):
             cdef int x, y
-            x = edje_edit_part_drag_count_x_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
-            y = edje_edit_part_drag_count_y_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            x = edje_edit_part_drag_count_x_get(self.edje.obj, self.name)
+            y = edje_edit_part_drag_count_y_get(self.edje.obj, self.name)
             return (x, y)
 
         def __set__(self, val):
             x, y = val
-            edje_edit_part_drag_count_x_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, x)
-            edje_edit_part_drag_count_y_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, y)
+            edje_edit_part_drag_count_x_set(self.edje.obj, self.name, x)
+            edje_edit_part_drag_count_y_set(self.edje.obj, self.name, y)
 
     property drag_confine:
         def __get__(self):
             cdef const_char *confine
-            confine = edje_edit_part_drag_confine_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            confine = edje_edit_part_drag_confine_get(self.edje.obj, self.name)
             ret = _ctouni(confine)
             edje_edit_string_free(confine)
             return ret
 
         def __set__(self, confine):
             if isinstance(confine, unicode): confine = confine.encode("UTF-8")
-            edje_edit_part_drag_confine_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    <const_char *>confine if confine is not None else NULL)
+            edje_edit_part_drag_confine_set(self.edje.obj, self.name,
+                        <const_char *>confine if confine is not None else NULL)
 
     property drag_event:
         def __get__(self):
             cdef const_char *event
-            event = edje_edit_part_drag_event_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            event = edje_edit_part_drag_event_get(self.edje.obj, self.name)
             ret = _ctouni(event)
             edje_edit_string_free(event)
             return ret
 
         def __set__(self, event):
             if isinstance(event, unicode): event = event.encode("UTF-8")
-            edje_edit_part_drag_event_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    <const_char *>event if event is not None else NULL)
+            edje_edit_part_drag_event_set(self.edje.obj, self.name,
+                            <const_char *>event if event is not None else NULL)
 
     property api:
         def __get__(self):
             cdef:
                 const_char *name
-                const_char *description
-            name = edje_edit_part_api_name_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
-            description = edje_edit_part_api_description_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
-            n, d = _ctouni(name), _ctouni(description)
+                const_char *desc
+            name = edje_edit_part_api_name_get(self.edje.obj, self.name)
+            desc = edje_edit_part_api_description_get(self.edje.obj, self.name)
+            n, d = _ctouni(name), _ctouni(desc)
             edje_edit_string_free(name)
-            edje_edit_string_free(description)
+            edje_edit_string_free(desc)
             return (n, d)
 
         def __set__(self, value):
@@ -323,9 +275,7 @@ cdef class Part(object):
             name, desc = value
             if isinstance(name, unicode): name = name.encode("UTF-8")
             if isinstance(desc, unicode): desc = desc.encode("UTF-8")
-            edje_edit_part_api_name_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    <const_char *>name if name is not None else NULL)
-            edje_edit_part_api_description_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
-                    <const_char *>desc if desc is not None else NULL)
+            edje_edit_part_api_name_set(self.edje.obj, self.name,
+                            <const_char *>name if name is not None else NULL)
+            edje_edit_part_api_description_set(self.edje.obj, self.name,
+                            <const_char *>desc if desc is not None else NULL)
diff --git a/efl/edje/efl.edje_edit_part_state.pxi 
b/efl/edje/efl.edje_edit_part_state.pxi
index 8c4b69d..45491ce 100644
--- a/efl/edje/efl.edje_edit_part_state.pxi
+++ b/efl/edje/efl.edje_edit_part_state.pxi
@@ -19,21 +19,26 @@
 cdef class State:
     cdef EdjeEdit edje
     cdef object part
-    cdef object name
+    cdef const_char *name
     cdef object part_obj
     cdef object value
 
-    def __init__(self, Part part, name, double value=0.0):
+    def __init__(self, Part part not None, name not None, double value=0.0):
         if isinstance(name, unicode): name = name.encode("UTF-8")
+        self.name = eina_stringshare_add(name)
         self.part_obj = part
         self.edje = part.edje
         self.part = part.name
-        self.name = name
         self.value = value
 
+    def __dealloc__(self):
+        eina_stringshare_del(self.name)
+
     property name:
         def __get__(self):
-            return self.name
+            return _ctouni(self.name)
+        def __set__(self, name):
+            self.name_set(name)
 
     property value:
         def __get__(self):
@@ -42,12 +47,16 @@ cdef class State:
     def part_get(self):
         return self.part_obj
 
-    def name_set(self, new_name, new_value=None):
-        if new_value == None:
-            new_value = self.value
-        return bool(edje_edit_state_name_set(self.edje.obj, self.part,
-                                             self.name, self.value, new_name,
-                                             new_value))
+    def name_set(self, new_name not None, new_value=None):
+        if isinstance(new_name, unicode): new_name = new_name.encode("UTF-8")
+        ret = edje_edit_state_name_set(self.edje.obj, self.part,
+                        self.name, self.value,
+                        <const_char *>new_name if new_name is not None else 
NULL,
+                        new_value if new_value is not None else self.value)
+        if ret == 0:
+            return False
+        eina_stringshare_replace(&self.name, <const_char *>new_name)
+        return True
     """
     def copy_from(self, from_state, from_value=0.0):
         return bool(edje_edit_state_copy(self.edje.obj, self.part,
diff --git a/efl/edje/efl.edje_edit_program.pxi 
b/efl/edje/efl.edje_edit_program.pxi
index acca7e4..4ccfe90 100644
--- a/efl/edje/efl.edje_edit_program.pxi
+++ b/efl/edje/efl.edje_edit_program.pxi
@@ -18,117 +18,103 @@
 
 cdef class Program(object):
     cdef EdjeEdit edje
-    cdef object name
+    cdef const_char *name
 
-    def __init__(self, EdjeEdit e, name):
+    def __init__(self, EdjeEdit e not None, name not None):
         if isinstance(name, unicode): name = name.encode("UTF-8")
         self.edje = e
-        self.name = name
+        self.name = eina_stringshare_add(name)
+
+    def __dealloc__(self):
+        eina_stringshare_del(self.name)
 
     property name:
         def __get__(self):
-            return self.name.decode('UTF-8', 'strict')
-
+            return _ctouni(self.name)
         def __set__(self, newname):
             self.rename(newname)
 
-    def rename(self, newname):
+    def rename(self, newname not None):
         cdef Eina_Bool ret
         if isinstance(newname, unicode): newname = newname.encode("UTF-8")
-        ret = edje_edit_program_name_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        ret = edje_edit_program_name_set(self.edje.obj, self.name,
                     <const_char *>newname if newname is not None else NULL)
         if ret == 0:
             return False
-        self.name = newname
+        eina_stringshare_replace(&self.name, <const_char *>newname)
         return True
 
     def edje_get(self):
         return self.edje
 
     def run(self):
-        return bool(edje_edit_program_run(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+        return bool(edje_edit_program_run(self.edje.obj, self.name))
 
     # XXX TODO: add (or better convert) all this to properties
     #       like is done in Part()
     def source_get(self):
         cdef const_char *s
-        s = edje_edit_program_source_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+        s = edje_edit_program_source_get(self.edje.obj, self.name)
         ret = _ctouni(s)
         edje_edit_string_free(s)
         return ret
 
     def source_set(self, source):
         if isinstance(source, unicode): source = source.encode("UTF-8")
-        return bool(edje_edit_program_source_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_source_set(self.edje.obj, self.name,
                     <const_char *>source if source is not None else NULL))
 
     def signal_get(self):
         cdef const_char *s
-        s = edje_edit_program_signal_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+        s = edje_edit_program_signal_get(self.edje.obj, self.name)
         ret = _ctouni(s)
         edje_edit_string_free(s)
         return ret
 
     def signal_set(self, signal):
         if isinstance(signal, unicode): signal = signal.encode("UTF-8")
-        return bool(edje_edit_program_signal_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_signal_set(self.edje.obj, self.name,
                     <const_char *>signal if signal is not None else NULL))
 
     def in_from_get(self):
-        return edje_edit_program_in_from_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_in_from_get(self.edje.obj, self.name)
 
     def in_from_set(self, double f):
-        return bool(edje_edit_program_in_from_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, f))
+        return bool(edje_edit_program_in_from_set(self.edje.obj, self.name, f))
 
     def in_range_get(self):
-        return edje_edit_program_in_range_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_in_range_get(self.edje.obj, self.name)
 
     def in_range_set(self, double r):
-        return bool(edje_edit_program_in_range_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, r))
+        return bool(edje_edit_program_in_range_set(self.edje.obj, self.name, 
r))
 
     def action_get(self):
-        return edje_edit_program_action_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_action_get(self.edje.obj, self.name)
 
     def action_set(self, action):
         if isinstance(action, unicode): action = action.encode("UTF-8")
-        return bool(edje_edit_program_action_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL,
-                action))
+        return bool(edje_edit_program_action_set(self.edje.obj, self.name,
+                                                 action))
 
     def targets_get(self):
         cdef Eina_List *lst
-        lst = edje_edit_program_targets_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        lst = edje_edit_program_targets_get(self.edje.obj, self.name)
         ret = convert_eina_list_strings_to_python_list(lst)
         edje_edit_string_list_free(lst)
         return ret
 
     def target_add(self, target):
         if isinstance(target, unicode): target = target.encode("UTF-8")
-        return bool(edje_edit_program_target_add(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_target_add(self.edje.obj, self.name,
                     <const_char *>target if target is not None else NULL))
 
     def target_del(self, target):
         if isinstance(target, unicode): target = target.encode("UTF-8")
-        return bool(edje_edit_program_target_del(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_target_del(self.edje.obj, self.name,
                     <const_char *>target if target is not None else NULL))
 
     def targets_clear(self):
-        return bool(edje_edit_program_targets_clear(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+        return bool(edje_edit_program_targets_clear(self.edje.obj, self.name))
 
     def afters_get(self):
         cdef Eina_List *lst
@@ -139,89 +125,72 @@ cdef class Program(object):
 
     def after_add(self, after):
         if isinstance(after, unicode): after = after.encode("UTF-8")
-        return bool(edje_edit_program_after_add(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_after_add(self.edje.obj, self.name,
                     <const_char *>after if after is not None else NULL))
 
     def after_del(self, after):
         if isinstance(after, unicode): after = after.encode("UTF-8")
-        return bool(edje_edit_program_after_del(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_after_del(self.edje.obj, self.name,
                     <const_char *>after if after is not None else NULL))
 
     def afters_clear(self):
-        return bool(edje_edit_program_afters_clear(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else 
NULL))
+        return bool(edje_edit_program_afters_clear(self.edje.obj, self.name))
 
     def state_get(self):
         cdef const_char *s
-        s = edje_edit_program_state_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+        s = edje_edit_program_state_get(self.edje.obj, self.name)
         ret = _ctouni(s)
         edje_edit_string_free(s)
         return ret
 
     def state_set(self, state):
         if isinstance(state, unicode): state = state.encode("UTF-8")
-        return bool(edje_edit_program_state_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_state_set(self.edje.obj, self.name,
                     <const_char *>state if state is not None else NULL))
 
     def value_get(self):
-        return edje_edit_program_value_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_value_get(self.edje.obj, self.name)
 
     def value_set(self, double v):
-        return bool(edje_edit_program_value_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, v))
+        return bool(edje_edit_program_value_set(self.edje.obj, self.name, v))
 
     def state2_get(self):
         cdef const_char *s
-        s = edje_edit_program_state2_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+        s = edje_edit_program_state2_get(self.edje.obj, self.name)
         ret = _ctouni(s)
         edje_edit_string_free(s)
         return ret
 
     def state2_set(self, state):
         if isinstance(state, unicode): state = state.encode("UTF-8")
-        return bool(edje_edit_program_state2_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+        return bool(edje_edit_program_state2_set(self.edje.obj, self.name,
                     <const_char *>state if state is not None else NULL))
 
     def value2_get(self):
-        return edje_edit_program_value2_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_value2_get(self.edje.obj, self.name)
 
     def value2_set(self, double v):
-        return bool(edje_edit_program_value2_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, v))
+        return bool(edje_edit_program_value2_set(self.edje.obj, self.name, v))
 
     def transition_get(self):
-        return edje_edit_program_transition_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_transition_get(self.edje.obj, self.name)
 
     def transition_set(self, t):
-        return bool(edje_edit_program_transition_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, t))
+        return bool(edje_edit_program_transition_set(self.edje.obj, self.name, 
t))
 
     def transition_time_get(self):
-        return edje_edit_program_transition_time_get(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL)
+        return edje_edit_program_transition_time_get(self.edje.obj, self.name)
 
     def transition_time_set(self, double t):
-        return bool(edje_edit_program_transition_time_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, t))
+        return bool(edje_edit_program_transition_time_set(self.edje.obj, 
self.name, t))
 
     property api:
         def __get__(self):
             cdef:
                 const_char *name
                 const_char *desc
-            name = edje_edit_program_api_name_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
-            desc = edje_edit_program_api_description_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            name = edje_edit_program_api_name_get(self.edje.obj, self.name)
+            desc = edje_edit_program_api_description_get(self.edje.obj, 
self.name)
             n, d = _ctouni(name), _ctouni(desc)
             edje_edit_string_free(name)
             edje_edit_string_free(desc)
@@ -232,29 +201,24 @@ cdef class Program(object):
             name, desc = value
             if isinstance(name, unicode): name = name.encode("UTF-8")
             if isinstance(desc, unicode): desc = desc.encode("UTF-8")
-            edje_edit_program_api_name_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+            edje_edit_program_api_name_set(self.edje.obj, self.name,
                     <const_char *>name if name is not None else NULL)
-            edje_edit_program_api_description_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+            edje_edit_program_api_description_set(self.edje.obj, self.name,
                     <const_char *>desc if desc is not None else NULL)
 
     property script:
         def __get__(self):
             cdef char *code
-            code = edje_edit_script_program_get(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL)
+            code = edje_edit_script_program_get(self.edje.obj, self.name)
             ret = _touni(code)
             free(code)
             return ret
 
         def __set__(self, code):
             if isinstance(code, unicode): code = code.encode("UTF-8")
-            edje_edit_script_program_set(self.edje.obj,
-                    <const_char *>self.name if self.name is not None else NULL,
+            edje_edit_script_program_set(self.edje.obj, self.name,
                     <const_char *>code if code is not None else NULL)
 
         def __del__(self):
-            edje_edit_script_program_set(self.edje.obj,
-                <const_char *>self.name if self.name is not None else NULL, 
NULL)
+            edje_edit_script_program_set(self.edje.obj, self.name, NULL)
 
diff --git a/include/efl.pxd b/include/efl.pxd
index 0dd7810..5663e10 100644
--- a/include/efl.pxd
+++ b/include/efl.pxd
@@ -113,6 +113,7 @@ cdef extern from "Eina.h":
     void              eina_stringshare_del(Eina_Stringshare *str)
     Eina_Stringshare *eina_stringshare_ref(Eina_Stringshare *str)
     int               eina_stringshare_strlen(Eina_Stringshare *str)
+    Eina_Bool         eina_stringshare_replace(Eina_Stringshare **p_str, 
const_char *news)
 
     Eina_List *eina_list_free(Eina_List *list)
     Eina_List *eina_list_append(Eina_List *list, void *data)
diff --git a/tests/edje/test_04_edit.py b/tests/edje/test_04_edit.py
index 67ba20e..7880864 100644
--- a/tests/edje/test_04_edit.py
+++ b/tests/edje/test_04_edit.py
@@ -466,10 +466,8 @@ class TestEdjeEditPartStates(unittest.TestCase):
         s = p.state_get("state1", 0.0)
         print(s)
         print(s.rel1_to_get())
-        
 
 
-        
 if __name__ == '__main__':
     unittest.main(verbosity=2)
     edje.shutdown()

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to