[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60197] trunk/blender: Fix for #36739: Delete new nodes added via the Add menu or toolbar if the subsequent transform operator is cancelled .

Lukas Toenne lukas.toenne at googlemail.com
Tue Sep 17 15:07:49 CEST 2013


Revision: 60197
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60197
Author:   lukastoenne
Date:     2013-09-17 13:07:48 +0000 (Tue, 17 Sep 2013)
Log Message:
-----------
Fix for #36739: Delete new nodes added via the Add menu or toolbar if the subsequent transform operator is cancelled. This prevents ugly situations where nodes stick "under" the toolbar after clicking a
wrong button.

Works by adding a flag to transform operators "remove_on_cancel". This is currently only used for node transforms, the idea is that if set, the operator will remove the transformed elements when it is
cancelled. It's not possible to do that in the original NODE_OT_add_node operator, because transform is modal and there is no way of reacting to a cancel outside of the transform itself (previous attempt
used a macro operator, but that also doesn't work because subsequent operators don't get executed if the previous transform cancels).

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_operators/node.py
    trunk/blender/source/blender/editors/transform/transform.c
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/transform/transform_ops.c

Modified: trunk/blender/release/scripts/startup/bl_operators/node.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_operators/node.py	2013-09-17 12:11:00 UTC (rev 60196)
+++ trunk/blender/release/scripts/startup/bl_operators/node.py	2013-09-17 13:07:48 UTC (rev 60197)
@@ -123,7 +123,8 @@
         result = self.execute(context)
 
         if self.use_transform and ('FINISHED' in result):
-            bpy.ops.transform.translate('INVOKE_DEFAULT')
+            # removes the node again if transform is cancelled
+            bpy.ops.transform.translate('INVOKE_DEFAULT', remove_on_cancel = True)
 
         return result
 

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2013-09-17 12:11:00 UTC (rev 60196)
+++ trunk/blender/source/blender/editors/transform/transform.c	2013-09-17 13:07:48 UTC (rev 60197)
@@ -1854,7 +1854,7 @@
 			options |= CTX_TEXTURE;
 		}
 	}
-	
+
 	t->options = options;
 
 	t->mode = mode;

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2013-09-17 12:11:00 UTC (rev 60196)
+++ trunk/blender/source/blender/editors/transform/transform.h	2013-09-17 13:07:48 UTC (rev 60197)
@@ -341,7 +341,9 @@
 	float		auto_values[4];
 	float		axis[3];
 	float		axis_orig[3];	/* TransCon can change 'axis', store the original value here */
-	
+
+	short		remove_on_cancel; /* remove elements if operator is cancelled */
+
 	void		*view;
 	struct bContext *context; /* Only valid (non null) during an operator called function. */
 	struct ScrArea	*sa;

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-09-17 12:11:00 UTC (rev 60196)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-09-17 13:07:48 UTC (rev 60197)
@@ -5323,6 +5323,25 @@
 	}
 }
 
+static void special_aftertrans_update__node(bContext *UNUSED(C), TransInfo *t)
+{
+	int canceled = (t->state == TRANS_CANCEL);
+	
+	if (canceled && t->remove_on_cancel) {
+		/* remove selected nodes on cancel */
+		SpaceNode *snode = (SpaceNode *)t->sa->spacedata.first;
+		bNodeTree *ntree = snode->edittree;
+		if (ntree) {
+			bNode *node, *node_next;
+			for (node = ntree->nodes.first; node; node = node_next) {
+				node_next = node->next;
+				if (node->flag & NODE_SELECT)
+					nodeFreeNode(ntree, node);
+			}
+		}
+	}
+}
+
 static void special_aftertrans_update__mesh(bContext *UNUSED(C), TransInfo *t)
 {
 	/* so automerge supports mirror */
@@ -5434,6 +5453,7 @@
 	}
 	else if (t->spacetype == SPACE_NODE) {
 		SpaceNode *snode = (SpaceNode *)t->sa->spacedata.first;
+		special_aftertrans_update__node(C, t);
 		if (canceled == 0) {
 			ED_node_post_apply_transform(C, snode->edittree);
 			

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c	2013-09-17 12:11:00 UTC (rev 60196)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c	2013-09-17 13:07:48 UTC (rev 60197)
@@ -1105,6 +1105,12 @@
 		t->options |= CTX_EDGE;
 	}
 
+	t->remove_on_cancel = false;
+	if ((prop = RNA_struct_find_property(op->ptr, "remove_on_cancel")) && RNA_property_is_set(op->ptr, prop)) {
+		if (RNA_property_boolean_get(op->ptr, prop)) {
+			t->remove_on_cancel = true;
+		}
+	}
 
 	/* Assign the space type, some exceptions for running in different mode */
 	if (sa == NULL) {

Modified: trunk/blender/source/blender/editors/transform/transform_ops.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_ops.c	2013-09-17 12:11:00 UTC (rev 60196)
+++ trunk/blender/source/blender/editors/transform/transform_ops.c	2013-09-17 13:07:48 UTC (rev 60197)
@@ -537,6 +537,7 @@
 
 	if (flags & P_OPTIONS) {
 		RNA_def_boolean(ot->srna, "texture_space", 0, "Edit Texture Space", "Edit Object data texture space");
+		RNA_def_boolean(ot->srna, "remove_on_cancel", 0, "Remove on Cancel", "Remove elements on cancel");
 	}
 
 	if (flags & P_CORRECT_UV) {




More information about the Bf-blender-cvs mailing list