[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25863] trunk/blender/source/blender/ editors: Animation Channels - Protect + Mute toggles flushing:

Joshua Leung aligorith at gmail.com
Sun Jan 10 12:09:30 CET 2010


Revision: 25863
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25863
Author:   aligorith
Date:     2010-01-10 12:09:30 +0100 (Sun, 10 Jan 2010)

Log Message:
-----------
Animation Channels - Protect + Mute toggles flushing:

Protect and Mute toggles now flush their values when changed, like for visibility, making the workflow a bit smoother. Currently, this only takes effect when clicking on the toggles (i.e. the hotkey+select based toggle setting operators don't take this into account yet).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/animation/anim_channels_defines.c
    trunk/blender/source/blender/editors/animation/anim_channels_edit.c
    trunk/blender/source/blender/editors/include/ED_anim_api.h

Modified: trunk/blender/source/blender/editors/animation/anim_channels_defines.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2010-01-10 10:50:11 UTC (rev 25862)
+++ trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2010-01-10 11:09:30 UTC (rev 25863)
@@ -2556,14 +2556,15 @@
 	WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
 }
 
-/* callback for visiblility-toggle widget settings - perform value flushing (Graph Editor only) */
-static void achannel_setting_visible_widget_cb(bContext *C, void *ale_npoin, void *dummy_poin)
+/* callback for widget settings that need flushing */
+static void achannel_setting_flush_widget_cb(bContext *C, void *ale_npoin, void *setting_wrap)
 {
 	bAnimListElem *ale_setting= (bAnimListElem *)ale_npoin;
 	bAnimContext ac;
 	ListBase anim_data = {NULL, NULL};
 	int filter;
-	short vizOn = 0;
+	int setting = GET_INT_FROM_POINTER(setting_wrap);
+	short on = 0;
 	
 	/* send notifiers before doing anything else... */
 	WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
@@ -2575,10 +2576,10 @@
 	/* verify that we have a channel to operate on, and that it has all we need */
 	if (ale_setting) {
 		/* check if the setting is on... */
-		vizOn= ANIM_channel_setting_get(&ac, ale_setting, ACHANNEL_SETTING_VISIBLE);
+		on= ANIM_channel_setting_get(&ac, ale_setting, setting);
 		
-		/* vizOn == -1 means setting not found... */
-		if (vizOn == -1)
+		/* on == -1 means setting not found... */
+		if (on == -1)
 			return;
 	}
 	else
@@ -2592,7 +2593,7 @@
 	ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
 	
 	/* call API method to flush the setting */
-	ANIM_visibility_flush_anim_channels(&ac, &anim_data, ale_setting, vizOn);
+	ANIM_flush_setting_anim_channels(&ac, &anim_data, ale_setting, setting, on);
 	
 	/* free temp data */
 	BLI_freelistN(&anim_data);
@@ -2770,11 +2771,19 @@
 		
 		/* set call to send relevant notifiers and/or perform type-specific updates */
 		if (but) {
-			/* 'visibility' toggles for Graph Editor need special flushing */
-			if (setting == ACHANNEL_SETTING_VISIBLE) 
-				uiButSetNFunc(but, achannel_setting_visible_widget_cb, MEM_dupallocN(ale), 0);
-			else
-				uiButSetFunc(but, achannel_setting_widget_cb, NULL, NULL);
+			switch (setting) {
+				/* settings needing flushing up/down hierarchy  */
+				case ACHANNEL_SETTING_VISIBLE: /* Graph Editor - 'visibility' toggles */
+				case ACHANNEL_SETTING_PROTECT: /* General - protection flags */
+				case ACHANNEL_SETTING_MUTE: /* General - muting flags */
+					uiButSetNFunc(but, achannel_setting_flush_widget_cb, MEM_dupallocN(ale), SET_INT_IN_POINTER(setting));
+					break;
+					
+				/* no flushing */
+				case ACHANNEL_SETTING_EXPAND: /* expanding - cannot flush, otherwise all would open/close at once */
+				default:
+					uiButSetFunc(but, achannel_setting_widget_cb, NULL, NULL);
+			}
 		}
 	}
 }

Modified: trunk/blender/source/blender/editors/animation/anim_channels_edit.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2010-01-10 10:50:11 UTC (rev 25862)
+++ trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2010-01-10 11:09:30 UTC (rev 25863)
@@ -364,9 +364,10 @@
  *	 	  then the channels under closed expanders get ignored...
  *	- ale_setting: the anim channel (not in the anim_data list directly, though occuring there)
  *		with the new state of the setting that we want flushed up/down the hierarchy 
- *	- vizOn: whether the visibility setting has been enabled or disabled 
+ *	- setting: type of setting to set
+ *	- on: whether the visibility setting has been enabled or disabled 
  */
