[Bf-blender-cvs] [54229b8e820] functions: support for removing execute sockets

Jacques Lucke noreply at git.blender.org
Tue Dec 17 13:53:44 CET 2019


Commit: 54229b8e820abd62d0c7b2db2269abc896e37450
Author: Jacques Lucke
Date:   Tue Dec 17 10:39:32 2019 +0100
Branches: functions
https://developer.blender.org/rB54229b8e820abd62d0c7b2db2269abc896e37450

support for removing execute sockets

===================================================================

M	release/scripts/startup/nodes/declaration/bparticles.py
M	source/blender/simulations/bparticles/node_frontend.cpp

===================================================================

diff --git a/release/scripts/startup/nodes/declaration/bparticles.py b/release/scripts/startup/nodes/declaration/bparticles.py
index 2b97d127062..067c798a3c8 100644
--- a/release/scripts/startup/nodes/declaration/bparticles.py
+++ b/release/scripts/startup/nodes/declaration/bparticles.py
@@ -1,7 +1,8 @@
 import bpy
+import uuid
 from bpy.props import *
 from . base import SocketDeclBase
-from .. sockets import OperatorSocket
+from .. sockets import OperatorSocket, ExecuteSocket
 
 MAX_LINK_LIMIT = 4095
 
@@ -88,11 +89,12 @@ class ExecuteInputListDecl(SocketDeclBase):
         return list(self._build(node_sockets))
 
     def _build(self, node_sockets):
-        for i in range(self.get_execute_amount()):
+        items = self.get_items()
+        for i, item in enumerate(items):
             socket = node_sockets.new(
                 "fn_ExecuteSocket",
-                self.display_name,
-                identifier=self.identifier_prefix + str(i))
+                self.display_name if i == 0 else "Then",
+                identifier=item.identifier)
             socket.display_shape = 'SQUARE'
             yield socket
         socket = node_sockets.new(
@@ -103,18 +105,17 @@ class ExecuteInputListDecl(SocketDeclBase):
         yield socket
 
     def amount(self):
-        return self.get_execute_amount() + 1
+        return len(self.get_items()) + 1
 
-    def get_execute_amount(self):
+    def get_items(self):
         return getattr(self.node, self.prop_name)
 
     def validate(self, sockets):
         if len(sockets) != self.amount():
             return False
 
-        for i, socket in enumerate(sockets[:-1]):
-            expected_identifier = self.identifier_prefix + str(i)
-            if socket.identifier != expected_identifier:
+        for socket, item in zip(sockets[:-1], self.get_items()):
+            if socket.identifier != item.identifier:
                 return False
             elif socket.bl_idname != "fn_ExecuteSocket":
                 return False
@@ -129,22 +130,50 @@ class ExecuteInputListDecl(SocketDeclBase):
         return True
 
     def draw_socket(self, layout, socket, index):
+        row = layout.row(align=True)
         if index == 0:
-            layout.label(text=self.display_name)
-        else :
-            layout.label(text="Then")
+            row.label(text=self.display_name)
+        else:
+            row.label(text="Then")
+        if isinstance(socket, ExecuteSocket):
+            props = row.operator("fn.remove_execute_socket", text="", icon="X")
+            props.tree_name = socket.id_data.name
+            props.node_name = self.node.name
+            props.prop_name = self.prop_name
+            props.index = index
 
     def operator_socket_call(self, own_socket, linked_socket, connected_sockets):
-        old_amount = self.get_execute_amount()
-        new_amount = old_amount + 1
-        new_identifier = self.identifier_prefix + str(old_amount)
-        setattr(self.node, self.prop_name, new_amount)
+        item = self.get_items().add()
+        item.identifier = str(uuid.uuid4())
 
         self.node.rebuild()
 
-        new_socket = self.node.find_socket(new_identifier, False)
+        new_socket = self.node.find_socket(item.identifier, False)
         self.node.tree.new_link(linked_socket, new_socket)
 
     @classmethod
     def Property(cls):
-        return IntProperty(default=0)
+        return CollectionProperty(type=ExecuteInputItem)
+
+
+class ExecuteInputItem(bpy.types.PropertyGroup):
+    identifier: StringProperty()
+
+
+class RemoveExecuteSocketOperator(bpy.types.Operator):
+    bl_idname = "fn.remove_execute_socket"
+    bl_label = "Remove Execute Socket"
+    bl_options = {'INTERNAL'}
+
+    tree_name: StringProperty()
+    node_name: StringProperty()
+    prop_name: StringProperty()
+    index: IntProperty()
+
+    def execute(self, context):
+        tree = bpy.data.node_groups[self.tree_name]
+        node = tree.nodes[self.node_name]
+        collection = getattr(node, self.prop_name)
+        collection.remove(self.index)
+        tree.sync()
+        return {'FINISHED'}
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 78e2211babb..bc6b6072d13 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -310,24 +310,28 @@ class InlinedTreeData {
 
   Vector<const XInputSocket *> find_execute_sockets(const XNode &xnode, StringRef name_prefix)
   {
-    bool found_name = false;
-    Vector<const XInputSocket *> execute_sockets;
+    int first_index = -1;
     for (const XInputSocket *xsocket : xnode.inputs()) {
-      if (StringRef(xsocket->name()).startswith(name_prefix)) {
-        if (xsocket->idname() == "fn_OperatorSocket") {
-          found_name = true;
-          break;
-        }
-        else {
-          execute_sockets.append(xsocket);
-        }
+      if (xsocket->name() == name_prefix) {
+        first_index = xsocket->index();
+        break;
+      }
+    }
+    BLI_assert(first_index >= 0);
+
+    Vector<const XInputSocket *> execute_sockets;
+    for (const XInputSocket *xsocket : xnode.inputs().drop_front(first_index)) {
+      if (xsocket->idname() == "fn_OperatorSocket") {
+        break;
+      }
+      else {
+        execute_sockets.append(xsocket);
       }
     }
-    BLI_assert(found_name);
-    UNUSED_VARS_NDEBUG(found_name);
+
     return execute_sockets;
   }
-};  // namespace BParticles
+};
 
 class XSocketActionBuilder {
  private:



More information about the Bf-blender-cvs mailing list