2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2011 Blender Foundation.
19 * All rights reserved.
22 * Contributor(s): Blender Foundation,
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file blender/editors/space_clip/space_clip.c
35 #include "DNA_scene_types.h"
36 #include "DNA_mask_types.h"
37 #include "DNA_movieclip_types.h"
38 #include "DNA_view3d_types.h" /* for pivot point */
40 #include "MEM_guardedalloc.h"
42 #include "BLI_blenlib.h"
43 #include "BLI_utildefines.h"
47 #include "BKE_context.h"
48 #include "BKE_screen.h"
49 #include "BKE_movieclip.h"
50 #include "BKE_tracking.h"
52 #include "IMB_imbuf_types.h"
55 #include "ED_space_api.h"
56 #include "ED_screen.h"
58 #include "ED_transform.h"
60 #include "IMB_imbuf.h"
67 #include "UI_interface.h"
68 #include "UI_resources.h"
69 #include "UI_view2d.h"
71 #include "RNA_access.h"
74 #include "clip_intern.h" /* own include */
76 static void init_preview_region(const bContext *C, ARegion *ar)
78 Scene *scene = CTX_data_scene(C);
79 ScrArea *sa = CTX_wm_area(C);
80 SpaceClip *sc = CTX_wm_space_clip(C);
82 ar->regiontype = RGN_TYPE_PREVIEW;
83 ar->alignment = RGN_ALIGN_TOP;
84 ar->flag |= RGN_FLAG_HIDDEN;
86 if (sc->view == SC_VIEW_DOPESHEET) {
87 ar->v2d.tot.xmin = -10.0f;
88 ar->v2d.tot.ymin = (float)(-sa->winy) / 3.0f;
89 ar->v2d.tot.xmax = (float)(sa->winx);
90 ar->v2d.tot.ymax = 0.0f;
92 ar->v2d.cur = ar->v2d.tot;
94 ar->v2d.min[0] = 0.0f;
95 ar->v2d.min[1] = 0.0f;
97 ar->v2d.max[0] = MAXFRAMEF;
98 ar->v2d.max[1] = FLT_MAX;
100 ar->v2d.minzoom = 0.01f;
101 ar->v2d.maxzoom = 50;
102 ar->v2d.scroll = (V2D_SCROLL_BOTTOM | V2D_SCROLL_SCALE_HORIZONTAL);
103 ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
104 ar->v2d.keepzoom = V2D_LOCKZOOM_Y;
105 ar->v2d.keepofs = V2D_KEEPOFS_Y;
106 ar->v2d.align = V2D_ALIGN_NO_POS_Y;
107 ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
110 ar->v2d.tot.xmin = 0.0f;
111 ar->v2d.tot.ymin = -10.0f;
112 ar->v2d.tot.xmax = (float)scene->r.efra;
113 ar->v2d.tot.ymax = 10.0f;
115 ar->v2d.cur = ar->v2d.tot;
117 ar->v2d.min[0] = FLT_MIN;
118 ar->v2d.min[1] = FLT_MIN;
120 ar->v2d.max[0] = MAXFRAMEF;
121 ar->v2d.max[1] = FLT_MAX;
123 ar->v2d.scroll = (V2D_SCROLL_BOTTOM | V2D_SCROLL_SCALE_HORIZONTAL);
124 ar->v2d.scroll |= (V2D_SCROLL_LEFT | V2D_SCROLL_SCALE_VERTICAL);
126 ar->v2d.minzoom = 0.0f;
127 ar->v2d.maxzoom = 0.0f;
128 ar->v2d.keepzoom = 0;
137 static void reinit_preview_region(const bContext *C, ARegion *ar)
139 SpaceClip *sc = CTX_wm_space_clip(C);
141 if (sc->view == SC_VIEW_DOPESHEET) {
142 if ((ar->v2d.flag & V2D_VIEWSYNC_AREA_VERTICAL) == 0)
143 init_preview_region(C, ar);
146 if (ar->v2d.flag & V2D_VIEWSYNC_AREA_VERTICAL)
147 init_preview_region(C, ar);
151 static ARegion *ED_clip_has_preview_region(const bContext *C, ScrArea *sa)
155 ar = BKE_area_find_region_type(sa, RGN_TYPE_PREVIEW);
159 /* add subdiv level; after header */
160 ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
166 arnew = MEM_callocN(sizeof(ARegion), "clip preview region");
168 BLI_insertlinkbefore(&sa->regionbase, ar, arnew);
169 init_preview_region(C, arnew);
174 static ARegion *ED_clip_has_channels_region(ScrArea *sa)
178 ar = BKE_area_find_region_type(sa, RGN_TYPE_CHANNELS);
182 /* add subdiv level; after header */
183 ar = BKE_area_find_region_type(sa, RGN_TYPE_PREVIEW);
189 arnew = MEM_callocN(sizeof(ARegion), "clip channels region");
191 BLI_insertlinkbefore(&sa->regionbase, ar, arnew);
192 arnew->regiontype = RGN_TYPE_CHANNELS;
193 arnew->alignment = RGN_ALIGN_LEFT;
195 arnew->v2d.scroll = V2D_SCROLL_BOTTOM;
196 arnew->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
201 static void clip_scopes_tag_refresh(ScrArea *sa)
203 SpaceClip *sc = (SpaceClip *)sa->spacedata.first;
206 if (sc->mode != SC_MODE_TRACKING)
209 /* only while proeprties are visible */
210 for (ar = sa->regionbase.first; ar; ar = ar->next) {
211 if (ar->regiontype == RGN_TYPE_UI && ar->flag & RGN_FLAG_HIDDEN)
215 sc->scopes.ok = FALSE;
218 static void clip_scopes_check_gpencil_change(ScrArea *sa)
220 SpaceClip *sc = (SpaceClip *)sa->spacedata.first;
222 if (sc->gpencil_src == SC_GPENCIL_SRC_TRACK) {
223 clip_scopes_tag_refresh(sa);
227 static void clip_stabilization_tag_refresh(ScrArea *sa)
229 SpaceClip *sc = (SpaceClip *) sa->spacedata.first;
230 MovieClip *clip = ED_space_clip_get_clip(sc);
233 MovieTrackingStabilization *stab = &clip->tracking.stabilization;
239 /* ******************** default callbacks for clip space ***************** */
241 static SpaceLink *clip_new(const bContext *C)
246 sc = MEM_callocN(sizeof(SpaceClip), "initclip");
247 sc->spacetype = SPACE_CLIP;
248 sc->flag = SC_SHOW_MARKER_PATTERN | SC_SHOW_TRACK_PATH | SC_MANUAL_CALIBRATION |
249 SC_SHOW_GRAPH_TRACKS | SC_SHOW_GRAPH_FRAMES;
251 sc->path_length = 20;
252 sc->scopes.track_preview_height = 120;
253 sc->around = V3D_LOCAL;
256 ar = MEM_callocN(sizeof(ARegion), "header for clip");
258 BLI_addtail(&sc->regionbase, ar);
259 ar->regiontype = RGN_TYPE_HEADER;
260 ar->alignment = RGN_ALIGN_BOTTOM;
263 ar = MEM_callocN(sizeof(ARegion), "tools for clip");
265 BLI_addtail(&sc->regionbase, ar);
266 ar->regiontype = RGN_TYPE_TOOLS;
267 ar->alignment = RGN_ALIGN_LEFT;
269 /* tool properties */
270 ar = MEM_callocN(sizeof(ARegion), "tool properties for clip");
272 BLI_addtail(&sc->regionbase, ar);
273 ar->regiontype = RGN_TYPE_TOOL_PROPS;
274 ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
276 /* properties view */
277 ar = MEM_callocN(sizeof(ARegion), "properties for clip");
279 BLI_addtail(&sc->regionbase, ar);
280 ar->regiontype = RGN_TYPE_UI;
281 ar->alignment = RGN_ALIGN_RIGHT;
284 ar = MEM_callocN(sizeof(ARegion), "channels for clip");
286 BLI_addtail(&sc->regionbase, ar);
287 ar->regiontype = RGN_TYPE_CHANNELS;
288 ar->alignment = RGN_ALIGN_LEFT;
290 ar->v2d.scroll = V2D_SCROLL_BOTTOM;
291 ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
294 ar = MEM_callocN(sizeof(ARegion), "preview for clip");
296 BLI_addtail(&sc->regionbase, ar);
297 init_preview_region(C, ar);
300 ar = MEM_callocN(sizeof(ARegion), "main area for clip");
302 BLI_addtail(&sc->regionbase, ar);
303 ar->regiontype = RGN_TYPE_WINDOW;
305 return (SpaceLink *) sc;
308 /* not spacelink itself */
309 static void clip_free(SpaceLink *sl)
311 SpaceClip *sc = (SpaceClip *) sl;
315 if (sc->scopes.track_preview)
316 IMB_freeImBuf(sc->scopes.track_preview);
318 if (sc->scopes.track_search)
319 IMB_freeImBuf(sc->scopes.track_search);
321 ED_space_clip_free_texture_buffer(sc);
324 /* spacetype; init callback */
325 static void clip_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
327 ListBase *lb = WM_dropboxmap_find("Clip", SPACE_CLIP, 0);
330 WM_event_add_dropbox_handler(&sa->handlers, lb);
333 static SpaceLink *clip_duplicate(SpaceLink *sl)
335 SpaceClip *scn = MEM_dupallocN(sl);
337 /* clear or remove stuff from old */
338 scn->scopes.track_search = NULL;
339 scn->scopes.track_preview = NULL;
340 scn->scopes.ok = FALSE;
341 scn->draw_context = NULL;
343 return (SpaceLink *)scn;
346 static void clip_listener(ScrArea *sa, wmNotifier *wmn)
348 /* context changes */
349 switch (wmn->category) {
353 clip_scopes_tag_refresh(sa);
357 ED_area_tag_redraw(sa);
365 clip_scopes_tag_refresh(sa);
366 ED_area_tag_redraw(sa);
369 switch (wmn->action) {
373 clip_stabilization_tag_refresh(sa);
377 clip_scopes_tag_refresh(sa);
378 ED_area_tag_redraw(sa);
387 ED_area_tag_redraw(sa);
390 switch (wmn->action) {
392 ED_area_tag_redraw(sa);
395 ED_area_tag_redraw(sa);
402 clip_scopes_tag_refresh(sa);
403 ED_area_tag_redraw(sa);
411 clip_scopes_check_gpencil_change(sa);
412 ED_area_tag_redraw(sa);
417 if (wmn->data == ND_SPACE_CLIP) {
418 clip_scopes_tag_refresh(sa);
419 clip_stabilization_tag_refresh(sa);
420 ED_area_tag_redraw(sa);
426 static void clip_operatortypes(void)
428 /* ** clip_ops.c ** */
429 WM_operatortype_append(CLIP_OT_open);
430 WM_operatortype_append(CLIP_OT_reload);
431 WM_operatortype_append(CLIP_OT_view_pan);
432 WM_operatortype_append(CLIP_OT_view_zoom);
433 WM_operatortype_append(CLIP_OT_view_zoom_in);
434 WM_operatortype_append(CLIP_OT_view_zoom_out);
435 WM_operatortype_append(CLIP_OT_view_zoom_ratio);
436 WM_operatortype_append(CLIP_OT_view_all);
437 WM_operatortype_append(CLIP_OT_view_selected);
438 WM_operatortype_append(CLIP_OT_change_frame);
439 WM_operatortype_append(CLIP_OT_rebuild_proxy);
440 WM_operatortype_append(CLIP_OT_mode_set);
441 WM_operatortype_append(CLIP_OT_view_ndof);
443 /* ** clip_toolbar.c ** */
444 WM_operatortype_append(CLIP_OT_tools);
445 WM_operatortype_append(CLIP_OT_properties);
447 /* ** tracking_ops.c ** */
450 WM_operatortype_append(CLIP_OT_frame_jump);
453 WM_operatortype_append(CLIP_OT_set_center_principal);
456 WM_operatortype_append(CLIP_OT_select);
457 WM_operatortype_append(CLIP_OT_select_all);
458 WM_operatortype_append(CLIP_OT_select_border);
459 WM_operatortype_append(CLIP_OT_select_lasso);
460 WM_operatortype_append(CLIP_OT_select_circle);
461 WM_operatortype_append(CLIP_OT_select_grouped);
464 WM_operatortype_append(CLIP_OT_add_marker);
465 WM_operatortype_append(CLIP_OT_slide_marker);
466 WM_operatortype_append(CLIP_OT_delete_track);
467 WM_operatortype_append(CLIP_OT_delete_marker);
470 WM_operatortype_append(CLIP_OT_track_markers);
473 WM_operatortype_append(CLIP_OT_solve_camera);
474 WM_operatortype_append(CLIP_OT_clear_solution);
476 WM_operatortype_append(CLIP_OT_disable_markers);
477 WM_operatortype_append(CLIP_OT_hide_tracks);
478 WM_operatortype_append(CLIP_OT_hide_tracks_clear);
479 WM_operatortype_append(CLIP_OT_lock_tracks);
481 WM_operatortype_append(CLIP_OT_set_solver_keyframe);
484 WM_operatortype_append(CLIP_OT_set_origin);
485 WM_operatortype_append(CLIP_OT_set_plane);
486 WM_operatortype_append(CLIP_OT_set_axis);
487 WM_operatortype_append(CLIP_OT_set_scale);
488 WM_operatortype_append(CLIP_OT_set_solution_scale);
491 WM_operatortype_append(CLIP_OT_detect_features);
494 WM_operatortype_append(CLIP_OT_stabilize_2d_add);
495 WM_operatortype_append(CLIP_OT_stabilize_2d_remove);
496 WM_operatortype_append(CLIP_OT_stabilize_2d_select);
497 WM_operatortype_append(CLIP_OT_stabilize_2d_set_rotation);
500 WM_operatortype_append(CLIP_OT_clear_track_path);
501 WM_operatortype_append(CLIP_OT_join_tracks);
502 WM_operatortype_append(CLIP_OT_track_copy_color);
504 WM_operatortype_append(CLIP_OT_clean_tracks);
506 /* object tracking */
507 WM_operatortype_append(CLIP_OT_tracking_object_new);
508 WM_operatortype_append(CLIP_OT_tracking_object_remove);
511 WM_operatortype_append(CLIP_OT_copy_tracks);
512 WM_operatortype_append(CLIP_OT_paste_tracks);
514 /* ** clip_graph_ops.c ** */
519 WM_operatortype_append(CLIP_OT_graph_select);
520 WM_operatortype_append(CLIP_OT_graph_select_border);
521 WM_operatortype_append(CLIP_OT_graph_select_all_markers);
523 WM_operatortype_append(CLIP_OT_graph_delete_curve);
524 WM_operatortype_append(CLIP_OT_graph_delete_knot);
525 WM_operatortype_append(CLIP_OT_graph_view_all);
526 WM_operatortype_append(CLIP_OT_graph_center_current_frame);
528 WM_operatortype_append(CLIP_OT_graph_disable_markers);
530 /* ** clip_dopesheet_ops.c ** */
532 WM_operatortype_append(CLIP_OT_dopesheet_select_channel);
535 static void clip_keymap(struct wmKeyConfig *keyconf)
540 /* ******** Global hotkeys avalaible for all regions ******** */
542 keymap = WM_keymap_find(keyconf, "Clip", SPACE_CLIP, 0);
544 WM_keymap_add_item(keymap, "CLIP_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
546 WM_keymap_add_item(keymap, "CLIP_OT_tools", TKEY, KM_PRESS, 0, 0);
547 WM_keymap_add_item(keymap, "CLIP_OT_properties", NKEY, KM_PRESS, 0, 0);
550 kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", LEFTARROWKEY, KM_PRESS, KM_ALT, 0);
551 RNA_boolean_set(kmi->ptr, "backwards", TRUE);
552 RNA_boolean_set(kmi->ptr, "sequence", FALSE);
553 kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0);
554 RNA_boolean_set(kmi->ptr, "backwards", FALSE);
555 RNA_boolean_set(kmi->ptr, "sequence", FALSE);
556 kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_CTRL, 0);
557 RNA_boolean_set(kmi->ptr, "backwards", FALSE);
558 RNA_boolean_set(kmi->ptr, "sequence", TRUE);
559 kmi = WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0);
560 RNA_boolean_set(kmi->ptr, "backwards", TRUE);
561 RNA_boolean_set(kmi->ptr, "sequence", TRUE);
564 WM_keymap_add_menu(keymap, "CLIP_MT_select_mode", TABKEY, KM_PRESS, 0, 0);
566 WM_keymap_add_item(keymap, "CLIP_OT_solve_camera", SKEY, KM_PRESS, KM_SHIFT, 0);
568 kmi = WM_keymap_add_item(keymap, "CLIP_OT_set_solver_keyframe", QKEY, KM_PRESS, 0, 0);
569 RNA_enum_set(kmi->ptr, "keyframe", 0);
571 kmi = WM_keymap_add_item(keymap, "CLIP_OT_set_solver_keyframe", EKEY, KM_PRESS, 0, 0);
572 RNA_enum_set(kmi->ptr, "keyframe", 1);
574 /* ******** Hotkeys avalaible for main region only ******** */
576 keymap = WM_keymap_find(keyconf, "Clip Editor", SPACE_CLIP, 0);
577 // keymap->poll = ED_space_clip_tracking_poll;
578 /* ** View/navigation ** */
580 WM_keymap_add_item(keymap, "CLIP_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
581 WM_keymap_add_item(keymap, "CLIP_OT_view_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
582 WM_keymap_add_item(keymap, "CLIP_OT_view_pan", MOUSEPAN, 0, 0, 0);
584 WM_keymap_add_item(keymap, "CLIP_OT_view_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
585 WM_keymap_add_item(keymap, "CLIP_OT_view_zoom", MOUSEZOOM, 0, 0, 0);
586 WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
587 WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_out", WHEELOUTMOUSE, KM_PRESS, 0, 0);
588 WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_in", PADPLUSKEY, KM_PRESS, 0, 0);
589 WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_out", PADMINUS, KM_PRESS, 0, 0);
591 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD8, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 8.0f);
592 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD4, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 4.0f);
593 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD2, KM_PRESS, KM_SHIFT, 0)->ptr, "ratio", 2.0f);
594 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD1, KM_PRESS, 0, 0)->ptr, "ratio", 1.0f);
595 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD2, KM_PRESS, 0, 0)->ptr, "ratio", 0.5f);
596 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f);
597 RNA_float_set(WM_keymap_add_item(keymap, "CLIP_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f);
599 WM_keymap_add_item(keymap, "CLIP_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
601 kmi = WM_keymap_add_item(keymap, "CLIP_OT_view_all", FKEY, KM_PRESS, 0, 0);
602 RNA_boolean_set(kmi->ptr, "fit_view", TRUE);
604 WM_keymap_add_item(keymap, "CLIP_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
606 WM_keymap_add_item(keymap, "CLIP_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0);
607 WM_keymap_add_item(keymap, "CLIP_OT_view_ndof", NDOF_MOTION, 0, 0, 0);
609 /* jump to special frame */
610 kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
611 RNA_enum_set(kmi->ptr, "position", 0);
613 kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
614 RNA_enum_set(kmi->ptr, "position", 1);
616 kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
617 RNA_enum_set(kmi->ptr, "position", 2);
619 kmi = WM_keymap_add_item(keymap, "CLIP_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
620 RNA_enum_set(kmi->ptr, "position", 3);
623 WM_keymap_add_item(keymap, "CLIP_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0);
626 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
627 RNA_boolean_set(kmi->ptr, "extend", FALSE);
628 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
629 RNA_boolean_set(kmi->ptr, "extend", TRUE);
630 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", AKEY, KM_PRESS, 0, 0);
631 RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE);
632 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
633 RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
634 WM_keymap_add_item(keymap, "CLIP_OT_select_border", BKEY, KM_PRESS, 0, 0);
635 WM_keymap_add_item(keymap, "CLIP_OT_select_circle", CKEY, KM_PRESS, 0, 0);
636 WM_keymap_add_menu(keymap, "CLIP_MT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
638 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
639 RNA_boolean_set(kmi->ptr, "deselect", FALSE);
640 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT | KM_ALT, 0);
641 RNA_boolean_set(kmi->ptr, "deselect", TRUE);
644 WM_keymap_add_item(keymap, "CLIP_OT_add_marker_slide", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
646 WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", DELKEY, KM_PRESS, KM_SHIFT, 0);
647 WM_keymap_add_item(keymap, "CLIP_OT_delete_marker", XKEY, KM_PRESS, KM_SHIFT, 0);
649 WM_keymap_add_item(keymap, "CLIP_OT_slide_marker", LEFTMOUSE, KM_PRESS, 0, 0);
651 kmi = WM_keymap_add_item(keymap, "CLIP_OT_disable_markers", DKEY, KM_PRESS, KM_SHIFT, 0);
652 RNA_enum_set(kmi->ptr, "action", 2); /* toggle */
655 WM_keymap_add_item(keymap, "CLIP_OT_delete_track", DELKEY, KM_PRESS, 0, 0);
656 WM_keymap_add_item(keymap, "CLIP_OT_delete_track", XKEY, KM_PRESS, 0, 0);
658 kmi = WM_keymap_add_item(keymap, "CLIP_OT_lock_tracks", LKEY, KM_PRESS, KM_CTRL, 0);
659 RNA_enum_set(kmi->ptr, "action", 0); /* lock */
661 kmi = WM_keymap_add_item(keymap, "CLIP_OT_lock_tracks", LKEY, KM_PRESS, KM_ALT, 0);
662 RNA_enum_set(kmi->ptr, "action", 1); /* unlock */
664 kmi = WM_keymap_add_item(keymap, "CLIP_OT_hide_tracks", HKEY, KM_PRESS, 0, 0);
665 RNA_boolean_set(kmi->ptr, "unselected", FALSE);
667 kmi = WM_keymap_add_item(keymap, "CLIP_OT_hide_tracks", HKEY, KM_PRESS, KM_SHIFT, 0);
668 RNA_boolean_set(kmi->ptr, "unselected", TRUE);
670 WM_keymap_add_item(keymap, "CLIP_OT_hide_tracks_clear", HKEY, KM_PRESS, KM_ALT, 0);
673 WM_keymap_add_item(keymap, "CLIP_OT_join_tracks", JKEY, KM_PRESS, KM_CTRL, 0);
676 WM_keymap_add_menu(keymap, "CLIP_MT_tracking_specials", WKEY, KM_PRESS, 0, 0);
679 kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", LKEY, KM_PRESS, 0, 0);
680 RNA_string_set(kmi->ptr, "data_path", "space_data.lock_selection");
682 kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", DKEY, KM_PRESS, KM_ALT, 0);
683 RNA_string_set(kmi->ptr, "data_path", "space_data.show_disabled");
685 kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_ALT, 0);
686 RNA_string_set(kmi->ptr, "data_path", "space_data.show_marker_search");
688 kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0);
689 RNA_string_set(kmi->ptr, "data_path", "space_data.use_mute_footage");
691 transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
694 kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT, 0);
695 RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_REMAINED);
696 RNA_boolean_set(kmi->ptr, "clear_active", FALSE);
697 kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_SHIFT, 0);
698 RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_UPTO);
699 RNA_boolean_set(kmi->ptr, "clear_active", FALSE);
700 kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
701 RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_ALL);
702 RNA_boolean_set(kmi->ptr, "clear_active", FALSE);
704 /* ******** Hotkeys avalaible for preview region only ******** */
706 keymap = WM_keymap_find(keyconf, "Clip Graph Editor", SPACE_CLIP, 0);
709 WM_keymap_add_item(keymap, "CLIP_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0);
712 kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, 0, 0);
713 RNA_boolean_set(kmi->ptr, "extend", FALSE);
714 kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
715 RNA_boolean_set(kmi->ptr, "extend", TRUE);
717 kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select_all_markers", AKEY, KM_PRESS, 0, 0);
718 RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE);
719 kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select_all_markers", IKEY, KM_PRESS, KM_CTRL, 0);
720 RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
722 WM_keymap_add_item(keymap, "CLIP_OT_graph_select_border", BKEY, KM_PRESS, 0, 0);
725 WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", DELKEY, KM_PRESS, 0, 0);
726 WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", XKEY, KM_PRESS, 0, 0);
728 WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", DELKEY, KM_PRESS, KM_SHIFT, 0);
729 WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", XKEY, KM_PRESS, KM_SHIFT, 0);
732 WM_keymap_add_item(keymap, "CLIP_OT_graph_view_all", HOMEKEY, KM_PRESS, 0, 0);
733 WM_keymap_add_item(keymap, "CLIP_OT_graph_center_current_frame", PADPERIOD, KM_PRESS, 0, 0);
735 kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", LKEY, KM_PRESS, 0, 0);
736 RNA_string_set(kmi->ptr, "data_path", "space_data.lock_time_cursor");
739 kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT, 0);
740 RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_REMAINED);
741 RNA_boolean_set(kmi->ptr, "clear_active", TRUE);
742 kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_SHIFT, 0);
743 RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_UPTO);
744 RNA_boolean_set(kmi->ptr, "clear_active", TRUE);
745 kmi = WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT | KM_SHIFT, 0);
746 RNA_enum_set(kmi->ptr, "action", TRACK_CLEAR_ALL);
747 RNA_boolean_set(kmi->ptr, "clear_active", TRUE);
750 kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_disable_markers", DKEY, KM_PRESS, KM_SHIFT, 0);
751 RNA_enum_set(kmi->ptr, "action", 2); /* toggle */
753 transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
755 /* ******** Hotkeys avalaible for channels region only ******** */
757 keymap = WM_keymap_find(keyconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
759 kmi = WM_keymap_add_item(keymap, "CLIP_OT_dopesheet_select_channel", ACTIONMOUSE, KM_PRESS, 0, 0);
760 RNA_boolean_set(kmi->ptr, "extend", TRUE); /* toggle */
763 const char *clip_context_dir[] = {"edit_movieclip", "edit_mask", NULL};
765 static int clip_context(const bContext *C, const char *member, bContextDataResult *result)
767 SpaceClip *sc = CTX_wm_space_clip(C);
769 if (CTX_data_dir(member)) {
770 CTX_data_dir_set(result, clip_context_dir);
774 else if (CTX_data_equals(member, "edit_movieclip")) {
776 CTX_data_id_pointer_set(result, &sc->clip->id);
779 else if (CTX_data_equals(member, "edit_mask")) {
780 if (sc->mask_info.mask)
781 CTX_data_id_pointer_set(result, &sc->mask_info.mask->id);
789 static int clip_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
791 if (drag->type == WM_DRAG_PATH)
792 if (ELEM3(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */
798 static void clip_drop_copy(wmDrag *drag, wmDropBox *drop)
801 char dir[FILE_MAX], file[FILE_MAX];
803 BLI_split_dirfile(drag->path, dir, file, sizeof(dir), sizeof(file));
805 RNA_string_set(drop->ptr, "directory", dir);
807 RNA_collection_clear(drop->ptr, "files");
808 RNA_collection_add(drop->ptr, "files", &itemptr);
809 RNA_string_set(&itemptr, "name", file);
812 /* area+region dropbox definition */
813 static void clip_dropboxes(void)
815 ListBase *lb = WM_dropboxmap_find("Clip", SPACE_CLIP, 0);
817 WM_dropbox_add(lb, "CLIP_OT_open", clip_drop_poll, clip_drop_copy);
820 static void clip_refresh(const bContext *C, ScrArea *sa)
822 wmWindowManager *wm = CTX_wm_manager(C);
823 wmWindow *window = CTX_wm_window(C);
824 Scene *scene = CTX_data_scene(C);
825 SpaceClip *sc = (SpaceClip *)sa->spacedata.first;
826 ARegion *ar_main = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
827 ARegion *ar_tools = BKE_area_find_region_type(sa, RGN_TYPE_TOOLS);
828 ARegion *ar_tool_props = BKE_area_find_region_type(sa, RGN_TYPE_TOOL_PROPS);
829 ARegion *ar_preview = ED_clip_has_preview_region(C, sa);
830 ARegion *ar_properties = ED_clip_has_properties_region(sa);
831 ARegion *ar_channels = ED_clip_has_channels_region(sa);
832 int main_visible = FALSE, preview_visible = FALSE, tools_visible = FALSE;
833 int tool_props_visible = FALSE, properties_visible = FALSE, channels_visible = FALSE;
834 int view_changed = FALSE;
839 preview_visible = FALSE;
840 tools_visible = TRUE;
841 tool_props_visible = TRUE;
842 properties_visible = TRUE;
843 channels_visible = FALSE;
846 main_visible = FALSE;
847 preview_visible = TRUE;
848 tools_visible = FALSE;
849 tool_props_visible = FALSE;
850 properties_visible = FALSE;
851 channels_visible = FALSE;
853 reinit_preview_region(C, ar_preview);
855 case SC_VIEW_DOPESHEET:
856 main_visible = FALSE;
857 preview_visible = TRUE;
858 tools_visible = FALSE;
859 tool_props_visible = FALSE;
860 properties_visible = FALSE;
861 channels_visible = TRUE;
863 reinit_preview_region(C, ar_preview);
868 if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
869 ar_main->flag &= ~RGN_FLAG_HIDDEN;
870 ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
874 if (ar_main && ar_main->alignment != RGN_ALIGN_NONE) {
875 ar_main->alignment = RGN_ALIGN_NONE;
880 if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
881 ar_main->flag |= RGN_FLAG_HIDDEN;
882 ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
883 WM_event_remove_handlers((bContext *)C, &ar_main->handlers);
886 if (ar_main && ar_main->alignment != RGN_ALIGN_NONE) {
887 ar_main->alignment = RGN_ALIGN_NONE;
892 if (properties_visible) {
893 if (ar_properties && (ar_properties->flag & RGN_FLAG_HIDDEN)) {
894 ar_properties->flag &= ~RGN_FLAG_HIDDEN;
895 ar_properties->v2d.flag &= ~V2D_IS_INITIALISED;
898 if (ar_properties && ar_properties->alignment != RGN_ALIGN_RIGHT) {
899 ar_properties->alignment = RGN_ALIGN_RIGHT;
904 if (ar_properties && !(ar_properties->flag & RGN_FLAG_HIDDEN)) {
905 ar_properties->flag |= RGN_FLAG_HIDDEN;
906 ar_properties->v2d.flag &= ~V2D_IS_INITIALISED;
907 WM_event_remove_handlers((bContext *)C, &ar_properties->handlers);
910 if (ar_properties && ar_properties->alignment != RGN_ALIGN_NONE) {
911 ar_properties->alignment = RGN_ALIGN_NONE;
917 if (ar_tools && (ar_tools->flag & RGN_FLAG_HIDDEN)) {
918 ar_tools->flag &= ~RGN_FLAG_HIDDEN;
919 ar_tools->v2d.flag &= ~V2D_IS_INITIALISED;
922 if (ar_tools && ar_tools->alignment != RGN_ALIGN_LEFT) {
923 ar_tools->alignment = RGN_ALIGN_LEFT;
928 if (ar_tools && !(ar_tools->flag & RGN_FLAG_HIDDEN)) {
929 ar_tools->flag |= RGN_FLAG_HIDDEN;
930 ar_tools->v2d.flag &= ~V2D_IS_INITIALISED;
931 WM_event_remove_handlers((bContext *)C, &ar_tools->handlers);
934 if (ar_tools && ar_tools->alignment != RGN_ALIGN_NONE) {
935 ar_tools->alignment = RGN_ALIGN_NONE;
940 if (tool_props_visible) {
941 if (ar_tool_props && (ar_tool_props->flag & RGN_FLAG_HIDDEN)) {
942 ar_tool_props->flag &= ~RGN_FLAG_HIDDEN;
943 ar_tool_props->v2d.flag &= ~V2D_IS_INITIALISED;
946 if (ar_tool_props && (ar_tool_props->alignment != (RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV))) {
947 ar_tool_props->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
952 if (ar_tool_props && !(ar_tool_props->flag & RGN_FLAG_HIDDEN)) {
953 ar_tool_props->flag |= RGN_FLAG_HIDDEN;
954 ar_tool_props->v2d.flag &= ~V2D_IS_INITIALISED;
955 WM_event_remove_handlers((bContext *)C, &ar_tool_props->handlers);
958 if (ar_tool_props && ar_tool_props->alignment != RGN_ALIGN_NONE) {
959 ar_tool_props->alignment = RGN_ALIGN_NONE;
964 if (preview_visible) {
965 if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
966 ar_preview->flag &= ~RGN_FLAG_HIDDEN;
967 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
968 ar_preview->v2d.cur = ar_preview->v2d.tot;
971 if (ar_preview && ar_preview->alignment != RGN_ALIGN_NONE) {
972 ar_preview->alignment = RGN_ALIGN_NONE;
977 if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
978 ar_preview->flag |= RGN_FLAG_HIDDEN;
979 ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
980 WM_event_remove_handlers((bContext *)C, &ar_preview->handlers);
983 if (ar_preview && ar_preview->alignment != RGN_ALIGN_NONE) {
984 ar_preview->alignment = RGN_ALIGN_NONE;
989 if (channels_visible) {
990 if (ar_channels && (ar_channels->flag & RGN_FLAG_HIDDEN)) {
991 ar_channels->flag &= ~RGN_FLAG_HIDDEN;
992 ar_channels->v2d.flag &= ~V2D_IS_INITIALISED;
995 if (ar_channels && ar_channels->alignment != RGN_ALIGN_LEFT) {
996 ar_channels->alignment = RGN_ALIGN_LEFT;
1001 if (ar_channels && !(ar_channels->flag & RGN_FLAG_HIDDEN)) {
1002 ar_channels->flag |= RGN_FLAG_HIDDEN;
1003 ar_channels->v2d.flag &= ~V2D_IS_INITIALISED;
1004 WM_event_remove_handlers((bContext *)C, &ar_tools->handlers);
1005 view_changed = TRUE;
1007 if (ar_channels && ar_channels->alignment != RGN_ALIGN_NONE) {
1008 ar_channels->alignment = RGN_ALIGN_NONE;
1009 view_changed = TRUE;
1014 ED_area_initialize(wm, window, sa);
1015 ED_area_tag_redraw(sa);
1018 BKE_movieclip_user_set_frame(&sc->user, scene->r.cfra);
1021 /********************* main region ********************/
1023 /* sets up the fields of the View2D from zoom and offset */
1024 static void movieclip_main_area_set_view2d(const bContext *C, ARegion *ar)
1026 SpaceClip *sc = CTX_wm_space_clip(C);
1027 MovieClip *clip = ED_space_clip_get_clip(sc);
1029 int width, height, winx, winy;
1031 ED_space_clip_get_size(sc, &width, &height);
1037 h *= clip->aspy / clip->aspx / clip->tracking.camera.pixel_aspect;
1039 winx = BLI_RCT_SIZE_X(&ar->winrct) + 1;
1040 winy = BLI_RCT_SIZE_Y(&ar->winrct) + 1;
1042 ar->v2d.tot.xmin = 0;
1043 ar->v2d.tot.ymin = 0;
1044 ar->v2d.tot.xmax = w;
1045 ar->v2d.tot.ymax = h;
1047 ar->v2d.mask.xmin = ar->v2d.mask.ymin = 0;
1048 ar->v2d.mask.xmax = winx;
1049 ar->v2d.mask.ymax = winy;
1051 /* which part of the image space do we see? */
1052 x1 = ar->winrct.xmin + (winx - sc->zoom * w) / 2.0f;
1053 y1 = ar->winrct.ymin + (winy - sc->zoom * h) / 2.0f;
1055 x1 -= sc->zoom * sc->xof;
1056 y1 -= sc->zoom * sc->yof;
1058 /* relative display right */
1059 ar->v2d.cur.xmin = (ar->winrct.xmin - (float)x1) / sc->zoom;
1060 ar->v2d.cur.xmax = ar->v2d.cur.xmin + ((float)winx / sc->zoom);
1062 /* relative display left */
1063 ar->v2d.cur.ymin = (ar->winrct.ymin - (float)y1) / sc->zoom;
1064 ar->v2d.cur.ymax = ar->v2d.cur.ymin + ((float)winy / sc->zoom);
1066 /* normalize 0.0..1.0 */
1067 ar->v2d.cur.xmin /= w;
1068 ar->v2d.cur.xmax /= w;
1069 ar->v2d.cur.ymin /= h;
1070 ar->v2d.cur.ymax /= h;
1073 /* add handlers, stuff you only do once or on area/region changes */
1074 static void clip_main_area_init(wmWindowManager *wm, ARegion *ar)
1078 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_STANDARD, ar->winx, ar->winy);
1080 /* mask polls mode */
1081 keymap = WM_keymap_find(wm->defaultconf, "Mask Editing", 0, 0);
1082 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1085 keymap = WM_keymap_find(wm->defaultconf, "Clip", SPACE_CLIP, 0);
1086 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1088 keymap = WM_keymap_find(wm->defaultconf, "Clip Editor", SPACE_CLIP, 0);
1089 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1092 static void clip_main_area_draw(const bContext *C, ARegion *ar)
1094 /* draw entirely, view changes should be handled here */
1095 SpaceClip *sc = CTX_wm_space_clip(C);
1096 MovieClip *clip = ED_space_clip_get_clip(sc);
1098 /* if tracking is in progress, we should synchronize framenr from clipuser
1099 * so latest tracked frame would be shown */
1100 if (clip && clip->tracking_context)
1101 BKE_tracking_context_sync_user(clip->tracking_context, &sc->user);
1103 if (sc->flag & SC_LOCK_SELECTION) {
1104 ImBuf *tmpibuf = NULL;
1106 if (clip && clip->tracking.stabilization.flag & TRACKING_2D_STABILIZATION) {
1107 tmpibuf = ED_space_clip_get_stable_buffer(sc, NULL, NULL, NULL);
1110 if (ED_clip_view_selection(C, ar, 0)) {
1111 sc->xof += sc->xlockof;
1112 sc->yof += sc->ylockof;
1116 IMB_freeImBuf(tmpibuf);
1119 /* clear and setup matrix */
1120 UI_ThemeClearColor(TH_BACK);
1121 glClear(GL_COLOR_BUFFER_BIT);
1124 movieclip_main_area_set_view2d(C, ar);
1126 clip_draw_main(C, sc, ar);
1128 if (sc->mode == SC_MODE_MASKEDIT) {
1130 Mask *mask = CTX_data_edit_mask(C);
1132 ScrArea *sa = CTX_wm_area(C);
1134 ED_mask_get_size(sa, &width, &height);
1135 ED_mask_draw_region(mask, ar,
1136 sc->mask_info.draw_flag, sc->mask_info.draw_type,
1146 clip_draw_grease_pencil((bContext *)C, 1);
1148 /* reset view matrix */
1149 UI_view2d_view_restore(C);
1151 /* draw Grease Pencil - screen space only */
1152 clip_draw_grease_pencil((bContext *)C, 0);
1155 static void clip_main_area_listener(ARegion *ar, wmNotifier *wmn)
1157 /* context changes */
1158 switch (wmn->category) {
1160 if (wmn->data == ND_GPENCIL)
1161 ED_region_tag_redraw(ar);
1166 /****************** preview region ******************/
1168 static void clip_preview_area_init(wmWindowManager *wm, ARegion *ar)
1172 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
1175 keymap = WM_keymap_find(wm->defaultconf, "Clip", SPACE_CLIP, 0);
1176 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1178 keymap = WM_keymap_find(wm->defaultconf, "Clip Graph Editor", SPACE_CLIP, 0);
1179 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1182 static void graph_area_draw(const bContext *C, ARegion *ar)
1184 View2D *v2d = &ar->v2d;
1185 View2DScrollers *scrollers;
1186 SpaceClip *sc = CTX_wm_space_clip(C);
1187 Scene *scene = CTX_data_scene(C);
1190 if (sc->flag & SC_LOCK_TIMECURSOR)
1191 ED_clip_graph_center_current_frame(scene, ar);
1193 /* clear and setup matrix */
1194 UI_ThemeClearColor(TH_BACK);
1195 glClear(GL_COLOR_BUFFER_BIT);
1197 UI_view2d_view_ortho(v2d);
1200 clip_draw_graph(sc, ar, scene);
1202 /* reset view matrix */
1203 UI_view2d_view_restore(C);
1206 unitx = (sc->flag & SC_SHOW_SECONDS) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
1207 unity = V2D_UNIT_VALUES;
1208 scrollers = UI_view2d_scrollers_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP);
1209 UI_view2d_scrollers_draw(C, v2d, scrollers);
1210 UI_view2d_scrollers_free(scrollers);
1213 static void dopesheet_area_draw(const bContext *C, ARegion *ar)
1215 Scene *scene = CTX_data_scene(C);
1216 SpaceClip *sc = CTX_wm_space_clip(C);
1217 MovieClip *clip = ED_space_clip_get_clip(sc);
1218 View2D *v2d = &ar->v2d;
1220 View2DScrollers *scrollers;
1224 BKE_tracking_dopesheet_update(&clip->tracking);
1226 /* clear and setup matrix */
1227 UI_ThemeClearColor(TH_BACK);
1228 glClear(GL_COLOR_BUFFER_BIT);
1230 UI_view2d_view_ortho(v2d);
1233 unit = (sc->flag & SC_SHOW_SECONDS) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
1234 grid = UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP,
1235 V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
1236 UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
1237 UI_view2d_grid_free(grid);
1240 clip_draw_dopesheet_main(sc, ar, scene);
1242 /* reset view matrix */
1243 UI_view2d_view_restore(C);
1246 scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
1247 UI_view2d_scrollers_draw(C, v2d, scrollers);
1248 UI_view2d_scrollers_free(scrollers);
1251 static void clip_preview_area_draw(const bContext *C, ARegion *ar)
1253 SpaceClip *sc = CTX_wm_space_clip(C);
1255 if (sc->view == SC_VIEW_GRAPH)
1256 graph_area_draw(C, ar);
1257 else if (sc->view == SC_VIEW_DOPESHEET)
1258 dopesheet_area_draw(C, ar);
1261 static void clip_preview_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
1265 /****************** channels region ******************/
1267 static void clip_channels_area_init(wmWindowManager *wm, ARegion *ar)
1271 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
1273 keymap = WM_keymap_find(wm->defaultconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
1274 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1277 static void clip_channels_area_draw(const bContext *C, ARegion *ar)
1279 SpaceClip *sc = CTX_wm_space_clip(C);
1280 MovieClip *clip = ED_space_clip_get_clip(sc);
1281 View2D *v2d = &ar->v2d;
1282 View2DScrollers *scrollers;
1285 BKE_tracking_dopesheet_update(&clip->tracking);
1287 /* clear and setup matrix */
1288 UI_ThemeClearColor(TH_BACK);
1289 glClear(GL_COLOR_BUFFER_BIT);
1291 UI_view2d_view_ortho(v2d);
1294 clip_draw_dopesheet_channels(C, ar);
1296 /* reset view matrix */
1297 UI_view2d_view_restore(C);
1300 scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
1301 UI_view2d_scrollers_draw(C, v2d, scrollers);
1302 UI_view2d_scrollers_free(scrollers);
1305 static void clip_channels_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
1309 /****************** header region ******************/
1311 /* add handlers, stuff you only do once or on area/region changes */
1312 static void clip_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
1314 ED_region_header_init(ar);
1317 static void clip_header_area_draw(const bContext *C, ARegion *ar)
1319 ED_region_header(C, ar);
1322 static void clip_header_area_listener(ARegion *ar, wmNotifier *wmn)
1324 /* context changes */
1325 switch (wmn->category) {
1327 switch (wmn->data) {
1328 /* for proportional editmode only */
1329 case ND_TOOLSETTINGS:
1330 /* TODO - should do this when in mask mode only but no datas available */
1331 // if (sc->mode == SC_MODE_MASKEDIT)
1333 ED_region_tag_redraw(ar);
1342 /****************** tools region ******************/
1344 /* add handlers, stuff you only do once or on area/region changes */
1345 static void clip_tools_area_init(wmWindowManager *wm, ARegion *ar)
1347 ED_region_panels_init(wm, ar);
1350 static void clip_tools_area_draw(const bContext *C, ARegion *ar)
1352 ED_region_panels(C, ar, 1, NULL, -1);
1355 /****************** tool properties region ******************/
1357 static void clip_props_area_listener(ARegion *ar, wmNotifier *wmn)
1359 /* context changes */
1360 switch (wmn->category) {
1362 if (wmn->data == ND_HISTORY)
1363 ED_region_tag_redraw(ar);
1366 if (wmn->data == ND_MODE)
1367 ED_region_tag_redraw(ar);
1370 if (wmn->data == ND_SPACE_CLIP)
1371 ED_region_tag_redraw(ar);
1374 if (wmn->data == ND_GPENCIL)
1375 ED_region_tag_redraw(ar);
1380 /****************** properties region ******************/
1382 /* add handlers, stuff you only do once or on area/region changes */
1383 static void clip_properties_area_init(wmWindowManager *wm, ARegion *ar)
1387 ED_region_panels_init(wm, ar);
1389 keymap = WM_keymap_find(wm->defaultconf, "Clip", SPACE_CLIP, 0);
1390 WM_event_add_keymap_handler(&ar->handlers, keymap);
1393 static void clip_properties_area_draw(const bContext *C, ARegion *ar)
1395 SpaceClip *sc = CTX_wm_space_clip(C);
1397 BKE_movieclip_update_scopes(sc->clip, &sc->user, &sc->scopes);
1399 ED_region_panels(C, ar, 1, NULL, -1);
1402 static void clip_properties_area_listener(ARegion *ar, wmNotifier *wmn)
1404 /* context changes */
1405 switch (wmn->category) {
1407 if (wmn->data == ND_GPENCIL)
1408 ED_region_tag_redraw(ar);
1411 if (wmn->action == NA_EDITED)
1412 ED_region_tag_redraw(ar);
1417 /********************* registration ********************/
1419 /* only called once, from space/spacetypes.c */
1420 void ED_spacetype_clip(void)
1422 SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype clip");
1425 st->spaceid = SPACE_CLIP;
1426 strncpy(st->name, "Clip", BKE_ST_MAXNAME);
1429 st->free = clip_free;
1430 st->init = clip_init;
1431 st->duplicate = clip_duplicate;
1432 st->operatortypes = clip_operatortypes;
1433 st->keymap = clip_keymap;
1434 st->listener = clip_listener;
1435 st->context = clip_context;
1436 st->dropboxes = clip_dropboxes;
1437 st->refresh = clip_refresh;
1439 /* regions: main window */
1440 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region");
1441 art->regionid = RGN_TYPE_WINDOW;
1442 art->init = clip_main_area_init;
1443 art->draw = clip_main_area_draw;
1444 art->listener = clip_main_area_listener;
1445 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI | ED_KEYMAP_GPENCIL;
1447 BLI_addhead(&st->regiontypes, art);
1450 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region preview");
1451 art->regionid = RGN_TYPE_PREVIEW;
1452 art->prefsizey = 240;
1453 art->init = clip_preview_area_init;
1454 art->draw = clip_preview_area_draw;
1455 art->listener = clip_preview_area_listener;
1456 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI | ED_KEYMAP_VIEW2D;
1458 BLI_addhead(&st->regiontypes, art);
1460 /* regions: properties */
1461 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region properties");
1462 art->regionid = RGN_TYPE_UI;
1463 art->prefsizex = UI_COMPACT_PANEL_WIDTH;
1464 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1465 art->init = clip_properties_area_init;
1466 art->draw = clip_properties_area_draw;
1467 art->listener = clip_properties_area_listener;
1468 BLI_addhead(&st->regiontypes, art);
1469 ED_clip_buttons_register(art);
1471 /* regions: tools */
1472 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region tools");
1473 art->regionid = RGN_TYPE_TOOLS;
1474 art->prefsizex = UI_COMPACT_PANEL_WIDTH;
1475 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1476 art->listener = clip_props_area_listener;
1477 art->init = clip_tools_area_init;
1478 art->draw = clip_tools_area_draw;
1480 BLI_addhead(&st->regiontypes, art);
1482 /* tool properties */
1483 art = MEM_callocN(sizeof(ARegionType), "spacetype clip tool properties region");
1484 art->regionid = RGN_TYPE_TOOL_PROPS;
1486 art->prefsizey = 120;
1487 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1488 art->listener = clip_props_area_listener;
1489 art->init = clip_tools_area_init;
1490 art->draw = clip_tools_area_draw;
1491 ED_clip_tool_props_register(art);
1493 BLI_addhead(&st->regiontypes, art);
1495 /* regions: header */
1496 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region");
1497 art->regionid = RGN_TYPE_HEADER;
1498 art->prefsizey = HEADERY;
1499 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_HEADER;
1501 art->init = clip_header_area_init;
1502 art->draw = clip_header_area_draw;
1503 art->listener = clip_header_area_listener;
1505 BLI_addhead(&st->regiontypes, art);
1507 BKE_spacetype_register(st);
1510 art = MEM_callocN(sizeof(ARegionType), "spacetype clip channels region");
1511 art->regionid = RGN_TYPE_CHANNELS;
1512 art->prefsizex = UI_COMPACT_PANEL_WIDTH;
1513 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1514 art->listener = clip_channels_area_listener;
1515 art->init = clip_channels_area_init;
1516 art->draw = clip_channels_area_draw;
1518 BLI_addhead(&st->regiontypes, art);