-void ANIM_visibility_flush_anim_channels (bAnimContext *ac, ListBase *anim_data, bAnimListElem *ale_setting, short vizOn)
+void ANIM_flush_setting_anim_channels (bAnimContext *ac, ListBase *anim_data, bAnimListElem *ale_setting, int setting, short on)
 {
 	bAnimListElem *ale, *match=NULL;
 	int prevLevel=0, matchLevel=0;
@@ -394,13 +395,22 @@
 		 * 	 - we define the level as simply being the offset for the start of the channel
 		 */
 		matchLevel= (acf->get_offset)? acf->get_offset(ac, ale_setting) : 0;
+		prevLevel= matchLevel;
 	}
 	
 	/* flush up? 
-	 *	- only flush up if the current state is now enabled 
+	 *
+	 * For Visibility:
+	 *	- only flush up if the current state is now enabled (positive 'on' state is default) 
 	 *	  (otherwise, it's too much work to force the parents to be inactive too)
+	 *
+	 * For everything else:
+	 *	- only flush up if the current state is now disabled (negative 'off' state is default)
+	 *	  (otherwise, it's too much work to force the parents to be active too)
 	 */
-	if (vizOn) {
+	if ( ((setting == ACHANNEL_SETTING_VISIBLE) && on) ||
+		 ((setting != ACHANNEL_SETTING_VISIBLE) && on==0) )
+	{
 		/* go backwards in the list, until the highest-ranking element (by indention has been covered) */
 		for (ale= match->prev; ale; ale= ale->prev) {
 			bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
@@ -416,7 +426,7 @@
 			 * when toggling visibility of F-Curves, gets flushed), flush the new status...
 			 */
 			if (level < prevLevel)
-				ANIM_channel_setting_set(ac, ale, ACHANNEL_SETTING_VISIBLE, vizOn);
+				ANIM_channel_setting_set(ac, ale, setting, on);
 			/* however, if the level is 'greater than' (i.e. less important than the previous channel,
 			 * stop searching, since we've already reached the bottom of another hierarchy
 			 */
@@ -444,7 +454,7 @@
 			 * flush the new status...
 			 */
 			if (level > matchLevel)
-				ANIM_channel_setting_set(ac, ale, ACHANNEL_SETTING_VISIBLE, vizOn);
+				ANIM_channel_setting_set(ac, ale, setting, on);
 			/* however, if the level is 'less than or equal to' the channel that was changed,
 			 * (i.e. the current channel is as important if not more important than the changed channel)
 			 * then we should stop, since we've found the last one of the children we should flush
@@ -1054,7 +1064,7 @@
 		ANIM_channel_setting_set(&ac, ale, ACHANNEL_SETTING_VISIBLE, ACHANNEL_SETFLAG_ADD);
 		
 		/* now, also flush selection status up/down as appropriate */
-		ANIM_visibility_flush_anim_channels(&ac, &all_data, ale, 1);
+		ANIM_flush_setting_anim_channels(&ac, &all_data, ale, ACHANNEL_SETTING_VISIBLE, 1);
 	}
 	
 	BLI_freelistN(&anim_data);
@@ -1128,7 +1138,7 @@
 		ANIM_channel_setting_set(&ac, ale, ACHANNEL_SETTING_VISIBLE, vis);
 		
 		/* now, also flush selection status up/down as appropriate */
-		ANIM_visibility_flush_anim_channels(&ac, &all_data, ale, (vis == ACHANNEL_SETFLAG_ADD));
+		ANIM_flush_setting_anim_channels(&ac, &all_data, ale, ACHANNEL_SETTING_VISIBLE, (vis == ACHANNEL_SETFLAG_ADD));
 	}
 	
 	/* cleanup */

Modified: trunk/blender/source/blender/editors/include/ED_anim_api.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_anim_api.h	2010-01-10 10:50:11 UTC (rev 25862)
+++ trunk/blender/source/blender/editors/include/ED_anim_api.h	2010-01-10 11:09:30 UTC (rev 25863)
@@ -386,9 +386,10 @@
  *	 	  then the channels under closed expanders get ignored...
  *	- ale_setting: the anim channel (not in the anim_data list directly, though occuring there)
  *		with the new state of the setting that we want flushed up/down the hierarchy 
- *	- vizOn: whether the visibility setting has been enabled or disabled 
+ *	- setting: type of setting to set
+ *	- on: whether the visibility setting has been enabled or disabled 
  */
-void ANIM_visibility_flush_anim_channels(bAnimContext *ac, ListBase *anim_data, bAnimListElem *ale_setting, short vizOn);
+void ANIM_flush_setting_anim_channels(bAnimContext *ac, ListBase *anim_data, bAnimListElem *ale_setting, int setting, short on);
 
 
 /* Deselect all animation channels */





More information about the Bf-blender-cvs mailing list