== Action Editor - Column Select Tools ==

Now it is possible to column select keyframes that occur on the
same frame as selected markers with the hotkey: SHIFT K

More selection goodies to come :-)
This commit is contained in:
Joshua Leung 2006-12-05 03:48:39 +00:00
parent 0f7f11fafc
commit 201df23d54
5 changed files with 143 additions and 52 deletions

@ -113,7 +113,8 @@ void deselect_actionchannels (struct bAction *act, int test);
void deselect_meshchannel_keys (struct Key *key, int test); void deselect_meshchannel_keys (struct Key *key, int test);
int select_channel(struct bAction *act, struct bActionChannel *chan, int selectmode); int select_channel(struct bAction *act, struct bActionChannel *chan, int selectmode);
void select_actionchannel_by_name (struct bAction *act, char *name, int select); void select_actionchannel_by_name (struct bAction *act, char *name, int select);
void column_select_meshkeys(struct Key *key, int mode);
void column_select_actionkeys(struct bAction *act, int mode);
/* Action */ /* Action */
struct bActionChannel* get_hilighted_action_channel(struct bAction* action); struct bActionChannel* get_hilighted_action_channel(struct bAction* action);

@ -33,6 +33,7 @@
#ifndef BSE_TIME_H #ifndef BSE_TIME_H
#define BSE_TIME_H #define BSE_TIME_H
struct ListBase;
struct View2D; struct View2D;
/* ******** Markers - General Api ********* */ /* ******** Markers - General Api ********* */
@ -41,11 +42,16 @@ void duplicate_marker(void);
void remove_marker(void); void remove_marker(void);
void rename_marker(void); void rename_marker(void);
void transform_markers(int mode, int smode); void transform_markers(int mode, int smode);
void borderselect_markers(void); void borderselect_markers(void);
void deselect_markers(short test, short sel); void deselect_markers(short test, short sel);
struct TimeMarker *find_nearest_marker(int clip_y); struct TimeMarker *find_nearest_marker(int clip_y);
void nextprev_marker(short dir); void nextprev_marker(short dir);
void add_marker_to_cfra_elem(struct ListBase *lb, struct TimeMarker *marker);
void make_marker_cfra_list(struct ListBase *lb);
/* ******** Markers - Space Specific ************* */ /* ******** Markers - Space Specific ************* */
void draw_markers_timespace(struct View2D *v2d); void draw_markers_timespace(struct View2D *v2d);

