[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24598] trunk/blender/release/scripts: property editor for bone and object ID props, add/remove/edit

Campbell Barton ideasman42 at gmail.com
Mon Nov 16 23:53:28 CET 2009


Revision: 24598
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24598
Author:   campbellbarton
Date:     2009-11-16 23:53:28 +0100 (Mon, 16 Nov 2009)

Log Message:
-----------
property editor for bone and object ID props, add/remove/edit
good example of how editing NON rna data results in very weired scripts :/

Modified Paths:
--------------
    trunk/blender/release/scripts/op/wm.py
    trunk/blender/release/scripts/ui/properties_data_bone.py
    trunk/blender/release/scripts/ui/properties_object.py

Added Paths:
-----------
    trunk/blender/release/scripts/modules/rna_prop_ui.py

Added: trunk/blender/release/scripts/modules/rna_prop_ui.py
===================================================================
--- trunk/blender/release/scripts/modules/rna_prop_ui.py	                        (rev 0)
+++ trunk/blender/release/scripts/modules/rna_prop_ui.py	2009-11-16 22:53:28 UTC (rev 24598)
@@ -0,0 +1,218 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+EVIL_PROP = "act_property"
+EVIL_PROP_PATH = EVIL_PROP + '_path'
+EVIL_PROP_VALUE = EVIL_PROP + '_value'
+EVIL_PROP_PROP = EVIL_PROP + '_prop'
+EVIL_PROP_PROP_ORIG = EVIL_PROP + '_prop_orig'
+
+# nasty!, use a scene property to store the active edit item
+def evil_prop_init():
+    Scene = bpy.types.Scene
+    if EVIL_PROP_PROP_ORIG not in Scene.bl_rna.properties:
+        Scene.StringProperty(attr=EVIL_PROP_PATH)
+        Scene.StringProperty(attr=EVIL_PROP_VALUE)
+        Scene.StringProperty(attr=EVIL_PROP_PROP)
+        Scene.StringProperty(attr=EVIL_PROP_PROP_ORIG)
+
+
+def draw(layout, context, context_member):
+    
+    def assign_props(prop, val, key):
+        prop.path = context_member
+        prop.property = key
+        
+        try:
+            prop.value = str(val)
+        except:
+            pass
+    
+    rna_item = eval("context." + context_member)
+    
+    evil_prop_init()
+
+    scene = context.scene
+    
+    global_path = getattr(scene, EVIL_PROP_PATH)
+    global_value = getattr(scene, EVIL_PROP_VALUE)
+    global_prop = getattr(scene, EVIL_PROP_PROP)
+    global_prop_orig = getattr(scene, EVIL_PROP_PROP_ORIG)
+    
+    # print((global_path, global_value, global_prop, global_prop_orig))
+
+    items = rna_item.items()
+    items.sort()
+    
+    row = layout.row()
+    props = row.itemO("wm.properties_add", properties=True, text="Add")
+    props.path = context_member
+    
+    for key, val in items:
+        row = layout.row()
+        
+        try:
+            val_draw = val = val.convert_to_pyobject()
+        except:
+            if type(val)==str:
+                val_draw = '"' + val + '"'
+            else:
+                val_draw = val
+        
+        box = row.box()
+        
+        
+        if key == global_prop_orig and context_member == global_path:
+            split = box.split(percentage=0.7)
+            
+            col = split.row()
+            col.itemR(scene, EVIL_PROP_PROP)
+            col.itemR(scene, EVIL_PROP_VALUE)
+            
+            col = split.column()
+            prop = col.itemO("wm.properties_edit_end", properties=True, text="done")
+            assign_props(prop, val, key)
+            
+        else:
+            split = box.split(percentage=0.5)
+            col = split.column()
+            col.itemL(text="%s = %s" % (key, str(val_draw)))
+            
+            col = split.column()
+            prop = col.itemO("wm.properties_edit_begin", properties=True, text="edit")
+            assign_props(prop, val, key)
+            
+            col = split.column()
+            prop = col.itemO("wm.properties_remove", properties=True, text="del")
+            assign_props(prop, val, key)
+    
+
+from bpy.props import *
+
+
+rna_path = StringProperty(name="Property Edit",
+    description="Property path edit", maxlen=1024, default="")
+
+rna_value = StringProperty(name="Property Value",
+    description="Property value edit", maxlen=1024, default="")
+
+rna_property = StringProperty(name="Property Name",
+    description="Property name edit", maxlen=1024, default="")
+
+class WM_OT_properties_edit_begin(bpy.types.Operator):
+    '''Internal use (edit a property path)'''
+    bl_idname = "wm.properties_edit_begin"
+    bl_label = "Edit Property"
+
+    path = rna_path
+    value = rna_value
+    property = rna_property
+
+    def execute(self, context):
+        scene = context.scene
+        
+        setattr(scene, EVIL_PROP_PATH, self.path)
+        setattr(scene, EVIL_PROP_VALUE, self.value)
+        setattr(scene, EVIL_PROP_PROP, self.property)
+        setattr(scene, EVIL_PROP_PROP_ORIG, self.property)
+        
+        return ('FINISHED',)
+
+
+class WM_OT_properties_edit_end(bpy.types.Operator):
+    '''Internal use (edit a property path)'''
+    bl_idname = "wm.properties_edit_end"
+    bl_label = "Edit Property"
+
+    path = rna_path
+    value = rna_value
+    property = rna_property
+
+    def execute(self, context):
+        
+        scene = context.scene
+        global_path = getattr(scene, EVIL_PROP_PATH)
+        global_value = getattr(scene, EVIL_PROP_VALUE)
+        global_prop = getattr(scene, EVIL_PROP_PROP)
+        
+        setattr(scene, EVIL_PROP_PATH, "")
+        setattr(scene, EVIL_PROP_VALUE, "")
+        setattr(scene, EVIL_PROP_PROP, "")
+        setattr(scene, EVIL_PROP_PROP_ORIG, "")
+        
+        try:
+            value = eval(global_value)
+        except:
+            value = '"' + global_value + '"' # keep as a string
+        
+        
+        # First remove
+        exec_str = "del context.%s['%s']" % (global_path, self.property)
+        # print(exec_str)
+        exec(exec_str)
+        
+        
+        # Reassign
+        exec_str = "context.%s['%s'] = %s" % (global_path, global_prop, value)
+        # print(exec_str)
+        exec(exec_str)
+        
+        return ('FINISHED',)
+
+
+class WM_OT_properties_add(bpy.types.Operator):
+    '''Internal use (edit a property path)'''
+    bl_idname = "wm.properties_add"
+    bl_label = "Add Property"
+
+    path = rna_path
+
+    def execute(self, context):
+        item = eval("context.%s" % self.path)
+        
+        def unique_name(names):
+            prop = 'prop'
+            prop_new = prop
+            i = 1
+            while prop_new in names:
+                prop_new = prop + str(i)
+                i+=1
+        
+            return prop_new
+        
+        property = unique_name(item.keys())
+        
+        item[property] = 1.0
+        return ('FINISHED',)
+        
+class WM_OT_properties_remove(bpy.types.Operator):
+    '''Internal use (edit a property path)'''
+    bl_idname = "wm.properties_remove"
+    bl_label = "Add Property"
+
+    path = rna_path
+    property = rna_property
+
+    def execute(self, context):
+        item = eval("context.%s" % self.path)
+        del item[self.property]
+        return ('FINISHED',)        

