Blender  V3.3
space_action.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2008 Blender Foundation. All rights reserved. */
3 
8 #include <stdio.h>
9 #include <string.h>
10 
11 #include "DNA_action_types.h"
12 #include "DNA_anim_types.h"
13 #include "DNA_collection_types.h"
14 #include "DNA_object_types.h"
15 #include "DNA_scene_types.h"
16 
17 #include "MEM_guardedalloc.h"
18 
19 #include "BLI_blenlib.h"
20 #include "BLI_utildefines.h"
21 
22 #include "BKE_context.h"
23 #include "BKE_lib_remap.h"
24 #include "BKE_nla.h"
25 #include "BKE_screen.h"
26 
27 #include "RNA_access.h"
28 #include "RNA_define.h"
29 #include "RNA_enum_types.h"
30 
31 #include "WM_api.h"
32 #include "WM_message.h"
33 #include "WM_types.h"
34 
35 #include "UI_interface.h"
36 #include "UI_resources.h"
37 #include "UI_view2d.h"
38 
39 #include "ED_anim_api.h"
40 #include "ED_markers.h"
41 #include "ED_screen.h"
42 #include "ED_space_api.h"
43 #include "ED_time_scrub_ui.h"
44 
45 #include "action_intern.h" /* own include */
46 
47 /* ******************** default callbacks for action space ***************** */
48 
49 static SpaceLink *action_create(const ScrArea *area, const Scene *scene)
50 {
51  SpaceAction *saction;
52  ARegion *region;
53 
54  saction = MEM_callocN(sizeof(SpaceAction), "initaction");
55  saction->spacetype = SPACE_ACTION;
56 
57  saction->autosnap = SACTSNAP_FRAME;
58  saction->mode = SACTCONT_DOPESHEET;
59  saction->mode_prev = SACTCONT_DOPESHEET;
61 
62  saction->ads.filterflag |= ADS_FILTER_SUMMARY;
63 
64  /* enable all cache display */
69 
70  /* header */
71  region = MEM_callocN(sizeof(ARegion), "header for action");
72 
73  BLI_addtail(&saction->regionbase, region);
74  region->regiontype = RGN_TYPE_HEADER;
76 
77  /* channel list region */
78  region = MEM_callocN(sizeof(ARegion), "channel region for action");
79  BLI_addtail(&saction->regionbase, region);
80  region->regiontype = RGN_TYPE_CHANNELS;
81  region->alignment = RGN_ALIGN_LEFT;
82 
83  /* only need to set scroll settings, as this will use 'listview' v2d configuration */
84  region->v2d.scroll = V2D_SCROLL_BOTTOM;
86 
87  /* ui buttons */
88  region = MEM_callocN(sizeof(ARegion), "buttons region for action");
89 
90  BLI_addtail(&saction->regionbase, region);
91  region->regiontype = RGN_TYPE_UI;
92  region->alignment = RGN_ALIGN_RIGHT;
93 
94  /* main region */
95  region = MEM_callocN(sizeof(ARegion), "main region for action");
96 
97  BLI_addtail(&saction->regionbase, region);
98  region->regiontype = RGN_TYPE_WINDOW;
99 
100  region->v2d.tot.xmin = (float)(scene->r.sfra - 10);
101  region->v2d.tot.ymin = (float)(-area->winy) / 3.0f;
102  region->v2d.tot.xmax = (float)(scene->r.efra + 10);
103  region->v2d.tot.ymax = 0.0f;
104 
105  region->v2d.cur = region->v2d.tot;
106 
107  region->v2d.min[0] = 0.0f;
108  region->v2d.min[1] = 0.0f;
109 
110  region->v2d.max[0] = MAXFRAMEF;
111  region->v2d.max[1] = FLT_MAX;
112 
113  region->v2d.minzoom = 0.01f;
114  region->v2d.maxzoom = 50;
116  region->v2d.scroll |= V2D_SCROLL_RIGHT;
117  region->v2d.keepzoom = V2D_LOCKZOOM_Y;
118  region->v2d.keepofs = V2D_KEEPOFS_Y;
119  region->v2d.align = V2D_ALIGN_NO_POS_Y;
121 
122  return (SpaceLink *)saction;
123 }
124 
125 /* not spacelink itself */
126 static void action_free(SpaceLink *UNUSED(sl))
127 {
128  // SpaceAction *saction = (SpaceAction *) sl;
129 }
130 
131 /* spacetype; init callback */
132 static void action_init(struct wmWindowManager *UNUSED(wm), ScrArea *area)
133 {
134  SpaceAction *saction = area->spacedata.first;
136 }
137 
139 {
140  SpaceAction *sactionn = MEM_dupallocN(sl);
141 
142  memset(&sactionn->runtime, 0x0, sizeof(sactionn->runtime));
143 
144  /* clear or remove stuff from old */
145 
146  return (SpaceLink *)sactionn;
147 }
148 
149 /* add handlers, stuff you only do once or on area/region changes */
151 {
152  wmKeyMap *keymap;
153 
154  UI_view2d_region_reinit(&region->v2d, V2D_COMMONVIEW_CUSTOM, region->winx, region->winy);
155 
156  /* own keymap */
157  keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet", SPACE_ACTION, 0);
159  keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet Generic", SPACE_ACTION, 0);
160  WM_event_add_keymap_handler(&region->handlers, keymap);
161 }
162 
163 static void action_main_region_draw(const bContext *C, ARegion *region)
164 {
165  /* draw entirely, view changes should be handled here */
166  SpaceAction *saction = CTX_wm_space_action(C);
168  Object *obact = CTX_data_active_object(C);
169  bAnimContext ac;
170  View2D *v2d = &region->v2d;
171  short marker_flag = 0;
172 
174 
175  /* clear and setup matrix */
177 
179 
180  /* time grid */
182  v2d, scene, saction->flag & SACTION_DRAWTIME, true);
183 
185 
186  /* start and end frame */
188 
189  /* Draw the manually set intended playback frame range highlight in the Action editor. */
190  if (ELEM(saction->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY) && saction->action) {
192 
193  ANIM_draw_action_framerange(adt, saction->action, v2d, -FLT_MAX, FLT_MAX);
194  }
195 
196  /* data */
197  if (ANIM_animdata_get_context(C, &ac)) {
198  draw_channel_strips(&ac, saction, region);
199  }
200 
201  /* markers */
202  UI_view2d_view_orthoSpecial(region, v2d, 1);
203 
204  marker_flag = ((ac.markers && (ac.markers != &ac.scene->markers)) ? DRAW_MARKERS_LOCAL : 0) |
206 
207  if (saction->flag & SACTION_SHOW_MARKERS) {
208  ED_markers_draw(C, marker_flag);
209  }
210 
211  /* caches */
212  if (saction->mode == SACTCONT_TIMELINE) {
213  timeline_draw_cache(saction, obact, scene);
214  }
215 
216  /* preview range */
218  ANIM_draw_previewrange(C, v2d, 0);
219 
220  /* callback */
223 
224  /* reset view matrix */
226 
227  /* gizmos */
229 
230  /* scrubbing region */
231  ED_time_scrub_draw(region, scene, saction->flag & SACTION_DRAWTIME, true);
232 }
233 
234 static void action_main_region_draw_overlay(const bContext *C, ARegion *region)
235 {
236  /* draw entirely, view changes should be handled here */
237  const SpaceAction *saction = CTX_wm_space_action(C);
238  const Scene *scene = CTX_data_scene(C);
239  View2D *v2d = &region->v2d;
240 
241  /* scrubbing region */
243 
244  /* scrollers */
246 }
247 
248 /* add handlers, stuff you only do once or on area/region changes */
250 {
251  wmKeyMap *keymap;
252 
253  /* ensure the 2d view sync works - main region has bottom scroller */
254  region->v2d.scroll = V2D_SCROLL_BOTTOM;
255 
256  UI_view2d_region_reinit(&region->v2d, V2D_COMMONVIEW_LIST, region->winx, region->winy);
257 
258  /* own keymap */
259  keymap = WM_keymap_ensure(wm->defaultconf, "Animation Channels", 0, 0);
261 
262  keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet Generic", SPACE_ACTION, 0);
263  WM_event_add_keymap_handler(&region->handlers, keymap);
264 }
265 
266 static void action_channel_region_draw(const bContext *C, ARegion *region)
267 {
268  /* draw entirely, view changes should be handled here */
269  bAnimContext ac;
270  View2D *v2d = &region->v2d;
271 
272  /* clear and setup matrix */
274 
276 
277  /* data */
278  if (ANIM_animdata_get_context(C, &ac)) {
279  draw_channel_names((bContext *)C, &ac, region);
280  }
281 
282  /* channel filter next to scrubbing area */
284 
285  /* reset view matrix */
287 
288  /* no scrollers here */
289 }
290 
291 /* add handlers, stuff you only do once or on area/region changes */
293 {
294  ED_region_header_init(region);
295 }
296 
297 static void action_header_region_draw(const bContext *C, ARegion *region)
298 {
299  /* The anim context is not actually used, but this makes sure the action being displayed is up to
300  * date. */
301  bAnimContext ac;
303 
304  ED_region_header(C, region);
305 }
306 
308 {
309  ARegion *region = params->region;
310  wmNotifier *wmn = params->notifier;
311 
312  /* context changes */
313  switch (wmn->category) {
314  case NC_ANIMATION:
315  ED_region_tag_redraw(region);
316  break;
317  case NC_SCENE:
318  switch (wmn->data) {
319  case ND_OB_ACTIVE:
320  case ND_FRAME:
321  ED_region_tag_redraw(region);
322  break;
323  }
324  break;
325  case NC_OBJECT:
326  switch (wmn->data) {
327  case ND_BONE_ACTIVE:
328  case ND_BONE_SELECT:
329  case ND_KEYS:
330  ED_region_tag_redraw(region);
331  break;
332  case ND_MODIFIER:
333  if (wmn->action == NA_RENAME) {
334  ED_region_tag_redraw(region);
335  }
336  break;
337  }
338  break;
339  case NC_GPENCIL:
340  if (ELEM(wmn->action, NA_RENAME, NA_SELECTED)) {
341  ED_region_tag_redraw(region);
342  }
343  break;
344  case NC_ID:
345  if (wmn->action == NA_RENAME) {
346  ED_region_tag_redraw(region);
347  }
348  break;
349  default:
350  if (wmn->data == ND_KEYS) {
351  ED_region_tag_redraw(region);
352  }
353  break;
354  }
355 }
356 
358 {
359  struct wmMsgBus *mbus = params->message_bus;
360  bScreen *screen = params->screen;
361  ScrArea *area = params->area;
362  ARegion *region = params->region;
363 
364  PointerRNA ptr;
365  RNA_pointer_create(&screen->id, &RNA_SpaceDopeSheetEditor, area->spacedata.first, &ptr);
366 
367  wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
368  .owner = region,
369  .user_data = region,
371  };
372 
373  /* All dopesheet filter settings, etc. affect the drawing of this editor,
374  * also same applies for all animation-related datatypes that may appear here,
375  * so just whitelist the entire structs for updates
376  */
377  {
378  wmMsgParams_RNA msg_key_params = {{0}};
379  StructRNA *type_array[] = {
380  &RNA_DopeSheet, /* dopesheet filters */
381 
382  &RNA_ActionGroup, /* channel groups */
383 
384  &RNA_FCurve, /* F-Curve */
385  &RNA_Keyframe,
386  &RNA_FCurveSample,
387 
388  &RNA_GreasePencil, /* Grease Pencil */
389  &RNA_GPencilLayer,
390  &RNA_GPencilFrame,
391  };
392 
393  for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
394  msg_key_params.ptr.type = type_array[i];
396  mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
397  }
398  }
399 }
400 
402 {
403  ARegion *region = params->region;
404  wmNotifier *wmn = params->notifier;
405 
406  /* context changes */
407  switch (wmn->category) {
408  case NC_ANIMATION:
409  ED_region_tag_redraw(region);
410  break;
411  case NC_SCENE:
412  switch (wmn->data) {
413  case ND_RENDER_OPTIONS:
414  case ND_OB_ACTIVE:
415  case ND_FRAME:
416  case ND_FRAME_RANGE:
417  case ND_MARKERS:
418  ED_region_tag_redraw(region);
419  break;
420  }
421  break;
422  case NC_OBJECT:
423  switch (wmn->data) {
424  case ND_TRANSFORM:
425  /* moving object shouldn't need to redraw action */
426  break;
427  case ND_BONE_ACTIVE:
428  case ND_BONE_SELECT:
429  case ND_KEYS:
430  ED_region_tag_redraw(region);
431  break;
432  }
433  break;
434  case NC_NODE:
435  switch (wmn->action) {
436  case NA_EDITED:
437  ED_region_tag_redraw(region);
438  break;
439  }
440  break;
441  case NC_ID:
442  if (wmn->action == NA_RENAME) {
443  ED_region_tag_redraw(region);
444  }
445  break;
446  case NC_SCREEN:
447  if (ELEM(wmn->data, ND_LAYER)) {
448  ED_region_tag_redraw(region);
449  }
450  break;
451  default:
452  if (wmn->data == ND_KEYS) {
453  ED_region_tag_redraw(region);
454  }
455  break;
456  }
457 }
458 
460 {
461  struct wmMsgBus *mbus = params->message_bus;
462  Scene *scene = params->scene;
463  bScreen *screen = params->screen;
464  ScrArea *area = params->area;
465  ARegion *region = params->region;
466 
467  PointerRNA ptr;
468  RNA_pointer_create(&screen->id, &RNA_SpaceDopeSheetEditor, area->spacedata.first, &ptr);
469 
470  wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
471  .owner = region,
472  .user_data = region,
474  };
475 
476  /* Timeline depends on scene properties. */
477  {
478  bool use_preview = (scene->r.flag & SCER_PRV_RANGE);
479  const PropertyRNA *props[] = {
480  use_preview ? &rna_Scene_frame_preview_start : &rna_Scene_frame_start,
481  use_preview ? &rna_Scene_frame_preview_end : &rna_Scene_frame_end,
482  &rna_Scene_use_preview_range,
483  &rna_Scene_frame_current,
484  };
485 
486  PointerRNA idptr;
487  RNA_id_pointer_create(&scene->id, &idptr);
488 
489  for (int i = 0; i < ARRAY_SIZE(props); i++) {
490  WM_msg_subscribe_rna(mbus, &idptr, props[i], &msg_sub_value_region_tag_redraw, __func__);
491  }
492  }
493 
494  /* Now run the general "channels region" one - since channels and main should be in sync */
496 }
497 
498 /* editor level listener */
500 {
501  ScrArea *area = params->area;
502  wmNotifier *wmn = params->notifier;
503  SpaceAction *saction = (SpaceAction *)area->spacedata.first;
504 
505  /* context changes */
506  switch (wmn->category) {
507  case NC_GPENCIL:
508  /* only handle these events for containers in which GPencil frames are displayed */
510  if (wmn->action == NA_EDITED) {
512  }
513  else if (wmn->action == NA_SELECTED) {
516  }
517  }
518  break;
519  case NC_ANIMATION:
520  /* For NLA tweak-mode enter/exit, need complete refresh. */
521  if (wmn->data == ND_NLA_ACTCHANGE) {
524  }
525  /* Auto-color only really needs to change when channels are added/removed,
526  * or previously hidden stuff appears
527  * (assume for now that if just adding these works, that will be fine).
528  */
529  else if (((wmn->data == ND_KEYFRAME) && ELEM(wmn->action, NA_ADDED, NA_REMOVED)) ||
530  ((wmn->data == ND_ANIMCHAN) && (wmn->action != NA_SELECTED))) {
532  }
533  /* for simple edits to the curve data though (or just plain selections),
534  * a simple redraw should work
535  * (see T39851 for an example of how this can go wrong)
536  */
537  else {
539  }
540  break;
541  case NC_SCENE:
542  switch (wmn->data) {
543  case ND_SEQUENCER:
544  if (wmn->action == NA_SELECTED) {
547  }
548  break;
549  case ND_OB_ACTIVE:
550  case ND_OB_SELECT:
551  /* Selection changed, so force refresh to flush
552  * (needs flag set to do syncing). */
555  break;
556  case ND_RENDER_RESULT:
558  break;
559  case ND_FRAME_RANGE:
560  LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
561  if (region->regiontype == RGN_TYPE_WINDOW) {
562  Scene *scene = wmn->reference;
563  region->v2d.tot.xmin = (float)(scene->r.sfra - 4);
564  region->v2d.tot.xmax = (float)(scene->r.efra + 4);
565  break;
566  }
567  }
568  break;
569  default:
570  if (saction->mode != SACTCONT_TIMELINE) {
571  /* Just redrawing the view will do. */
573  }
574  break;
575  }
576  break;
577  case NC_OBJECT:
578  switch (wmn->data) {
579  case ND_BONE_SELECT: /* Selection changed, so force refresh to flush
580  * (needs flag set to do syncing). */
581  case ND_BONE_ACTIVE:
584  break;
585  case ND_TRANSFORM:
586  /* moving object shouldn't need to redraw action */
587  break;
588  case ND_POINTCACHE:
589  case ND_MODIFIER:
590  case ND_PARTICLE:
591  /* only needed in timeline mode */
592  if (saction->mode == SACTCONT_TIMELINE) {
595  }
596  break;
597  default: /* just redrawing the view will do */
599  break;
600  }
601  break;
602  case NC_MASK:
603  if (saction->mode == SACTCONT_MASK) {
604  switch (wmn->data) {
605  case ND_DATA:
608  break;
609  default: /* just redrawing the view will do */
611  break;
612  }
613  }
614  break;
615  case NC_NODE:
616  if (wmn->action == NA_SELECTED) {
617  /* selection changed, so force refresh to flush (needs flag set to do syncing) */
620  }
621  break;
622  case NC_SPACE:
623  switch (wmn->data) {
624  case ND_SPACE_DOPESHEET:
626  break;
627  case ND_SPACE_TIME:
629  break;
630  case ND_SPACE_CHANGED:
633  break;
634  }
635  break;
636  case NC_WINDOW:
638  /* force redraw/refresh after undo/redo, see: T28962. */
640  }
641  break;
642  case NC_WM:
643  switch (wmn->data) {
644  case ND_FILEREAD:
646  break;
647  }
648  break;
649  }
650 }
651 
653 {
654  ScrArea *area = params->area;
655  ARegion *region = params->region;
656  wmNotifier *wmn = params->notifier;
657  SpaceAction *saction = (SpaceAction *)area->spacedata.first;
658 
659  /* context changes */
660  switch (wmn->category) {
661  case NC_SCREEN:
662  if (saction->mode == SACTCONT_TIMELINE) {
663  if (wmn->data == ND_ANIMPLAY) {
664  ED_region_tag_redraw(region);
665  }
666  }
667  break;
668  case NC_SCENE:
669  if (saction->mode == SACTCONT_TIMELINE) {
670  switch (wmn->data) {
671  case ND_RENDER_RESULT:
672  case ND_OB_SELECT:
673  case ND_FRAME:
674  case ND_FRAME_RANGE:
675  case ND_KEYINGSET:
676  case ND_RENDER_OPTIONS:
677  ED_region_tag_redraw(region);
678  break;
679  }
680  }
681  else {
682  switch (wmn->data) {
683  case ND_OB_ACTIVE:
684  ED_region_tag_redraw(region);
685  break;
686  }
687  }
688  break;
689  case NC_ID:
690  if (wmn->action == NA_RENAME) {
691  ED_region_tag_redraw(region);
692  }
693  break;
694  case NC_ANIMATION:
695  switch (wmn->data) {
696  case ND_ANIMCHAN: /* set of visible animchannels changed */
697  /* NOTE: for now, this should usually just mean that the filters changed
698  * It may be better if we had a dedicated flag for that though
699  */
700  ED_region_tag_redraw(region);
701  break;
702 
703  case ND_KEYFRAME: /* new keyframed added -> active action may have changed */
704  // saction->flag |= SACTION_TEMP_NEEDCHANSYNC;
705  ED_region_tag_redraw(region);
706  break;
707  }
708  break;
709  }
710 }
711 
712 /* add handlers, stuff you only do once or on area/region changes */
714 {
715  wmKeyMap *keymap;
716 
717  ED_region_panels_init(wm, region);
718 
719  keymap = WM_keymap_ensure(wm->defaultconf, "Dopesheet Generic", SPACE_ACTION, 0);
720  WM_event_add_keymap_handler(&region->handlers, keymap);
721 }
722 
723 static void action_buttons_area_draw(const bContext *C, ARegion *region)
724 {
725  ED_region_panels(C, region);
726 }
727 
729 {
730  ARegion *region = params->region;
731  wmNotifier *wmn = params->notifier;
732 
733  /* context changes */
734  switch (wmn->category) {
735  case NC_ANIMATION:
736  ED_region_tag_redraw(region);
737  break;
738  case NC_SCENE:
739  switch (wmn->data) {
740  case ND_OB_ACTIVE:
741  case ND_FRAME:
742  case ND_MARKERS:
743  ED_region_tag_redraw(region);
744  break;
745  }
746  break;
747  case NC_OBJECT:
748  switch (wmn->data) {
749  case ND_BONE_ACTIVE:
750  case ND_BONE_SELECT:
751  case ND_KEYS:
752  ED_region_tag_redraw(region);
753  break;
754  }
755  break;
756  default:
757  if (wmn->data == ND_KEYS) {
758  ED_region_tag_redraw(region);
759  }
760  break;
761  }
762 }
763 
764 static void action_refresh(const bContext *C, ScrArea *area)
765 {
766  SpaceAction *saction = (SpaceAction *)area->spacedata.first;
767 
768  /* Update the state of the animchannels in response to changes from the data they represent
769  * NOTE: the temp flag is used to indicate when this needs to be done,
770  * and will be cleared once handled. */
772  ARegion *region;
773 
774  /* Perform syncing of channel state incl. selection
775  * Active action setting also occurs here
776  * (as part of anim channel filtering in anim_filter.c). */
779 
780  /* Tag everything for redraw
781  * - Regions (such as header) need to be manually tagged for redraw too
782  * or else they don't update T28962.
783  */
785  for (region = area->regionbase.first; region; region = region->next) {
786  ED_region_tag_redraw(region);
787  }
788  }
789 
790  /* region updates? */
791  /* XXX re-sizing y-extents of tot should go here? */
792 }
793 
795  SpaceLink *slink,
796  const struct IDRemapper *mappings)
797 {
798  SpaceAction *sact = (SpaceAction *)slink;
799 
800  BKE_id_remapper_apply(mappings, (ID **)&sact->action, ID_REMAP_APPLY_DEFAULT);
803 }
804 
811 {
812  SpaceAction *sact = area->spacedata.first;
814 }
815 
816 static void action_space_subtype_set(ScrArea *area, int value)
817 {
818  SpaceAction *sact = area->spacedata.first;
819  if (value == SACTCONT_TIMELINE) {
820  if (sact->mode != SACTCONT_TIMELINE) {
821  sact->mode_prev = sact->mode;
822  }
823  sact->mode = value;
824  }
825  else {
826  sact->mode = sact->mode_prev;
827  }
828 }
829 
831  EnumPropertyItem **item,
832  int *totitem)
833 {
835 }
836 
838 {
839  SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype action");
840  ARegionType *art;
841 
842  st->spaceid = SPACE_ACTION;
843  strncpy(st->name, "Action", BKE_ST_MAXNAME);
844 
845  st->create = action_create;
846  st->free = action_free;
847  st->init = action_init;
848  st->duplicate = action_duplicate;
849  st->operatortypes = action_operatortypes;
850  st->keymap = action_keymap;
851  st->listener = action_listener;
852  st->refresh = action_refresh;
853  st->id_remap = action_id_remap;
854  st->space_subtype_item_extend = action_space_subtype_item_extend;
855  st->space_subtype_get = action_space_subtype_get;
856  st->space_subtype_set = action_space_subtype_set;
857 
858  /* regions: main window */
859  art = MEM_callocN(sizeof(ARegionType), "spacetype action region");
860  art->regionid = RGN_TYPE_WINDOW;
867 
868  BLI_addhead(&st->regiontypes, art);
869 
870  /* regions: header */
871  art = MEM_callocN(sizeof(ARegionType), "spacetype action region");
872  art->regionid = RGN_TYPE_HEADER;
873  art->prefsizey = HEADERY;
875 
879 
880  BLI_addhead(&st->regiontypes, art);
881 
882  /* regions: channels */
883  art = MEM_callocN(sizeof(ARegionType), "spacetype action region");
885  art->prefsizex = 200;
887 
892 
893  BLI_addhead(&st->regiontypes, art);
894 
895  /* regions: UI buttons */
896  art = MEM_callocN(sizeof(ARegionType), "spacetype action region");
897  art->regionid = RGN_TYPE_UI;
899  art->keymapflag = ED_KEYMAP_UI;
903 
904  BLI_addhead(&st->regiontypes, art);
905 
907 
909 }
typedef float(TangentPoint)[2]
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1353
struct SpaceAction * CTX_wm_space_action(const bContext *C)
Definition: context.c:896
@ ID_REMAP_APPLY_DEFAULT
IDRemapperApplyResult BKE_id_remapper_apply(const struct IDRemapper *id_remapper, struct ID **r_id_ptr, IDRemapperApplyOptions options)
#define BKE_ST_MAXNAME
Definition: BKE_screen.h:53
void BKE_spacetype_register(struct SpaceType *st)
Definition: screen.c:391
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:60
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:80
#define ARRAY_SIZE(arr)
#define UNUSED(x)
#define ELEM(...)
@ ADS_FILTER_SUMMARY
@ SACTSNAP_FRAME
@ TIME_CACHE_PARTICLES
@ TIME_CACHE_RIGIDBODY
@ TIME_CACHE_DYNAMICPAINT
@ TIME_CACHE_SOFTBODY
@ TIME_CACHE_DISPLAY
@ TIME_CACHE_CLOTH
@ TIME_CACHE_SMOKE
@ SACTCONT_GPENCIL
@ SACTCONT_ACTION
@ SACTCONT_TIMELINE
@ SACTCONT_DOPESHEET
@ SACTCONT_SHAPEKEY
@ SACTCONT_MASK
@ SACTION_RUNTIME_FLAG_NEED_CHAN_SYNC
@ SACTION_SHOW_INTERPOLATION
@ SACTION_SHOW_MARKERS
@ SACTION_DRAWTIME
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
#define SCER_PRV_RANGE
#define MAXFRAMEF
#define HEADERY
@ RGN_TYPE_CHANNELS
@ RGN_TYPE_UI
@ RGN_TYPE_WINDOW
@ RGN_TYPE_HEADER
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ SPACE_ACTION
@ USER_HEADER_BOTTOM
@ V2D_KEEPOFS_Y
@ V2D_LOCKZOOM_Y
@ V2D_VIEWSYNC_AREA_VERTICAL
@ V2D_SCROLL_RIGHT
@ V2D_SCROLL_BOTTOM
@ V2D_SCROLL_HORIZONTAL_HANDLES
@ V2D_ALIGN_NO_POS_Y
struct AnimData * ED_actedit_animdata_from_context(const struct bContext *C, struct ID **r_adt_id_owner)
@ DRAW_MARKERS_MARGIN
Definition: ED_markers.h:28
@ DRAW_MARKERS_LOCAL
Definition: ED_markers.h:27
void ED_area_tag_redraw(ScrArea *area)
Definition: area.c:729
@ ED_KEYMAP_UI
Definition: ED_screen.h:691
@ ED_KEYMAP_ANIMATION
Definition: ED_screen.h:695
@ ED_KEYMAP_HEADER
Definition: ED_screen.h:697
@ ED_KEYMAP_GIZMO
Definition: ED_screen.h:692
@ ED_KEYMAP_VIEW2D
Definition: ED_screen.h:694
@ ED_KEYMAP_FRAMES
Definition: ED_screen.h:696
void ED_region_header(const struct bContext *C, struct ARegion *region)
void ED_region_do_msg_notify_tag_redraw(struct bContext *C, struct wmMsgSubscribeKey *msg_key, struct wmMsgSubscribeValue *msg_val)
void ED_region_panels(const struct bContext *C, struct ARegion *region)
void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *region)
Definition: area.c:3153
void ED_region_tag_redraw(struct ARegion *region)
Definition: area.c:655
void ED_region_header_init(struct ARegion *region)
Definition: area.c:3417
void ED_area_tag_refresh(ScrArea *area)
Definition: area.c:758
#define REGION_DRAW_POST_VIEW
Definition: ED_space_api.h:62
void ED_region_draw_cb_draw(const struct bContext *C, struct ARegion *region, int type)
#define REGION_DRAW_PRE_VIEW
Definition: ED_space_api.h:64
Read Guarded memory(de)allocation.
#define C
Definition: RandGen.cpp:25
#define UI_SIDEBAR_PANEL_WIDTH
Definition: UI_interface.h:242
@ TH_BACK
Definition: UI_resources.h:39
void UI_ThemeClearColor(int colorid)
Definition: resources.c:1448
void UI_view2d_region_reinit(struct View2D *v2d, short type, int winx, int winy)
Definition: view2d.cc:217
void UI_view2d_view_restore(const struct bContext *C)
void UI_view2d_view_orthoSpecial(struct ARegion *region, struct View2D *v2d, bool xaxis)
Definition: view2d.cc:1122
void UI_view2d_draw_lines_x__discrete_frames_or_seconds(const struct View2D *v2d, const struct Scene *scene, bool display_seconds, bool display_minor_lines)
void UI_view2d_view_ortho(const struct View2D *v2d)
void UI_view2d_scrollers_draw(struct View2D *v2d, const struct rcti *mask_custom)
@ V2D_COMMONVIEW_LIST
Definition: UI_view2d.h:38
@ V2D_COMMONVIEW_CUSTOM
Definition: UI_view2d.h:34
@ WM_GIZMOMAP_DRAWSTEP_2D
#define ND_SEQUENCER
Definition: WM_types.h:385
#define NC_WINDOW
Definition: WM_types.h:325
#define NC_ID
Definition: WM_types.h:345
#define NC_NODE
Definition: WM_types.h:344
#define ND_FILEREAD
Definition: WM_types.h:360
#define ND_NLA_ACTCHANGE
Definition: WM_types.h:446
#define ND_SPACE_CHANGED
Definition: WM_types.h:481
#define ND_OB_ACTIVE
Definition: WM_types.h:388
#define ND_RENDER_RESULT
Definition: WM_types.h:394
#define NC_WM
Definition: WM_types.h:324
#define ND_DATA
Definition: WM_types.h:456
#define ND_RENDER_OPTIONS
Definition: WM_types.h:383
#define ND_SPACE_DOPESHEET
Definition: WM_types.h:476
#define NC_ANIMATION
Definition: WM_types.h:338
#define NC_SCREEN
Definition: WM_types.h:327
#define ND_OB_SELECT
Definition: WM_types.h:390
#define ND_ANIMPLAY
Definition: WM_types.h:372
#define ND_KEYINGSET
Definition: WM_types.h:396
#define NC_SCENE
Definition: WM_types.h:328
#define NA_ADDED
Definition: WM_types.h:525
#define ND_MODIFIER
Definition: WM_types.h:411
#define NA_EDITED
Definition: WM_types.h:523
#define ND_PARTICLE
Definition: WM_types.h:414
#define ND_FRAME_RANGE
Definition: WM_types.h:399
#define ND_MARKERS
Definition: WM_types.h:381
#define ND_FRAME
Definition: WM_types.h:382
#define ND_SPACE_TIME
Definition: WM_types.h:474
#define NA_REMOVED
Definition: WM_types.h:526
#define NC_GPENCIL
Definition: WM_types.h:349
#define ND_BONE_ACTIVE
Definition: WM_types.h:408
#define ND_TRANSFORM
Definition: WM_types.h:405
#define ND_LAYER
Definition: WM_types.h:398
#define NC_MASK
Definition: WM_types.h:348
#define ND_KEYS
Definition: WM_types.h:412
#define NA_RENAME
Definition: WM_types.h:527
#define ND_POINTCACHE
Definition: WM_types.h:415
#define ND_BONE_SELECT
Definition: WM_types.h:409
#define ND_KEYFRAME
Definition: WM_types.h:442
#define NC_OBJECT
Definition: WM_types.h:329
#define ND_ANIMCHAN
Definition: WM_types.h:444
#define NC_SPACE
Definition: WM_types.h:342
#define NA_SELECTED
Definition: WM_types.h:528
void action_buttons_register(ARegionType *UNUSED(art))
void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *region)
Definition: action_draw.c:50
void timeline_draw_cache(SpaceAction *saction, Object *ob, Scene *scene)
Definition: action_draw.c:609
void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *region)
Definition: action_draw.c:165
void action_keymap(struct wmKeyConfig *keyconf)
Definition: action_ops.c:94
void action_operatortypes(void)
Definition: action_ops.c:25
void ANIM_sync_animchannels_to_data(const bContext *C)
Definition: anim_deps.c:259
void ANIM_draw_action_framerange(AnimData *adt, bAction *action, View2D *v2d, float ymin, float ymax)
Definition: anim_draw.c:149
void ANIM_draw_previewrange(const bContext *C, View2D *v2d, int end_frame_width)
Definition: anim_draw.c:79
void ANIM_draw_framerange(Scene *scene, View2D *v2d)
Definition: anim_draw.c:113
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
Definition: anim_filter.c:379
void ED_markers_draw(const bContext *C, int flag)
Definition: anim_markers.c:535
unsigned int U
Definition: btGjkEpa3.h:78
Scene scene
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:28
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
static void area(int d1, int d2, int e1, int e2, float weights[2])
static const pxr::TfToken st("st", pxr::TfToken::Immortal)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
Definition: rna_access.c:112
void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
Definition: rna_define.c:4465
const EnumPropertyItem rna_enum_space_action_mode_items[]
Definition: rna_space.c:266
static int action_space_subtype_get(ScrArea *area)
Definition: space_action.c:810
static void action_channel_region_init(wmWindowManager *wm, ARegion *region)
Definition: space_action.c:249
static void action_free(SpaceLink *UNUSED(sl))
Definition: space_action.c:126
static void action_init(struct wmWindowManager *UNUSED(wm), ScrArea *area)
Definition: space_action.c:132
static void action_channel_region_draw(const bContext *C, ARegion *region)
Definition: space_action.c:266
static void action_space_subtype_set(ScrArea *area, int value)
Definition: space_action.c:816
static void action_refresh(const bContext *C, ScrArea *area)
Definition: space_action.c:764
static void action_main_region_draw(const bContext *C, ARegion *region)
Definition: space_action.c:163
static void action_channel_region_listener(const wmRegionListenerParams *params)
Definition: space_action.c:307
static void action_listener(const wmSpaceTypeListenerParams *params)
Definition: space_action.c:499
void ED_spacetype_action(void)
Definition: space_action.c:837
static SpaceLink * action_duplicate(SpaceLink *sl)
Definition: space_action.c:138
static void action_header_region_listener(const wmRegionListenerParams *params)
Definition: space_action.c:652
static void action_header_region_draw(const bContext *C, ARegion *region)
Definition: space_action.c:297
static SpaceLink * action_create(const ScrArea *area, const Scene *scene)
Definition: space_action.c:49
static void saction_channel_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
Definition: space_action.c:357
static void action_main_region_draw_overlay(const bContext *C, ARegion *region)
Definition: space_action.c:234
static void action_id_remap(ScrArea *UNUSED(area), SpaceLink *slink, const struct IDRemapper *mappings)
Definition: space_action.c:794
static void action_main_region_init(wmWindowManager *wm, ARegion *region)
Definition: space_action.c:150
static void action_space_subtype_item_extend(bContext *UNUSED(C), EnumPropertyItem **item, int *totitem)
Definition: space_action.c:830
static void action_header_region_init(wmWindowManager *UNUSED(wm), ARegion *region)
Definition: space_action.c:292
static void action_buttons_area_init(wmWindowManager *wm, ARegion *region)
Definition: space_action.c:713
static void action_main_region_listener(const wmRegionListenerParams *params)
Definition: space_action.c:401
static void action_region_listener(const wmRegionListenerParams *params)
Definition: space_action.c:728
static void saction_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
Definition: space_action.c:459
static void action_buttons_area_draw(const bContext *C, ARegion *region)
Definition: space_action.c:723
void(* draw)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:151
void(* message_subscribe)(const wmRegionMessageSubscribeParams *params)
Definition: BKE_screen.h:167
void(* draw_overlay)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:159
void(* listener)(const wmRegionListenerParams *params)
Definition: BKE_screen.h:165
int keymapflag
Definition: BKE_screen.h:208
void(* init)(struct wmWindowManager *wm, struct ARegion *region)
Definition: BKE_screen.h:147
struct ARegion * next
ListBase handlers
short alignment
short regiontype
struct wmGizmoMap * gizmo_map
Definition: DNA_ID.h:368
struct StructRNA * type
Definition: RNA_types.h:37
struct RenderData r
ListBase markers
bAction * action
bDopeSheet ads
SpaceAction_Runtime runtime
ListBase regionbase
short flag
float minzoom
short align
float max[2]
short keepzoom
short keepofs
float min[2]
short scroll
float maxzoom
ListBase * markers
Definition: ED_anim_api.h:92
struct Scene * scene
Definition: ED_anim_api.h:84
struct bDopeSheet * ads
Definition: ED_anim_api.h:79
struct Collection * filter_grp
float xmax
Definition: DNA_vec_types.h:69
float xmin
Definition: DNA_vec_types.h:69
float ymax
Definition: DNA_vec_types.h:70
float ymin
Definition: DNA_vec_types.h:70
unsigned int data
Definition: WM_types.h:308
unsigned int action
Definition: WM_types.h:308
unsigned int category
Definition: WM_types.h:308
void * reference
Definition: WM_types.h:310
struct wmKeyConfig * defaultconf
void ED_time_scrub_draw_current_frame(const ARegion *region, const Scene *scene, bool display_seconds)
void ED_time_scrub_channel_search_draw(const bContext *C, ARegion *region, bDopeSheet *dopesheet)
void ED_time_scrub_draw(const ARegion *region, const Scene *scene, bool display_seconds, bool discrete_frames)
wmEventHandler_Keymap * WM_event_add_keymap_handler_v2d_mask(ListBase *handlers, wmKeyMap *keymap)
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
PointerRNA * ptr
Definition: wm_files.c:3480
void WM_gizmomap_draw(wmGizmoMap *gzmap, const bContext *C, const eWM_GizmoFlagMapDrawStep drawstep)
Definition: wm_gizmo_map.c:483
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition: wm_keymap.c:852
void WM_msg_subscribe_rna_params(struct wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_msg_subscribe_rna(struct wmMsgBus *mbus, PointerRNA *ptr, const PropertyRNA *prop, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)