[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23246] trunk/blender: 2.5: node group/ ungroup/edit operators, patch by Michal Ziulek,

Brecht Van Lommel brecht at blender.org
Tue Sep 15 13:35:47 CEST 2009


Revision: 23246
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23246
Author:   blendix
Date:     2009-09-15 13:35:10 +0200 (Tue, 15 Sep 2009)

Log Message:
-----------
2.5: node group/ungroup/edit operators, patch by Michal Ziulek,
with some small changes.

Modified Paths:
--------------
    trunk/blender/release/ui/space_node.py
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/editors/space_node/node_ops.c

Modified: trunk/blender/release/ui/space_node.py
===================================================================
--- trunk/blender/release/ui/space_node.py	2009-09-15 10:59:42 UTC (rev 23245)
+++ trunk/blender/release/ui/space_node.py	2009-09-15 11:35:10 UTC (rev 23246)
@@ -98,11 +98,10 @@
 		# XXX
 		# layout.itemS()
 		# layout.itemO("node.make_link")
-		# layout.itemS()
-		# layout.itemO("node.edit_group")
-		# layout.itemO("node.ungroup")
-		# layout.itemO("node.group")
-		# layout.itemO("node.make_link")
+		layout.itemS()
+		layout.itemO("node.group_edit")
+		layout.itemO("node.group_ungroup")
+		layout.itemO("node.group_make")
 
 		layout.itemS()
 

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2009-09-15 10:59:42 UTC (rev 23245)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2009-09-15 11:35:10 UTC (rev 23246)
@@ -601,7 +601,7 @@
 				//addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
 			}
 			else {
-				node= snode_get_editgroup(snode);
+				node= node_tree_get_editgroup(snode->nodetree);
 				if(node)
 					NodeTagIDChanged(snode->nodetree, node->id);
 			}

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2009-09-15 10:59:42 UTC (rev 23245)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2009-09-15 11:35:10 UTC (rev 23246)
@@ -58,6 +58,7 @@
 #include "BKE_material.h"
 #include "BKE_paint.h"
 #include "BKE_texture.h"
+#include "BKE_report.h"
 #include "BKE_scene.h"
 #include "BKE_utildefines.h"
 
@@ -84,6 +85,7 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "UI_interface.h"
 #include "UI_view2d.h"
  
 #include "node_intern.h"
@@ -327,12 +329,12 @@
 
 #endif /* 0 */
 
