Fixes for Time Marker support in Action window;

- now draws on correct height
- selection is clipped correctly (did entire height)
- made showing scene markers default

Actually this implementation should have been a patch review... it was
done with entirely duplicating the code from timeline.c, whilst re-use
and generalizing markers has a preference. That way markers can become
supported in any time-based editor.

Will send an extensive review to Joshua Leung :)
This commit is contained in:
Ton Roosendaal 2006-11-17 11:56:00 +00:00
parent 1ad9d9f370
commit 4923b8e7a2
5 changed files with 42 additions and 115 deletions

@ -33,6 +33,7 @@
#ifndef BSE_TIME_H #ifndef BSE_TIME_H
#define BSE_TIME_H #define BSE_TIME_H
struct SpaceAction;
/* ******** Markers ********* */ /* ******** Markers ********* */
void add_timeline_marker(int frame); void add_timeline_marker(int frame);
@ -44,6 +45,7 @@ void timeline_frame_to_center(void);
void nextprev_timeline_key(short dir); void nextprev_timeline_key(short dir);
void nextprev_timeline_marker(short dir); void nextprev_timeline_marker(short dir);
void timeline_grab(int mode, int smode); void timeline_grab(int mode, int smode);
void draw_markers_action(struct SpaceAction *sact);
#endif #endif

@ -215,93 +215,6 @@ void draw_cfra_action(void)
glLineWidth(1.0); glLineWidth(1.0);
} }
/* Aligorith: for now, just draw them as lines (for debugging) */
static void draw_marker(TimeMarker *marker)
{
float xpos, xspace, yspace, xpixels, ypixels;
float vec[2];
xpos = marker->frame;
/* no time correction for framelen! space is drawn with old values */
xspace= G.v2d->cur.xmax - G.v2d->cur.xmin;
yspace= G.v2d->cur.ymax - G.v2d->cur.ymin;
xpixels= G.v2d->mask.xmax-G.v2d->mask.xmin;
ypixels= G.v2d->mask.ymax-G.v2d->mask.ymin;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* draw line through this point */
vec[0]= G.scene->r.framelen * xpos;
vec[1]= G.v2d->cur.ymin;
if (marker->flag & SELECT)
glColor3ub(0xFF, 0xFF, 0x99);
else
glColor3ub(0xAA, 0xAA, 0x55);
glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
glVertex2fv(vec);
vec[1]= G.v2d->cur.ymax;
glVertex2fv(vec);
glEnd();
glLineWidth(1.0);
/* 5 px to offset icon to align properly, space / pixels corrects for zoom */
if(marker->flag & SELECT)
BIF_icon_draw(xpos-(5.0*(xspace/xpixels)), (12.0*yspace/ypixels)-CHANNELHEIGHT, ICON_MARKER_HLT);
else
BIF_icon_draw(xpos-(5.0*(xspace/xpixels)), (12.0*yspace/ypixels)-CHANNELHEIGHT, ICON_MARKER);
glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_BLEND);
/* and the marker name too, shifted slightly to the top-right */
if(marker->name && marker->name[0]) {
if(marker->flag & SELECT) {
BIF_ThemeColor(TH_TEXT_HI);
glRasterPos2f(xpos+(4.0*(xspace/xpixels)),
((ypixels<=39.0)?(ypixels-10.0):29.0)*yspace/ypixels);
}
else {
BIF_ThemeColor(TH_TEXT);
if((marker->frame <= G.scene->r.cfra) && (marker->frame+5 > G.scene->r.cfra))
glRasterPos2f(xpos+(4.0*(xspace/xpixels)),
((ypixels<=39.0)?(ypixels-10.0):29.0)*yspace/ypixels);
else
glRasterPos2f(xpos+(4.0*(xspace/xpixels)), 17.0*yspace/ypixels);
}
BMF_DrawString(G.font, marker->name);
}
}
static void draw_markers_action(SpaceAction *saction)
{
ListBase *markers;
TimeMarker *marker;
/* try to get markers */
markers = get_saction_markers(saction);
if (markers == NULL)
return;
/* unselected markers are drawn at the first time */
for(marker= markers->first; marker; marker= marker->next) {
if(!(marker->flag & SELECT)) draw_marker(marker);
}
/* selected markers are drawn later ... selected markers have to cover unselected
* markers laying at the same position as selected markers
* (jiri: it is hack, it could be solved better) */
for(marker= markers->first; marker; marker= marker->next) {
if(marker->flag & SELECT) draw_marker(marker);
}
}
/* left hand */ /* left hand */
static void draw_action_channel_names(bAction *act) static void draw_action_channel_names(bAction *act)

