[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13778] trunk/blender/source/blender: == Action Editor - Channel Tools ==

Joshua Leung aligorith at gmail.com
Wed Feb 20 12:02:33 CET 2008


Revision: 13778
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13778
Author:   aligorith
Date:     2008-02-20 12:02:32 +0100 (Wed, 20 Feb 2008)

Log Message:
-----------
== Action Editor - Channel Tools ==

* Added a new set of related tools for channel editing (Toggle/Enable/Disable Setting). These are activated using the Shift-W, Ctrl-Shift-W, and Alt-W hotkeys. They allow for setting of the given setting on all selected channels (where it will apply).

* Moved + grouped all the channel-related operations in a new "Channels" menu, located between the "Select" and "Markers" menus. This makes more sense than squeezing the functionality at the end of the "Key" menu!

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_editaction.h
    trunk/blender/source/blender/src/editaction.c
    trunk/blender/source/blender/src/header_action.c

Modified: trunk/blender/source/blender/include/BIF_editaction.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editaction.h	2008-02-20 01:12:21 UTC (rev 13777)
+++ trunk/blender/source/blender/include/BIF_editaction.h	2008-02-20 11:02:32 UTC (rev 13778)
@@ -153,6 +153,7 @@
 
 void expand_all_action(void);
 void openclose_level_action(short mode);
+void setflag_action_channels(short mode);
 
 /* IPO/Handle Types  */
 void sethandles_action_keys(int code);

Modified: trunk/blender/source/blender/src/editaction.c
===================================================================
--- trunk/blender/source/blender/src/editaction.c	2008-02-20 01:12:21 UTC (rev 13777)
+++ trunk/blender/source/blender/src/editaction.c	2008-02-20 11:02:32 UTC (rev 13778)
@@ -398,8 +398,11 @@
 	for (agrp= act->groups.first; agrp; agrp= agrp->next) {
 		/* add this group as a channel first */
 		if (!(filter_mode & ACTFILTER_ONLYICU) && !(filter_mode & ACTFILTER_IPOKEYS)) {
-			ale= make_new_actlistelem(agrp, ACTTYPE_GROUP, NULL, ACTTYPE_NONE);
-			if (ale) BLI_addtail(act_data, ale);
+			/* check if filtering by selection */
+			if ( !(filter_mode & ACTFILTER_SEL) || SEL_AGRP(agrp) ) {
+				ale= make_new_actlistelem(agrp, ACTTYPE_GROUP, NULL, ACTTYPE_NONE);
+				if (ale) BLI_addtail(act_data, ale);
+			}
 		}
 		
 		/* store reference to last channel of group */
@@ -1239,7 +1242,7 @@
 	void *data;
 	short datatype;
 	char str[32];
-		
+	
 	/* get data */
 	data= get_action_context(&datatype);
 	if (data == NULL) return;
@@ -2254,8 +2257,140 @@
 	}
 }
 
