[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18235] branches/blender2.5/blender/source /blender: 2.5 - Animation and View2D

Joshua Leung aligorith at gmail.com
Fri Jan 2 01:56:48 CET 2009


Revision: 18235
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18235
Author:   aligorith
Date:     2009-01-02 01:56:48 +0100 (Fri, 02 Jan 2009)

Log Message:
-----------
2.5 - Animation and View2D 

* Added back deselect all (and invert all) tools for Animation Channels (i.e. channel list in Action Editor).

* Resolved all MSVC warnings (I came across) in View2d code. Also, added a new API method to get the coordinates (in 'view' space) of a listview 'cell' given the row + column the cell is in.

* Tidied up a few comments here and there

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c
    branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c
    branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
    branches/blender2.5/blender/source/blender/editors/include/UI_view2d.h
    branches/blender2.5/blender/source/blender/editors/interface/view2d.c
    branches/blender2.5/blender/source/blender/editors/interface/view2d_ops.c
    branches/blender2.5/blender/source/blender/editors/space_action/action_ops.c
    branches/blender2.5/blender/source/blender/editors/space_action/action_select.c
    branches/blender2.5/blender/source/blender/editors/space_action/space_action.c

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-01-02 00:53:49 UTC (rev 18234)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-01-02 00:56:48 UTC (rev 18235)
@@ -5264,9 +5264,9 @@
 			case SPACE_ACTION:
 			{
 				SpaceAction *saction= (SpaceAction *)sl;
-				memcpy(&ar->v2d, &saction->v2d, sizeof(View2D));
 				
-				ar->v2d.tot.xmin= -10.0f;
+				/* we totally reinit the view for the Action Editor, as some old instances had some weird cruft set */
+				ar->v2d.tot.xmin= -20.0f;
 				ar->v2d.tot.ymin= (float)(-sa->winy);
 				ar->v2d.tot.xmax= (float)(sa->winx);
 				ar->v2d.tot.ymax= 0.0f;

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c	2009-01-02 00:53:49 UTC (rev 18234)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c	2009-01-02 00:56:48 UTC (rev 18235)
@@ -86,19 +86,178 @@
 /* ************************************************************************** */
 /* CHANNELS API */
 
-/* -------------------------- Internal Tools -------------------------------- */
+/* -------------------------- Internal Macros ------------------------------- */
 
+/* set/clear/toggle macro 
+ *	- channel - channel with a 'flag' member that we're setting
+ *	- smode - 0=clear, 1=set, 2=toggle
+ *	- sflag - bitflag to set
+ */
+#define ACHANNEL_SET_FLAG(channel, smode, sflag) \
+	{ \
+		if (smode == ACHANNEL_SETFLAG_TOGGLE) 	(channel)->flag ^= (sflag); \
+		else if (smode == ACHANNEL_SETFLAG_ADD) (channel)->flag |= (sflag); \
+		else 									(channel)->flag &= ~(sflag); \
+	}
 
+/* -------------------------- Internal Tools -------------------------------- */
 
 /* -------------------------- Exposed API ----------------------------------- */
 
+
+
+/* Deselect all animation channels 
+ *	- data: pointer to datatype, as contained in bAnimContext
+ *	- datatype: the type of data that 'data' represents (eAnim_ChannelType)
+ *	- test: check if deselecting instead of selecting
+ *	- sel: eAnimChannels_SetFlag;
+ */
+void ANIM_deselect_anim_channels (void *data, short datatype, short test, short sel)
+{
+	ListBase anim_data = {NULL, NULL};
+	bAnimListElem *ale;
+	int filter;
+	
+	/* filter data */
+	filter= ANIMFILTER_VISIBLE;
+	ANIM_animdata_filter(&anim_data, filter, data, datatype);
+	
+	/* See if we should be selecting or deselecting */
+	if (test) {
+		for (ale= anim_data.first; ale; ale= ale->next) {
+			if (sel == 0) 
+				break;
+			
+			switch (ale->type) {
+				case ANIMTYPE_OBJECT:
+					if (ale->flag & SELECT)
+						sel= ACHANNEL_SETFLAG_CLEAR;
+					break;
+				case ANIMTYPE_FILLACTD:
+					if (ale->flag & ACTC_SELECTED)
+						sel= ACHANNEL_SETFLAG_CLEAR;
+					break;
+				case ANIMTYPE_GROUP:
+					if (ale->flag & AGRP_SELECTED)
+						sel= ACHANNEL_SETFLAG_CLEAR;
+					break;
+				case ANIMTYPE_ACHAN:
+					if (ale->flag & ACHAN_SELECTED) 
+						sel= ACHANNEL_SETFLAG_CLEAR;
+					break;
+				case ANIMTYPE_CONCHAN:
+					if (ale->flag & CONSTRAINT_CHANNEL_SELECT) 
+						sel= ACHANNEL_SETFLAG_CLEAR;
+					break;
+				case ANIMTYPE_ICU:
+					if (ale->flag & IPO_SELECT)
+						sel= ACHANNEL_SETFLAG_CLEAR;
+					break;
+			}
+		}
+	}
+		
+	/* Now set the flags */
+	for (ale= anim_data.first; ale; ale= ale->next) {
+		switch (ale->type) {
+			case ANIMTYPE_OBJECT:
+			{
+				Base *base= (Base *)ale->data;
+				Object *ob= base->object;
+				
+				ACHANNEL_SET_FLAG(base, sel, SELECT);
+				ACHANNEL_SET_FLAG(ob, sel, SELECT);
+			}
+				break;
+			case ANIMTYPE_FILLACTD:
+			{
+				bAction *act= (bAction *)ale->data;
+				
+				ACHANNEL_SET_FLAG(act, sel, ACTC_SELECTED);
+			}
+				break;
+			case ANIMTYPE_GROUP:
+			{
+				bActionGroup *agrp= (bActionGroup *)ale->data;
+				
+				ACHANNEL_SET_FLAG(agrp, sel, AGRP_SELECTED);
+				agrp->flag &= ~AGRP_ACTIVE;
+			}
+				break;
+			case ANIMTYPE_ACHAN:
+			{
+				bActionChannel *achan= (bActionChannel *)ale->data;
+				
+				ACHANNEL_SET_FLAG(achan, sel, ACHAN_SELECTED);
+				
+				//select_poseelement_by_name(achan->name, sel); // XXX
+				achan->flag &= ~ACHAN_HILIGHTED;
+			}
+				break;
+			case ANIMTYPE_CONCHAN:
+			{
+				bConstraintChannel *conchan= (bConstraintChannel *)ale->data;
+				
+				ACHANNEL_SET_FLAG(conchan, sel, CONSTRAINT_CHANNEL_SELECT);
+			}
+				break;
+			case ANIMTYPE_ICU:
+			{
+				IpoCurve *icu= (IpoCurve *)ale->data;
+				
+				ACHANNEL_SET_FLAG(icu, sel, IPO_SELECT);
+				icu->flag &= ~IPO_ACTIVE;
+			}
+				break;
+		}
+	}
+	
+	/* Cleanup */
+	BLI_freelistN(&anim_data);
+}
+
 /* ************************************************************************** */
 /* OPERATORS */
 
 /* ********************** Select All Operator *********************** */
 
+static int animchannels_deselectall_exec(bContext *C, wmOperator *op)
+{
+	bAnimContext ac;
+	
+	/* get editor data */
+	if (ANIM_animdata_get_context(C, &ac) == 0)
+		return OPERATOR_CANCELLED;
+		
+	/* 'standard' behaviour - check if selected, then apply relevant selection */
+	if (RNA_boolean_get(op->ptr, "invert"))
+		ANIM_deselect_anim_channels(ac.data, ac.datatype, 0, ACHANNEL_SETFLAG_TOGGLE);
+	else
+		ANIM_deselect_anim_channels(ac.data, ac.datatype, 1, ACHANNEL_SETFLAG_ADD);
+	
+	/* set notifier tha things have changed */
+	ED_area_tag_redraw(CTX_wm_area(C)); // FIXME... should be updating 'keyframes' data context or so instead!
+	
+	return OPERATOR_FINISHED;
+}
+ 
+void ANIM_OT_channels_deselectall (wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Select All";
+	ot->idname= "ANIM_OT_channels_deselectall";
+	
+	/* api callbacks */
+	ot->exec= animchannels_deselectall_exec;
+	ot->poll= ED_operator_areaactive;
+	
+	/* flags */
+	ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
+	
+	/* props */
+	RNA_def_property(ot->srna, "invert", PROP_BOOLEAN, PROP_NONE);
+}
 
-
 /* ******************** Mouse-Click Operator *********************** */
 /* Depending on the channel that was clicked on, the mouse click will activate whichever
  * part of the channel is relevant.
@@ -243,7 +402,7 @@
 						/* inverse selection status of group */
 						//select_action_group(act, agrp, SELECT_INVERT);
 					}
