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);
1135 ED_mask_get_size(sa, &width, &height);
1136 ED_space_clip_get_aspect(sc, &aspx, &aspy);
1137 ED_mask_draw_region(mask, ar,
1138 sc->mask_info.draw_flag, sc->mask_info.draw_type,
1149 clip_draw_grease_pencil((bContext *)C, 1);
1151 /* reset view matrix */
1152 UI_view2d_view_restore(C);
1154 /* draw Grease Pencil - screen space only */
1155 clip_draw_grease_pencil((bContext *)C, 0);
1158 static void clip_main_area_listener(ARegion *ar, wmNotifier *wmn)
1160 /* context changes */
1161 switch (wmn->category) {
1163 if (wmn->data == ND_GPENCIL)
1164 ED_region_tag_redraw(ar);
1169 /****************** preview region ******************/
1171 static void clip_preview_area_init(wmWindowManager *wm, ARegion *ar)
1175 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
1178 keymap = WM_keymap_find(wm->defaultconf, "Clip", SPACE_CLIP, 0);
1179 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1181 keymap = WM_keymap_find(wm->defaultconf, "Clip Graph Editor", SPACE_CLIP, 0);
1182 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1185 static void graph_area_draw(const bContext *C, ARegion *ar)
1187 View2D *v2d = &ar->v2d;
1188 View2DScrollers *scrollers;
1189 SpaceClip *sc = CTX_wm_space_clip(C);
1190 Scene *scene = CTX_data_scene(C);
1193 if (sc->flag & SC_LOCK_TIMECURSOR)
1194 ED_clip_graph_center_current_frame(scene, ar);
1196 /* clear and setup matrix */
1197 UI_ThemeClearColor(TH_BACK);
1198 glClear(GL_COLOR_BUFFER_BIT);
1200 UI_view2d_view_ortho(v2d);
1203 clip_draw_graph(sc, ar, scene);
1205 /* reset view matrix */
1206 UI_view2d_view_restore(C);
1209 unitx = (sc->flag & SC_SHOW_SECONDS) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
1210 unity = V2D_UNIT_VALUES;
1211 scrollers = UI_view2d_scrollers_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP);
1212 UI_view2d_scrollers_draw(C, v2d, scrollers);
1213 UI_view2d_scrollers_free(scrollers);
1216 static void dopesheet_area_draw(const bContext *C, ARegion *ar)
1218 Scene *scene = CTX_data_scene(C);
1219 SpaceClip *sc = CTX_wm_space_clip(C);
1220 MovieClip *clip = ED_space_clip_get_clip(sc);
1221 View2D *v2d = &ar->v2d;
1223 View2DScrollers *scrollers;
1227 BKE_tracking_dopesheet_update(&clip->tracking);
1229 /* clear and setup matrix */
1230 UI_ThemeClearColor(TH_BACK);
1231 glClear(GL_COLOR_BUFFER_BIT);
1233 UI_view2d_view_ortho(v2d);
1236 unit = (sc->flag & SC_SHOW_SECONDS) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
1237 grid = UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP,
1238 V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
1239 UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
1240 UI_view2d_grid_free(grid);
1243 clip_draw_dopesheet_main(sc, ar, scene);
1245 /* reset view matrix */
1246 UI_view2d_view_restore(C);
1249 scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
1250 UI_view2d_scrollers_draw(C, v2d, scrollers);
1251 UI_view2d_scrollers_free(scrollers);
1254 static void clip_preview_area_draw(const bContext *C, ARegion *ar)
1256 SpaceClip *sc = CTX_wm_space_clip(C);
1258 if (sc->view == SC_VIEW_GRAPH)
1259 graph_area_draw(C, ar);
1260 else if (sc->view == SC_VIEW_DOPESHEET)
1261 dopesheet_area_draw(C, ar);
1264 static void clip_preview_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
1268 /****************** channels region ******************/
1270 static void clip_channels_area_init(wmWindowManager *wm, ARegion *ar)
1274 UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
1276 keymap = WM_keymap_find(wm->defaultconf, "Clip Dopesheet Editor", SPACE_CLIP, 0);
1277 WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
1280 static void clip_channels_area_draw(const bContext *C, ARegion *ar)
1282 SpaceClip *sc = CTX_wm_space_clip(C);
1283 MovieClip *clip = ED_space_clip_get_clip(sc);
1284 View2D *v2d = &ar->v2d;
1285 View2DScrollers *scrollers;
1288 BKE_tracking_dopesheet_update(&clip->tracking);
1290 /* clear and setup matrix */
1291 UI_ThemeClearColor(TH_BACK);
1292 glClear(GL_COLOR_BUFFER_BIT);
1294 UI_view2d_view_ortho(v2d);
1297 clip_draw_dopesheet_channels(C, ar);
1299 /* reset view matrix */
1300 UI_view2d_view_restore(C);
1303 scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
1304 UI_view2d_scrollers_draw(C, v2d, scrollers);
1305 UI_view2d_scrollers_free(scrollers);
1308 static void clip_channels_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
1312 /****************** header region ******************/
1314 /* add handlers, stuff you only do once or on area/region changes */
1315 static void clip_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
1317 ED_region_header_init(ar);
1320 static void clip_header_area_draw(const bContext *C, ARegion *ar)
1322 ED_region_header(C, ar);
1325 static void clip_header_area_listener(ARegion *ar, wmNotifier *wmn)
1327 /* context changes */
1328 switch (wmn->category) {
1330 switch (wmn->data) {
1331 /* for proportional editmode only */
1332 case ND_TOOLSETTINGS:
1333 /* TODO - should do this when in mask mode only but no datas available */
1334 // if (sc->mode == SC_MODE_MASKEDIT)
1336 ED_region_tag_redraw(ar);
1345 /****************** tools region ******************/
1347 /* add handlers, stuff you only do once or on area/region changes */
1348 static void clip_tools_area_init(wmWindowManager *wm, ARegion *ar)
1350 ED_region_panels_init(wm, ar);
1353 static void clip_tools_area_draw(const bContext *C, ARegion *ar)
1355 ED_region_panels(C, ar, 1, NULL, -1);
1358 /****************** tool properties region ******************/
1360 static void clip_props_area_listener(ARegion *ar, wmNotifier *wmn)
1362 /* context changes */
1363 switch (wmn->category) {
1365 if (wmn->data == ND_HISTORY)
1366 ED_region_tag_redraw(ar);
1369 if (wmn->data == ND_MODE)
1370 ED_region_tag_redraw(ar);
1373 if (wmn->data == ND_SPACE_CLIP)
1374 ED_region_tag_redraw(ar);
1377 if (wmn->data == ND_GPENCIL)
1378 ED_region_tag_redraw(ar);
1383 /****************** properties region ******************/
1385 /* add handlers, stuff you only do once or on area/region changes */
1386 static void clip_properties_area_init(wmWindowManager *wm, ARegion *ar)
1390 ED_region_panels_init(wm, ar);
1392 keymap = WM_keymap_find(wm->defaultconf, "Clip", SPACE_CLIP, 0);
1393 WM_event_add_keymap_handler(&ar->handlers, keymap);
1396 static void clip_properties_area_draw(const bContext *C, ARegion *ar)
1398 SpaceClip *sc = CTX_wm_space_clip(C);
1400 BKE_movieclip_update_scopes(sc->clip, &sc->user, &sc->scopes);
1402 ED_region_panels(C, ar, 1, NULL, -1);
1405 static void clip_properties_area_listener(ARegion *ar, wmNotifier *wmn)
1407 /* context changes */
1408 switch (wmn->category) {
1410 if (wmn->data == ND_GPENCIL)
1411 ED_region_tag_redraw(ar);
1414 if (wmn->action == NA_EDITED)
1415 ED_region_tag_redraw(ar);
1420 /********************* registration ********************/
1422 /* only called once, from space/spacetypes.c */
1423 void ED_spacetype_clip(void)
1425 SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype clip");
1428 st->spaceid = SPACE_CLIP;
1429 strncpy(st->name, "Clip", BKE_ST_MAXNAME);
1432 st->free = clip_free;
1433 st->init = clip_init;
1434 st->duplicate = clip_duplicate;
1435 st->operatortypes = clip_operatortypes;
1436 st->keymap = clip_keymap;
1437 st->listener = clip_listener;
1438 st->context = clip_context;
1439 st->dropboxes = clip_dropboxes;
1440 st->refresh = clip_refresh;
1442 /* regions: main window */
1443 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region");
1444 art->regionid = RGN_TYPE_WINDOW;
1445 art->init = clip_main_area_init;
1446 art->draw = clip_main_area_draw;
1447 art->listener = clip_main_area_listener;
1448 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI | ED_KEYMAP_GPENCIL;
1450 BLI_addhead(&st->regiontypes, art);
1453 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region preview");
1454 art->regionid = RGN_TYPE_PREVIEW;
1455 art->prefsizey = 240;
1456 art->init = clip_preview_area_init;
1457 art->draw = clip_preview_area_draw;
1458 art->listener = clip_preview_area_listener;
1459 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI | ED_KEYMAP_VIEW2D;
1461 BLI_addhead(&st->regiontypes, art);
1463 /* regions: properties */
1464 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region properties");
1465 art->regionid = RGN_TYPE_UI;
1466 art->prefsizex = UI_COMPACT_PANEL_WIDTH;
1467 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1468 art->init = clip_properties_area_init;
1469 art->draw = clip_properties_area_draw;
1470 art->listener = clip_properties_area_listener;
1471 BLI_addhead(&st->regiontypes, art);
1472 ED_clip_buttons_register(art);
1474 /* regions: tools */
1475 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region tools");
1476 art->regionid = RGN_TYPE_TOOLS;
1477 art->prefsizex = UI_COMPACT_PANEL_WIDTH;
1478 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1479 art->listener = clip_props_area_listener;
1480 art->init = clip_tools_area_init;
1481 art->draw = clip_tools_area_draw;
1483 BLI_addhead(&st->regiontypes, art);
1485 /* tool properties */
1486 art = MEM_callocN(sizeof(ARegionType), "spacetype clip tool properties region");
1487 art->regionid = RGN_TYPE_TOOL_PROPS;
1489 art->prefsizey = 120;
1490 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1491 art->listener = clip_props_area_listener;
1492 art->init = clip_tools_area_init;
1493 art->draw = clip_tools_area_draw;
1494 ED_clip_tool_props_register(art);
1496 BLI_addhead(&st->regiontypes, art);
1498 /* regions: header */
1499 art = MEM_callocN(sizeof(ARegionType), "spacetype clip region");
1500 art->regionid = RGN_TYPE_HEADER;
1501 art->prefsizey = HEADERY;
1502 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_HEADER;
1504 art->init = clip_header_area_init;
1505 art->draw = clip_header_area_draw;
1506 art->listener = clip_header_area_listener;
1508 BLI_addhead(&st->regiontypes, art);
1510 BKE_spacetype_register(st);
1513 art = MEM_callocN(sizeof(ARegionType), "spacetype clip channels region");
1514 art->regionid = RGN_TYPE_CHANNELS;
1515 art->prefsizex = UI_COMPACT_PANEL_WIDTH;
1516 art->keymapflag = ED_KEYMAP_FRAMES | ED_KEYMAP_UI;
1517 art->listener = clip_channels_area_listener;
1518 art->init = clip_channels_area_init;
1519 art->draw = clip_channels_area_draw;
1521 BLI_addhead(&st->regiontypes, art);