[Bf-blender-cvs] [08da311c744] functions: dynamically add and remove sockets
Jacques Lucke
noreply at git.blender.org
Wed Feb 20 17:21:21 CET 2019
Commit: 08da311c744260a8b0f731da511b7138470ba5c0
Author: Jacques Lucke
Date: Wed Feb 20 15:05:47 2019 +0100
Branches: functions
https://developer.blender.org/rB08da311c744260a8b0f731da511b7138470ba5c0
dynamically add and remove sockets
===================================================================
M release/scripts/startup/function_nodes/base.py
M release/scripts/startup/function_nodes/nodes/function_input.py
M release/scripts/startup/function_nodes/nodes/function_output.py
M release/scripts/startup/function_nodes/sockets.py
===================================================================
diff --git a/release/scripts/startup/function_nodes/base.py b/release/scripts/startup/function_nodes/base.py
index d4eb0ebc46d..7e30d4ab903 100644
--- a/release/scripts/startup/function_nodes/base.py
+++ b/release/scripts/startup/function_nodes/base.py
@@ -14,14 +14,31 @@ class BaseNode:
def draw(self, layout):
pass
- def invoke_function(self, layout, function_name, text, *, settings=tuple()):
+ def invoke_function(self,
+ layout, function_name, text,
+ *, icon="NONE", settings=tuple()):
assert isinstance(settings, tuple)
- props = layout.operator("fn.node_operator", text=text)
+ props = layout.operator("fn.node_operator", text=text, icon=icon)
props.tree_name = self.id_data.name
props.node_name = self.name
props.function_name = function_name
props.settings_repr = repr(settings)
+ def draw_socket(self, socket, layout, text):
+ socket.draw_self(layout, self, text)
+
+class BaseSocket:
+ color = (0, 0, 0, 0)
+
+ def draw_color(self, context, node):
+ return self.color
+
+ def draw(self, context, layout, node, text):
+ node.draw_socket(self, layout, text)
+
+ def draw_self(self, layout, node, text):
+ layout.label(text=text)
+
class FunctionNode(BaseNode):
def init(self, context):
inputs, outputs = self.get_sockets()
@@ -33,15 +50,10 @@ class FunctionNode(BaseNode):
def get_sockets():
return [], []
-class DataSocket:
- color = (0, 0, 0, 0)
-
- def draw_color(self, context, node):
- return self.color
-
- def draw(self, context, layout, node, text):
+class DataSocket(BaseSocket):
+ def draw_self(self, layout, node, text):
if not (self.is_linked or self.is_output) and hasattr(self, "draw_property"):
- self.draw_property(layout, text, node)
+ self.draw_property(layout, node, text)
else:
layout.label(text=text)
diff --git a/release/scripts/startup/function_nodes/nodes/function_input.py b/release/scripts/startup/function_nodes/nodes/function_input.py
index 28b4d6e6642..c05851e270e 100644
--- a/release/scripts/startup/function_nodes/nodes/function_input.py
+++ b/release/scripts/startup/function_nodes/nodes/function_input.py
@@ -6,7 +6,28 @@ class FunctionInputNode(BaseNode, bpy.types.Node):
bl_label = "Function Input"
def init(self, context):
- self.outputs.new("fn_VectorSocket", "Position")
- self.outputs.new("fn_FloatSocket", "Control")
+ pass
+
+ def draw(self, layout):
+ col = layout.column(align=True)
+ self.invoke_function(col, "new_socket",
+ "New Float", settings=("fn_FloatSocket", ))
+ self.invoke_function(col, "new_socket",
+ "New Vector", settings=("fn_VectorSocket", ))
+
+ def draw_socket(self, socket, layout, text):
+ row = layout.row(align=True)
+ row.prop(socket, "name", text="")
+
+ index = list(self.outputs).index(socket)
+ self.invoke_function(row, "remove_socket",
+ text="", icon="X", settings=(index, ))
+
+ def new_socket(self, idname):
+ self.outputs.new(idname, "Output")
+
+ def remove_socket(self, index):
+ self.outputs.remove(self.outputs[index])
+
bpy.utils.register_class(FunctionInputNode)
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/nodes/function_output.py b/release/scripts/startup/function_nodes/nodes/function_output.py
index 5490ba27e7d..a85d7beb1e9 100644
--- a/release/scripts/startup/function_nodes/nodes/function_output.py
+++ b/release/scripts/startup/function_nodes/nodes/function_output.py
@@ -9,12 +9,24 @@ class FunctionOutputNode(BaseNode, bpy.types.Node):
pass
def draw(self, layout):
- self.invoke_function(layout, "new_socket",
+ col = layout.column(align=True)
+ self.invoke_function(col, "new_socket",
"New Float", settings=("fn_FloatSocket", ))
- self.invoke_function(layout, "new_socket",
+ self.invoke_function(col, "new_socket",
"New Vector", settings=("fn_VectorSocket", ))
+ def draw_socket(self, socket, layout, text):
+ row = layout.row(align=True)
+ row.prop(socket, "name", text="")
+
+ index = list(self.inputs).index(socket)
+ self.invoke_function(row, "remove_socket",
+ text="", icon="X", settings=(index, ))
+
def new_socket(self, idname):
self.inputs.new(idname, "Output")
+ def remove_socket(self, index):
+ self.inputs.remove(self.inputs[index])
+
bpy.utils.register_class(FunctionOutputNode)
\ No newline at end of file
diff --git a/release/scripts/startup/function_nodes/sockets.py b/release/scripts/startup/function_nodes/sockets.py
index acc8d4b7986..a7821c897cd 100644
--- a/release/scripts/startup/function_nodes/sockets.py
+++ b/release/scripts/startup/function_nodes/sockets.py
@@ -12,7 +12,7 @@ class FloatSocket(bpy.types.NodeSocket, DataSocket):
default=0.0,
)
- def draw_property(self, layout, text, node):
+ def draw_property(self, layout, node, text):
layout.prop(self, "value", text=text)
class VectorSocket(bpy.types.NodeSocket, DataSocket):
@@ -26,7 +26,7 @@ class VectorSocket(bpy.types.NodeSocket, DataSocket):
default=(0.0, 0.0, 0.0),
)
- def draw_property(self, layout, text, node):
+ def draw_property(self, layout, node, text):
layout.column().prop(self, "value", text=text)
bpy.utils.register_class(FloatSocket)
More information about the Bf-blender-cvs
mailing list