@ -179,6 +179,36 @@ static void draw_markers_time( void )
} }
} }
void draw_markers_action(SpaceAction *sact)
{
TimeMarker *marker;
float yspace, ypixels;
/* move ortho view to align with slider in bottom */
glTranslatef(0.0f, sact->v2d.cur.ymin, 0.0f);
/* bad hacks in drawing markers... inverse correct that as well */
yspace= sact->v2d.cur.ymax - sact->v2d.cur.ymin;
ypixels= sact->v2d.mask.ymax - sact->v2d.mask.ymin;
glTranslatef(0.0f, -11.0*yspace/ypixels, 0.0f);
/* unselected markers are drawn at the first time */
for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(!(marker->flag & SELECT)) draw_marker(marker);
}
/* selected markers are drawn later ... selected markers have to cover unselected
* markers laying at the same position as selected markers */
for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT) draw_marker(marker);
}
glTranslatef(0.0f, -sact->v2d.cur.ymin, 0.0f);
glTranslatef(0.0f, 11.0*yspace/ypixels, 0.0f);
}
static void draw_sfra_efra() static void draw_sfra_efra()
{ {
BIF_ThemeColorShade(TH_BACK, -25); BIF_ThemeColorShade(TH_BACK, -25);

@ -2919,12 +2919,12 @@ ListBase *get_saction_markers (SpaceAction *saction)
{ {
ListBase *markers; ListBase *markers;
if (saction->markert == SACTION_SCMARKERS) // if (saction->markert == SACTION_SCMARKERS)
markers = &(G.scene->markers); markers = &(G.scene->markers);
else if ((saction->markert == SACTION_ACMARKERS) && (saction->action != NULL)) // else if ((saction->markert == SACTION_ACMARKERS) && (saction->action != NULL))
markers = &(saction->action->markers); // markers = &(saction->action->markers);
else // else
markers = NULL; // markers = NULL;
return markers; return markers;
} }
@ -3122,6 +3122,10 @@ TimeMarker *find_nearest_saction_marker(ListBase *markers)
getmouseco_areawin (mval); getmouseco_areawin (mval);
/* first clip selection in Y */
if(mval[1] > 30)
return NULL;
mval[0]-=7; mval[0]-=7;
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin); areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
mval[0]+=14; mval[0]+=14;

@ -1096,28 +1096,6 @@ void action_buttons(void)
B_ACTLOCAL, B_ACTIONDELETE, 0, 0); B_ACTLOCAL, B_ACTIONDELETE, 0, 0);
/* Draw marker set selection box */
xco+= 8;
if (G.saction->action != NULL) {
uiDefButS(block, MENU, B_REDR,
"Markers%t|None%x0|Scene%x1|Action%x2",
xco, 0, 80, 20, &(G.saction->markert), 0, 0, 0, 0,
"What set of markers to display.");
}
else {
if (G.saction->markert == SACTION_ACMARKERS)
G.saction->markert = SACTION_NOMARKERS;
uiDefButS(block, MENU, B_REDR,
"Markers%t|None%x0|Scene%x1",
xco, 0, 80, 20, &(G.saction->markert), 0, 0, 0, 0,
"What set of markers to display.");
}
xco+=80;
/* Draw action baker */ /* Draw action baker */
xco+= 8; xco+= 8;