51
56
#include "UI_resources.h"
52
57
#include "UI_view2d.h"
54
#include "sequencer_intern.h" // own include
59
#include "sequencer_intern.h" // own include
56
61
/* ******************** manage regions ********************* */
58
63
ARegion *sequencer_has_buttons_region(ScrArea *sa)
60
65
ARegion *ar, *arnew;
62
for(ar= sa->regionbase.first; ar; ar= ar->next)
63
if(ar->regiontype==RGN_TYPE_UI)
67
ar = BKE_area_find_region_type(sa, RGN_TYPE_UI);
66
70
/* add subdiv level; after header */
67
for(ar= sa->regionbase.first; ar; ar= ar->next)
68
if(ar->regiontype==RGN_TYPE_HEADER)
71
ar = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
72
if(ar==NULL) return NULL;
74
if (ar == NULL) return NULL;
74
arnew= MEM_callocN(sizeof(ARegion), "buttons for sequencer");
76
arnew = MEM_callocN(sizeof(ARegion), "buttons for sequencer");
76
78
BLI_insertlinkafter(&sa->regionbase, ar, arnew);
77
arnew->regiontype= RGN_TYPE_UI;
78
arnew->alignment= RGN_ALIGN_RIGHT;
79
arnew->regiontype = RGN_TYPE_UI;
80
arnew->alignment = RGN_ALIGN_RIGHT;
80
82
arnew->flag = RGN_FLAG_HIDDEN;
85
ARegion *sequencer_find_region(ScrArea *sa, short type)
87
static ARegion *sequencer_find_region(ScrArea *sa, short type)
89
for(ar= sa->regionbase.first; ar; ar= ar->next)
90
if(ar->regiontype==type)
91
for (ar = sa->regionbase.first; ar; ar = ar->next)
92
if (ar->regiontype == type)
96
void ED_sequencer_update_view(bContext *C, int view)
98
ScrArea *sa= CTX_wm_area(C);
100
ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW);
101
ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW);
104
case SEQ_VIEW_SEQUENCE:
105
if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
106
ar_main->flag &= ~RGN_FLAG_HIDDEN;
107
ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
109
if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
110
ar_preview->flag |= RGN_FLAG_HIDDEN;
111
ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
112
WM_event_remove_handlers(C, &ar_preview->handlers);
114
if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
115
if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
117
case SEQ_VIEW_PREVIEW:
118
if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
119
ar_main->flag |= RGN_FLAG_HIDDEN;
120
ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
121
WM_event_remove_handlers(C, &ar_main->handlers);
123
if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
124
ar_preview->flag &= ~RGN_FLAG_HIDDEN;
125
ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
126
ar_preview->v2d.cur = ar_preview->v2d.tot;
128
if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
129
if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
131
case SEQ_VIEW_SEQUENCE_PREVIEW:
132
if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
133
ar_main->flag &= ~RGN_FLAG_HIDDEN;
134
ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
136
if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
137
ar_preview->flag &= ~RGN_FLAG_HIDDEN;
138
ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
139
ar_preview->v2d.cur = ar_preview->v2d.tot;
141
if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
142
if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP;
146
ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
147
ED_area_tag_redraw(sa);
151
98
/* ******************** default callbacks for sequencer space ***************** */
153
100
static SpaceLink *sequencer_new(const bContext *C)
155
Scene *scene= CTX_data_scene(C);
102
Scene *scene = CTX_data_scene(C);
159
sseq= MEM_callocN(sizeof(SpaceSeq), "initsequencer");
160
sseq->spacetype= SPACE_SEQ;
106
sseq = MEM_callocN(sizeof(SpaceSeq), "initsequencer");
107
sseq->spacetype = SPACE_SEQ;
162
108
sseq->chanshown = 0;
163
109
sseq->view = SEQ_VIEW_SEQUENCE;
164
110
sseq->mainb = SEQ_DRAW_IMG_IMBUF;
166
ar= MEM_callocN(sizeof(ARegion), "header for sequencer");
112
ar = MEM_callocN(sizeof(ARegion), "header for sequencer");
168
114
BLI_addtail(&sseq->regionbase, ar);
169
ar->regiontype= RGN_TYPE_HEADER;
170
ar->alignment= RGN_ALIGN_BOTTOM;
115
ar->regiontype = RGN_TYPE_HEADER;
116
ar->alignment = RGN_ALIGN_BOTTOM;
172
118
/* buttons/list view */
173
ar= MEM_callocN(sizeof(ARegion), "buttons for sequencer");
119
ar = MEM_callocN(sizeof(ARegion), "buttons for sequencer");
175
121
BLI_addtail(&sseq->regionbase, ar);
176
ar->regiontype= RGN_TYPE_UI;
177
ar->alignment= RGN_ALIGN_RIGHT;
122
ar->regiontype = RGN_TYPE_UI;
123
ar->alignment = RGN_ALIGN_RIGHT;
178
124
ar->flag = RGN_FLAG_HIDDEN;
180
126
/* preview area */
181
127
/* NOTE: if you change values here, also change them in sequencer_init_preview_region */
182
ar= MEM_callocN(sizeof(ARegion), "preview area for sequencer");
128
ar = MEM_callocN(sizeof(ARegion), "preview area for sequencer");
183
129
BLI_addtail(&sseq->regionbase, ar);
184
ar->regiontype= RGN_TYPE_PREVIEW;
185
ar->alignment= RGN_ALIGN_TOP;
130
ar->regiontype = RGN_TYPE_PREVIEW;
131
ar->alignment = RGN_ALIGN_TOP;
186
132
ar->flag |= RGN_FLAG_HIDDEN;
187
133
/* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
188
ar->v2d.keepzoom= V2D_KEEPASPECT | V2D_KEEPZOOM;
189
ar->v2d.minzoom= 0.00001f;
190
ar->v2d.maxzoom= 100000.0f;
191
ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */
192
ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */
193
ar->v2d.tot.xmax= 960.0f;
194
ar->v2d.tot.ymax= 540.0f;
195
ar->v2d.min[0]= 0.0f;
196
ar->v2d.min[1]= 0.0f;
197
ar->v2d.max[0]= 12000.0f;
198
ar->v2d.max[1]= 12000.0f;
199
ar->v2d.cur= ar->v2d.tot;
200
ar->v2d.align= V2D_ALIGN_FREE;
201
ar->v2d.keeptot= V2D_KEEPTOT_FREE;
134
ar->v2d.keepzoom = V2D_KEEPASPECT | V2D_KEEPZOOM;
135
ar->v2d.minzoom = 0.00001f;
136
ar->v2d.maxzoom = 100000.0f;
137
ar->v2d.tot.xmin = -960.0f; /* 1920 width centered */
138
ar->v2d.tot.ymin = -540.0f; /* 1080 height centered */
139
ar->v2d.tot.xmax = 960.0f;
140
ar->v2d.tot.ymax = 540.0f;
141
ar->v2d.min[0] = 0.0f;
142
ar->v2d.min[1] = 0.0f;
143
ar->v2d.max[0] = 12000.0f;
144
ar->v2d.max[1] = 12000.0f;
145
ar->v2d.cur = ar->v2d.tot;
146
ar->v2d.align = V2D_ALIGN_FREE;
147
ar->v2d.keeptot = V2D_KEEPTOT_FREE;
205
ar= MEM_callocN(sizeof(ARegion), "main area for sequencer");
151
ar = MEM_callocN(sizeof(ARegion), "main area for sequencer");
207
153
BLI_addtail(&sseq->regionbase, ar);
208
ar->regiontype= RGN_TYPE_WINDOW;
154
ar->regiontype = RGN_TYPE_WINDOW;
211
157
/* seq space goes from (0,8) to (0, efra) */
213
ar->v2d.tot.xmin= 0.0f;
214
ar->v2d.tot.ymin= 0.0f;
215
ar->v2d.tot.xmax= scene->r.efra;
216
ar->v2d.tot.ymax= 8.0f;
218
ar->v2d.cur= ar->v2d.tot;
220
ar->v2d.min[0]= 10.0f;
221
ar->v2d.min[1]= 4.0f;
223
ar->v2d.max[0]= MAXFRAMEF;
224
ar->v2d.max[1]= MAXSEQ;
226
ar->v2d.minzoom= 0.01f;
227
ar->v2d.maxzoom= 100.0f;
229
ar->v2d.scroll |= (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
230
ar->v2d.scroll |= (V2D_SCROLL_LEFT|V2D_SCROLL_SCALE_VERTICAL);
233
ar->v2d.align= V2D_ALIGN_NO_NEG_Y;
159
ar->v2d.tot.xmin = 0.0f;
160
ar->v2d.tot.ymin = 0.0f;
161
ar->v2d.tot.xmax = scene->r.efra;
162
ar->v2d.tot.ymax = 8.0f;
164
ar->v2d.cur = ar->v2d.tot;
166
ar->v2d.min[0] = 10.0f;
167
ar->v2d.min[1] = 0.5f;
169
ar->v2d.max[0] = MAXFRAMEF;
170
ar->v2d.max[1] = MAXSEQ;
172
ar->v2d.minzoom = 0.01f;
173
ar->v2d.maxzoom = 100.0f;
175
ar->v2d.scroll |= (V2D_SCROLL_BOTTOM | V2D_SCROLL_SCALE_HORIZONTAL);
176
ar->v2d.scroll |= (V2D_SCROLL_LEFT | V2D_SCROLL_SCALE_VERTICAL);
177
ar->v2d.keepzoom = 0;
179
ar->v2d.align = V2D_ALIGN_NO_NEG_Y;
235
181
return (SpaceLink *)sseq;
238
184
/* not spacelink itself */
239
static void sequencer_free(SpaceLink *sl)
185
static void sequencer_free(SpaceLink *UNUSED(sl))
241
187
// SpaceSeq *sseq= (SpaceSequencer*) sl;
243
// XXX if(sseq->gpd) free_gpencil_data(sseq->gpd);
189
// XXX if (sseq->gpd) free_gpencil_data(sseq->gpd);
248
194
/* spacetype; init callback */
249
static void sequencer_init(struct wmWindowManager *wm, ScrArea *sa)
195
static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
200
static void sequencer_refresh(const bContext *C, ScrArea *sa)
202
wmWindowManager *wm = CTX_wm_manager(C);
203
wmWindow *window = CTX_wm_window(C);
204
SpaceSeq *sseq = (SpaceSeq *)sa->spacedata.first;
205
ARegion *ar_main = sequencer_find_region(sa, RGN_TYPE_WINDOW);
206
ARegion *ar_preview = sequencer_find_region(sa, RGN_TYPE_PREVIEW);
207
int view_changed = 0;
209
switch (sseq->view) {
210
case SEQ_VIEW_SEQUENCE:
211
if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
212
ar_main->flag &= ~RGN_FLAG_HIDDEN;
213
ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
216
if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
217
ar_preview->flag |= RGN_FLAG_HIDDEN;
218
ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
219
WM_event_remove_handlers((bContext *)C, &ar_preview->handlers);
222
if (ar_main && ar_main->alignment != RGN_ALIGN_NONE) {
223
ar_main->alignment = RGN_ALIGN_NONE;
226
if (ar_preview && ar_preview->alignment != RGN_ALIGN_NONE) {
227
ar_preview->alignment = RGN_ALIGN_NONE;
231
case SEQ_VIEW_PREVIEW:
232
if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
233
ar_main->flag |= RGN_FLAG_HIDDEN;
234
ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
235
WM_event_remove_handlers((bContext *)C, &ar_main->handlers);
238
if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
239
ar_preview->flag &= ~RGN_FLAG_HIDDEN;
240
ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
241
ar_preview->v2d.cur = ar_preview->v2d.tot;
244
if (ar_main && ar_main->alignment != RGN_ALIGN_NONE) {
245
ar_main->alignment = RGN_ALIGN_NONE;
248
if (ar_preview && ar_preview->alignment != RGN_ALIGN_NONE) {
249
ar_preview->alignment = RGN_ALIGN_NONE;
253
case SEQ_VIEW_SEQUENCE_PREVIEW:
254
if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
255
ar_main->flag &= ~RGN_FLAG_HIDDEN;
256
ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
259
if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
260
ar_preview->flag &= ~RGN_FLAG_HIDDEN;
261
ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
262
ar_preview->v2d.cur = ar_preview->v2d.tot;
265
if (ar_main && ar_main->alignment != RGN_ALIGN_NONE) {
266
ar_main->alignment = RGN_ALIGN_NONE;
269
if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
270
ar_preview->alignment = RGN_ALIGN_TOP;
277
ED_area_initialize(wm, window, sa);
278
ED_area_tag_redraw(sa);
254
282
static SpaceLink *sequencer_duplicate(SpaceLink *sl)
256
SpaceSeq *sseqn= MEM_dupallocN(sl);
284
SpaceSeq *sseqn = MEM_dupallocN(sl);
258
286
/* clear or remove stuff from old */
259
287
// XXX sseq->gpd= gpencil_data_duplicate(sseq->gpd);
395
425
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
397
keymap= WM_keymap_find(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
427
keymap = WM_keymap_find(wm->defaultconf, "SequencerCommon", SPACE_SEQ, 0);
398
428
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
401
keymap= WM_keymap_find(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0);
431
keymap = WM_keymap_find(wm->defaultconf, "SequencerPreview", SPACE_SEQ, 0);
402
432
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
405
435
static void sequencer_preview_area_draw(const bContext *C, ARegion *ar)
407
ScrArea *sa= CTX_wm_area(C);
408
SpaceSeq *sseq= sa->spacedata.first;
409
Scene *scene= CTX_data_scene(C);
437
ScrArea *sa = CTX_wm_area(C);
438
SpaceSeq *sseq = sa->spacedata.first;
439
Scene *scene = CTX_data_scene(C);
411
441
/* XXX temp fix for wrong setting in sseq->mainb */
412
442
if (sseq->mainb == SEQ_DRAW_SEQUENCE) sseq->mainb = SEQ_DRAW_IMG_IMBUF;
414
444
draw_image_seq(C, scene, ar, sseq, scene->r.cfra, 0);
416
if(scene->ed && scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW && sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
446
if (scene->ed && scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW && sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
419
if(scene->ed->over_flag & SEQ_EDIT_OVERLAY_ABS)
420
over_cfra= scene->ed->over_cfra;
449
if (scene->ed->over_flag & SEQ_EDIT_OVERLAY_ABS)
450
over_cfra = scene->ed->over_cfra;
422
over_cfra= scene->r.cfra + scene->ed->over_ofs;
452
over_cfra = scene->r.cfra + scene->ed->over_ofs;
424
if(over_cfra != scene->r.cfra)
454
if (over_cfra != scene->r.cfra)
425
455
draw_image_seq(C, scene, ar, sseq, scene->r.cfra, over_cfra - scene->r.cfra);
496
527
/* only called once, from space/spacetypes.c */
497
528
void ED_spacetype_sequencer(void)
499
SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype sequencer");
530
SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype sequencer");
500
531
ARegionType *art;
502
st->spaceid= SPACE_SEQ;
533
st->spaceid = SPACE_SEQ;
503
534
strncpy(st->name, "Sequencer", BKE_ST_MAXNAME);
505
st->new= sequencer_new;
506
st->free= sequencer_free;
507
st->init= sequencer_init;
508
st->duplicate= sequencer_duplicate;
509
st->operatortypes= sequencer_operatortypes;
510
st->keymap= sequencer_keymap;
511
st->dropboxes= sequencer_dropboxes;
536
st->new = sequencer_new;
537
st->free = sequencer_free;
538
st->init = sequencer_init;
539
st->duplicate = sequencer_duplicate;
540
st->operatortypes = sequencer_operatortypes;
541
st->keymap = sequencer_keymap;
542
st->dropboxes = sequencer_dropboxes;
543
st->refresh = sequencer_refresh;
513
545
/* regions: main window */
514
art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
546
art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
515
547
art->regionid = RGN_TYPE_WINDOW;
516
art->init= sequencer_main_area_init;
517
art->draw= sequencer_main_area_draw;
518
art->listener= sequencer_main_area_listener;
519
art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
548
art->init = sequencer_main_area_init;
549
art->draw = sequencer_main_area_draw;
550
art->listener = sequencer_main_area_listener;
551
art->keymapflag = ED_KEYMAP_VIEW2D | ED_KEYMAP_MARKERS | ED_KEYMAP_FRAMES | ED_KEYMAP_ANIMATION;
521
553
BLI_addhead(&st->regiontypes, art);
524
art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
556
art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
525
557
art->regionid = RGN_TYPE_PREVIEW;
526
558
art->prefsizey = 240; // XXX
527
art->init= sequencer_preview_area_init;
528
art->draw= sequencer_preview_area_draw;
529
art->listener= sequencer_preview_area_listener;
530
art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
559
art->init = sequencer_preview_area_init;
560
art->draw = sequencer_preview_area_draw;
561
art->listener = sequencer_preview_area_listener;
562
art->keymapflag = ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_ANIMATION;
531
563
BLI_addhead(&st->regiontypes, art);
533
565
/* regions: listview/buttons */
534
art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
566
art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
535
567
art->regionid = RGN_TYPE_UI;
536
art->prefsizex= 220; // XXX
537
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
538
art->listener= sequencer_buttons_area_listener;
539
art->init= sequencer_buttons_area_init;
540
art->draw= sequencer_buttons_area_draw;
568
art->prefsizex = 220; // XXX
569
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
570
art->listener = sequencer_buttons_area_listener;
571
art->init = sequencer_buttons_area_init;
572
art->draw = sequencer_buttons_area_draw;
541
573
BLI_addhead(&st->regiontypes, art);
543
/* Keep as python only for now
544
sequencer_buttons_register(art);
547
575
/* regions: header */
548
art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
576
art = MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
549
577
art->regionid = RGN_TYPE_HEADER;
550
art->prefsizey= HEADERY;
551
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER;
578
art->prefsizey = HEADERY;
579
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_HEADER;
553
art->init= sequencer_header_area_init;
554
art->draw= sequencer_header_area_draw;
555
art->listener= sequencer_main_area_listener;
581
art->init = sequencer_header_area_init;
582
art->draw = sequencer_header_area_draw;
583
art->listener = sequencer_main_area_listener;
557
585
BLI_addhead(&st->regiontypes, art);
559
587
BKE_spacetype_register(st);
561
589
/* set the sequencer callback when not in background mode */
562
if(G.background==0) {
563
sequencer_view3d_cb= ED_view3d_draw_offscreen_imbuf_simple;
590
if (G.background == 0) {
591
sequencer_view3d_cb = ED_view3d_draw_offscreen_imbuf_simple;