98
100
marker->frame= frame;
99
101
BLI_addtail(&(G.scene->markers), marker);
101
BIF_undo_push("Add Timeline Marker");
103
BIF_undo_push("Add Marker");
104
/* remove TimeMarker */
105
void remove_timeline_marker(void)
108
/* remove selected TimeMarkers */
109
void remove_marker(void)
109
for(marker= G.scene->markers.first; marker; marker= marker->next) {
110
if(marker->flag & SELECT){
111
BLI_freelinkN(&G.scene->markers, marker);
111
TimeMarker *marker, *nmarker;
114
for(marker= G.scene->markers.first; marker; marker= nmarker) {
115
nmarker= marker->next;
116
if(marker->flag & SELECT) {
117
BLI_freelinkN(&(G.scene->markers), marker);
115
BIF_undo_push("Remove Timeline Marker");
123
BIF_undo_push("Remove Marker");
118
126
/* rename first selected TimeMarker */
119
void rename_timeline_marker(void)
127
void rename_marker(void)
121
129
TimeMarker *marker;
124
132
for(marker= G.scene->markers.first; marker; marker= marker->next) {
125
133
if(marker->flag & SELECT) {
126
sprintf(name, marker->name);
134
strcpy(name, marker->name);
127
135
if (sbutton(name, 0, sizeof(name)-1, "Name: "))
128
136
BLI_strncpy(marker->name, name, sizeof(marker->name));
133
BIF_undo_push("Rename Timeline Marker");
141
// BIF_undo_push("Rename Marker");
136
144
/* duplicate selected TimeMarkers */
137
void duplicate_timeline_marker(void)
145
void duplicate_marker(void)
139
147
TimeMarker *marker, *newmarker;
141
149
/* go through the list of markers, duplicate selected markers and add duplicated copies
142
150
* to the begining of the list (unselect original markers) */
143
151
for(marker= G.scene->markers.first; marker; marker= marker->next) {
157
timeline_grab('g', 0);
162
static int find_nearest_marker(float dx)
165
transform_markers('g', 0);
168
void transform_markers(int mode, int smode) // mode and smode unused here, for callback
170
SpaceLink *slink= curarea->spacedata.first;
171
SpaceTime *stime= curarea->spacedata.first;
172
SpaceAction *saction = curarea->spacedata.first;
174
TimeMarker *marker, *selmarker=NULL;
176
int a, ret_val= 0, totmark=0, *oldframe, offs, firsttime=1;
177
unsigned short event;
178
short val, pmval[2], mval[2], mvalo[2];
181
/* hack for pose-markers in action editor */
182
if ((slink->spacetype == SPACE_ACTION) && (saction->flag & SACTION_POSEMARKERS_MOVE)) {
184
markers= &saction->action->markers;
189
markers= &G.scene->markers;
191
for (marker= markers->first; marker; marker= marker->next) {
192
if (marker->flag & SELECT) totmark++;
194
if (totmark==0) return;
196
oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
197
for (a=0, marker= markers->first; marker; marker= marker->next) {
198
if (marker->flag & SELECT) {
199
oldframe[a]= marker->frame;
200
selmarker= marker; // used for headerprint
205
dx= G.v2d->mask.xmax-G.v2d->mask.xmin;
206
dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/dx;
208
getmouseco_areawin(pmval);
211
while (ret_val == 0) {
212
getmouseco_areawin(mval);
214
if (mval[0] != mvalo[0] || firsttime) {
218
fac= (((float)(mval[0] - pmval[0]))*dx);
220
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND))
221
apply_keyb_grid(&fac, 0.0, FPS, 0.1*FPS, 0);
223
apply_keyb_grid(&fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
226
for (a=0, marker= markers->first; marker; marker= marker->next) {
227
if (marker->flag & SELECT) {
228
marker->frame= oldframe[a] + offs;
234
/* we print current marker value */
235
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
236
if (stime->flag & TIME_DRAWFRAMES)
237
sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
239
sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
241
else if (slink->spacetype == SPACE_ACTION) {
242
if (saction->flag & SACTION_DRAWTIME)
243
sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
245
sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
248
sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
252
/* we only print the offset */
253
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
254
if (stime->flag & TIME_DRAWFRAMES)
255
sprintf(str, "Marker offset %d ", offs);
257
sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
259
else if (slink->spacetype == SPACE_ACTION) {
260
if (saction->flag & SACTION_DRAWTIME)
261
sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
263
sprintf(str, "Marker offset %.2f ", (double)(offs));
266
sprintf(str, "Marker offset %.2f ", (double)(offs));
271
force_draw(0); // areas identical to this, 0 = no header
273
else PIL_sleep_ms(10); // idle
275
/* emptying queue and reading events */
277
event= extern_qread(&val);
280
if (ELEM(event, ESCKEY, RIGHTMOUSE)) ret_val= 2;
281
else if (ELEM3(event, LEFTMOUSE, RETKEY, SPACEKEY)) ret_val= 1;
288
for (a=0, marker= markers->first; marker; marker= marker->next) {
289
if (marker->flag & SELECT) {
290
marker->frame= oldframe[a];
296
BIF_undo_push("Move Markers");
299
allqueue(REDRAWMARKER, 0);
302
/* select/deselect all TimeMarkers
303
* test - based on current selections?
304
* sel - selection status to set all markers to if blanket apply status
306
void deselect_markers(short test, short sel)
310
/* check if need to find out whether to how to select markers */
312
/* dependant on existing selection */
313
/* determine if select all or deselect all */
315
for (marker= G.scene->markers.first; marker; marker= marker->next) {
316
if (marker->flag & SELECT) {
323
for (marker= G.scene->markers.first; marker; marker= marker->next) {
325
marker->flag ^= SELECT;
328
if ((marker->flag & SELECT)==0)
329
marker->flag |= SELECT;
332
if (marker->flag & SELECT)
333
marker->flag &= ~SELECT;
338
/* not dependant on existing selection */
339
for (marker= G.scene->markers.first; marker; marker= marker->next) {
341
marker->flag ^= SELECT;
344
if ((marker->flag & SELECT)==0)
345
marker->flag |= SELECT;
348
if (marker->flag & SELECT)
349
marker->flag &= ~SELECT;
355
static void borderselect_markers_func(float xmin, float xmax, int selectmode)
359
for(marker= G.scene->markers.first; marker; marker= marker->next) {
360
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
361
switch (selectmode) {
363
if ((marker->flag & SELECT) == 0)
364
marker->flag |= SELECT;
366
case SELECT_SUBTRACT:
367
if (marker->flag & SELECT)
368
marker->flag &= ~SELECT;
375
/* border-select markers */
376
void borderselect_markers(void)
383
if ( (val = get_border(&rect, 3)) ){
384
if (val == LEFTMOUSE)
385
selectmode = SELECT_ADD;
387
selectmode = SELECT_SUBTRACT;
390
mval[1]= rect.ymin+2;
391
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
393
mval[1]= rect.ymax-2;
394
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
397
borderselect_markers_func(rectf.xmin, rectf.xmax, selectmode);
399
BIF_undo_push("Border Select Markers");
400
allqueue(REDRAWMARKER, 0);
404
void nextprev_marker(short dir)
406
TimeMarker *marker, *cur=NULL, *first, *last;
407
int mindist= MAXFRAME, dist;
409
first= last= G.scene->markers.first;
410
for(marker= G.scene->markers.first; marker; marker= marker->next) {
411
/* find closest to current frame first */
412
dist= (marker->frame/G.scene->r.framelen) - CFRA;
413
if(dir==1 && dist>0 && dist<mindist) {
417
else if(dir==-1 && dist<0 && -dist<mindist) {
421
/* find first/last */
422
if(marker->frame > last->frame) last= marker;
423
if(marker->frame < first->frame) first= marker;
427
if(dir==1) cur= first;
431
CFRA= cur->frame/G.scene->r.framelen;
432
update_for_newframe();
433
allqueue(REDRAWALL, 0);
437
void get_minmax_markers(short sel, float *first, float *last)
444
markers= &(G.scene->markers);
447
for (marker= markers->first; marker; marker= marker->next) {
448
if (marker->flag & SELECT)
452
selcount= BLI_countlist(markers);
455
if (markers->first && markers->last) {
456
min= ((TimeMarker *)markers->first)->frame;
457
max= ((TimeMarker *)markers->last)->frame;
466
for (marker= markers->first; marker; marker= marker->next) {
468
if (marker->flag & SELECT) {
469
if (marker->frame < min)
471
else if (marker->frame > max)
476
if (marker->frame < min)
478
else if (marker->frame > max)
488
TimeMarker *find_nearest_marker(ListBase *markers, int clip_y)
495
getmouseco_areawin (mval);
497
/* first clip selection in Y */
498
if ((clip_y) && (mval[1] > 30))
502
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
504
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
509
for (marker= markers->first; marker; marker= marker->next) {
510
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
518
/* Adds a marker to list of cfra elems */
519
void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel)
523
/* should this one only be considered if it is selected? */
524
if ((only_sel) && ((marker->flag & SELECT)==0))
527
/* try to find a previous cfra elem */
531
if( ce->cfra==marker->frame ) {
532
/* do because of double keys */
533
if(marker->flag & SELECT) ce->sel= marker->flag;
536
else if(ce->cfra > marker->frame) break;
541
cen= MEM_callocN(sizeof(CfraElem), "add_to_cfra_elem");
542
if(ce) BLI_insertlinkbefore(lb, ce, cen);
543
else BLI_addtail(lb, cen);
545
cen->cfra= marker->frame;
546
cen->sel= marker->flag;
549
/* This function makes a list of all the markers. The only_sel
550
* argument is used to specify whether only the selected markers
553
void make_marker_cfra_list(ListBase *lb, short only_sel)
557
for (marker= G.scene->markers.first; marker; marker= marker->next) {
558
add_marker_to_cfra_elem(lb, marker, only_sel);
562
int find_nearest_marker_time(float dx)
164
564
TimeMarker *marker, *nearest= NULL;
165
565
float dist, min_dist= 1000000;
199
/* select/deselect all TimeMarkers */
200
void select_timeline_markers(void)
203
char any_selected= 0;
205
for(marker= G.scene->markers.first; marker; marker= marker->next) {
206
if(marker->flag & SELECT) any_selected= 1;
207
marker->flag &= ~SELECT;
210
/* no TimeMarker selected, then select all TimeMarkers */
212
for(marker= G.scene->markers.first; marker; marker= marker->next) {
213
marker->flag |= SELECT;
218
void nextprev_timeline_marker(short dir)
220
TimeMarker *marker, *cur=NULL, *first, *last;
221
int mindist= MAXFRAME, dist;
223
first= last= G.scene->markers.first;
224
for(marker= G.scene->markers.first; marker; marker= marker->next) {
225
/* find closest to current frame first */
226
dist= (marker->frame/G.scene->r.framelen) - CFRA;
227
if(dir==1 && dist>0 && dist<mindist) {
231
else if(dir==-1 && dist<0 && -dist<mindist) {
235
/* find first/last */
236
if(marker->frame > last->frame) last= marker;
237
if(marker->frame < first->frame) first= marker;
241
if(dir==1) cur= first;
245
CFRA= cur->frame/G.scene->r.framelen;
246
update_for_newframe();
247
allqueue(REDRAWALL, 0);
251
/* *********** end Markers *************** */
600
/* *********** end Markers - TimeLine *************** */
602
/* set the animation preview range of scene */
603
void anim_previewrange_set()
609
/* set range by drawing border-select rectangle */
610
if ( (val = get_border(&rect, 5)) ) {
611
/* get frame numbers */
613
mval[1]= rect.ymin+2;
614
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
616
mval[1]= rect.ymax-2;
617
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
619
/* set preview-range */
620
if (rectf.xmin < 1) rectf.xmin = 1.0f;
621
if (rectf.xmax < 1) rectf.xmax = 1.0f;
622
G.scene->r.psfra= rectf.xmin;
623
G.scene->r.pefra= rectf.xmax;
625
BIF_undo_push("Set anim-preview range");
626
allqueue(REDRAWTIME, 0);
627
allqueue(REDRAWACTION, 0);
628
allqueue(REDRAWNLA, 0);
629
allqueue(REDRAWIPO, 0);
630
allqueue(REDRAWBUTSALL, 0);
634
/* clear the animation preview range for scene */
635
void anim_previewrange_clear()
637
G.scene->r.psfra = 0;
638
G.scene->r.pefra = 0;
640
BIF_undo_push("Clear anim-preview range");
641
allqueue(REDRAWTIME, 0);
642
allqueue(REDRAWACTION, 0);
643
allqueue(REDRAWNLA, 0);
644
allqueue(REDRAWBUTSALL, 0);
647
/* ************ end Animation Preview Range ********** */
253
650
static int float_to_frame(float frame)
359
777
scrarea_queue_winredraw(curarea);
362
void timeline_grab(int mode, int smode) // mode and smode unused here, for callback
364
SpaceTime *stime= curarea->spacedata.first;
365
TimeMarker *marker, *selmarker=NULL;
367
int a, ret_val= 0, totmark=0, *oldframe, offs, firsttime=1;
368
unsigned short event;
369
short val, pmval[2], mval[2], mvalo[2];
372
for(marker= G.scene->markers.first; marker; marker= marker->next) {
373
if(marker->flag & SELECT) totmark++;
375
if(totmark==0) return;
377
oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
378
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
379
if(marker->flag & SELECT) {
380
oldframe[a]= marker->frame;
381
selmarker= marker; // used for hederprint
386
dx= G.v2d->mask.xmax-G.v2d->mask.xmin;
387
dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/dx;
389
getmouseco_areawin(pmval);
392
while(ret_val == 0) {
394
getmouseco_areawin(mval);
396
if (mval[0] != mvalo[0] || firsttime) {
400
fac= (((float)(mval[0] - pmval[0]))*dx);
402
apply_keyb_grid(&fac, 0.0, (float)G.scene->r.frs_sec, 0.1*(float)G.scene->r.frs_sec, 0);
405
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
406
if(marker->flag & SELECT) {
407
marker->frame= oldframe[a] + offs;
412
if(totmark==1) { // we print current marker value
413
if(stime->flag & TIME_DRAWFRAMES)
414
sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
416
sprintf(str, "Marker %.2f offset %.2f", (selmarker->frame/(float)G.scene->r.frs_sec), (offs/(float)G.scene->r.frs_sec));
419
if(stime->flag & TIME_DRAWFRAMES)
420
sprintf(str, "Marker offset %d ", offs);
422
sprintf(str, "Marker offset %.2f ", (offs/(float)G.scene->r.frs_sec));
426
force_draw(0); // areas identical to this, 0 = no header
428
else PIL_sleep_ms(10); // idle
430
/* emptying queue and reading events */
432
event= extern_qread(&val);
435
if(event==ESCKEY || event==RIGHTMOUSE) ret_val= 2;
436
else if(event==LEFTMOUSE || event==RETKEY || event==SPACEKEY) ret_val= 1;
443
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
444
if(marker->flag & SELECT) {
445
marker->frame= oldframe[a];
451
BIF_undo_push("Move Markers");
454
allqueue(REDRAWTIME, 0);
457
780
/* copy of this is actually in editscreen.c, but event based */
458
781
static void timeline_force_draw(short val)