-bNode *snode_get_editgroup(SpaceNode *snode)
+bNode *node_tree_get_editgroup(bNodeTree *nodetree)
 {
 	bNode *gnode;
 	
 	/* get the groupnode */
-	for(gnode= snode->nodetree->nodes.first; gnode; gnode= gnode->next)
+	for(gnode= nodetree->nodes.first; gnode; gnode= gnode->next)
 		if(gnode->flag & NODE_GROUP_EDIT)
 			break;
 	return gnode;
@@ -441,7 +443,7 @@
 					addqueue(curarea->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
 				}
 				else {
-					node= snode_get_editgroup(snode);
+					node= node_tree_get_editgroup(snode->nodetree);
 					if(node)
 						NodeTagIDChanged(snode->nodetree, node->id);
 					
@@ -722,7 +724,7 @@
 					NodeTagChanged(snode->edittree, node);
 					
 					/* if inside group, tag entire group */
-					gnode= snode_get_editgroup(snode);
+					gnode= node_tree_get_editgroup(snode->nodetree);
 					if(gnode)
 						NodeTagIDChanged(snode->nodetree, gnode->id);
 					
@@ -753,6 +755,8 @@
 	#endif /* 0 */
 }
 
+/* ***************** Edit Group operator ************* */
+
 void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
 {
 	bNode *node;
@@ -768,12 +772,9 @@
 	}
 	
 	if(gnode && gnode->type==NODE_GROUP && gnode->id) {
-		if(gnode->id->lib) {
-			// XXX if(okee("Make Group Local"))
-			//	ntreeMakeLocal((bNodeTree *)gnode->id);
-			// else
-				return;
-		}
+		if(gnode->id->lib)
+			ntreeMakeLocal((bNodeTree *)gnode->id);
+
 		gnode->flag |= NODE_GROUP_EDIT;
 		snode->edittree= (bNodeTree *)gnode->id;
 		
@@ -794,43 +795,102 @@
 		
 		// XXX BIF_preview_changed(-1);	/* temp hack to force texture preview to update */
 	}
+}
+
+static int node_group_edit_exec(bContext *C, wmOperator *op)
+{
+	SpaceNode *snode = CTX_wm_space_node(C);
+	bNode *gnode;
+
+	gnode= nodeGetActive(snode->edittree);
+	snode_make_group_editable(snode, gnode);
+
+	WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
+static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	SpaceNode *snode = CTX_wm_space_node(C);
+	bNode *gnode;
+
+	gnode= nodeGetActive(snode->edittree);
+	if(gnode && gnode->type==NODE_GROUP && gnode->id && gnode->id->lib) {
+		uiPupMenuOkee(C, op->type->idname, "Make group local?");
+		return OPERATOR_CANCELLED;
+	}
+
+	return node_group_edit_exec(C, op);
+}
+
+void NODE_OT_group_edit(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Edit Group";
+	ot->description = "Edit node group.";
+	ot->idname = "NODE_OT_group_edit";
 	
-	// allqueue(REDRAWNODE, 0);
+	/* api callbacks */
+	ot->invoke = node_group_edit_invoke;
+	ot->exec = node_group_edit_exec;
+	ot->poll = ED_operator_node_active;
+	
+	/* flags */
+	ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-#if 0
+/* ******************** Ungroup operator ********************** */
 
-void node_ungroup(SpaceNode *snode)
+static int node_group_ungroup_exec(bContext *C, wmOperator *op)
 {
+	SpaceNode *snode = CTX_wm_space_node(C);
 	bNode *gnode;
 
 	/* are we inside of a group? */
-	gnode= snode_get_editgroup(snode);
+	gnode= node_tree_get_editgroup(snode->nodetree);
 	if(gnode)
 		snode_make_group_editable(snode, NULL);
 	
 	gnode= nodeGetActive(snode->edittree);
-	if(gnode==NULL) return;
+	if(gnode==NULL)
+		return OPERATOR_CANCELLED;
 	
-	if(gnode->type!=NODE_GROUP)
-		error("Not a group");
-	else {
-		if(nodeGroupUnGroup(snode->edittree, gnode)) {
-			
-			// allqueue(REDRAWNODE, 0);
-		}
-		else
-			error("Can't ungroup");
+	if(gnode->type!=NODE_GROUP) {
+		BKE_report(op->reports, RPT_ERROR, "Not a group");
+		return OPERATOR_CANCELLED;
 	}
+	else if(!nodeGroupUnGroup(snode->edittree, gnode)) {
+		BKE_report(op->reports, RPT_ERROR, "Can't ungroup");
+		return OPERATOR_CANCELLED;
+	}
+
+	WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
+
+	return OPERATOR_FINISHED;
 }
 
-#endif /* 0 */
+void NODE_OT_group_ungroup(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Ungroup";
+	ot->description = "Ungroup selected nodes.";
+	ot->idname = "NODE_OT_group_ungroup";
+	
+	/* api callbacks */
+	ot->exec = node_group_ungroup_exec;
+	ot->poll = ED_operator_node_active;
+	
+	/* flags */
+	ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
 /* when links in groups change, inputs/outputs change, nodes added/deleted... */
-static void snode_verify_groups(SpaceNode *snode)
+static void node_tree_verify_groups(bNodeTree *nodetree)
 {
 	bNode *gnode;
 	
-	gnode= snode_get_editgroup(snode);
+	gnode= node_tree_get_editgroup(nodetree);
 	
 	/* does all materials */
 	if(gnode)
@@ -1263,7 +1323,7 @@
 			sock->flag &= ~SOCK_HIDDEN;
 	}
 	else {
-		bNode *gnode= snode_get_editgroup(snode);
+		bNode *gnode= node_tree_get_editgroup(snode->nodetree);
 		
 		/* hiding inside group should not break links in other group users */
 		if(gnode) {
@@ -1291,7 +1351,7 @@
 	}
 
 	// allqueue(REDRAWNODE, 1);
-	snode_verify_groups(snode);
+	node_tree_verify_groups(snode->nodetree);
 
 }
 
@@ -1418,7 +1478,7 @@
 	float mx=0, my=0;
 // XXX	short mval[2];
 	
-	gnode= snode_get_editgroup(snode);
+	gnode= node_tree_get_editgroup(snode->nodetree);
 	if(gnode==NULL) return 0;
 	
 // XXX	getmouseco_areawin(mval);
@@ -1618,13 +1678,13 @@
 		node->locy= locy + 60.0f;		// arbitrary.. so its visible
 		node->flag |= SELECT;
 		
-		gnode= snode_get_editgroup(snode);
+		gnode= node_tree_get_editgroup(snode->nodetree);
 		if(gnode) {
 			node->locx -= gnode->locx;
 			node->locy -= gnode->locy;
 		}
 
-		snode_verify_groups(snode);
+		node_tree_verify_groups(snode->nodetree);
 		node_set_active(snode, node);
 		
 		if(snode->nodetree->type==NTREE_COMPOSIT) {
@@ -1654,7 +1714,7 @@
 	bNode *node;
 
 	/* no disabling inside of groups */
-	if(snode_get_editgroup(snode))
+	if(node_tree_get_editgroup(snode->nodetree))
 		return;
 	
 	for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -1680,7 +1740,7 @@
 	ntreeCopyTree(snode->edittree, 1);	/* 1 == internally selected nodes */
 	
 	ntreeSolveOrder(snode->edittree);
-	snode_verify_groups(snode);
+	node_tree_verify_groups(snode->nodetree);
 	snode_handle_recalc(C, snode);
 
 	return OPERATOR_FINISHED;
@@ -1891,7 +1951,7 @@
 			}
 			
 			ntreeSolveOrder(snode->edittree);
-			snode_verify_groups(snode);
+			node_tree_verify_groups(snode->nodetree);
 			snode_handle_recalc(C, snode);
 			
 			MEM_freeN(op->customdata);
@@ -2000,35 +2060,6 @@
 }
 
 
-void node_delete(SpaceNode *snode)
-{
-	bNode *node, *next;
-	bNodeSocket *sock;
-	
-	for(node= snode->edittree->nodes.first; node; node= next) {
-		next= node->next;
-		if(node->flag & SELECT) {
-			/* set selin and selout NULL if the sockets belong to a node to be deleted */
-			for(sock= node->inputs.first; sock; sock= sock->next)
-				if(snode->edittree->selin == sock) snode->edittree->selin= NULL;
-
-			for(sock= node->outputs.first; sock; sock= sock->next)
-				if(snode->edittree->selout == sock) snode->edittree->selout= NULL;
-
-			/* check id user here, nodeFreeNode is called for free dbase too */
-			if(node->id)
-				node->id->us--;
-			nodeFreeNode(snode->edittree, node);
-		}
-	}
-	
-	snode_verify_groups(snode);
-	// NODE_FIX_ME
-	// snode_handle_recalc(snode);
-	// allqueue(REDRAWNODE, 1);
-}
-
-
 void node_hide(SpaceNode *snode)
 {
 	bNode *node;
@@ -2098,7 +2129,7 @@
 	else return;
 
 	ntreeSolveOrder(snode->edittree);
-	snode_verify_groups(snode);
+	node_tree_verify_groups(snode->nodetree);
 	// XXX			snode_handle_recalc(snode);
 
 }
@@ -2153,7 +2184,7 @@
 		}
 
 		ntreeSolveOrder(snode->edittree);
-		snode_verify_groups(snode);
+		node_tree_verify_groups(snode->nodetree);
 		snode_handle_recalc(C, snode);
 		
 		return OPERATOR_FINISHED;
@@ -2253,15 +2284,16 @@
 	}
 }
 
