[Bf-blender-cvs] [d98e05f4b56] temp-node-tree-pages-prototype: initial pages

Jacques Lucke noreply at git.blender.org
Thu Mar 18 13:51:19 CET 2021


Commit: d98e05f4b56d5d10e23bdfcfb0f2b992bd4a59dc
Author: Jacques Lucke
Date:   Thu Mar 18 12:48:45 2021 +0100
Branches: temp-node-tree-pages-prototype
https://developer.blender.org/rBd98e05f4b56d5d10e23bdfcfb0f2b992bd4a59dc

initial pages

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

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 67723cfb3bc..5d3d2192a77 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -21,6 +21,7 @@ from __future__ import annotations
 
 import bpy
 import nodeitems_utils
+from mathutils import Vector
 from bpy.types import (
     Operator,
     PropertyGroup,
@@ -343,6 +344,59 @@ class NODE_OT_follow_portal(Operator):
         bpy.ops.node.view_selected()
         return {'FINISHED'}
 
+PAGE_SIZE = 10000
+
+def get_page_center(page):
+    return Vector((page * PAGE_SIZE, 0))
+
+def node_is_on_page(node, page):
+    page_center = get_page_center(page)
+    return (abs(page_center.x - node.location.x) < PAGE_SIZE / 2
+        and abs(page_center.y - node.location.y) < PAGE_SIZE / 2)
+
+def get_nodes_on_page(ntree, page):
+    return [n for n in ntree.nodes if node_is_on_page(n, page)]
+
+class NODE_OT_goto_page(Operator):
+    '''Goto page'''
+    bl_idname = "node.goto_page"
+    bl_label = "Goto Page"
+
+    page: bpy.props.IntProperty(default=0)
+
+    @classmethod
+    def poll(cls, context):
+        space = context.space_data
+        return space.type == 'NODE_EDITOR'
+
+    def execute(self, context):
+        space = context.space_data
+        ntree = space.node_tree
+        for node in ntree.nodes:
+            node.select = False
+
+        nodes_on_page = get_nodes_on_page(ntree, self.page)
+        if len(nodes_on_page) > 0:
+            for node in nodes_on_page:
+                node.select = True
+            bpy.ops.node.view_selected()
+            for node in nodes_on_page:
+                node.select = False
+            ntree.nodes.active = None
+        else:
+            page_center = get_page_center(self.page)
+            new_node = ntree.nodes.new('NodeReroute')
+            new_node.select = True
+            new_node.location = page_center
+
+            context_copy = context.copy()
+            def update_after_draw():
+                bpy.ops.node.view_selected(context_copy)
+                ntree.nodes.remove(new_node)
+            bpy.app.timers.register(update_after_draw, first_interval=0.01)
+
+        return {'FINISHED'}
+
 
 classes = (
     NodeSetting,
@@ -353,4 +407,5 @@ classes = (
     NODE_OT_collapse_hide_unused_toggle,
     NODE_OT_tree_path_parent,
     NODE_OT_follow_portal,
+    NODE_OT_goto_page,
 )
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 7f66cdd3d74..706a9fe4585 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -168,6 +168,11 @@ class NODE_HT_header(Header):
                 else:
                     row.template_ID(snode, "node_tree", new="node.new_geometry_nodes_modifier")
 
+            row = layout.row(align=True)
+            for page in range(5):
+                props = row.operator("node.goto_page", text=str(page))
+                props.page = page
+
         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