Timeline: Keyframe Drawing for All Selected Objects

When 'Only Selected' is ON, or the Active Object is in PoseMode, only the keyframes for the active Object are drawn (*).

Otherwise, the keyframes for the scene (sequence+nodes+world), and the selected Objects (including the Active Object) are drawn.


(*) I've also made some changes here to try and get only the selected bones showing here, but some further changes are still needed for that to be able to work.

---

Also, fixed bug in makesrna caused by missing newlines for error prints. This resulted in all error-output from makesrna appearing on a single line.
This commit is contained in:
Joshua Leung
2010-01-18 23:31:46 +00:00
parent b6421418e4
commit 56660fab4b
3 changed files with 47 additions and 14 deletions

View File

@@ -113,21 +113,28 @@ static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe)
}
/* helper for time_draw_keyframes() */
static void time_draw_idblock_keyframes(View2D *v2d, ID *id)
static void time_draw_idblock_keyframes(View2D *v2d, ID *id, short onlysel)
{
bDopeSheet ads;
DLRBT_Tree keys;
ActKeyColumn *ak;
/* init binarytree-list for getting keyframes */
BLI_dlrbTree_init(&keys);
/* init dopesheet settings */
// FIXME: the ob_to_keylist function currently doesn't take this into account...
memset(&ads, 0, sizeof(bDopeSheet));
if (onlysel)
ads.filterflag |= ADS_FILTER_ONLYSEL;
/* populate tree with keyframe nodes */
switch (GS(id->name)) {
case ID_SCE:
scene_to_keylist(NULL, (Scene *)id, &keys, NULL);
scene_to_keylist(&ads, (Scene *)id, &keys, NULL);
break;
case ID_OB:
ob_to_keylist(NULL, (Object *)id, &keys, NULL);
ob_to_keylist(&ads, (Object *)id, &keys, NULL);
break;
}
@@ -159,21 +166,47 @@ static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
View2D *v2d= &ar->v2d;
short onlysel= (stime->flag & TIME_ONLYACTSEL);
/* draw scene keyframes first
* - only if we're not only showing the
* - don't try to do this when only drawing active/selected data keyframes,
* since this can become quite slow
*/
if ((scene) && (stime->flag & TIME_ONLYACTSEL)==0) {
if (scene && onlysel==0) {
/* set draw color */
glColor3ub(0xDD, 0xA7, 0x00);
time_draw_idblock_keyframes(v2d, (ID *)scene);
time_draw_idblock_keyframes(v2d, (ID *)scene, onlysel);
}
/* draw active object's keyframes */
if (ob) {
/* set draw color */
glColor3ub(0xDD, 0xD7, 0x00);
time_draw_idblock_keyframes(v2d, (ID *)ob);
/* draw keyframes from selected objects
* - only do the active object if in posemode (i.e. showing only keyframes for the bones)
* OR the onlysel flag was set, which means that only active object's keyframes should
* be considered
*/
glColor3ub(0xDD, 0xD7, 0x00);
if (ob && ((ob->mode == OB_MODE_POSE) || onlysel)) {
/* draw keyframes for active object only */
time_draw_idblock_keyframes(v2d, (ID *)ob, onlysel);
}
else {
short active_done = 0;
/* draw keyframes from all selected objects */
CTX_DATA_BEGIN(C, Object*, obsel, selected_objects)
{
/* last arg is 0, since onlysel doesn't apply here... */
time_draw_idblock_keyframes(v2d, (ID *)obsel, 0);
/* if this object is the active one, set flag so that we don't draw again */
if (obsel == ob)
active_done= 1;
}
CTX_DATA_END;
/* if active object hasn't been done yet, draw it... */
if (ob && (active_done == 0))
time_draw_idblock_keyframes(v2d, (ID *)ob, 0);
}
}

View File

@@ -52,7 +52,7 @@ static int replace_if_different(char *tmpfile)
#define REN_IF_DIFF \
if(rename(tmpfile, orgfile) != 0) { \
fprintf(stderr, "%s:%d, rename error: \"%s\" -> \"%s\"", __FILE__, __LINE__, tmpfile, orgfile); \
fprintf(stderr, "%s:%d, rename error: \"%s\" -> \"%s\"\n", __FILE__, __LINE__, tmpfile, orgfile); \
return -1; \
} \
remove(tmpfile); \
@@ -79,7 +79,7 @@ static int replace_if_different(char *tmpfile)
if(fp_new==NULL) {
/* shouldn't happen, just to be safe */
fprintf(stderr, "%s:%d, open error: \"%s\"", __FILE__, __LINE__, tmpfile);
fprintf(stderr, "%s:%d, open error: \"%s\"\n", __FILE__, __LINE__, tmpfile);
return -1;
}

View File

@@ -1517,7 +1517,7 @@ static void rna_def_space_time(BlenderRNA *brna)
/* Other options */
prop= RNA_def_property(srna, "only_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TIME_ONLYACTSEL);
RNA_def_property_ui_text(prop, "Only Selected channels", "Show keyframes only from active/selected channels.");
RNA_def_property_ui_text(prop, "Only Selected channels", "Show keyframes for active Object and/or its selected channels only.");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
prop= RNA_def_property(srna, "show_cframe_indicator", PROP_BOOLEAN, PROP_NONE);