Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2007-03-20 14:04:47 +0300
committerJoshua Leung <aligorith@gmail.com>2007-03-20 14:04:47 +0300
commit3cb25c774c993fd4ca316c529f75d87e1761b417 (patch)
tree95770b77a70e1a2525306793cba840e1d7f00042 /source/blender
parenta51477093b93fdbca69b47165012c762c46c7e34 (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).
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/include/BIF_editaction.h7
-rw-r--r--source/blender/makesdna/DNA_action_types.h1
-rw-r--r--source/blender/src/drawaction.c132
-rw-r--r--source/blender/src/editaction.c951
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