Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-08-08 21:02:14 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-08-08 21:02:14 +0400
commitde131177b0ccfa9c65b9edca97f6349ebc3b6b07 (patch)
tree738aa58076536b157ac16dbbbc0f6928ae3a3e7c /release/scripts/startup/bl_operators/node.py
parentc21bf16c46a095ab0508793315cb236d93b17fee (diff)
code cleanup: lazy init enum for node search
Diffstat (limited to 'release/scripts/startup/bl_operators/node.py')
-rw-r--r--release/scripts/startup/bl_operators/node.py46
1 files changed, 28 insertions, 18 deletions
diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py
index 0927f13f5d7..f9ecc1b9802 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -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 @@ from bpy.props import (EnumProperty,
# 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 @@ class NODE_OT_add_search(bpy.types.Operator):
# 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'}
-