@ -485,16 +485,24 @@ static void make_sel_cfra_list(Ipo *ipo, ListBase *elems)
/* This function selects all key frames in the same column(s) as a already selected key(s) /* This function selects all key frames in the same column(s) as a already selected key(s)
* this version only works for Shape Keys, Key should be not NULL * this version only works for Shape Keys, Key should be not NULL
*/ */
static void column_select_shapekeys(Key *key) void column_select_shapekeys(Key *key, int mode)
{ {
if(key->ipo) { if(key->ipo) {
IpoCurve *icu; IpoCurve *icu;
ListBase elems= {NULL, NULL}; ListBase elems= {NULL, NULL};
CfraElem *ce; CfraElem *ce;
/* create a list of all selected keys */ /* build list of columns */
make_sel_cfra_list(key->ipo, &elems); switch (mode) {
case 1:
/* create a list of all selected keys */
make_sel_cfra_list(key->ipo, &elems);
break;
case 2:
/* create a list of all selected markers */
make_marker_cfra_list(&elems);
break;
}
/* loop through all of the keys and select additional keyframes /* loop through all of the keys and select additional keyframes
* based on the keys found to be selected above * based on the keys found to be selected above
@ -521,7 +529,7 @@ static void column_select_shapekeys(Key *key)
/* This function selects all key frames in the same column(s) as a already selected key(s) /* This function selects all key frames in the same column(s) as a already selected key(s)
* this version only works for on Action. *act should be not NULL * this version only works for on Action. *act should be not NULL
*/ */
static void column_select_actionkeys(bAction *act) void column_select_actionkeys(bAction *act, int mode)
{ {
IpoCurve *icu; IpoCurve *icu;
BezTriple *bezt; BezTriple *bezt;
@ -530,16 +538,25 @@ static void column_select_actionkeys(bAction *act)
bActionChannel *chan; bActionChannel *chan;
bConstraintChannel *conchan; bConstraintChannel *conchan;
/* create a list of all selected keys */ /* build list of columns */
for (chan=act->chanbase.first; chan; chan=chan->next){ switch (mode) {
if((chan->flag & ACHAN_HIDDEN)==0) { case 1:
if (chan->ipo) /* create a list of all selected keys */
make_sel_cfra_list(chan->ipo, &elems); for (chan=act->chanbase.first; chan; chan=chan->next){
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) { if((chan->flag & ACHAN_HIDDEN)==0) {
if (conchan->ipo) if (chan->ipo)
make_sel_cfra_list(conchan->ipo, &elems); make_sel_cfra_list(chan->ipo, &elems);
for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) {
if (conchan->ipo)
make_sel_cfra_list(conchan->ipo, &elems);
}
}
} }
} break;
case 2:
/* create a list of all selected markers */
make_marker_cfra_list(&elems);
break;
} }
/* loop through all of the keys and select additional keyframes /* loop through all of the keys and select additional keyframes
@ -2680,15 +2697,18 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break; break;
case KKEY: case KKEY:
if(key) val= (G.qual & LR_SHIFTKEY) ? 2 : 1;
column_select_shapekeys(key);
else if(act)
column_select_actionkeys(act);
if(key)
column_select_shapekeys(key, val);
else if(act)
column_select_actionkeys(act, val);
allqueue(REDRAWTIME, 0);
allqueue(REDRAWIPO, 0); allqueue(REDRAWIPO, 0);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWACTION, 0); allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0); allqueue(REDRAWNLA, 0);
allqueue(REDRAWSOUND, 0);
break; break;
case MKEY: case MKEY:

@ -435,6 +435,43 @@ TimeMarker *find_nearest_marker(int clip_y)
return NULL; return NULL;
} }
/* Adds a marker to list of cfra elems */
void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker)
{
CfraElem *ce, *cen;
ce= lb->first;
while(ce) {
if( ce->cfra==marker->frame ) {
/* do because of double keys */
if(marker->flag & SELECT) ce->sel= marker->flag;
return;
}
else if(ce->cfra > marker->frame) break;
ce= ce->next;
}
cen= MEM_callocN(sizeof(CfraElem), "add_to_cfra_elem");
if(ce) BLI_insertlinkbefore(lb, ce, cen);
else BLI_addtail(lb, cen);
cen->cfra= marker->frame;
cen->sel= marker->flag;
}
/* This function makes a list of the selected markers
*/
void make_marker_cfra_list(ListBase *lb)
{
TimeMarker *marker;
for (marker= G.scene->markers.first; marker; marker= marker->next) {
add_marker_to_cfra_elem(lb, marker);
}
}
/* *********** End Markers - Markers API *************** */ /* *********** End Markers - Markers API *************** */
static int find_nearest_timeline_marker(float dx) static int find_nearest_timeline_marker(float dx)

@ -92,10 +92,11 @@
#define ACTMENU_SEL_BORDERM 1 #define ACTMENU_SEL_BORDERM 1
#define ACTMENU_SEL_ALL_KEYS 2 #define ACTMENU_SEL_ALL_KEYS 2
#define ACTMENU_SEL_ALL_CHAN 3 #define ACTMENU_SEL_ALL_CHAN 3
#define ACTMENU_SEL_COLUMN 4 #define ACTMENU_SEL_ALL_MARKERS 4
#define ACTMENU_SEL_ALL_MARKERS 5
#define ACTMENU_SEL_MARKERS_KEYSBETWEEN 6 #define ACTMENU_SEL_COLUMN_KEYS 1
#define ACTMENU_SEL_MARKERS_KEYSCOLUMN 7 #define ACTMENU_SEL_COLUMN_MARKERSCOLUMN 2
#define ACTMENU_SEL_COLUMN_MARKERSBETWEEN 3
#define ACTMENU_KEY_DUPLICATE 0 #define ACTMENU_KEY_DUPLICATE 0
#define ACTMENU_KEY_DELETE 1 #define ACTMENU_KEY_DELETE 1
@ -355,6 +356,56 @@ static uiBlock *action_viewmenu(void *arg_unused)
return block; return block;
} }
static void do_action_selectmenu_columnmenu(void *arg, int event)
{
SpaceAction *saction;
bAction *act;
Key *key;
key = get_action_mesh_key();
saction= curarea->spacedata.first;
act=saction->action;
if ( ELEM3(event, ACTMENU_SEL_COLUMN_KEYS, ACTMENU_SEL_COLUMN_MARKERSCOLUMN,
ACTMENU_SEL_COLUMN_MARKERSBETWEEN) == 0)
return;
if (key)
column_select_shapekeys(key, event);
else
column_select_actionkeys(act, event);
allqueue(REDRAWTIME, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
allqueue(REDRAWSOUND, 0);
}
static uiBlock *action_selectmenu_columnmenu(void *arg_unused)
{
uiBlock *block;
short yco= 0, menuwidth=120;
block= uiNewBlock(&curarea->uiblocks, "action_selectmenu_columnmenu",
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_action_selectmenu_columnmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"On Selected Keys|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_COLUMN_KEYS, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"On Selected Markers|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_COLUMN_MARKERSCOLUMN, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
}
static void do_action_selectmenu(void *arg, int event) static void do_action_selectmenu(void *arg, int event)
{ {
SpaceAction *saction; SpaceAction *saction;
@ -414,16 +465,6 @@ static void do_action_selectmenu(void *arg, int event)
allqueue(REDRAWNLA, 0); allqueue(REDRAWNLA, 0);
allqueue(REDRAWSOUND, 0); allqueue(REDRAWSOUND, 0);
break; break;
case ACTMENU_SEL_COLUMN: /* select column */
addqueue (curarea->win, KKEY, 1);
break;
case ACTMENU_SEL_MARKERS_KEYSBETWEEN: /* keys between 2 extreme selected markers */
break;
case ACTMENU_SEL_MARKERS_KEYSCOLUMN: /* keys on same frame as marker(s) */
break;
} }
} }
@ -464,22 +505,8 @@ static uiBlock *action_selectmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, uiDefBut(block, SEPR, 0, "", 0, yco-=6,
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, uiDefIconTextBlockBut(block, action_selectmenu_columnmenu,
"Select Keys Column|K", 0, yco-=20, NULL, ICON_RIGHTARROW_THIN, "Column Select Keys", 0, yco-=20, 120, 20, "");
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_COLUMN, "");
/*
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"Select Keys At Markers|CTRL K", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_MARKERS_KEYSCOLUMN, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"Select Keys Between Markers|SHIFT K", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_MARKERS_KEYSBETWEEN, "");
*/
if(curarea->headertype==HEADERTOP) { if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN); uiBlockSetDirection(block, UI_DOWN);