[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