diff options
author | Joshua Leung <aligorith@gmail.com> | 2007-03-20 14:04:47 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2007-03-20 14:04:47 +0300 |
commit | 3cb25c774c993fd4ca316c529f75d87e1761b417 (patch) | |
tree | 95770b77a70e1a2525306793cba840e1d7f00042 | |
parent | a51477093b93fdbca69b47165012c762c46c7e34 (diff) |
== Action Editor - Collapsable Action Channels ==
Action Channels can now be collapsed/expanded to show/hide Constraint Channels, lessening clutter. In future, this could (will probably be) expanded to
show the show/hide individual transform channels.
User Notes:
* Expansion is off by default
* NKEY popup now features option to turn expansion on/off
* Changed behaviour of protection a bit - now if an action channel has protection
on, constraint channels under it are also automagically protected
Developer Notes:
* I've gone through doing a lot of whitespace/linebreak tweaking to get the code looking more consistent with itself
* To save typing (and to make it easier to make future revisions), a set of macros
is now used to check for some commonly-checked settings (i.e. selection, visibility,
and protection).
-rw-r--r-- | source/blender/include/BIF_editaction.h | 7 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_action_types.h | 1 | ||||
-rw-r--r-- | source/blender/src/drawaction.c | 132 | ||||
-rw-r--r-- | source/blender/src/editaction.c | 951 |
4 files changed, 549 insertions, 542 deletions
diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h index 2419cc779dd..974ffc412d4 100644 --- a/source/blender/include/BIF_editaction.h +++ b/source/blender/include/BIF_editaction.h @@ -58,11 +58,11 @@ /* Macros for easier/more consistant state testing */ #define VISIBLE_ACHAN(achan) ((achan->flag & ACHAN_HIDDEN)==0) #define EDITABLE_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && ((achan->flag & ACHAN_PROTECTED)==0)) -//#define EXPANDED_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && (achan->flag & ACHAN_EXPANDED)) +#define EXPANDED_ACHAN(achan) ((VISIBLE_ACHAN(achan)) && (achan->flag & ACHAN_EXPANDED)) #define SEL_ACHAN(achan) ((achan->flag & ACHAN_SELECTED) || (achan->flag & ACHAN_HILIGHTED)) #define EDITABLE_CONCHAN(conchan) ((conchan->flag & CONSTRAINT_CHANNEL_PROTECTED)==0) - +#define SEL_CONCHAN(conchan) (conchan->flag & CONSTRAINT_CHANNEL_SELECT) #define CHANNEL_FILTER_LOC 0x00000001 /* Show location keys */ #define CHANNEL_FILTER_ROT 0x00000002 /* Show rotation keys */ @@ -96,7 +96,6 @@ void mirror_action_keys(short mirror_mode); void clean_shapekeys(struct Key *key); void clean_actionchannels(struct bAction *act); - /* Marker Operations */ void column_select_shapekeys(struct Key *key, int mode); void column_select_actionkeys(struct bAction *act, int mode); @@ -122,7 +121,7 @@ void borderselect_action(void); void deselect_actionchannel_keys(struct bAction *act, int test, int sel); void deselect_actionchannels (struct bAction *act, int test); void deselect_meshchannel_keys (struct Key *key, int test, int sel); -int select_channel(struct bAction *act, struct bActionChannel *chan, int selectmode); +int select_channel(struct bAction *act, struct bActionChannel *achan, int selectmode); void select_actionchannel_by_name (struct bAction *act, char *name, int select); /* */ diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 7d221d34d6e..2f1b9ed85f0 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -126,6 +126,7 @@ typedef struct SpaceAction { #define ACHAN_HILIGHTED 0x00000002 #define ACHAN_HIDDEN 0x00000004 #define ACHAN_PROTECTED 0x00000008 +#define ACHAN_EXPANDED 0x00000010 #define ACHAN_MOVED 0x80000000 /* SpaceAction flag */ diff --git a/source/blender/src/drawaction.c b/source/blender/src/drawaction.c index 7bdf27beab5..1bc2e4b96d3 100644 --- a/source/blender/src/drawaction.c +++ b/source/blender/src/drawaction.c @@ -209,15 +209,15 @@ void draw_cfra_action(void) /* left hand */ static void draw_action_channel_names(bAction *act) { - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; float x, y; x = 0.0; y= count_action_levels(act)*(CHANNELHEIGHT+CHANNELSKIP); - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + for (achan=act->chanbase.first; achan; achan= achan->next) { + if(VISIBLE_ACHAN(achan)) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ; @@ -225,37 +225,51 @@ static void draw_action_channel_names(bAction *act) BIF_ThemeColorShade(TH_HEADER, 20); glRectf(x, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2); - /* draw 'lock' indicating whether channel is protected */ - if (chan->flag & ACHAN_PROTECTED) - BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED); - else - BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED); + /* draw expand/collapse triangle for action-channel */ + if (achan->constraintChannels.first) { /* until we get ipo-channels */ + if (EXPANDED_ACHAN(achan)) + BIF_icon_draw(x+1, y-CHANNELHEIGHT/2, ICON_TRIA_DOWN); + else + BIF_icon_draw(x+1, y-CHANNELHEIGHT/2, ICON_TRIA_RIGHT); + } /* draw name of action channel */ - if (chan->flag & ACHAN_SELECTED) + if (SEL_ACHAN(achan)) BIF_ThemeColor(TH_TEXT_HI); else BIF_ThemeColor(TH_TEXT); - glRasterPos2f(x+8, y-4); - BMF_DrawString(G.font, chan->name); + glRasterPos2f(x+18, y-4); + BMF_DrawString(G.font, achan->name); + + /* draw 'lock' indicating whether channel is protected */ + if (EDITABLE_ACHAN(achan)==0) + BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED); + else + BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED); y-=CHANNELHEIGHT+CHANNELSKIP; - - /* Draw constraint channels */ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) { - /* draw 'lock' to indicate if constraint channel is protected */ - if (conchan->flag & CONSTRAINT_CHANNEL_PROTECTED) - BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED); - else - BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED); - - /* draw name of constraint channel */ - if (conchan->flag & CONSTRAINT_CHANNEL_SELECT) - BIF_ThemeColor(TH_TEXT_HI); - else - BIF_ThemeColor(TH_TEXT); - glRasterPos2f(x+32, y-4); - BMF_DrawString(G.font, conchan->name); - y-=CHANNELHEIGHT+CHANNELSKIP; + + if (EXPANDED_ACHAN(achan)) { + /* Draw constraint channels */ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + /* draw backing strip behind constraint channel*/ + BIF_ThemeColorShade(TH_HEADER, -20); + glRectf(x+7, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2); + + /* draw name of constraint channel */ + if (SEL_CONCHAN(conchan)) + BIF_ThemeColor(TH_TEXT_HI); + else + BIF_ThemeColor(TH_TEXT); + glRasterPos2f(x+18, y-4); + BMF_DrawString(G.font, conchan->name); + + /* draw 'lock' to indicate if constraint channel is protected */ + if (EDITABLE_CONCHAN(conchan)==0) + BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED); + else + BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED); + y-=CHANNELHEIGHT+CHANNELSKIP; + } } glDisable(GL_BLEND); @@ -354,16 +368,18 @@ static void draw_channel_names(void) int count_action_levels(bAction *act) { - int y=0; bActionChannel *achan; + int y= 0; if (!act) return 0; - for (achan=act->chanbase.first; achan; achan=achan->next){ - if((achan->flag & ACHAN_HIDDEN)==0) { - y+=1; - y+=BLI_countlist(&achan->constraintChannels); + for (achan=act->chanbase.first; achan; achan=achan->next) { + if(VISIBLE_ACHAN(achan)) { + y+= 1; + + if (EXPANDED_ACHAN(achan)) + y+= BLI_countlist(&achan->constraintChannels); } } @@ -399,7 +415,7 @@ static void draw_channel_strips(SpaceAction *saction) rcti scr_rct; gla2DDrawInfo *di; bAction *act; - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; float y, sta, end; int act_start, act_end, dummy; @@ -433,17 +449,17 @@ static void draw_channel_strips(SpaceAction *saction) /* first backdrop strips */ y= count_action_levels(act)*(CHANNELHEIGHT+CHANNELSKIP); glEnable(GL_BLEND); - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + for (achan=act->chanbase.first; achan; achan= achan->next) { + if(VISIBLE_ACHAN(achan)) { int frame1_x, channel_y; gla2DDrawTranslatePt(di, G.v2d->cur.xmin, y, &frame1_x, &channel_y); - if (chan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x22); + if (SEL_ACHAN(achan)) glColor4ub(col1[0], col1[1], col1[2], 0x22); else glColor4ub(col2[0], col2[1], col2[2], 0x22); glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2); - if (chan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x22); + if (SEL_ACHAN(achan)) glColor4ub(col1[0], col1[1], col1[2], 0x22); else glColor4ub(col2[0], col2[1], col2[2], 0x22); glRectf(act_start, channel_y-CHANNELHEIGHT/2, act_end, channel_y+CHANNELHEIGHT/2); @@ -451,18 +467,20 @@ static void draw_channel_strips(SpaceAction *saction) y-=CHANNELHEIGHT+CHANNELSKIP; /* Draw constraint channels */ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y); - - if (conchan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x22); - else glColor4ub(col2[0], col2[1], col2[2], 0x22); - glRectf(frame1_x, channel_y-CHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2-4); - - if (conchan->flag & ACHAN_SELECTED) glColor4ub(col1[0], col1[1], col1[2], 0x22); - else glColor4ub(col2[0], col2[1], col2[2], 0x22); - glRectf(act_start, channel_y-CHANNELHEIGHT/2+4, act_end, channel_y+CHANNELHEIGHT/2-4); - - y-=CHANNELHEIGHT+CHANNELSKIP; + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y); + + if (SEL_CONCHAN(conchan)) glColor4ub(col1[0], col1[1], col1[2], 0x22); + else glColor4ub(col2[0], col2[1], col2[2], 0x22); + glRectf(frame1_x, channel_y-CHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2-4); + + if (SEL_CONCHAN(conchan)) glColor4ub(col1[0], col1[1], col1[2], 0x22); + else glColor4ub(col2[0], col2[1], col2[2], 0x22); + glRectf(act_start, channel_y-CHANNELHEIGHT/2+4, act_end, channel_y+CHANNELHEIGHT/2-4); + + y-=CHANNELHEIGHT+CHANNELSKIP; + } } } } @@ -473,16 +491,18 @@ static void draw_channel_strips(SpaceAction *saction) /* dot thingies */ y= count_action_levels(act)*(CHANNELHEIGHT+CHANNELSKIP); - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + for (achan= act->chanbase.first; achan; achan= achan->next) { + if(VISIBLE_ACHAN(achan)) { - draw_ipo_channel(di, chan->ipo, y); + draw_ipo_channel(di, achan->ipo, y); y-=CHANNELHEIGHT+CHANNELSKIP; /* Draw constraint channels */ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - draw_ipo_channel(di, conchan->ipo, y); - y-=CHANNELHEIGHT+CHANNELSKIP; + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + draw_ipo_channel(di, conchan->ipo, y); + y-=CHANNELHEIGHT+CHANNELSKIP; + } } } } diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c index 78290f7f413..f1ef693317a 100644 --- a/source/blender/src/editaction.c +++ b/source/blender/src/editaction.c @@ -128,20 +128,20 @@ static void select_poseelement_by_name (char *name, int select) /* called extern, like on bone selection */ void select_actionchannel_by_name (bAction *act, char *name, int select) { - bActionChannel *chan; + bActionChannel *achan; if (!act) return; - for (chan = act->chanbase.first; chan; chan=chan->next){ - if (!strcmp (chan->name, name)){ - if (select){ - chan->flag |= ACHAN_SELECTED; - hilight_channel (act, chan, 1); + for (achan = act->chanbase.first; achan; achan= achan->next) { + if (!strcmp(achan->name, name)) { + if (select) { + achan->flag |= ACHAN_SELECTED; + hilight_channel(act, achan, 1); } - else{ - chan->flag &= ~ACHAN_SELECTED; - hilight_channel (act, chan, 0); + else { + achan->flag &= ~ACHAN_SELECTED; + hilight_channel(act, achan, 0); } return; } @@ -151,19 +151,19 @@ void select_actionchannel_by_name (bAction *act, char *name, int select) /* called on changing action ipos or keys */ void remake_action_ipos(bAction *act) { - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; IpoCurve *icu; - for (chan= act->chanbase.first; chan; chan=chan->next){ - if (chan->ipo){ - for (icu = chan->ipo->curve.first; icu; icu=icu->next){ + for (achan= act->chanbase.first; achan; achan= achan->next) { + if (achan->ipo) { + for (icu = achan->ipo->curve.first; icu; icu=icu->next) { sort_time_ipocurve(icu); testhandles_ipocurve(icu); } } - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - if (conchan->ipo){ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){ + if (conchan->ipo) { for (icu = conchan->ipo->curve.first; icu; icu=icu->next){ sort_time_ipocurve(icu); testhandles_ipocurve(icu); @@ -183,7 +183,7 @@ static void remake_meshaction_ipos(Ipo *ipo) */ IpoCurve *icu; - for (icu = ipo->curve.first; icu; icu=icu->next){ + for (icu = ipo->curve.first; icu; icu=icu->next) { sort_time_ipocurve(icu); testhandles_ipocurve(icu); } @@ -209,7 +209,6 @@ void duplicate_meshchannel_keys(Key *key) transform_meshchannel_keys ('g', key); } - void duplicate_actionchannel_keys(void) { bAction *act; @@ -222,13 +221,14 @@ void duplicate_actionchannel_keys(void) /* Find selected items */ for (achan = act->chanbase.first; achan; achan= achan->next){ - if(EDITABLE_ACHAN(achan)) + if(EDITABLE_ACHAN(achan)) { duplicate_ipo_keys(achan->ipo); - - if (VISIBLE_ACHAN(achan)) { - for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { - if (EDITABLE_CONCHAN(conchan)) - duplicate_ipo_keys(conchan->ipo); + + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (EDITABLE_CONCHAN(conchan)) + duplicate_ipo_keys(conchan->ipo); + } } } } @@ -239,7 +239,7 @@ void duplicate_actionchannel_keys(void) static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, bConstraintChannel **rchan) { bAction *act; - bActionChannel *chan; + bActionChannel *achan; IpoCurve *icu; bActionChannel *firstchan=NULL; bConstraintChannel *conchan, *firstconchan=NULL; @@ -266,7 +266,7 @@ static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, ymax += CHANNELHEIGHT/2; /* if action is mapped in NLA, it returns a correction */ - if(G.saction->pin==0 && OBACT) { + if (G.saction->pin==0 && OBACT) { xmin= get_action_frame(OBACT, rectf.xmin); xmax= get_action_frame(OBACT, rectf.xmax); } @@ -277,31 +277,30 @@ static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, *sel=0; - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - + for (achan=act->chanbase.first; achan; achan= achan->next) { + if (VISIBLE_ACHAN(achan)) { /* Check action channel */ ymin= ymax-(CHANNELHEIGHT+CHANNELSKIP); - if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)) && chan->ipo){ - for (icu=chan->ipo->curve.first; icu; icu=icu->next){ - for (i=0; i<icu->totvert; i++){ - if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ){ - if (!firstchan){ - firstchan=chan; + if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)) && achan->ipo) { + for (icu=achan->ipo->curve.first; icu; icu=icu->next) { + for (i=0; i<icu->totvert; i++) { + if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ) { + if (!firstchan) { + firstchan=achan; firstvert=icu->bezt[i].vec[1][0]; *sel = icu->bezt[i].f2 & 1; } - if (icu->bezt[i].f2 & 1){ - if (!foundsel){ + if (icu->bezt[i].f2 & 1) { + if (!foundsel) { foundsel=1; foundx = icu->bezt[i].vec[1][0]; } } - else if (foundsel && icu->bezt[i].vec[1][0] != foundx){ + else if (foundsel && icu->bezt[i].vec[1][0] != foundx) { *index=icu->bezt[i].vec[1][0]; *sel = 0; - return chan; + return achan; } } } @@ -309,31 +308,34 @@ static bActionChannel *get_nearest_actionchannel_key (float *index, short *sel, } ymax=ymin; + if (EXPANDED_ACHAN(achan) == 0) + continue; + /* Check constraint channels */ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { ymin=ymax-(CHANNELHEIGHT+CHANNELSKIP); if (!((ymax < rectf.ymin) || (ymin > rectf.ymax)) && conchan->ipo) { for (icu=conchan->ipo->curve.first; icu; icu=icu->next){ - for (i=0; i<icu->totvert; i++){ - if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ){ - if (!firstchan){ - firstchan=chan; - firstconchan=conchan; - firstvert=icu->bezt[i].vec[1][0]; + for (i=0; i<icu->totvert; i++) { + if (icu->bezt[i].vec[1][0] > xmin && icu->bezt[i].vec[1][0] <= xmax ) { + if (!firstchan) { + firstchan= achan; + firstconchan= conchan; + firstvert= icu->bezt[i].vec[1][0]; *sel = icu->bezt[i].f2 & 1; } - if (icu->bezt[i].f2 & 1){ - if (!foundsel){ + if (icu->bezt[i].f2 & 1) { + if (!foundsel) { foundsel=1; foundx = icu->bezt[i].vec[1][0]; } } - else if (foundsel && icu->bezt[i].vec[1][0] != foundx){ + else if (foundsel && icu->bezt[i].vec[1][0] != foundx) { *index=icu->bezt[i].vec[1][0]; *sel = 0; *rchan = conchan; - return chan; + return achan; } } } @@ -390,39 +392,34 @@ static IpoCurve *get_nearest_meshchannel_key (float *index, short *sel) */ if (!icu->adrcode) continue; - ymax = ybase - (CHANNELHEIGHT+CHANNELSKIP)*(icu->adrcode-1); - ymin=ymax-(CHANNELHEIGHT+CHANNELSKIP); + ymax = ybase - (CHANNELHEIGHT+CHANNELSKIP)*(icu->adrcode-1); + ymin = ymax - (CHANNELHEIGHT+CHANNELSKIP); /* Does this curve coorespond to the right * strip? */ - if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))){ + if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) { /* loop through the beziers in the curve */ - for (i=0; i<icu->totvert; i++){ + for (i=0; i<icu->totvert; i++) { /* Is this bezier in the right area? */ if (icu->bezt[i].vec[1][0] > rectf.xmin && - icu->bezt[i].vec[1][0] <= rectf.xmax ){ + icu->bezt[i].vec[1][0] <= rectf.xmax ) { - /* if no other curves have been picked ... - */ + /* if no other curves have been picked ... */ if (!firsticu){ - /* mark this curve/bezier as the first - * selected - */ + /* mark this curve/bezier as the first selected */ firsticu=icu; firstvert=icu->bezt[i].vec[1][0]; - /* sel = (is the bezier is already selected) ? 1 : 0; - */ + /* sel = (is the bezier is already selected) ? 1 : 0; */ *sel = icu->bezt[i].f2 & 1; } - /* if the bezier is selected ... - */ + /* if the bezier is selected ... */ if (icu->bezt[i].f2 & 1){ /* if we haven't found a selected one yet ... */ @@ -543,12 +540,14 @@ void column_select_actionkeys(bAction *act, int mode) case 1: /* create a list of all selected keys */ for (achan=act->chanbase.first; achan; achan=achan->next){ - if((achan->flag & ACHAN_HIDDEN)==0) { + if(VISIBLE_ACHAN(achan)) { if (achan->ipo) make_sel_cfra_list(achan->ipo, &elems); - for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { - if (conchan->ipo) - make_sel_cfra_list(conchan->ipo, &elems); + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (conchan->ipo) + make_sel_cfra_list(conchan->ipo, &elems); + } } } } @@ -568,8 +567,8 @@ void column_select_actionkeys(bAction *act, int mode) /* loop through all of the keys and select additional keyframes * based on the keys found to be selected above */ - for (achan=act->chanbase.first; achan; achan=achan->next){ - if((achan->flag & ACHAN_HIDDEN)==0) { + for (achan=act->chanbase.first; achan; achan= achan->next){ + if(VISIBLE_ACHAN(achan)) { if (achan->ipo) { for(ce= elems.first; ce; ce= ce->next) { for (icu = achan->ipo->curve.first; icu; icu = icu->next){ @@ -587,8 +586,10 @@ void column_select_actionkeys(bAction *act, int mode) } } } - - + + if (EXPANDED_ACHAN(achan) == 0) + continue; + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { if (conchan->ipo) { for(ce= elems.first; ce; ce= ce->next) { @@ -617,38 +618,37 @@ void column_select_actionkeys(bAction *act, int mode) static void mouse_action(int selectmode) { bAction *act; - short sel; - float selx; - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; TimeMarker *marker; - short mval[2]; - + short mval[2], sel; + float selx; + act=G.saction->action; if (!act) return; getmouseco_areawin (mval); - chan=get_nearest_actionchannel_key(&selx, &sel, &conchan); + achan=get_nearest_actionchannel_key(&selx, &sel, &conchan); marker=find_nearest_marker(1); - if (chan){ + if (achan) { if (selectmode == SELECT_REPLACE) { selectmode = SELECT_ADD; deselect_actionchannel_keys(act, 0, 0); deselect_actionchannels(act, 0); - chan->flag |= ACHAN_SELECTED; - hilight_channel (act, chan, 1); - select_poseelement_by_name(chan->name, 2); /* 2 is activate */ + achan->flag |= ACHAN_SELECTED; + hilight_channel (act, achan, 1); + select_poseelement_by_name(achan->name, 2); /* 2 is activate */ } if (conchan) select_ipo_key(conchan->ipo, selx, selectmode); else - select_ipo_key(chan->ipo, selx, selectmode); + select_ipo_key(achan->ipo, selx, selectmode); std_rmouse_transform(transform_actionchannel_keys); @@ -779,7 +779,7 @@ void borderselect_action(void) rctf rectf; int val, selectmode; short mval[2]; - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; bAction *act; float ymin, ymax; @@ -789,7 +789,7 @@ void borderselect_action(void) if (!act) return; - if ( (val = get_border(&rect, 3)) ){ + if ( (val = get_border(&rect, 3)) ) { if (val == LEFTMOUSE) selectmode = SELECT_ADD; else @@ -803,33 +803,31 @@ void borderselect_action(void) areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax); /* if action is mapped in NLA, it returns a correction */ - if(G.saction->pin==0 && OBACT) { + if (G.saction->pin==0 && OBACT) { rectf.xmin= get_action_frame(OBACT, rectf.xmin); rectf.xmax= get_action_frame(OBACT, rectf.xmax); } - ymax= count_action_levels(act) * (CHANNELHEIGHT+CHANNELSKIP); + ymax = count_action_levels(act) * (CHANNELHEIGHT+CHANNELSKIP); ymax += CHANNELHEIGHT/2; - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - + for (achan=act->chanbase.first; achan; achan= achan->next) { + if(VISIBLE_ACHAN(achan)) { /* Check action */ ymin=ymax-(CHANNELHEIGHT+CHANNELSKIP); if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) - borderselect_ipo_key(chan->ipo, rectf.xmin, rectf.xmax, - selectmode); - + borderselect_ipo_key(achan->ipo, rectf.xmin, rectf.xmax, selectmode); ymax=ymin; - - /* Check constraints */ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - ymin=ymax-(CHANNELHEIGHT+CHANNELSKIP); - if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) - borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax, - selectmode); - ymax=ymin; + if (EXPANDED_ACHAN(achan)) { + /* Check constraints */ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + ymin= ymax-(CHANNELHEIGHT+CHANNELSKIP); + if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) + borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax, selectmode); + + ymax=ymin; + } } } } @@ -922,17 +920,17 @@ bAction *ob_get_action(Object *ob) } /* used by ipo, outliner, buttons to find the active channel */ -bActionChannel* get_hilighted_action_channel(bAction* action) +bActionChannel *get_hilighted_action_channel(bAction *action) { - bActionChannel *chan; + bActionChannel *achan; if (!action) return NULL; - for (chan=action->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) - if (chan->flag & ACHAN_SELECTED && chan->flag & ACHAN_HILIGHTED) - return chan; + for (achan= action->chanbase.first; achan; achan= achan->next) { + if(VISIBLE_ACHAN(achan)) + if (SEL_ACHAN(achan) && achan->flag & ACHAN_HILIGHTED) + return achan; } return NULL; @@ -978,13 +976,14 @@ void transform_actionchannel_keys(int mode, int dummy) /* Ensure that partial selections result in beztriple selections */ for (achan=act->chanbase.first; achan; achan= achan->next){ - if (EDITABLE_ACHAN(achan)) + if (EDITABLE_ACHAN(achan)) { tvtot+=fullselect_ipo_keys(achan->ipo); - if (VISIBLE_ACHAN(achan)) { - for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { - if (EDITABLE_CONCHAN(conchan)) - tvtot+=fullselect_ipo_keys(conchan->ipo); + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (EDITABLE_CONCHAN(conchan)) + tvtot+=fullselect_ipo_keys(conchan->ipo); + } } } } @@ -999,13 +998,14 @@ void transform_actionchannel_keys(int mode, int dummy) tvtot=0; for (achan=act->chanbase.first; achan; achan= achan->next){ - if(EDITABLE_ACHAN(achan)) + if(EDITABLE_ACHAN(achan)) { tvtot = add_trans_ipo_keys(achan->ipo, tv, tvtot); - if (VISIBLE_ACHAN(achan)) { - for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { - if (EDITABLE_CONCHAN(conchan)) - tvtot = add_trans_ipo_keys(conchan->ipo, tv, tvtot); + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (EDITABLE_CONCHAN(conchan)) + tvtot = add_trans_ipo_keys(conchan->ipo, tv, tvtot); + } } } } @@ -1074,7 +1074,8 @@ void transform_actionchannel_keys(int mode, int dummy) tv[i].loc[0]=tv[i].oldloc[0]; tv[i].loc[1]=tv[i].oldloc[1]; } - } else { + } + else { getmouseco_areawin (mvalc); areamouseco_to_ipoco(G.v2d, mvalc, &cval[0], &cval[1]); @@ -1086,7 +1087,8 @@ void transform_actionchannel_keys(int mode, int dummy) if (!firsttime && lastcval[0]==cval[0] && lastcval[1]==cval[1]) { PIL_sleep_ms(1); - } else { + } + else { short autosnap= 0; /* determine mode of keyframe snapping/autosnap */ @@ -1109,10 +1111,10 @@ void transform_actionchannel_keys(int mode, int dummy) } } - for (i=0; i<tvtot; i++){ + for (i=0; i<tvtot; i++) { tv[i].loc[0]=tv[i].oldloc[0]; - switch (mode){ + switch (mode) { case 't': if( sval[0] > minx && sval[0] < maxx) { float timefac, cvalc= CLAMPIS(cval[0], minx, maxx); @@ -1201,11 +1203,11 @@ void transform_actionchannel_keys(int mode, int dummy) } } - if (mode=='s'){ + if (mode=='s') { sprintf(str, "scaleX: %.3f", fac); headerprint(str); } - else if (mode=='g'){ + else if (mode=='g') { if(G.saction->pin==0 && OBACT) { /* recalculate the delta based on 'visual' times */ fac = get_action_frame_inv(OBACT, cval[0]); @@ -1296,21 +1298,18 @@ void transform_meshchannel_keys(char mode, Key *key) */ tvtot=fullselect_ipo_keys(key->ipo); - /* If nothing is selected, bail out - */ + /* If nothing is selected, bail out */ if (!tvtot) return; - /* Build the transvert structure - */ + /* Build the transvert structure */ tv = MEM_callocN (sizeof(TransVert) * tvtot, "transVert"); tvtot=0; tvtot = add_trans_ipo_keys(key->ipo, tv, tvtot); - /* Do the event loop - */ + /* Do the event loop */ cent[0] = curarea->winx + (G.saction->v2d.hor.xmax)/2; cent[1] = curarea->winy + (G.saction->v2d.hor.ymax)/2; areamouseco_to_ipoco(G.v2d, cent, &cenf[0], &cenf[1]); @@ -1362,7 +1361,8 @@ void transform_meshchannel_keys(char mode, Key *key) if (!firsttime && lastcval[0]==cval[0] && lastcval[1]==cval[1]) { PIL_sleep_ms(1); - } else { + } + else { short autosnap= 0; /* determine mode of keyframe snapping/autosnap */ @@ -1385,7 +1385,7 @@ void transform_meshchannel_keys(char mode, Key *key) } } - for (i=0; i<tvtot; i++){ + for (i=0; i<tvtot; i++) { tv[i].loc[0]=tv[i].oldloc[0]; switch (mode){ @@ -1442,16 +1442,16 @@ void transform_meshchannel_keys(char mode, Key *key) /* Display a message showing the magnitude of * the grab/scale we are performing */ - if (mode=='s'){ + if (mode=='s') { sprintf(str, "scaleX: %.3f", fac); headerprint(str); } - else if (mode=='g'){ + else if (mode=='g') { sprintf(str, "deltaX: %.3f", fac); headerprint(str); } - if (G.saction->lock){ + if (G.saction->lock) { /* doubt any of this code ever gets * executed, but it might in the * future @@ -1476,8 +1476,7 @@ void transform_meshchannel_keys(char mode, Key *key) firsttime= 0; } - /* fix up the Ipocurves and redraw stuff - */ + /* fix up the Ipocurves and redraw stuff */ meshkey_do_redraw(key); BIF_undo_push("Transform Action Keys"); @@ -1490,25 +1489,27 @@ void transform_meshchannel_keys(char mode, Key *key) void deselect_actionchannel_keys (bAction *act, int test, int sel) { - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; if (!act) return; /* Determine if this is selection or deselection */ - - if (test){ - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + if (test) { + for (achan= act->chanbase.first; achan; achan= achan->next) { + if(VISIBLE_ACHAN(achan)) { /* Test the channel ipos */ - if (is_ipo_key_selected(chan->ipo)){ + if (is_ipo_key_selected(achan->ipo)) { sel = 0; break; } + if (EXPANDED_ACHAN(achan) == 0) + continue; + /* Test the constraint ipos */ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){ if (is_ipo_key_selected(conchan->ipo)){ sel = 0; break; @@ -1522,23 +1523,25 @@ void deselect_actionchannel_keys (bAction *act, int test, int sel) } /* Set the flags */ - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - set_ipo_key_selection(chan->ipo, sel); - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) - set_ipo_key_selection(conchan->ipo, sel); + for (achan= act->chanbase.first; achan; achan= achan->next){ + if(VISIBLE_ACHAN(achan)) { + set_ipo_key_selection(achan->ipo, sel); + + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) + set_ipo_key_selection(conchan->ipo, sel); + } } } } void deselect_meshchannel_keys (Key *key, int test, int sel) { - /* should deselect the rvk keys - */ + /* should deselect the rvk keys */ /* Determine if this is selection or deselection */ - if (test){ - if (is_ipo_key_selected(key->ipo)){ + if (test) { + if (is_ipo_key_selected(key->ipo)) { sel = 0; } } @@ -1550,28 +1553,28 @@ void deselect_meshchannel_keys (Key *key, int test, int sel) /* apparently within active object context */ void deselect_actionchannels (bAction *act, int test) { - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; - int sel=1; + int sel= 1; if (!act) return; /* See if we should be selecting or deselecting */ - if (test){ - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + if (test) { + for (achan=act->chanbase.first; achan; achan= achan->next){ + if (VISIBLE_ACHAN(achan)) { if (!sel) break; - - if (chan->flag & ACHAN_SELECTED){ - sel=0; + + if (SEL_ACHAN(achan)) { + sel= 0; break; } - if (sel){ - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){ - sel=0; + if (sel && EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){ + if (SEL_CONCHAN(conchan)) { + sel= 0; break; } } @@ -1580,38 +1583,40 @@ void deselect_actionchannels (bAction *act, int test) } } else - sel=0; + sel= 0; /* Now set the flags */ - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - select_poseelement_by_name(chan->name, sel); + for (achan=act->chanbase.first; achan; achan= achan->next) { + if (VISIBLE_ACHAN(achan)) { + select_poseelement_by_name(achan->name, sel); if (sel) - chan->flag |= ACHAN_SELECTED; + achan->flag |= ACHAN_SELECTED; else - chan->flag &= ~ACHAN_SELECTED; + achan->flag &= ~ACHAN_SELECTED; - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next){ - if (sel) - conchan->flag |= CONSTRAINT_CHANNEL_SELECT; - else - conchan->flag &= ~CONSTRAINT_CHANNEL_SELECT; + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (sel) + conchan->flag |= CONSTRAINT_CHANNEL_SELECT; + else + conchan->flag &= ~CONSTRAINT_CHANNEL_SELECT; + } } } } } -static void hilight_channel (bAction *act, bActionChannel *chan, short select) +static void hilight_channel (bAction *act, bActionChannel *achan, short select) { bActionChannel *curchan; if (!act) return; - for (curchan=act->chanbase.first; curchan; curchan=curchan->next){ - if (curchan==chan && select) + for (curchan=act->chanbase.first; curchan; curchan=curchan->next) { + if (curchan==achan && select) curchan->flag |= ACHAN_HILIGHTED; else curchan->flag &= ~ACHAN_HILIGHTED; @@ -1626,8 +1631,7 @@ static void hilight_channel (bAction *act, bActionChannel *chan, short select) /* exported for outliner (ton) */ /* apparently within active object context */ -int select_channel(bAction *act, bActionChannel *chan, - int selectmode) +int select_channel(bAction *act, bActionChannel *achan, int selectmode) { /* Select the channel based on the selection mode */ @@ -1635,19 +1639,19 @@ int select_channel(bAction *act, bActionChannel *chan, switch (selectmode) { case SELECT_ADD: - chan->flag |= ACHAN_SELECTED; + achan->flag |= ACHAN_SELECTED; break; case SELECT_SUBTRACT: - chan->flag &= ~ACHAN_SELECTED; + achan->flag &= ~ACHAN_SELECTED; break; case SELECT_INVERT: - chan->flag ^= ACHAN_SELECTED; + achan->flag ^= ACHAN_SELECTED; break; } - flag = (chan->flag & ACHAN_SELECTED) ? 1 : 0; + flag = (achan->flag & ACHAN_SELECTED) ? 1 : 0; - hilight_channel(act, chan, flag); - select_poseelement_by_name(chan->name, flag); + hilight_channel(act, achan, flag); + select_poseelement_by_name(achan->name, flag); return flag; } @@ -1675,9 +1679,9 @@ static int select_constraint_channel(bAction *act, return flag; } -/* lefthand side */ -static void mouse_actionchannels(bAction *act, short *mval, - short *mvalo, int selectmode) { +static void borderselect_actionchannels(bAction *act, short *mval, + short *mvalo, int selectmode) +{ /* Select action channels, based on mouse values. * If mvalo is NULL we assume it is a one click * action, other wise we treat it like it is a @@ -1685,15 +1689,15 @@ static void mouse_actionchannels(bAction *act, short *mval, * mvalo[0], mvalo[1] forming the corners of * a rectangle. */ - bActionChannel *chan; - float click, x,y; - int clickmin, clickmax; - int wsize, sel; + bActionChannel *achan; bConstraintChannel *conchan; + float click, x,y; + int clickmin, clickmax; + int wsize; if (!act) return; - + if (selectmode == SELECT_REPLACE) { deselect_actionchannels (act, 0); selectmode = SELECT_ADD; @@ -1742,37 +1746,44 @@ static void mouse_actionchannels(bAction *act, short *mval, * and constraint channels. */ - for (chan = act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + /* try in action channels */ + for (achan = act->chanbase.first; achan; achan= achan->next){ + if(VISIBLE_ACHAN(achan)) { if (clickmax < 0) break; - - if ( clickmin <= 0) { + + if (clickmin <= 0) { /* Select the channel with the given mode. If the * channel is freshly selected then set it to the * active channel for the action */ - sel = (chan->flag & ACHAN_SELECTED); - select_channel(act, chan, selectmode); + select_channel(act, achan, selectmode); /* messy... */ - select_poseelement_by_name(chan->name, 2); - + select_poseelement_by_name(achan->name, 2); } + --clickmin; --clickmax; - - /* Check for click in a constraint */ - for (conchan=chan->constraintChannels.first; - conchan; conchan=conchan->next){ - if (clickmax < 0) break; - if ( clickmin <= 0) { - select_constraint_channel(act, conchan, selectmode); - } - --clickmin; - --clickmax; + } + + if (EXPANDED_ACHAN(achan) == 0) { + /* cannot search constaint channels */ + continue; + } + + /* try in constaint channels */ + for (conchan= achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (clickmax < 0) break; + + if (clickmin <= 0) { + /* constraint channel */ + select_constraint_channel(act, conchan, selectmode); } + + --clickmin; + --clickmax; } } - + allqueue (REDRAWIPO, 0); allqueue (REDRAWVIEW3D, 0); allqueue (REDRAWACTION, 0); @@ -1781,77 +1792,70 @@ static void mouse_actionchannels(bAction *act, short *mval, allqueue (REDRAWBUTSALL, 0); } -/* turn on/off protect option for action channel */ -static void mouse_actionchannels_protect (bAction *act, short *mval) +/* lefthand side */ +static void mouse_actionchannels (short mval[]) { - bActionChannel *achan; - bConstraintChannel *conchan; - - float x,y; - int clickmin, clickmax; - int wsize, lock; - - /* wsize is the greatest possible height (in pixels) that would be - * needed to draw all of the action channels and constraint - * channels. - */ - wsize = count_action_levels(act)*(CHANNELHEIGHT+CHANNELSKIP); - wsize += CHANNELHEIGHT/2; - - areamouseco_to_ipoco(G.v2d, mval, &x, &y); - clickmin = (int) ((wsize - y) / (CHANNELHEIGHT+CHANNELSKIP)); - clickmax = clickmin; + bAction *act= G.saction->action; + void *act_channel; + short chan_type; - if (clickmax < 0) - return; + /* get channel to work on */ + act_channel= get_nearest_act_channel(mval, &chan_type); - /* clickmin and clickmax now coorespond to indices into - * the collection of channels and constraint channels. - * What we need to do is turn locks on/off for all action - * channels and constraint channels between these indices. - * This is done by traversing the channels and constraint - * channels, for each item decrementing clickmin and clickmax. - * When clickmin is less than zero we start locking stuff, - * until clickmax is less than zero or we run out of channels - * and constraint channels. - */ - - for (achan = act->chanbase.first; achan; achan= achan->next){ - if((achan->flag & ACHAN_HIDDEN)==0) { - if (clickmax < 0) break; - - /* assume locking this action channel */ - if ( clickmin <= 0) { - /* invert the channel's protect property */ - lock = (achan->flag & ACHAN_PROTECTED); - if (lock) { - achan->flag &= ~ACHAN_PROTECTED; - } + /* action to take depends on what channel we've got */ + switch (chan_type) { + case ACTTYPE_ACHAN: + { + bActionChannel *achan= (bActionChannel *)act_channel; + + if (mval[0] >= (NAMEWIDTH-16)) { + /* toggle protect */ + achan->flag ^= ACHAN_PROTECTED; + } + else if (mval[0] <= 17) { + /* toggle expand */ + if (achan->constraintChannels.first) + achan->flag ^= ACHAN_EXPANDED; + } else { - achan->flag |= ACHAN_PROTECTED; + /* select/deselect achan */ + if (G.qual & LR_SHIFTKEY) { + select_channel(act, achan, SELECT_INVERT); + } + else { + deselect_actionchannels(act, 0); + select_channel(act, achan, SELECT_ADD); + } + + /* messy... set active bone */ + select_poseelement_by_name(achan->name, 2); } } - --clickmin; - --clickmax; - - /* Check for click in a constraint channel */ - for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){ - if (clickmax < 0) break; - if ( clickmin <= 0) { - /* invert the channel's protect property */ - lock = (conchan->flag & CONSTRAINT_CHANNEL_PROTECTED); - if (lock) - conchan->flag &= ~CONSTRAINT_CHANNEL_PROTECTED; - else - conchan->flag |= CONSTRAINT_CHANNEL_PROTECTED; + break; + case ACTTYPE_CONCHAN: + { + bConstraintChannel *conchan= (bConstraintChannel *)act_channel; + + if (mval[0] >= (NAMEWIDTH-16)) { + /* toggle protection */ + conchan->flag ^= CONSTRAINT_CHANNEL_PROTECTED; + } + else { + /* select/deselect */ + select_constraint_channel(act, conchan, SELECT_INVERT); } - --clickmin; - --clickmax; } - } + break; + default: + return; } + allqueue (REDRAWIPO, 0); + allqueue (REDRAWVIEW3D, 0); allqueue (REDRAWACTION, 0); + allqueue (REDRAWNLA, 0); + allqueue (REDRAWOOPS, 0); + allqueue (REDRAWBUTSALL, 0); } void delete_meshchannel_keys(Key *key) @@ -1876,17 +1880,17 @@ void delete_actionchannel_keys(void) if (!act) return; - for (achan = act->chanbase.first; achan; achan= achan->next){ - if(EDITABLE_ACHAN(achan)) { + for (achan = act->chanbase.first; achan; achan= achan->next) { + if (EDITABLE_ACHAN(achan)) { /* Check action channel keys*/ delete_ipo_keys(achan->ipo); - } - - if (VISIBLE_ACHAN(achan)) { - /* Delete constraint channel keys */ - for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { - if (EDITABLE_CONCHAN(conchan)) - delete_ipo_keys(conchan->ipo); + + if (EXPANDED_ACHAN(achan)) { + /* Delete constraint channel keys */ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (EDITABLE_CONCHAN(conchan)) + delete_ipo_keys(conchan->ipo); + } } } } @@ -1902,9 +1906,9 @@ void delete_actionchannel_keys(void) static void delete_actionchannels (void) { - bConstraintChannel *conchan=NULL, *nextconchan; - bActionChannel *chan, *next; bAction *act; + bActionChannel *achan, *next; + bConstraintChannel *conchan=NULL, *nextconchan; int freechan; act=G.saction->action; @@ -1912,47 +1916,47 @@ static void delete_actionchannels (void) if (!act) return; - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - if (chan->flag & ACHAN_SELECTED) + for (achan=act->chanbase.first; achan; achan=achan->next) { + if (VISIBLE_ACHAN(achan)) { + if (SEL_ACHAN(achan)) break; - for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) - { - if (conchan->flag & CONSTRAINT_CHANNEL_SELECT){ - chan=act->chanbase.last; + + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next){ + if (SEL_CONCHAN(conchan)) { + achan= act->chanbase.last; break; } } } } - if (!chan && !conchan) + if (!achan && !conchan) return; - for (chan=act->chanbase.first; chan; chan=next){ + for (achan= act->chanbase.first; achan; achan= next) { freechan = 0; - next=chan->next; - if((chan->flag & ACHAN_HIDDEN)==0) { - + next= achan->next; + + if (VISIBLE_ACHAN(achan)) { /* Remove action channels */ - if (chan->flag & ACHAN_SELECTED){ - if (chan->ipo) - chan->ipo->id.us--; /* Release the ipo */ + if (SEL_ACHAN(achan)) { + if (achan->ipo) + achan->ipo->id.us--; /* Release the ipo */ freechan = 1; - } - /* Remove constraint channels */ - for (conchan=chan->constraintChannels.first; conchan; conchan=nextconchan){ - nextconchan=conchan->next; - if (freechan || conchan->flag & CONSTRAINT_CHANNEL_SELECT){ - if (conchan->ipo) - conchan->ipo->id.us--; - BLI_freelinkN(&chan->constraintChannels, conchan); + /* Remove constraint channels */ + for (conchan=achan->constraintChannels.first; conchan; conchan=nextconchan) { + nextconchan= conchan->next; + if (freechan || SEL_CONCHAN(conchan)) { + if (conchan->ipo) + conchan->ipo->id.us--; + BLI_freelinkN(&achan->constraintChannels, conchan); + } } } if (freechan) - BLI_freelinkN (&act->chanbase, chan); + BLI_freelinkN (&act->chanbase, achan); } } @@ -2010,23 +2014,23 @@ void clean_actionchannels(bAction *act) for (achan= act->chanbase.first; achan; achan= achan->next) { if(EDITABLE_ACHAN(achan)) { /* clean if action channel if selected */ - if (achan->flag & ACHAN_SELECTED) { + if (SEL_ACHAN(achan)) { ipo= achan->ipo; if (ipo) { for (icu= ipo->curve.first; icu; icu= icu->next) clean_ipo_curve(icu); } } - } - - if (VISIBLE_ACHAN(achan)) { - /* clean action channel's constraint channels */ - for (conchan= achan->constraintChannels.first; conchan; conchan=conchan->next) { - if (EDITABLE_CONCHAN(conchan)) { - ipo= conchan->ipo; - if (ipo) { - for (icu= ipo->curve.first; icu; icu= icu->next) - clean_ipo_curve(icu); + + if (EXPANDED_ACHAN(achan)) { + /* clean action channel's constraint channels */ + for (conchan= achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (EDITABLE_CONCHAN(conchan)) { + ipo= conchan->ipo; + if (ipo) { + for (icu= ipo->curve.first; icu; icu= icu->next) + clean_ipo_curve(icu); + } } } } @@ -2056,8 +2060,7 @@ void sethandles_actionchannel_keys(int code) bActionChannel *achan; bConstraintChannel *conchan; - /* Get the selected action, exit if none are selected - */ + /* Get the selected action, exit if none are selected */ act = G.saction->action; if (!act) return; @@ -2066,19 +2069,19 @@ void sethandles_actionchannel_keys(int code) * of the selected keys based on the integer code */ for (achan = act->chanbase.first; achan; achan= achan->next){ - if(EDITABLE_ACHAN(achan)) + if (EDITABLE_ACHAN(achan)) { sethandles_ipo_keys(achan->ipo, code); - if (VISIBLE_ACHAN(achan)) { - for (conchan= achan->constraintChannels.first; conchan; conchan= conchan->next) { - if (EDITABLE_CONCHAN(conchan)) - sethandles_ipo_keys(conchan->ipo, code); + if (EXPANDED_ACHAN(achan)) { + for (conchan= achan->constraintChannels.first; conchan; conchan= conchan->next) { + if (EDITABLE_CONCHAN(conchan)) + sethandles_ipo_keys(conchan->ipo, code); + } } } } - /* Clean up and redraw stuff - */ + /* Clean up and redraw stuff */ remake_action_ipos(act); BIF_undo_push("Set handles Action channel"); allspace(REMAKEIPO, 0); @@ -2095,8 +2098,7 @@ void set_ipotype_actionchannels(int ipotype) bConstraintChannel *conchan; short event; - /* Get the selected action, exit if none are selected - */ + /* Get the selected action, exit if none are selected */ act = G.saction->action; if (!act) return; @@ -2119,28 +2121,27 @@ void set_ipotype_actionchannels(int ipotype) * the value from the popup). */ for (achan = act->chanbase.first; achan; achan= achan->next){ - if(EDITABLE_ACHAN(achan)) { - if (achan->flag & ACHAN_SELECTED){ + if (EDITABLE_ACHAN(achan)) { + if (SEL_ACHAN(achan)) { if (achan->ipo) setipotype_ipo(achan->ipo, ipotype); } - } - if (VISIBLE_ACHAN(achan)) { - /* constraint channels */ - for (conchan=achan->constraintChannels.first; conchan; conchan= conchan->next) { - if (EDITABLE_CONCHAN(conchan)) { - if (conchan->flag & CONSTRAINT_CHANNEL_SELECT) { - if (conchan->ipo) - setipotype_ipo(conchan->ipo, ipotype); + if (EXPANDED_ACHAN(achan)) { + /* constraint channels */ + for (conchan=achan->constraintChannels.first; conchan; conchan= conchan->next) { + if (EDITABLE_CONCHAN(conchan)) { + if (SEL_CONCHAN(conchan)) { + if (conchan->ipo) + setipotype_ipo(conchan->ipo, ipotype); + } } } } } } - /* Clean up and redraw stuff - */ + /* Clean up and redraw stuff */ remake_action_ipos(act); BIF_undo_push("Set Ipo type Action channel"); allspace(REMAKEIPO, 0); @@ -2180,9 +2181,9 @@ void set_extendtype_actionchannels(int extendtype) * the type for each Ipo curve in the channel Ipo (based on * the value from the popup). */ - for (achan = act->chanbase.first; achan; achan= achan->next){ + for (achan = act->chanbase.first; achan; achan= achan->next) { if (EDITABLE_ACHAN(achan)) { - if (achan->flag & ACHAN_SELECTED) { + if (SEL_ACHAN(achan)) { if (achan->ipo) { switch (extendtype) { case SET_EXTEND_CONSTANT: @@ -2200,13 +2201,14 @@ void set_extendtype_actionchannels(int extendtype) } } } - } - - if (VISIBLE_ACHAN(achan)) { + + if (EXPANDED_ACHAN(achan) == 0) + continue; + /* constraint channels */ for (conchan=achan->constraintChannels.first; conchan; conchan= conchan->next) { if (EDITABLE_CONCHAN(conchan)) { - if (conchan->flag & CONSTRAINT_CHANNEL_SELECT) { + if (SEL_CONCHAN(conchan)) { if (conchan->ipo) { switch (extendtype) { case SET_EXTEND_CONSTANT: @@ -2229,8 +2231,7 @@ void set_extendtype_actionchannels(int extendtype) } } - /* Clean up and redraw stuff - */ + /* Clean up and redraw stuff */ remake_action_ipos(act); BIF_undo_push("Set Ipo type Action channel"); allspace(REMAKEIPO, 0); @@ -2246,7 +2247,7 @@ static void set_snap_actionchannels(bAction *act, short snaptype) bConstraintChannel *conchan; /* Loop through the channels */ - for (achan = act->chanbase.first; achan; achan= achan->next){ + for (achan = act->chanbase.first; achan; achan= achan->next) { if(EDITABLE_ACHAN(achan)) { if (achan->ipo) { if(G.saction->pin==0 && OBACT) { @@ -2258,9 +2259,10 @@ static void set_snap_actionchannels(bAction *act, short snaptype) snap_ipo_keys(achan->ipo, snaptype); } } - } - - if (VISIBLE_ACHAN(achan)) { + + if (EXPANDED_ACHAN(achan) == 0) + continue; + /* constraint channels */ for (conchan=achan->constraintChannels.first; conchan; conchan= conchan->next) { if (EDITABLE_CONCHAN(conchan)) { @@ -2345,10 +2347,10 @@ static void mirror_actionchannels(bAction *act, short mirror_mode) bConstraintChannel *conchan; /* Loop through the channels */ - for (achan = act->chanbase.first; achan; achan= achan->next){ - if(EDITABLE_ACHAN(achan)) { + for (achan= act->chanbase.first; achan; achan= achan->next) { + if (EDITABLE_ACHAN(achan)) { if (achan->ipo) { - if(G.saction->pin==0 && OBACT) { + if (G.saction->pin==0 && OBACT) { actstrip_map_ipo_keys(OBACT, achan->ipo, 0); mirror_ipo_keys(achan->ipo, mirror_mode); actstrip_map_ipo_keys(OBACT, achan->ipo, 1); @@ -2357,9 +2359,10 @@ static void mirror_actionchannels(bAction *act, short mirror_mode) mirror_ipo_keys(achan->ipo, mirror_mode); } } - } - - if (VISIBLE_ACHAN(achan)) { + + if (EXPANDED_ACHAN(achan) == 0) + continue; + /* constraint channels */ for (conchan=achan->constraintChannels.first; conchan; conchan= conchan->next) { if (EDITABLE_CONCHAN(conchan)) { @@ -2440,7 +2443,8 @@ void mirror_action_keys(short mirror_mode) } static void select_all_keys_frames(bAction *act, short *mval, - short *mvalo, int selectmode) { + short *mvalo, int selectmode) +{ /* This function tries to select all action keys in * every channel for a given range of keyframes that @@ -2453,7 +2457,7 @@ static void select_all_keys_frames(bAction *act, short *mval, rcti rect; rctf rectf; - bActionChannel *chan; + bActionChannel *achan; bConstraintChannel *conchan; if (!act) @@ -2499,14 +2503,14 @@ static void select_all_keys_frames(bAction *act, short *mval, rectf.xmax = rectf.xmax + 0.5; } - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - borderselect_ipo_key(chan->ipo, rectf.xmin, rectf.xmax, - selectmode); - for (conchan=chan->constraintChannels.first; conchan; - conchan=conchan->next){ - borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax, - selectmode); + for (achan=act->chanbase.first; achan; achan= achan->next) { + if (VISIBLE_ACHAN(achan)) { + borderselect_ipo_key(achan->ipo, rectf.xmin, rectf.xmax, selectmode); + + if (EXPANDED_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + borderselect_ipo_key(conchan->ipo, rectf.xmin, rectf.xmax, selectmode); + } } } } @@ -2518,13 +2522,14 @@ static void select_all_keys_frames(bAction *act, short *mval, static void select_all_keys_channels(bAction *act, short *mval, - short *mvalo, int selectmode) { - bActionChannel *chan; + short *mvalo, int selectmode) +{ + bActionChannel *achan; + bConstraintChannel *conchan; float click, x,y; int clickmin, clickmax; int wsize; - bConstraintChannel *conchan; - + /* This function selects all the action keys that * are in the mouse selection range defined by * the ordered pairs mval and mvalo (usually @@ -2534,8 +2539,7 @@ static void select_all_keys_channels(bAction *act, short *mval, * one channel is selected. */ - /* If the action is null then abort - */ + /* If the action is null then abort */ if (!act) return; @@ -2561,7 +2565,6 @@ static void select_all_keys_channels(bAction *act, short *mval, } /* Two click values (i.e., border select) */ else { - areamouseco_to_ipoco(G.v2d, mvalo, &x, &y); click = ((wsize - y) / (CHANNELHEIGHT+CHANNELSKIP)); @@ -2578,26 +2581,28 @@ static void select_all_keys_channels(bAction *act, short *mval, return; } - for (chan = act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { + for (achan = act->chanbase.first; achan; achan= achan->next) { + if (VISIBLE_ACHAN(achan)) { if (clickmax < 0) break; - if ( clickmin <= 0) { + if (clickmin <= 0) { /* Select the channel with the given mode. If the * channel is freshly selected then set it to the * active channel for the action */ - select_ipo_bezier_keys(chan->ipo, selectmode); + select_ipo_bezier_keys(achan->ipo, selectmode); } --clickmin; --clickmax; - + + if (EXPANDED_ACHAN(achan) == 0) + continue; + /* Check for click in a constraint */ - for (conchan=chan->constraintChannels.first; - conchan; conchan=conchan->next){ + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { if (clickmax < 0) break; - if ( clickmin <= 0) { - select_ipo_bezier_keys(chan->ipo, selectmode); + if (clickmin <= 0) { + select_ipo_bezier_keys(achan->ipo, selectmode); } --clickmin; --clickmax; @@ -2609,32 +2614,30 @@ static void select_all_keys_channels(bAction *act, short *mval, allqueue (REDRAWVIEW3D, 0); allqueue (REDRAWACTION, 0); allqueue (REDRAWNLA, 0); - } static void borderselect_function(void (*select_func)(bAction *act, short *mval, short *mvalo, - int selectmode)) { + int selectmode)) +{ /* This function executes an arbitrary selection * function as part of a border select. This * way the same function that is used for * right click selection points can generally * be used as the argument to this function */ - rcti rect; - short mval[2], mvalo[2]; bAction *act; + rcti rect; + short mval[2], mvalo[2]; int val; - /* Get the selected action, exit if none are selected - */ + /* Get the selected action, exit if none are selected */ act=G.saction->action; if (!act) return; - /* Let the user draw a border (or abort) - */ + /* Let the user draw a border (or abort) */ if ( (val=get_border (&rect, 3)) ) { mval[0]= rect.xmin; mval[1]= rect.ymin+2; @@ -2655,8 +2658,8 @@ static void borderselect_function(void (*select_func)(bAction *act, else if (val == RIGHTMOUSE) select_func(act, mval, mvalo, SELECT_SUBTRACT); } - BIF_undo_push("Border select Action"); + BIF_undo_push("Border select Action"); } static void clever_keyblock_names(Key *key, short* mval){ @@ -2714,7 +2717,7 @@ static void clever_achannel_names(short *mval) int but=0; char str[64]; - short protect, chantype; + short expand, protect, chantype; /* figure out what is under cursor */ act_channel= get_nearest_act_channel(mval, &chantype); @@ -2725,8 +2728,10 @@ static void clever_achannel_names(short *mval) strcpy(str, achan->name); protect= (achan->flag & ACHAN_PROTECTED); + expand = (achan->flag & ACHAN_EXPANDED); add_numbut(but++, TEX, "ActChan: ", 0, 24, str, "Name of Action Channel"); + add_numbut(but++, TOG|SHO, "Expanded", 0, 24, &expand, "Action Channel is Expanded"); } else if (chantype == ACTTYPE_CONCHAN) { conchan= (bConstraintChannel *)act_channel; @@ -2740,7 +2745,7 @@ static void clever_achannel_names(short *mval) /* nothing under-cursor */ return; } - add_numbut(but++, TOG|SHO, "Protected", 0, 24, &protect, "Group is expanded"); + add_numbut(but++, TOG|SHO, "Protected", 0, 24, &protect, "Channel is Protected"); /* draw clever-numbut */ if (do_clever_numbuts(str, but, REDRAW)) { @@ -2754,8 +2759,8 @@ static void clever_achannel_names(short *mval) else if (achan) { strcpy(achan->name, str); - //if (expand) achan->flag |= ACHAN_EXPANDED; - //else achan->flag &= ~ACHAN_EXPANDED; + if (expand) achan->flag |= ACHAN_EXPANDED; + else achan->flag &= ~ACHAN_EXPANDED; if (protect) achan->flag |= ACHAN_PROTECTED; else achan->flag &= ~ACHAN_PROTECTED; @@ -2791,10 +2796,10 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) SpaceAction *saction; bAction *act; Key *key; - float dx,dy; + float dx, dy; int doredraw= 0; int cfra; - short mval[2]; + short mval[2]; unsigned short event= evt->event; short val= evt->val; short mousebut = L_MOUSE; @@ -2806,9 +2811,8 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) return; act=saction->action; - if(val) { - - if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0; + if (val) { + if ( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0; /* swap mouse buttons based on user preference */ if (U.flag & USER_LMOUSESELECT) { @@ -2887,7 +2891,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) if (G.qual & LR_CTRLKEY) borderselect_markers(); else if (key) { - if (mval[0]<ACTWIDTH){ + if (mval[0]<ACTWIDTH) { /* to do?? */ } else { @@ -2895,13 +2899,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) } } else { - /* If the border select is initiated in the * part of the action window where the channel * names reside, then select the channels */ if (mval[0]<NAMEWIDTH){ - borderselect_function(mouse_actionchannels); + borderselect_function(borderselect_actionchannels); BIF_undo_push("Select Action"); } else if (mval[0]>ACTWIDTH){ @@ -3007,7 +3010,6 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) allqueue(REDRAWIPO, 0); allqueue(REDRAWACTION, 0); allqueue(REDRAWNLA, 0); - allqueue(REDRAWSOUND, 0); break; case MKEY: @@ -3154,7 +3156,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) case LEFTMOUSE: if(view2dmove(LEFTMOUSE)) // only checks for sliders break; - else if (mval[0]>ACTWIDTH){ + else if (mval[0]>ACTWIDTH) { do { getmouseco_areawin(mval); @@ -3180,36 +3182,20 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) */ if (mval[0]<NAMEWIDTH) { if(act) { - if (mval[0] < (NAMEWIDTH-16)) { - /* mouse is over action channels */ - if(G.qual & LR_SHIFTKEY) - mouse_actionchannels(act, mval, NULL, SELECT_INVERT); - else - mouse_actionchannels(act, mval, NULL, SELECT_REPLACE); - - BIF_undo_push("Select Action"); - } - else { - /* mouse is over channel locks */ - mouse_actionchannels_protect(act, mval); - - BIF_undo_push("Protect Channel"); - } + /* mouse is over action channels */ + mouse_actionchannels(mval); } else numbuts_action(); } else if (mval[0]>ACTWIDTH) { - /* Clicking in the vertical scrollbar selects * all of the keys for that channel at that height */ if (IN_2D_VERT_SCROLL(mval)) { if(G.qual & LR_SHIFTKEY) - select_all_keys_channels(act, mval, NULL, - SELECT_INVERT); + select_all_keys_channels(act, mval, NULL, SELECT_INVERT); else - select_all_keys_channels(act, mval, NULL, - SELECT_REPLACE); + select_all_keys_channels(act, mval, NULL, SELECT_REPLACE); } /* Clicking in the horizontal scrollbar selects @@ -3218,11 +3204,9 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) */ else if (IN_2D_HORIZ_SCROLL(mval)) { if(G.qual & LR_SHIFTKEY) - select_all_keys_frames(act, mval, NULL, - SELECT_INVERT); + select_all_keys_frames(act, mval, NULL, SELECT_INVERT); else - select_all_keys_frames(act, mval, NULL, - SELECT_REPLACE); + select_all_keys_frames(act, mval, NULL, SELECT_REPLACE); BIF_undo_push("Select all Action"); } @@ -3372,9 +3356,11 @@ void *get_nearest_act_channel(short mval[], short *ret_type) --clickmin; --clickmax; } - else { + else + continue; + + if (EXPANDED_ACHAN(achan) == 0) continue; - } /* try in constaint channels */ for (conchan= achan->constraintChannels.first; conchan; conchan=conchan->next) { @@ -3433,7 +3419,10 @@ void markers_selectkeys_between(void) borderselect_ipo_key(achan->ipo, min, max, SELECT_ADD); } } - + + if (EXPANDED_ACHAN(achan) == 0) + continue; + for (conchan= achan->constraintChannels.first; conchan; conchan= conchan->next) { if (conchan->ipo) { if(G.saction->pin==0 && OBACT) { @@ -3455,28 +3444,28 @@ void markers_selectkeys_between(void) void top_sel_action() { bAction *act; - bActionChannel *chan; + bActionChannel *achan; /* Get the selected action, exit if none are selected */ act = G.saction->action; if (!act) return; - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - if ((chan->flag & ACHAN_SELECTED) && !(chan->flag & ACHAN_MOVED)){ + for (achan= act->chanbase.first; achan; achan= achan->next){ + if (VISIBLE_ACHAN(achan)) { + if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)){ /* take it out off the chain keep data */ - BLI_remlink (&act->chanbase, chan); + BLI_remlink (&act->chanbase, achan); /* make it first element */ - BLI_insertlinkbefore(&act->chanbase,act->chanbase.first, chan); - chan->flag |= ACHAN_MOVED; + BLI_insertlinkbefore(&act->chanbase, act->chanbase.first, achan); + achan->flag |= ACHAN_MOVED; /* restart with rest of list */ - chan=chan->next; + achan= achan->next; } } } /* clear temp flags */ - for (chan=act->chanbase.first; chan; chan=chan->next){ - chan->flag = chan->flag & ~ACHAN_MOVED; + for (achan= act->chanbase.first; achan; achan= achan->next){ + achan->flag = achan->flag & ~ACHAN_MOVED; } /* Clean up and redraw stuff */ @@ -3491,32 +3480,31 @@ void top_sel_action() void up_sel_action() { bAction *act; - bActionChannel *chan; - bActionChannel *prev; + bActionChannel *achan, *prev; /* Get the selected action, exit if none are selected */ act = G.saction->action; if (!act) return; - for (chan=act->chanbase.first; chan; chan=chan->next){ - if((chan->flag & ACHAN_HIDDEN)==0) { - if ((chan->flag & ACHAN_SELECTED) && !(chan->flag & ACHAN_MOVED)){ - prev = chan->prev; - if (prev){ + for (achan=act->chanbase.first; achan; achan= achan->next) { + if (VISIBLE_ACHAN(achan)) { + if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)){ + prev = achan->prev; + if (prev) { /* take it out off the chain keep data */ - BLI_remlink (&act->chanbase, chan); + BLI_remlink (&act->chanbase, achan); /* push it up */ - BLI_insertlinkbefore(&act->chanbase,prev, chan); - chan->flag |= ACHAN_MOVED; + BLI_insertlinkbefore(&act->chanbase, prev, achan); + achan->flag |= ACHAN_MOVED; /* restart with rest of list */ - chan=chan->next; + achan= achan->next; } } } } /* clear temp flags */ - for (chan=act->chanbase.first; chan; chan=chan->next){ - chan->flag = chan->flag & ~ACHAN_MOVED; + for (achan=act->chanbase.first; achan; achan= achan->next){ + achan->flag = achan->flag & ~ACHAN_MOVED; } /* Clean up and redraw stuff @@ -3532,38 +3520,37 @@ void up_sel_action() void down_sel_action() { bAction *act; - bActionChannel *chan; - bActionChannel *next; + bActionChannel *achan, *next; /* Get the selected action, exit if none are selected */ act = G.saction->action; if (!act) return; - for (chan=act->chanbase.last; chan; chan=chan->prev){ - if((chan->flag & ACHAN_HIDDEN)==0) { - if ((chan->flag & ACHAN_SELECTED) && !(chan->flag & ACHAN_MOVED)){ - next = chan->next; + for (achan= act->chanbase.last; achan; achan= achan->prev) { + if (VISIBLE_ACHAN(achan)) { + if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)){ + next = achan->next; if (next) next = next->next; - if (next){ + if (next) { /* take it out off the chain keep data */ - BLI_remlink (&act->chanbase, chan); + BLI_remlink (&act->chanbase, achan); /* move it down */ - BLI_insertlinkbefore(&act->chanbase,next, chan); - chan->flag |= ACHAN_MOVED; + BLI_insertlinkbefore(&act->chanbase, next, achan); + achan->flag |= ACHAN_MOVED; } else { /* take it out off the chain keep data */ - BLI_remlink (&act->chanbase, chan); + BLI_remlink (&act->chanbase, achan); /* add at end */ - BLI_addtail(&act->chanbase,chan); - chan->flag |= ACHAN_MOVED; + BLI_addtail(&act->chanbase, achan); + achan->flag |= ACHAN_MOVED; } } } } /* clear temp flags */ - for (chan=act->chanbase.first; chan; chan=chan->next){ - chan->flag = chan->flag & ~ACHAN_MOVED; + for (achan= act->chanbase.first; achan; achan= achan->next){ + achan->flag = achan->flag & ~ACHAN_MOVED; } /* Clean up and redraw stuff @@ -3579,26 +3566,26 @@ void down_sel_action() void bottom_sel_action() { bAction *act; - bActionChannel *chan; + bActionChannel *achan; /* Get the selected action, exit if none are selected */ act = G.saction->action; if (!act) return; - for (chan=act->chanbase.last; chan; chan=chan->prev){ - if((chan->flag & ACHAN_HIDDEN)==0) { - if ((chan->flag & ACHAN_SELECTED) && !(chan->flag & ACHAN_MOVED)) { + for (achan=act->chanbase.last; achan; achan= achan->prev) { + if (VISIBLE_ACHAN(achan)) { + if (SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED)) { /* take it out off the chain keep data */ - BLI_remlink (&act->chanbase, chan); + BLI_remlink (&act->chanbase, achan); /* add at end */ - BLI_addtail(&act->chanbase,chan); - chan->flag |= ACHAN_MOVED; + BLI_addtail(&act->chanbase, achan); + achan->flag |= ACHAN_MOVED; } } } /* clear temp flags */ - for (chan=act->chanbase.first; chan; chan=chan->next){ - chan->flag = chan->flag & ~ACHAN_MOVED; + for (achan=act->chanbase.first; achan; achan= achan->next) { + achan->flag = achan->flag & ~ACHAN_MOVED; } /* Clean up and redraw stuff |