-/* ********************** */
+/* ****************** Make Group operator ******************* */
 
-void node_make_group(SpaceNode *snode)
+static int node_group_make_exec(bContext *C, wmOperator *op)
 {
+	SpaceNode *snode = CTX_wm_space_node(C);
 	bNode *gnode;
 	
 	if(snode->edittree!=snode->nodetree) {
-// XXX		error("Can not add a new Group in a Group");
-		return;
+		BKE_report(op->reports, RPT_ERROR, "Can not add a new Group in a Group");
+		return OPERATOR_CANCELLED;
 	}
 	
 	/* for time being... is too complex to handle */
@@ -2271,22 +2303,41 @@
 				if(gnode->type==CMP_NODE_R_LAYERS)
 					break;
 		}
+
 		if(gnode) {
-// XXX			error("Can not add RenderLayer in a Group");
-			return;
+			BKE_report(op->reports, RPT_ERROR, "Can not add RenderLayer in a Group");
+			return OPERATOR_CANCELLED;
 		}
 	}
 	
 	gnode= nodeMakeGroupFromSelected(snode->nodetree);
 	if(gnode==NULL) {
-// XXX		error("Can not make Group");
+		BKE_report(op->reports, RPT_ERROR, "Can not make Group");
+		return OPERATOR_CANCELLED;
 	}
 	else {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list