Sequencer

- Draw a verticle line for markers
- Added an option to transform selected markers in the sequencer - useful for Extending time
This commit is contained in:
2007-10-17 18:32:54 +00:00
parent e844ee5e54
commit 2639404f34
11 changed files with 132 additions and 31 deletions

View File

@@ -54,7 +54,7 @@ int find_nearest_marker_time(float dx);
void add_marker_to_cfra_elem(struct ListBase *lb, struct TimeMarker *marker, short only_sel); void add_marker_to_cfra_elem(struct ListBase *lb, struct TimeMarker *marker, short only_sel);
void make_marker_cfra_list(struct ListBase *lb, short only_sel); void make_marker_cfra_list(struct ListBase *lb, short only_sel);
void draw_markers_timespace(void); void draw_markers_timespace(int lines);
/* ******** Animation - Preview Range ************* */ /* ******** Animation - Preview Range ************* */
void anim_previewrange_set(void); void anim_previewrange_set(void);

View File

@@ -621,6 +621,7 @@ typedef struct SpaceImaSel {
/* sseq->flag */ /* sseq->flag */
#define SEQ_DRAWFRAMES 1 #define SEQ_DRAWFRAMES 1
#define SEQ_MARKER_TRANS 2
/* space types, moved from DNA_screen_types.h */ /* space types, moved from DNA_screen_types.h */
enum { enum {

View File

@@ -928,7 +928,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
draw_cfra_action(); draw_cfra_action();
/* Draw markers */ /* Draw markers */
draw_markers_timespace(); draw_markers_timespace(0);
/* Draw 'curtains' for preview */ /* Draw 'curtains' for preview */
draw_anim_preview_timespace(); draw_anim_preview_timespace();

View File

@@ -2240,7 +2240,7 @@ void drawipospace(ScrArea *sa, void *spacedata)
draw_anim_preview_timespace(); draw_anim_preview_timespace();
/* draw markers */ /* draw markers */
draw_markers_timespace(); draw_markers_timespace(0);
/* restore viewport */ /* restore viewport */
mywinset(sa->win); mywinset(sa->win);

View File

@@ -754,7 +754,7 @@ void drawnlaspace(ScrArea *sa, void *spacedata)
draw_cfra_action(); draw_cfra_action();
/* draw markers */ /* draw markers */
draw_markers_timespace(); draw_markers_timespace(0);
/* Draw preview 'curtains' */ /* Draw preview 'curtains' */
draw_anim_preview_timespace(); draw_anim_preview_timespace();

View File

@@ -76,6 +76,7 @@
#include "BSE_seqeffects.h" #include "BSE_seqeffects.h"
#include "BSE_seqscopes.h" #include "BSE_seqscopes.h"
#include "BSE_seqaudio.h" #include "BSE_seqaudio.h"
#include "BSE_time.h"
#include "IMB_imbuf_types.h" #include "IMB_imbuf_types.h"
#include "IMB_imbuf.h" #include "IMB_imbuf.h"
@@ -883,7 +884,7 @@ static void draw_extra_seqinfo(void)
yfac= G.v2d->cur.ymax - G.v2d->cur.ymin; yfac= G.v2d->cur.ymax - G.v2d->cur.ymin;
yfac/= (float)(G.v2d->mask.ymax-G.v2d->mask.ymin); yfac/= (float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
yco= G.v2d->cur.ymin+10*yfac; yco= G.v2d->cur.ymin+40*yfac;
BIF_ThemeColor(TH_TEXT_HI); BIF_ThemeColor(TH_TEXT_HI);
@@ -1230,10 +1231,10 @@ static void seq_panel_properties(short cntrl) // SEQ_HANDLER_PROPERTIES
uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Percent", 10, 30, 150, 19, &transform->percent, 0.0, 1.0, 0.0, 0.0, "Percent Translate"); uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Percent", 10, 30, 150, 19, &transform->percent, 0.0, 1.0, 0.0, 0.0, "Percent Translate");
uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Pixels", 160, 30, 150, 19, &transform->percent, 0.0, 0.0, 0.0, 0.0, "Pixels Translate"); uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Pixels", 160, 30, 150, 19, &transform->percent, 0.0, 0.0, 0.0, 0.0, "Pixels Translate");
if(transform->percent==1){ if(transform->percent==1){
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -100.0, 100.0, 0, 0, "X Position Start"); uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -500.0, 500.0, 0, 0, "X Position Start");
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -100.0, 100.0, 0, 0, "X Position End"); uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -500.0, 500.0, 0, 0, "X Position End");
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y Start:", 10,-10,150,19, &transform->yIni, -100.0, 100.0, 0, 0, "Y Position Start"); uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y Start:", 10,-10,150,19, &transform->yIni, -500.0, 500.0, 0, 0, "Y Position Start");
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y End:", 160,-10,150,19, &transform->yFin, -100.0, 100.0, 0, 0, "Y Position End"); uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y End:", 160,-10,150,19, &transform->yFin, -500.0, 500.0, 0, 0, "Y Position End");
}else{ }else{
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -10000.0, 10000.0, 0, 0, "X Position Start"); uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -10000.0, 10000.0, 0, 0, "X Position Start");
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -10000.0, 10000.0, 0, 0, "X Position End"); uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -10000.0, 10000.0, 0, 0, "X Position End");
@@ -1444,7 +1445,7 @@ void drawseqspace(ScrArea *sa, void *spacedata)
draw_extra_seqinfo(); draw_extra_seqinfo();
/* Draw markers */ /* Draw markers */
draw_markers_timespace(); draw_markers_timespace(1);
/* restore viewport */ /* restore viewport */
mywinset(sa->win); mywinset(sa->win);

