[Bf-blender-cvs] [eb9f9809128] functions: initial V shortcut to create group inputs

Jacques Lucke noreply at git.blender.org
Thu Dec 5 13:14:34 CET 2019


Commit: eb9f9809128c0cc1fd20da67a443feb1a50b6c0d
Author: Jacques Lucke
Date:   Thu Dec 5 12:43:41 2019 +0100
Branches: functions
https://developer.blender.org/rBeb9f9809128c0cc1fd20da67a443feb1a50b6c0d

initial V shortcut to create group inputs

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

M	release/scripts/startup/nodes/function_nodes/groups.py
A	release/scripts/startup/nodes/utils/pie_menu_helper.py

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

diff --git a/release/scripts/startup/nodes/function_nodes/groups.py b/release/scripts/startup/nodes/function_nodes/groups.py
index 2e8f3ec62ad..29a23697715 100644
--- a/release/scripts/startup/nodes/function_nodes/groups.py
+++ b/release/scripts/startup/nodes/function_nodes/groups.py
@@ -1,10 +1,12 @@
 import bpy
 from bpy.props import *
 from .. types import type_infos
-from .. base import BaseNode, FunctionNode
+from .. base import BaseNode, FunctionNode, DataSocket
 from .. function_tree import FunctionTree
 from .. node_builder import NodeBuilder
 from .. ui import NodeSidebarPanel
