[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