[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49710] trunk/blender/release/scripts/ startup/bl_operators/node.py: code cleanup: lazy init enum for node search

Campbell Barton ideasman42 at gmail.com
Wed Aug 8 19:02:14 CEST 2012


Revision: 49710
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49710
Author:   campbellbarton
Date:     2012-08-08 17:02:14 +0000 (Wed, 08 Aug 2012)
Log Message:
-----------
code cleanup: lazy init enum for node search

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_operators/node.py

Modified: trunk/blender/release/scripts/startup/bl_operators/node.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_operators/node.py	2012-08-08 16:49:12 UTC (rev 49709)
+++ trunk/blender/release/scripts/startup/bl_operators/node.py	2012-08-08 17:02:14 UTC (rev 49710)
@@ -20,11 +20,7 @@
 
 import bpy
 from bpy.types import Operator
-from bpy.props import (EnumProperty,
-                       FloatVectorProperty,
-                       StringProperty,
-                       CollectionProperty
-                       )
+from bpy.props import EnumProperty
 
 # XXX These node item lists should actually be generated by a callback at operator execution time (see node_type_items below),
 # using the active node tree from the context. Due to a difficult bug in bpy this is not possible (item list memory gets freed too early),
@@ -33,51 +29,66 @@
 # In the custom_nodes branch, the static per-tree-type node items are replaced by a single independent type list anyway (with a poll function
 # to limit node types to the respective trees). So this workaround is only temporary.
 
+# lazy init
 node_type_items_dict = {}
-node_type_items_dict['SHADER'] = [(item.identifier, item.name, item.description, item.value) for item in bpy.types.ShaderNode.bl_rna.properties['type'].enum_items]
-node_type_items_dict['COMPOSITING'] = [(item.identifier, item.name, item.description, item.value) for item in bpy.types.CompositorNode.bl_rna.properties['type'].enum_items]
-node_type_items_dict['TEXTURE'] = [(item.identifier, item.name, item.description, item.value) for item in bpy.types.TextureNode.bl_rna.properties['type'].enum_items]
 
 # Returns the enum item list for the edited tree in the context
-def node_type_items(self, context):
+def node_type_items_cb(self, context):
     snode = context.space_data
     if not snode:
         return []
     tree = snode.edit_tree
     if not tree:
         return []
-    
+
+    if not node_type_items_dict:
+        node_type_items_dict.update({
+            'SHADER': [(item.identifier, item.name, item.description, item.value)
+                    for item in bpy.types.ShaderNode.bl_rna.properties['type'].enum_items],
+            'COMPOSITING': [(item.identifier, item.name, item.description, item.value)
+                    for item in bpy.types.CompositorNode.bl_rna.properties['type'].enum_items],
+            'TEXTURE': [(item.identifier, item.name, item.description, item.value)
+                    for item in bpy.types.TextureNode.bl_rna.properties['type'].enum_items],
+            })
+
     # XXX Does not work correctly, see comment above
     #return [(item.identifier, item.name, item.description, item.value) for item in tree.nodes.bl_rna.functions['new'].parameters['type'].enum_items]
-    
+
     if tree.type in node_type_items_dict:
         return node_type_items_dict[tree.type]
     else:
         return []
 
-class NODE_OT_add_search(bpy.types.Operator):
+
+class NODE_OT_add_search(Operator):
     '''Add a node to the active tree'''
     bl_idname = "node.add_search"
     bl_label = "Search and Add Node"
     bl_options = {'REGISTER', 'UNDO'}
 
     # XXX this should be called 'node_type' but the operator search property is hardcoded to 'type' by a hack in bpy_operator_wrap.c ...
-    type = EnumProperty(items=node_type_items, name="Node Type", description="Node type")
+    type = EnumProperty(
+            name="Node Type",
+            description="Node type",
+            items=node_type_items_cb,
+            )
 
+    _node_type_items_dict = None
+
     def create_node(self, context):
         space = context.space_data
         tree = space.edit_tree
-        
+
         node = tree.nodes.new(type=self.type)
         for n in tree.nodes:
-            if n==node:
+            if n == node:
                 node.select = True
                 tree.nodes.active = node
             else:
                 node.select = False
         node.location = space.cursor_location
         return node
-    
+
     @classmethod
     def poll(cls, context):
         space = context.space_data
@@ -94,7 +105,6 @@
 
         # convert mouse position to the View2D for later node placement
         space.cursor_location = v2d.region_to_view(event.mouse_region_x, event.mouse_region_y)
-        
+
         context.window_manager.invoke_search_popup(self)
         return {'CANCELLED'}
-




More information about the Bf-blender-cvs mailing list