+from .. utils.pie_menu_helper import PieMenuHelper
+from .. sync import skip_syncing
 
 interface_type_items = [
     ("DATA", "Data", "Some data type like integer or vector", "NONE", 0),
@@ -62,8 +64,8 @@ class GroupInputNode(bpy.types.Node, BaseNode):
             self.invoke_type_selection(layout, "set_data_type", "Select Type")
 
     def draw_socket(self, layout, socket, text, decl, index):
-        row = layout.row()
-        row.prop(self, "display_settings", text="", icon="SETTINGS", emboss=False)
+        row = layout.row(align=True)
+        row.prop(self, "display_settings", text="", icon="SETTINGS")
         row.prop(self, "input_name", text="")
 
     def draw_closed_label(self):
@@ -118,8 +120,8 @@ class GroupOutputNode(bpy.types.Node, BaseNode):
             self.invoke_type_selection(layout, "set_type_type", "Select Type")
 
     def draw_socket(self, layout, socket, text, decl, index):
-        row = layout.row()
-        row.prop(self, "display_settings", text="", icon="SETTINGS", emboss=False)
+        row = layout.row(align=True)
+        row.prop(self, "display_settings", text="", icon="SETTINGS")
         row.prop(self, "output_name", text="")
 
     def draw_closed_label(self):
@@ -206,3 +208,103 @@ class GroupInterfacePanel(bpy.types.Panel, NodeSidebarPanel):
         col.label(text="Outputs:")
         for node in tree.get_output_nodes():
             layout.label(text=node.output_name)
+
+
+class ManageGroupPieMenu(bpy.types.Menu, PieMenuHelper):
+    bl_idname = "FN_MT_manage_group_pie"
+    bl_label = "Manage Group"
+
+    @classmethod
+    def poll(cls, context):
+        try: 
+            return isinstance(context.space_data.node_tree, FunctionTree)
+        except:
+            return False
+
+    def draw_left(self, layout):
+        node = bpy.context.active_node
+        possible_inputs = [(i, socket) for i, socket in enumerate(node.inputs) 
+                                       if socket_can_become_group_input(socket)]
+
+        if len(possible_inputs) == 0:
+            self.empty(layout, "No inputs.")
+        elif len(possible_inputs) == 1:
+            props = layout.operator("fn.create_group_input_for_socket", text="New Group Input")
+            props.input_index = possible_inputs[0][0]
+        else:
+            layout.operator("fn.create_group_input_for_socket_invoker", text="New Group Input")
+
+
+class CreateGroupInputForSocketInvoker(bpy.types.Operator):
+    bl_idname = "fn.create_group_input_for_socket_invoker"
+    bl_label = "Create Group Input for Socket Invoker"
+
+    def invoke(self, context, event):
+        context.window_manager.popup_menu(self.draw_menu)
+        return {"CANCELLED"}
+
+    @staticmethod
+    def draw_menu(menu, context):
+        node = bpy.context.active_node
+        if node is None:
+            return
+
+        layout = menu.layout.column()
+        layout.operator_context = "INVOKE_DEFAULT"
+
+        for i, socket in enumerate(node.inputs):
+            if socket_can_become_group_input(socket):
+                props = layout.operator("fn.create_group_input_for_socket", text=socket.name)
+                props.input_index = i
+
+
+class CreateGroupInputForSocket(bpy.types.Operator):
+    bl_idname = "fn.create_group_input_for_socket"
+    bl_label = "Create Group Input for Socket"
+
+    input_index: IntProperty()
+
+    def invoke(self, context, event):
+        tree = context.space_data.node_tree
+        node = context.active_node
+        socket = node.inputs[self.input_index]
+
+        node.select = False
+
+        with skip_syncing():
+            new_node = tree.nodes.new(type="fn_GroupInputNode")
+            new_node.sort_index = 1000
+            new_node.input_name = socket.name
+            new_node.interface_type = "DATA"
+            new_node.data_type = socket.data_type
+            new_node.select = True
+            new_node.parent = node.parent
+            new_node.location = node.location
+            new_node.location.x -= 200
+            new_node.rebuild()
+
+            tree.new_link(new_node.outputs[0], socket)
+
+        tree.sync()
+        bpy.ops.node.translate_attach("INVOKE_DEFAULT")
+        return {"FINISHED"}
+
+
+def socket_can_become_group_input(socket):
+    return socket.bl_idname != "fn_OperatorSocket" and not socket.is_linked
+
+
+keymap = None
+
+def register():
+    global keymap
+    keymap = bpy.context.window_manager.keyconfigs.addon.keymaps.new(
+        name="Node Editor", space_type="NODE_EDITOR")
+
+    kmi = keymap.keymap_items.new("wm.call_menu_pie", type="V", value="PRESS")
+    kmi.properties.name = "FN_MT_manage_group_pie"
+
+def unregister():
+    global keymap
+    bpy.context.window_manager.keyconfigs.addon.keymaps.remove(keymap)
+    keymap = None
\ No newline at end of file
diff --git a/release/scripts/startup/nodes/utils/pie_menu_helper.py b/release/scripts/startup/nodes/utils/pie_menu_helper.py
new file mode 100644
index 00000000000..b0ac542b189
--- /dev/null
+++ b/release/scripts/startup/nodes/utils/pie_menu_helper.py
@@ -0,0 +1,38 @@
+class PieMenuHelper:
+    def draw(self, context):
+        pie = self.layout.menu_pie()
+        self.draw_left(pie)
+        self.draw_right(pie)
+        self.draw_bottom(pie)
+        self.draw_top(pie)
+        self.draw_top_left(pie)
+        self.draw_top_right(pie)
+        self.draw_bottom_left(pie)
+        self.draw_bottom_right(pie)
+
+    def draw_left(self, layout):
+        self.empty(layout)
+
+    def draw_right(self, layout):
+        self.empty(layout)
+
+    def draw_bottom(self, layout):
+        self.empty(layout)
+
+    def draw_top(self, layout):
+        self.empty(layout)
+
+    def draw_top_left(self, layout):
+        self.empty(layout)
+
+    def draw_top_right(self, layout):
+        self.empty(layout)
+
+    def draw_bottom_left(self, layout):
+        self.empty(layout)
+
+    def draw_bottom_right(self, layout):
+        self.empty(layout)
+
+    def empty(self, layout, text=""):
+        layout.row().label(text=text)
\ No newline at end of file



More information about the Bf-blender-cvs mailing list