[Bf-blender-cvs] [bcc6b87881b] temp-node-tree-pages-prototype: support moving nodes between pages by holding ctrl and clicking on page

Jacques Lucke noreply at git.blender.org
Thu Mar 18 16:40:57 CET 2021


Commit: bcc6b87881bd481e93090a7e2004d469670416f1
Author: Jacques Lucke
Date:   Thu Mar 18 16:40:47 2021 +0100
Branches: temp-node-tree-pages-prototype
https://developer.blender.org/rBbcc6b87881bd481e93090a7e2004d469670416f1

support moving nodes between pages by holding ctrl and clicking on page

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

M	release/scripts/startup/bl_operators/node.py
M	release/scripts/startup/bl_ui/space_node.py

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

diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py
index 56cdfa8007d..0a202f953ba 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -370,10 +370,10 @@ def get_current_page(context):
                 return page
     return None
 
-class NODE_OT_goto_page(Operator):
-    '''Goto page'''
-    bl_idname = "node.goto_page"
-    bl_label = "Goto Page"
+class NODE_OT_view_page(Operator):
+    '''View page'''
+    bl_idname = "node.view_page"
+    bl_label = "View Page"
 
     page: bpy.props.IntProperty(default=0)
 
@@ -382,6 +382,12 @@ class NODE_OT_goto_page(Operator):
         space = context.space_data
         return space.type == 'NODE_EDITOR'
 
+    def invoke(self, context, event):
+        if event.ctrl:
+            bpy.ops.node.move_to_page('INVOKE_DEFAULT', page=self.page)
+            return {'FINISHED'}
+        return self.execute(context)
+
     def execute(self, context):
         space = context.space_data
         ntree = space.node_tree
@@ -410,61 +416,38 @@ class NODE_OT_goto_page(Operator):
 
         return {'FINISHED'}
 
+class NODE_OT_move_to_page(Operator):
+    '''Move to page'''
+    bl_idname = "node.move_to_page"
+    bl_label = "Move to Page"
 
-copied_portal = None
-
-def get_nodes_with_portal_id(ntree, portal_id):
-    return [n for n in ntree.nodes if getattr(n, "portal_id", None) == portal_id]
-
-class NODE_OT_copy_portal(Operator):
-    '''Copy portal'''
-    bl_idname = "node.copy_portal"
-    bl_label = "Copy Portal"
+    page: IntProperty()
 
     @classmethod
     def poll(cls, context):
-        try:
-            context.space_data.node_tree.nodes.active.portal_id
-            return True
-        except:
-            return False
+        space = context.space_data
+        return space.type == 'NODE_EDITOR'
 
     def execute(self, context):
-        global copied_portal
-        node = context.space_data.node_tree.nodes.active
-        copied_portal = (node.bl_idname, node.portal_id)
-        return {'FINISHED'}
-
-class NODE_OT_paste_portal(Operator):
-    '''Paste portal'''
-    bl_idname = "node.paste_portal"
-    bl_label = "Paste Portal"
-
-    @classmethod
-    def poll(cls, context):
-        if context.space_data.type != 'NODE_EDITOR':
-            return False
         ntree = context.space_data.node_tree
-        if ntree is None:
-            return False
-        if copied_portal is None:
-            return False
-        return len(get_nodes_with_portal_id(ntree, copied_portal[1])) == 1
+        nodes_to_move = [n for n in ntree.nodes if n.select]
+        if len(nodes_to_move) == 0:
+            return {'CANCELLED'}
 
-    def invoke(self, context, event):
-        global copied_portal
+        old_center = sum((n.location for n in nodes_to_move), Vector((0, 0))) / len(nodes_to_move)
+        new_center = get_page_center(self.page)
+        offset = new_center - old_center
 
-        ntree = context.space_data.node_tree
-        new_idname = "NodePortalIn" if copied_portal[0] == "NodePortalOut" else "NodePortalOut"
+        view2d = context.region.view2d
+        old_center_region = Vector(view2d.view_to_region(old_center.x, old_center.y, clip=False))
+        new_center_region = Vector(view2d.view_to_region(new_center.x, new_center.y, clip=False))
+        offset_region = new_center_region - old_center_region
 
-        bpy.ops.node.add_and_link_node(type=new_idname)
-        new_node = ntree.nodes[-1]
+        for node in nodes_to_move:
+            node.location += offset
 
-        new_node.portal_id = copied_portal[1]
-
-        bpy.ops.node.translate_attach("INVOKE_DEFAULT")
+        bpy.ops.view2d.pan(deltax=offset_region.x, deltay=offset_region.y)
 
-        copied_portal = None
         return {'FINISHED'}
 
 class NODE_OT_add_portal(Operator):
@@ -511,8 +494,7 @@ classes = (
     NODE_OT_collapse_hide_unused_toggle,
     NODE_OT_tree_path_parent,
     NODE_OT_follow_portal,
-    NODE_OT_goto_page,
-    NODE_OT_copy_portal,
-    NODE_OT_paste_portal,
+    NODE_OT_view_page,
     NODE_OT_add_portal,
+    NODE_OT_move_to_page,
 )
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index cda255f73a9..6ddafdf5c79 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -175,13 +175,9 @@ class NODE_HT_header(Header):
             for page in range(1, 6):
                 subrow = row.row(align=True)
                 subrow.enabled = page != current_page
-                props = subrow.operator("node.goto_page", text=str(page))
+                props = subrow.operator("node.view_page", text=str(page))
                 props.page = page
 
-            row = layout.row(align=True)
-            row.operator("node.copy_portal", text="Copy Portal")
-            row.operator("node.paste_portal", text="Paste Portal")
-
         else:
             # Custom node tree is edited as independent ID block
             NODE_MT_editor_menus.draw_collapsible(context, layout)



More information about the Bf-blender-cvs mailing list