-					else if (/*G.qual == (LR_CTRLKEY|LR_SHIFTKEY)*/0) {
+					else if (/*G.qual == (LR_CTRLKEY|LR_SHIFTKEY)*/selectmode == -1) {
 						// FIXME: need a special case for this!
 						/* select all in group (and deselect everthing else) */	
 						//select_action_group_channels(act, agrp);
@@ -251,7 +410,7 @@
 					}
 					else {
 						/* select group by itself */
-						//deselect_actionchannels(act, ANIMCONT_ACTION, 0);
+						ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
 						//select_action_group(act, agrp, SELECT_ADD);
 					}
 					
@@ -283,7 +442,7 @@
 						//select_channel(act, achan, SELECT_INVERT);
 					}
 					else {
-						//deselect_actionchannels(act, ACTCONT_ACTION, 0);
+						ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
 						//select_channel(act, achan, SELECT_ADD);
 					}
 					
@@ -303,7 +462,7 @@
 				
 				if ((x > 24) && (achan->flag & ACHAN_SHOWIPO)) {
 					/* select+make active achan */		
-					//deselect_actionchannels(act, ACTCONT_ACTION, 0);
+					ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
 					//select_channel(act, achan, SELECT_ADD);
 					
 					/* messy... set active bone */
@@ -322,7 +481,7 @@
 				
 				if ((x > 24) && (achan->flag & ACHAN_SHOWCONS)) {
 					/* select+make active achan */	
-					//deselect_actionchannels(act, ACTCONT_ACTION, 0);
+					ANIM_deselect_anim_channels(ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
 					//select_channel(act, achan, SELECT_ADD);
 					
 					/* messy... set active bone */
@@ -460,7 +619,7 @@
 	 *		ACHANNEL_HEIGHT_HALF.
 	 */
 	UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
-	UI_view2d_listview_get_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+	UI_view2d_listview_view_to_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
 	
 	/* handle mouse-click in the relevant channel then */
 	mouse_anim_channels(&ac, x, channel_index, selectmode);
@@ -490,6 +649,7 @@
 
 void ED_operatortypes_animchannels(void)
 {
+	WM_operatortype_append(ANIM_OT_channels_deselectall);
 	WM_operatortype_append(ANIM_OT_channels_mouseclick);
 }
 
@@ -501,6 +661,10 @@
 		// XXX for now, only leftmouse.... 
 	WM_keymap_add_item(keymap, "ANIM_OT_channels_mouseclick", LEFTMOUSE, KM_PRESS, 0, 0);
 	RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_mouseclick", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend_select", 1);
+	
+	/* deselect all */
+	WM_keymap_add_item(keymap, "ANIM_OT_channels_deselectall", AKEY, KM_PRESS, 0, 0);
+	RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_deselectall", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
 }
 
 /* ************************************************************************** */

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c	2009-01-02 00:53:49 UTC (rev 18234)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_draw.c	2009-01-02 00:56:48 UTC (rev 18235)
@@ -79,7 +79,7 @@
 	
 	/* because the frame number text is subject to the same scaling as the contents of the view */
 	UI_view2d_getscale(v2d, &xscale, &yscale);
-	glScalef(1.0/xscale, 1.0, 1.0);
+	glScalef(1.0f/xscale, 1.0f, 1.0f);
 	
 	if (time) 
 		sprintf(str, "   %.2f", FRA2TIME(CFRA));
@@ -97,7 +97,7 @@
 	
 	/* draw current frame number - black text */
 	UI_ThemeColor(TH_TEXT);
-	ui_rasterpos_safe(x-5, y+3, 1.0);
+	ui_rasterpos_safe(x-5, y+3, 1.0f);
 	UI_DrawString(G.fonts, str, 0); // XXX may need to be updated for font stuff
 	
 	/* restore view transform */
@@ -168,8 +168,8 @@
 		
 		/* only draw two separate 'curtains' if there's no overlap between them */
 		if (PSFRA < PEFRA) {
-			glRectf(v2d->cur.xmin, v2d->cur.ymin, PSFRA, v2d->cur.ymax);
-			glRectf(PEFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax);	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list