+/* Set/clear a particular flag (setting) for all selected + visible channels 
+ *	mode: 0 = toggle, 1 = turn on, 2 = turn off
+ */
+void setflag_action_channels (short mode)
+{
+	ListBase act_data = {NULL, NULL};
+	bActListElem *ale;
+	int filter;
+	void *data;
+	short datatype;
+	char str[32];
+	short val;
+	
+	/* get data */
+	data= get_action_context(&datatype);
+	if (data == NULL) return;
+	
+	/* get setting to affect */
+	if (mode == 2) {
+		val= pupmenu("Disable Setting%t|Protect %x1|Mute%x2");
+		sprintf(str, "Disable Action Setting");
+	}
+	else if (mode == 1) {
+		val= pupmenu("Enable Setting%t|Protect %x1|Mute%x2");
+		sprintf(str, "Enable Action Setting");
+	}
+	else {
+		val= pupmenu("Toggle Setting%t|Protect %x1|Mute%x2");
+		sprintf(str, "Toggle Action Setting");
+	}
+	if (val <= 0) return;
+	
+	/* filter data */
+	filter= (ACTFILTER_VISIBLE | ACTFILTER_CHANNELS | ACTFILTER_SEL);
+	actdata_filter(&act_data, filter, data, datatype);
+	
+	/* affect selected channels */
+	for (ale= act_data.first; ale; ale= ale->next) {
+		switch (ale->type) {
+			case ACTTYPE_GROUP:
+			{
+				bActionGroup *agrp= (bActionGroup *)ale->data;
+				
+				/* only 'protect' is available */
+				if (val == 1) {
+					if (mode == 2)
+						agrp->flag &= ~AGRP_PROTECTED;
+					else if (mode == 1)
+						agrp->flag |= AGRP_PROTECTED;
+					else
+						agrp->flag ^= AGRP_PROTECTED;
+				}
+			}
+				break;
+			case ACTTYPE_ACHAN:
+			{
+				bActionChannel *achan= (bActionChannel *)ale->data;
+				
+				/* 'protect' and 'mute' */
+				if ((val == 2) && (achan->ipo)) {
+					Ipo *ipo= achan->ipo;
+					
+					/* mute */
+					if (mode == 2)
+						ipo->muteipo= 0;
+					else if (mode == 1)
+						ipo->muteipo= 1;
+					else
+						ipo->muteipo= (ipo->muteipo) ? 0 : 1;
+				}
+				else if (val == 1) {
+					/* protected */
+					if (mode == 2)
+						achan->flag &= ~ACHAN_PROTECTED;
+					else if (mode == 1)
+						achan->flag |= ACHAN_PROTECTED;
+					else
+						achan->flag ^= ACHAN_PROTECTED;
+				}
+			}
+				break;
+			case ACTTYPE_CONCHAN:
+			{
+				bConstraintChannel *conchan= (bConstraintChannel *)ale->data;
+				
+				/* 'protect' and 'mute' */
+				if ((val == 2) && (conchan->ipo)) {
+					Ipo *ipo= conchan->ipo;
+					
+					/* mute */
+					if (mode == 2)
+						ipo->muteipo= 0;
+					else if (mode == 1)
+						ipo->muteipo= 1;
+					else
+						ipo->muteipo= (ipo->muteipo) ? 0 : 1;
+				}
+				else if (val == 1) {
+					/* protect */
+					if (mode == 2)
+						conchan->flag &= ~CONSTRAINT_CHANNEL_PROTECTED;
+					else if (mode == 1)
+						conchan->flag |= CONSTRAINT_CHANNEL_PROTECTED;
+					else
+						conchan->flag ^= CONSTRAINT_CHANNEL_PROTECTED;
+				}
+			}
+				break;
+			case ACTTYPE_ICU:
+			{
+				IpoCurve *icu= (IpoCurve *)ale->data;
+				
+				/* mute */
+				if (val == 2) {
+					if (mode == 2)
+						icu->flag &= ~IPO_MUTE;
+					else if (mode == 1)
+						icu->flag |= IPO_MUTE;
+					else
+						icu->flag ^= IPO_MUTE;
+				}
+			}
+				break;
+		}
+	}
+	BLI_freelistN(&act_data);
+	
+	BIF_undo_push(str);
+	allspace(REMAKEIPO, 0);
+	allqueue(REDRAWACTION, 0);
+	allqueue(REDRAWIPO, 0);
+	allqueue(REDRAWNLA, 0);
+}
 
-
 /* **************************************************** */
 /* CHANNEL SELECTION */
 
@@ -3986,7 +4121,8 @@
 			if (event == LEFTMOUSE) {
 				event = RIGHTMOUSE;
 				mousebut = L_MOUSE;
-			} else if (event == RIGHTMOUSE) {
+			} 
+			else if (event == RIGHTMOUSE) {
 				event = LEFTMOUSE;
 				mousebut = R_MOUSE;
 			}
@@ -4071,25 +4207,6 @@
 				action_groups_group(1);
 			else if (G.qual == LR_ALTKEY)
 				action_groups_ungroup();