View File

@@ -219,7 +219,7 @@ void drawsoundspace(ScrArea *sa, void *spacedata)
} }
draw_cfra_sound(spacedata); draw_cfra_sound(spacedata);
draw_markers_timespace(); draw_markers_timespace(0);
/* restore viewport */ /* restore viewport */
mywinset(curarea->win); mywinset(curarea->win);

View File

@@ -133,7 +133,7 @@ static void draw_cfra_time(SpaceTime *stime)
} }
static void draw_marker(TimeMarker *marker) static void draw_marker(TimeMarker *marker, int lines)
{ {
float xpos, ypixels, xscale, yscale; float xpos, ypixels, xscale, yscale;
@@ -149,6 +149,21 @@ static void draw_marker(TimeMarker *marker)
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* verticle line */
if (lines) {
setlinestyle(3);
if(marker->flag & SELECT)
glColor4ub(255,255,255, 96);
else
glColor4ub(0,0,0, 96);
glBegin(GL_LINES);
glVertex2f((xpos*xscale)+0.5, 12);
glVertex2f((xpos*xscale)+0.5, 34*yscale); /* a bit lazy but we know it cant be greater then 34 strips high*/
glEnd();
setlinestyle(0);
}
/* 5 px to offset icon to align properly, space / pixels corrects for zoom */ /* 5 px to offset icon to align properly, space / pixels corrects for zoom */
if(marker->flag & SELECT) if(marker->flag & SELECT)
BIF_icon_draw(xpos*xscale-5.0, 12.0, ICON_MARKER_HLT); BIF_icon_draw(xpos*xscale-5.0, 12.0, ICON_MARKER_HLT);
@@ -176,24 +191,24 @@ static void draw_marker(TimeMarker *marker)
glScalef(xscale, yscale, 1.0); glScalef(xscale, yscale, 1.0);
} }
static void draw_markers_time(void) static void draw_markers_time(int lines)
{ {
TimeMarker *marker; TimeMarker *marker;
/* unselected markers are drawn at the first time */ /* unselected markers are drawn at the first time */
for(marker= G.scene->markers.first; marker; marker= marker->next) { for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(!(marker->flag & SELECT)) draw_marker(marker); if(!(marker->flag & SELECT)) draw_marker(marker, lines);
} }
/* selected markers are drawn later ... selected markers have to cover unselected /* selected markers are drawn later ... selected markers have to cover unselected
* markers laying at the same position as selected markers * markers laying at the same position as selected markers
* (jiri: it is hack, it could be solved better) */ * (jiri: it is hack, it could be solved better) */
for(marker= G.scene->markers.first; marker; marker= marker->next) { for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT) draw_marker(marker); if(marker->flag & SELECT) draw_marker(marker, lines);
} }
} }
void draw_markers_timespace() void draw_markers_timespace(int lines)
{ {
TimeMarker *marker; TimeMarker *marker;
float yspace, ypixels; float yspace, ypixels;
@@ -208,13 +223,13 @@ void draw_markers_timespace()
/* unselected markers are drawn at the first time */ /* unselected markers are drawn at the first time */
for(marker= G.scene->markers.first; marker; marker= marker->next) { for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(!(marker->flag & SELECT)) draw_marker(marker); if(!(marker->flag & SELECT)) draw_marker(marker, lines);
} }
/* selected markers are drawn later ... selected markers have to cover unselected /* selected markers are drawn later ... selected markers have to cover unselected
* markers laying at the same position as selected markers */ * markers laying at the same position as selected markers */
for(marker= G.scene->markers.first; marker; marker= marker->next) { for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT) draw_marker(marker); if(marker->flag & SELECT) draw_marker(marker, lines);
} }
glTranslatef(0.0f, -G.v2d->cur.ymin, 0.0f); glTranslatef(0.0f, -G.v2d->cur.ymin, 0.0f);
@@ -386,7 +401,7 @@ void drawtimespace(ScrArea *sa, void *spacedata)
draw_cfra_time(spacedata); draw_cfra_time(spacedata);
draw_ob_keys(); draw_ob_keys();
draw_markers_time(); draw_markers_time(0);
/* restore viewport */ /* restore viewport */
mywinset(curarea->win); mywinset(curarea->win);

