Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_node/node_view.cc')
-rw-r--r--source/blender/editors/space_node/node_view.cc90
1 files changed, 90 insertions, 0 deletions
diff --git a/source/blender/editors/space_node/node_view.cc b/source/blender/editors/space_node/node_view.cc
index f0db0539c4f..762b4b36a39 100644
--- a/source/blender/editors/space_node/node_view.cc
+++ b/source/blender/editors/space_node/node_view.cc
@@ -23,8 +23,10 @@
#include "DNA_node_types.h"
+#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_rect.h"
+#include "BLI_string_ref.hh"
#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -54,6 +56,8 @@
#include "node_intern.h" /* own include */
+using blender::StringRef;
+
/* -------------------------------------------------------------------- */
/** \name View All Operator
* \{ */
@@ -700,3 +704,89 @@ void NODE_OT_backimage_sample(wmOperatorType *ot)
}
/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name View Geometry Nodes Legacy Operator
+ *
+ * This operator should be removed when the 2.93 legacy nodes are removed.
+ * \{ */
+
+static int space_node_view_geometry_nodes_legacy(bContext *C, SpaceNode *snode, wmOperator *op)
+{
+ ARegion *region = CTX_wm_region(C);
+
+ /* Only use the node editor's active node tree. Otherwise this will be too complicated. */
+ bNodeTree *node_tree = snode->nodetree;
+ if (node_tree == nullptr || node_tree->type != NTREE_GEOMETRY) {
+ return OPERATOR_CANCELLED;
+ }
+
+ bool found_legacy_node = false;
+ LISTBASE_FOREACH_BACKWARD (bNode *, node, &node_tree->nodes) {
+ StringRef idname{node->idname};
+ if (idname.find("Legacy") == StringRef::not_found) {
+ node->flag &= ~NODE_SELECT;
+ }
+ else {
+ found_legacy_node = true;
+ node->flag |= NODE_SELECT;
+ }
+ }
+
+ if (!found_legacy_node) {
+ WM_report(RPT_INFO, "Legacy node not found, may be in nested node group");
+ }
+
+ const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
+ if (space_node_view_flag(C, snode, region, NODE_SELECT, smooth_viewtx)) {
+ return OPERATOR_FINISHED;
+ }
+ return OPERATOR_CANCELLED;
+}
+
+static int geometry_node_view_legacy_exec(bContext *C, wmOperator *op)
+{
+ /* Allow running this operator directly in a specific node editor. */
+ if (SpaceNode *snode = CTX_wm_space_node(C)) {
+ return space_node_view_geometry_nodes_legacy(C, snode, op);
+ }
+
+ /* Since the operator is meant to be called from a button in the modifier panel, the node tree
+ * must be found from the screen, using the largest node editor if there is more than one. */
+ if (ScrArea *area = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_NODE, 0)) {
+ if (SpaceNode *snode = static_cast<SpaceNode *>(area->spacedata.first)) {
+ ScrArea *old_area = CTX_wm_area(C);
+ ARegion *old_region = CTX_wm_region(C);
+
+ /* Override the context since it is used by the View2D panning code. */
+ CTX_wm_area_set(C, area);
+ CTX_wm_region_set(C, static_cast<ARegion *>(area->regionbase.last));
+ const int result = space_node_view_geometry_nodes_legacy(C, snode, op);
+ CTX_wm_area_set(C, old_area);
+ CTX_wm_region_set(C, old_region);
+ return result;
+ }
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+static bool geometry_node_view_legacy_poll(bContext *C)
+{
+ /* Allow direct execution in a node editor, but also affecting any visible node editor. */
+ return ED_operator_node_active(C) || BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_NODE, 0);
+}
+
+void NODE_OT_geometry_node_view_legacy(wmOperatorType *ot)
+{
+ ot->name = "View Deprecated Geometry Nodes";
+ ot->idname = "NODE_OT_geometry_node_view_legacy";
+ ot->description = "Select and view legacy geometry nodes in the node editor";
+
+ ot->exec = geometry_node_view_legacy_exec;
+ ot->poll = geometry_node_view_legacy_poll;
+
+ ot->flag = OPTYPE_INTERNAL;
+}
+
+/** \} */