Modified: trunk/blender/release/scripts/op/wm.py
===================================================================
--- trunk/blender/release/scripts/op/wm.py	2009-11-16 22:21:39 UTC (rev 24597)
+++ trunk/blender/release/scripts/op/wm.py	2009-11-16 22:53:28 UTC (rev 24598)
@@ -392,7 +392,6 @@
         '''
         return ('FINISHED',)
 
-
 bpy.ops.add(MESH_OT_delete_edgeloop)
 
 bpy.ops.add(WM_OT_context_set_boolean)
@@ -409,3 +408,10 @@
 bpy.ops.add(WM_OT_doc_edit)
 
 bpy.ops.add(WM_OT_reload_scripts)
+
+# experemental!
+import rna_prop_ui
+bpy.ops.add(rna_prop_ui.WM_OT_properties_edit_begin)
+bpy.ops.add(rna_prop_ui.WM_OT_properties_edit_end)
+bpy.ops.add(rna_prop_ui.WM_OT_properties_add)
+bpy.ops.add(rna_prop_ui.WM_OT_properties_remove)

Modified: trunk/blender/release/scripts/ui/properties_data_bone.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_data_bone.py	2009-11-16 22:21:39 UTC (rev 24597)
+++ trunk/blender/release/scripts/ui/properties_data_bone.py	2009-11-16 22:53:28 UTC (rev 24598)
@@ -274,9 +274,22 @@
         col.itemL(text="Offset:")
         col.itemR(bone, "cyclic_offset")
 
+class BONE_PT_properties(BoneButtonsPanel):
+    bl_label = "Properties"
+    bl_default_closed = True
+
+    def draw(self, context):
+        import rna_prop_ui
+        # reload(rna_prop_ui)
+        
+        rna_prop_ui.draw(self.layout, context, "active_bone")
+        
+        
+
 bpy.types.register(BONE_PT_context_bone)
 bpy.types.register(BONE_PT_transform)
 bpy.types.register(BONE_PT_transform_locks)
 bpy.types.register(BONE_PT_relations)
 bpy.types.register(BONE_PT_display)
 bpy.types.register(BONE_PT_deform)
+bpy.types.register(BONE_PT_properties)

Modified: trunk/blender/release/scripts/ui/properties_object.py
===================================================================
--- trunk/blender/release/scripts/ui/properties_object.py	2009-11-16 22:21:39 UTC (rev 24597)
+++ trunk/blender/release/scripts/ui/properties_object.py	2009-11-16 22:53:28 UTC (rev 24598)
@@ -292,6 +292,17 @@
         row.itemR(ob, "track_override_parent", text="Override Parent")
         row.active = ob.parent != None
 
+
+class OBJECT_PT_properties(ObjectButtonsPanel):
+    bl_label = "Properties"
+    bl_default_closed = True
+
+    def draw(self, context):
+        import rna_prop_ui
+        # reload(rna_prop_ui)
+        
+        rna_prop_ui.draw(self.layout, context, "object")
+
 bpy.types.register(OBJECT_PT_context_object)
 bpy.types.register(OBJECT_PT_transform)
 bpy.types.register(OBJECT_PT_transform_locks)
@@ -300,3 +311,4 @@
 bpy.types.register(OBJECT_PT_display)
 bpy.types.register(OBJECT_PT_duplication)
 bpy.types.register(OBJECT_PT_animation)
+bpy.types.register(OBJECT_PT_properties)





More information about the Bf-blender-cvs mailing list