View File

@@ -2625,6 +2625,7 @@ static void transform_grab_xlimits(Sequence *seq, int leftflag, int rightflag)
void transform_seq(int mode, int context) void transform_seq(int mode, int context)
{ {
SpaceSeq *sseq= curarea->spacedata.first;
Sequence *seq; Sequence *seq;
Editing *ed; Editing *ed;
float dx, dy, dvec[2], div; float dx, dy, dvec[2], div;
@@ -2636,6 +2637,11 @@ void transform_seq(int mode, int context)
char str[32]; char str[32];
char side; /* for extend mode only - use to know which side to extend on */ char side; /* for extend mode only - use to know which side to extend on */
/* for markers */
int *oldframe, totmark, a;
TimeMarker *marker;
if(mode!='g' && mode!='e') return; /* from gesture */ if(mode!='g' && mode!='e') return; /* from gesture */
/* which seqs are involved */ /* which seqs are involved */
@@ -2682,6 +2688,31 @@ void transform_seq(int mode, int context)
side = (xmouse > CFRA) ? 'R' : 'L'; side = (xmouse > CFRA) ? 'R' : 'L';
} }
/* Markers */
if (sseq->flag & SEQ_MARKER_TRANS) {
for(marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT) totmark++;
}
oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT) {
if (mode=='e') {
/* when extending, invalidate markers on the other side by using an invalid frame value */
if ((side == 'L' && marker->frame > CFRA) || (side == 'R' && marker->frame < CFRA)) {
oldframe[a] = MAXFRAME+1;
} else {
oldframe[a]= marker->frame;
}
} else {
oldframe[a]= marker->frame;
}
a++;
}
}
}
xo=xn= mval[0]; xo=xn= mval[0];
yo=yn= mval[1]; yo=yn= mval[1];
dvec[0]= dvec[1]= 0.0; dvec[0]= dvec[1]= 0.0;
@@ -2747,6 +2778,16 @@ void transform_seq(int mode, int context)
} }
} }
END_SEQ END_SEQ
/* Markers */
if (sseq->flag & SEQ_MARKER_TRANS) {
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT) {
marker->frame= oldframe[a] + ix;
a++;
}
}
}
/* Extend, grabs one side of the current frame */ /* Extend, grabs one side of the current frame */
} else if (mode=='e') { } else if (mode=='e') {
int cfra = CFRA; int cfra = CFRA;
@@ -2840,6 +2881,16 @@ void transform_seq(int mode, int context)
} }
} }
END_SEQ END_SEQ
/* markers */
if (sseq->flag & SEQ_MARKER_TRANS) {
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT && (oldframe[a] != MAXFRAME+1)) {
marker->frame= oldframe[a] + ix;
}
a++;
}
}
} }
sprintf(str, "X: %d Y: %d ", ix, iy); sprintf(str, "X: %d Y: %d ", ix, iy);
@@ -2919,9 +2970,19 @@ void transform_seq(int mode, int context)
else if(seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(seq); else if(seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(seq);
else if(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq); else if(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq);
} }
} }
END_SEQ END_SEQ
/* Markers */
if (sseq->flag & SEQ_MARKER_TRANS) {
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
if(marker->flag & SELECT && (oldframe[a] != MAXFRAME+1)) {
marker->frame= oldframe[a];
}
a++;
}
}
} else { } else {
/* images, effects and overlap */ /* images, effects and overlap */
@@ -2953,6 +3014,9 @@ void transform_seq(int mode, int context)
G.moving= 0; G.moving= 0;
MEM_freeN(transmain); MEM_freeN(transmain);
if (sseq->flag & SEQ_MARKER_TRANS)
MEM_freeN(transmain);
if (mode=='g') if (mode=='g')
BIF_undo_push("Transform Grab, Sequencer"); BIF_undo_push("Transform Grab, Sequencer");
else if (mode=='e') else if (mode=='e')

View File

@@ -509,6 +509,8 @@ static uiBlock *seq_editmenu(void *arg_unused)
static void do_seq_markermenu(void *arg, int event) static void do_seq_markermenu(void *arg, int event)
{ {
SpaceSeq *sseq= curarea->spacedata.first;
switch(event) switch(event)
{ {
case 1: case 1:
@@ -526,6 +528,10 @@ static void do_seq_markermenu(void *arg, int event)
case 5: case 5:
transform_markers('g', 0); transform_markers('g', 0);
break; break;
case 6:
sseq->flag ^= SEQ_MARKER_TRANS;
break;
} }
allqueue(REDRAWMARKER, 0); allqueue(REDRAWMARKER, 0);
@@ -536,6 +542,8 @@ static uiBlock *seq_markermenu(void *arg_unused)
uiBlock *block; uiBlock *block;
short yco= 0, menuwidth=120; short yco= 0, menuwidth=120;
SpaceSeq *sseq= curarea->spacedata.first;
block= uiNewBlock(&curarea->uiblocks, "ipo_markermenu", block= uiNewBlock(&curarea->uiblocks, "ipo_markermenu",
UI_EMBOSSP, UI_HELV, curarea->headwin); UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_seq_markermenu, NULL); uiBlockSetButmFunc(block, do_seq_markermenu, NULL);
@@ -554,10 +562,15 @@ static uiBlock *seq_markermenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20, uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, (sseq->flag & SEQ_MARKER_TRANS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
"Transform Markers", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
if(curarea->headertype==HEADERTOP) { if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN); uiBlockSetDirection(block, UI_DOWN);
} } else {
else {
uiBlockSetDirection(block, UI_TOP); uiBlockSetDirection(block, UI_TOP);
uiBlockFlipOrder(block); uiBlockFlipOrder(block);
} }
@@ -693,6 +706,8 @@ void seq_buttons()
uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to fit area"); uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to fit area");
uiBlockEndAlign(block); uiBlockEndAlign(block);
/* CLEAR MEM */
xco+= 8;
/* CLEAR MEM */ /* CLEAR MEM */
xco+= 8; xco+= 8;

View File

@@ -4506,12 +4506,17 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break; break;
case AKEY: case AKEY:
if (G.qual == LR_CTRLKEY) {
deselect_markers(1, 0);
allqueue(REDRAWMARKER, 0);
} else {
if(sseq->mainb) break; if(sseq->mainb) break;
if((G.qual==LR_SHIFTKEY)) { if((G.qual==LR_SHIFTKEY)) {
add_sequence(-1); add_sequence(-1);
} } else if((G.qual==0)) {
else if((G.qual==0))
swap_select_seq(); swap_select_seq();
}
}
break; break;
case SPACEKEY: case SPACEKEY:
if (G.qual==0) { if (G.qual==0) {