-				
-			else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY|LR_ALTKEY)) {
-				/* WARNING: this is a debug tool which should be removed once everything is stable... */
-				bAction *act= G.saction->action;
-				bActionGroup *agrp;
-				bActionChannel *achan;
-				
-				printf("Debug Action Grouping: \n");
-				
-				printf("\tGroups: \n");
-				for (agrp= act->groups.first; agrp; agrp= agrp->next) {
-					printf("\t\tGroup \"%s\" : %p... start={%p} end={%p} \n", agrp->name, agrp, agrp->channels.first, agrp->channels.last);
-				}
-				
-				printf("\tAction Channels: \n");
-				for (achan= act->chanbase.first; achan; achan= achan->next) {
-					printf("\t\tAchan \"%s\" : %p... group={%p} \n", achan->name, achan, achan->grp);
-				}	
-			}
 			
 			/* Transforms */
 			else {
@@ -4258,6 +4375,20 @@
 			if (okee("Set Keys to Vector Handle"))
 				sethandles_action_keys(HD_VECT);
 			break;
+			
+		case WKEY:
+			/* toggle/turn-on\off-based-on-setting */
+			if (G.qual) {
+				if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+					val= 1;
+				else if (G.qual == LR_ALTKEY)
+					val= 2;
+				else
+					val= 0;	
+				
+				setflag_action_channels(val);
+			}
+			break;
 		
 		case PAGEUPKEY:
 			if (datatype == ACTCONT_ACTION) {

Modified: trunk/blender/source/blender/src/header_action.c
===================================================================
--- trunk/blender/source/blender/src/header_action.c	2008-02-20 01:12:21 UTC (rev 13777)
+++ trunk/blender/source/blender/src/header_action.c	2008-02-20 11:02:32 UTC (rev 13778)
@@ -96,9 +96,6 @@
 	ACTMENU_VIEW_PREVKEYFRAME,
 	ACTMENU_VIEW_TIME,
 	ACTMENU_VIEW_NOHIDE,
-	ACTMENU_VIEW_OPENLEVELS,
-	ACTMENU_VIEW_CLOSELEVELS,
-	ACTMENU_VIEW_EXPANDALL,
 	ACTMENU_VIEW_TRANSDELDUPS,
 	ACTMENU_VIEW_HORIZOPTIMISE
 };
@@ -124,26 +121,39 @@
 };
 
 enum {
-	ACTMENU_KEY_DUPLICATE = 0,
-	ACTMENU_KEY_DELETE,
-	ACTMENU_KEY_CLEAN,
-	ACTMENU_KEY_SAMPLEKEYS
+	ACTMENU_CHANNELS_OPENLEVELS = 0,
+	ACTMENU_CHANNELS_CLOSELEVELS,
+	ACTMENU_CHANNELS_EXPANDALL,
+	ACTMENU_CHANNELS_DELETE
 };
 
 enum {
-	ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP	= 0,
-	ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN,
-	ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_TOP,
-	ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_BOTTOM
+	ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP	= 0,
+	ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN,
+	ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_TOP,
+	ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_BOTTOM
 };
 
 enum {
-	ACTMENU_KEY_CHANGROUP_ADD_TOACTIVE	= 0,
-	ACTMENU_KEY_CHANGROUP_ADD_TONEW,
-	ACTMENU_KEY_CHANGROUP_REMOVE
+	ACTMENU_CHANNELS_GROUP_ADD_TOACTIVE	= 0,
+	ACTMENU_CHANNELS_GROUP_ADD_TONEW,
+	ACTMENU_CHANNELS_GROUP_REMOVE
 };
 
 enum {
+	ACTMENU_CHANNELS_SETTINGS_TOGGLE = 0,
+	ACTMENU_CHANNELS_SETTINGS_ENABLE,
+	ACTMENU_CHANNELS_SETTINGS_DISABLE,
+};
+
+enum {
+	ACTMENU_KEY_DUPLICATE = 0,
+	ACTMENU_KEY_DELETE,
+	ACTMENU_KEY_CLEAN,
+	ACTMENU_KEY_SAMPLEKEYS
+};
+
+enum {
 	ACTMENU_KEY_TRANSFORM_MOVE  = 0,
 	ACTMENU_KEY_TRANSFORM_SCALE,
 	ACTMENU_KEY_TRANSFORM_SLIDE,
@@ -328,15 +338,6 @@
 		case ACTMENU_VIEW_PREVKEYFRAME: /* Jump to previous keyframe */
 			nextprev_action_keyframe(-1);
 			break;
-		case ACTMENU_VIEW_OPENLEVELS: /* Unfold channels one step */
-			openclose_level_action(1);
-			break;
-		case ACTMENU_VIEW_CLOSELEVELS: /* Fold channels one step */
-			openclose_level_action(-1);
-			break;
-		case ACTMENU_VIEW_EXPANDALL: /* Expands all channels */
-			expand_all_action();
-			break;
 		case ACTMENU_VIEW_TRANSDELDUPS: /* Don't delete duplicate/overlapping keyframes after transform */
 			G.saction->flag ^= SACTION_NOTRANSKEYCULL;
 			break;
@@ -414,27 +415,7 @@
 
 	uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
 					menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-					
-	/* only if editing action... */
-	// TODO: improve this code!
-	
-	if (G.saction->action) {
-		uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
-				"Toggle Show Hierachy|~", 0, yco-=20,
-				menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_EXPANDALL, "");
-				
-		uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
-				"Expand One Level|Ctrl NumPad+", 0, yco-=20,
-				menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_OPENLEVELS, "");
-				
-		uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
-				"Collapse One Level|Ctrl NumPad-", 0, yco-=20,
-				menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_CLOSELEVELS, "");
-	}
-	
-	uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
-					menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-					 
+		
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
 				"Jump To Next Marker|PageUp", 0, yco-=20,
 				menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTMARKER, "");
@@ -549,7 +530,7 @@
 	Key *key;
 	
 	saction = curarea->spacedata.first;
-	if (!saction) return;
+	if (saction == NULL) return;
 
 	act = saction->action;
 	key = get_action_mesh_key();
@@ -689,7 +670,7 @@
 	uiDefIconTextBlockBut(block, action_selectmenu_columnmenu, 
 						  NULL, ICON_RIGHTARROW_THIN, "Column Select Keys", 0, yco-=20, 120, 20, "");
 	
-	if(curarea->headertype==HEADERTOP) {
+	if (curarea->headertype==HEADERTOP) {
 		uiBlockSetDirection(block, UI_DOWN);
 	}
 	else {
@@ -702,6 +683,227 @@
 	return block;
 }
 
+
+static void do_action_channelmenu_posmenu(void *arg, int event)
+{
+	switch(event)
+	{
+		case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_DOWN:
+			rearrange_action_channels(REARRANGE_ACTCHAN_DOWN);
+			break;
+		case ACTMENU_CHANNELS_CHANPOS_MOVE_CHANNEL_UP:

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list