Blender V5.0
screen_context.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <cstdlib>
10#include <cstring>
11
12#include "DNA_anim_types.h"
13#include "DNA_armature_types.h"
16#include "DNA_object_types.h"
17#include "DNA_scene_types.h"
18#include "DNA_screen_types.h"
19#include "DNA_sequence_types.h"
20#include "DNA_space_types.h"
22#include "DNA_workspace_types.h"
23
24#include "BLI_listbase.h"
25#include "BLI_map.hh"
26#include "BLI_set.hh"
27#include "BLI_utildefines.h"
28
29#include "BKE_action.hh"
30#include "BKE_armature.hh"
31#include "BKE_context.hh"
32#include "BKE_gpencil_legacy.h"
33#include "BKE_layer.hh"
34#include "BKE_library.hh"
35#include "BKE_object.hh"
36#include "BKE_tracking.h"
37
38#include "RNA_access.hh"
39#include "RNA_prototypes.hh"
40
41#include "ED_anim_api.hh"
42#include "ED_armature.hh"
43#include "ED_clip.hh"
44#include "ED_gpencil_legacy.hh"
45
46#include "SEQ_channels.hh"
47#include "SEQ_select.hh"
48#include "SEQ_sequencer.hh"
49#include "SEQ_transform.hh"
50
51#include "UI_interface.hh"
52#include "WM_api.hh"
53
54#include "ANIM_action.hh"
55#include "ANIM_armature.hh"
57
58#include "screen_intern.hh"
59
60using blender::Vector;
61
62const char *screen_context_dir[] = {
63 "scene",
64 "view_layer",
65 "visible_objects",
66 "selectable_objects",
67 "selected_objects",
68 "editable_objects",
69 "selected_editable_objects",
70 "objects_in_mode",
71 "objects_in_mode_unique_data",
72 "visible_bones",
73 "editable_bones",
74 "selected_bones",
75 "selected_editable_bones",
76 "visible_pose_bones",
77 "selected_pose_bones",
78 "selected_pose_bones_from_active_object",
79 "active_bone",
80 "active_pose_bone",
81 "active_object",
82 "object",
83 "edit_object",
84 "sculpt_object",
85 "vertex_paint_object",
86 "weight_paint_object",
87 "image_paint_object",
88 "particle_edit_object",
89 "pose_object",
90 "active_nla_track",
91 "active_nla_strip",
92 "selected_nla_strips", /* nla editor */
93 "selected_movieclip_tracks",
94 /* Legacy Grease Pencil */
95 "annotation_data",
96 "annotation_data_owner",
97 "active_annotation_layer",
98 /* Grease Pencil */
99 "grease_pencil",
100 "active_operator",
101 "active_action",
102 "selected_visible_actions",
103 "selected_editable_actions",
104 "visible_fcurves",
105 "editable_fcurves",
106 "selected_visible_fcurves",
107 "selected_editable_fcurves",
108 "active_editable_fcurve",
109 "selected_editable_keyframes",
110 "ui_list",
111 "property",
112 "asset_library_reference",
113 "active_strip",
114 "strips",
115 "selected_strips",
116 "selected_editable_strips",
117 "sequencer_scene",
118 nullptr,
119};
120
121/* Each function `screen_ctx_XXX()` will be called when the screen context "XXX" is requested.
122 * ensure_ed_screen_context_functions() is responsible for creating the hash map from context
123 * member name to function. */
124
133{
134 wmWindow *win = CTX_wm_window(C);
135 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
136 Scene *scene = WM_window_get_active_scene(win);
138 BKE_view_layer_synced_ensure(scene, view_layer);
139
141 if (BASE_VISIBLE(v3d, base)) {
142 CTX_data_id_list_add(result, &base->object->id);
143 }
144 }
146 return CTX_RESULT_OK;
147}
149{
150 wmWindow *win = CTX_wm_window(C);
151 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
152 Scene *scene = WM_window_get_active_scene(win);
154 BKE_view_layer_synced_ensure(scene, view_layer);
155
157 if (BASE_SELECTABLE(v3d, base)) {
158 CTX_data_id_list_add(result, &base->object->id);
159 }
160 }
162 return CTX_RESULT_OK;
163}
165{
166 wmWindow *win = CTX_wm_window(C);
167 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
168 Scene *scene = WM_window_get_active_scene(win);
170 BKE_view_layer_synced_ensure(scene, view_layer);
171
173 if (BASE_SELECTED(v3d, base)) {
174 CTX_data_id_list_add(result, &base->object->id);
175 }
176 }
178 return CTX_RESULT_OK;
179}
182{
183 wmWindow *win = CTX_wm_window(C);
184 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
185 Scene *scene = WM_window_get_active_scene(win);
187 BKE_view_layer_synced_ensure(scene, view_layer);
188
190 if (BASE_SELECTED_EDITABLE(v3d, base)) {
191 CTX_data_id_list_add(result, &base->object->id);
192 }
193 }
195 return CTX_RESULT_OK;
196}
198{
199 wmWindow *win = CTX_wm_window(C);
200 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
201 Scene *scene = WM_window_get_active_scene(win);
203 BKE_view_layer_synced_ensure(scene, view_layer);
204
205 /* Visible + Editable, but not necessarily selected */
207 if (BASE_EDITABLE(v3d, base)) {
208 CTX_data_id_list_add(result, &base->object->id);
209 }
210 }
212 return CTX_RESULT_OK;
213}
215{
216 wmWindow *win = CTX_wm_window(C);
217 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
218 const Scene *scene = WM_window_get_active_scene(win);
220 BKE_view_layer_synced_ensure(scene, view_layer);
221 Object *obact = BKE_view_layer_active_object_get(view_layer);
222
223 if (obact && (obact->mode != OB_MODE_OBJECT)) {
224 FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, obact->type, obact->mode, ob_iter) {
225 CTX_data_id_list_add(result, &ob_iter->id);
226 }
228 }
230 return CTX_RESULT_OK;
231}
234{
235 wmWindow *win = CTX_wm_window(C);
236 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
237 const Scene *scene = WM_window_get_active_scene(win);
239 BKE_view_layer_synced_ensure(scene, view_layer);
240 Object *obact = BKE_view_layer_active_object_get(view_layer);
241
242 if (obact && (obact->mode != OB_MODE_OBJECT)) {
243 FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, obact->type, obact->mode, ob_iter) {
244 ob_iter->id.tag |= ID_TAG_DOIT;
245 }
247 FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, obact->type, obact->mode, ob_iter) {
248 if (ob_iter->id.tag & ID_TAG_DOIT) {
249 ob_iter->id.tag &= ~ID_TAG_DOIT;
250 CTX_data_id_list_add(result, &ob_iter->id);
251 }
252 }
254 }
256 return CTX_RESULT_OK;
257}
260 const bool editable_bones)
261{
262 wmWindow *win = CTX_wm_window(C);
263 const Scene *scene = WM_window_get_active_scene(win);
265 BKE_view_layer_synced_ensure(scene, view_layer);
266 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
267
268 bArmature *arm = static_cast<bArmature *>(
269 (obedit && obedit->type == OB_ARMATURE) ? obedit->data : nullptr);
270 EditBone *flipbone = nullptr;
271
272 if (arm && arm->edbo) {
274 scene, view_layer, CTX_wm_view3d(C));
275 for (Object *ob : objects) {
276 arm = static_cast<bArmature *>(ob->data);
277
278 /* Attention: X-Axis Mirroring is also handled here... */
279 LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) {
280 /* first and foremost, bone must be visible and selected */
281 if (blender::animrig::bone_is_visible(arm, ebone)) {
282 /* Get 'x-axis mirror equivalent' bone if the X-Axis Mirroring option is enabled
283 * so that most users of this data don't need to explicitly check for it themselves.
284 *
285 * We need to make sure that these mirrored copies are not selected, otherwise some
286 * bones will be operated on twice.
287 */
288 if (arm->flag & ARM_MIRROR_EDIT) {
289 flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
290 }
291
292 /* if we're filtering for editable too, use the check for that instead,
293 * as it has selection check too */
294 if (editable_bones) {
295 /* only selected + editable */
296 if (EBONE_EDITABLE(ebone)) {
297 CTX_data_list_add(result, &arm->id, &RNA_EditBone, ebone);
298
299 if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
300 CTX_data_list_add(result, &arm->id, &RNA_EditBone, flipbone);
301 }
302 }
303 }
304 else {
305 /* only include bones if visible */
306 CTX_data_list_add(result, &arm->id, &RNA_EditBone, ebone);
307
308 if ((flipbone) && blender::animrig::bone_is_visible(arm, flipbone) == 0) {
309 CTX_data_list_add(result, &arm->id, &RNA_EditBone, flipbone);
310 }
311 }
312 }
313 }
314 }
315
317 return CTX_RESULT_OK;
318 }
319 return CTX_RESULT_NO_DATA;
320}
331 const bool selected_editable_bones)
332{
333 wmWindow *win = CTX_wm_window(C);
334 const Scene *scene = WM_window_get_active_scene(win);
336 BKE_view_layer_synced_ensure(scene, view_layer);
337 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
338 bArmature *arm = static_cast<bArmature *>(
339 (obedit && obedit->type == OB_ARMATURE) ? obedit->data : nullptr);
340 EditBone *flipbone = nullptr;
341
342 if (arm && arm->edbo) {
344 scene, view_layer, CTX_wm_view3d(C));
345 for (Object *ob : objects) {
346 arm = static_cast<bArmature *>(ob->data);
347
348 /* Attention: X-Axis Mirroring is also handled here... */
349 LISTBASE_FOREACH (EditBone *, ebone, arm->edbo) {
350 /* first and foremost, bone must be visible and selected */
351 if (blender::animrig::bone_is_visible(arm, ebone) && (ebone->flag & BONE_SELECTED)) {
352 /* Get 'x-axis mirror equivalent' bone if the X-Axis Mirroring option is enabled
353 * so that most users of this data don't need to explicitly check for it themselves.
354 *
355 * We need to make sure that these mirrored copies are not selected, otherwise some
356 * bones will be operated on twice.
357 */
358 if (arm->flag & ARM_MIRROR_EDIT) {
359 flipbone = ED_armature_ebone_get_mirrored(arm->edbo, ebone);
360 }
361
362 /* if we're filtering for editable too, use the check for that instead,
363 * as it has selection check too */
364 if (selected_editable_bones) {
365 /* only selected + editable */
366 if (EBONE_EDITABLE(ebone)) {
367 CTX_data_list_add(result, &arm->id, &RNA_EditBone, ebone);
368
369 if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
370 CTX_data_list_add(result, &arm->id, &RNA_EditBone, flipbone);
371 }
372 }
373 }
374 else {
375 /* only include bones if selected */
376 CTX_data_list_add(result, &arm->id, &RNA_EditBone, ebone);
377
378 if ((flipbone) && !(flipbone->flag & BONE_SELECTED)) {
379 CTX_data_list_add(result, &arm->id, &RNA_EditBone, flipbone);
380 }
381 }
382 }
383 }
384 }
385
387 return CTX_RESULT_OK;
388 }
389 return CTX_RESULT_NO_DATA;
390}
401{
402 wmWindow *win = CTX_wm_window(C);
403 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
404 const Scene *scene = WM_window_get_active_scene(win);
406 BKE_view_layer_synced_ensure(scene, view_layer);
407 Object *obact = BKE_view_layer_active_object_get(view_layer);
408 Object *obpose = BKE_object_pose_armature_get(obact);
409 if (obpose && obpose->pose && obpose->data) {
410 if (obpose != obact) {
412 CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
413 }
415 }
416 else if (obact->mode & OB_MODE_POSE) {
417 FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, OB_ARMATURE, OB_MODE_POSE, ob_iter) {
419 CTX_data_list_add(result, &ob_iter->id, &RNA_PoseBone, pchan);
420 }
422 }
424 }
426 return CTX_RESULT_OK;
427 }
428 return CTX_RESULT_NO_DATA;
429}
431{
432 wmWindow *win = CTX_wm_window(C);
433 View3D *v3d = CTX_wm_view3d(C); /* This may be nullptr in a lot of cases. */
434 const Scene *scene = WM_window_get_active_scene(win);
436 Object *obact = BKE_view_layer_active_object_get(view_layer);
437 Object *obpose = BKE_object_pose_armature_get(obact);
438 if (obpose && obpose->pose && obpose->data) {
439 if (obpose != obact) {
441 CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
442 }
444 }
445 else if (obact->mode & OB_MODE_POSE) {
446 FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, OB_ARMATURE, OB_MODE_POSE, ob_iter) {
448 CTX_data_list_add(result, &ob_iter->id, &RNA_PoseBone, pchan);
449 }
451 }
453 }
455 return CTX_RESULT_OK;
456 }
457 return CTX_RESULT_NO_DATA;
458}
461{
462 wmWindow *win = CTX_wm_window(C);
463 const Scene *scene = WM_window_get_active_scene(win);
465 BKE_view_layer_synced_ensure(scene, view_layer);
466 Object *obact = BKE_view_layer_active_object_get(view_layer);
467 Object *obpose = BKE_object_pose_armature_get(obact);
468 if (obpose && obpose->pose && obpose->data) {
469 if (obpose != obact) {
471 CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
472 }
474 }
475 else if (obact->mode & OB_MODE_POSE) {
477 CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
478 }
480 }
482 return CTX_RESULT_OK;
483 }
484 return CTX_RESULT_NO_DATA;
485}
487{
488 wmWindow *win = CTX_wm_window(C);
489 const Scene *scene = WM_window_get_active_scene(win);
491 BKE_view_layer_synced_ensure(scene, view_layer);
492 Object *obact = BKE_view_layer_active_object_get(view_layer);
493 if (obact && obact->type == OB_ARMATURE) {
494 bArmature *arm = static_cast<bArmature *>(obact->data);
495 if (arm->edbo) {
496 if (arm->act_edbone) {
497 CTX_data_pointer_set(result, &arm->id, &RNA_EditBone, arm->act_edbone);
498 return CTX_RESULT_OK;
499 }
500 }
501 else {
502 if (arm->act_bone) {
503 CTX_data_pointer_set(result, &arm->id, &RNA_Bone, arm->act_bone);
504 return CTX_RESULT_OK;
505 }
506 }
507 }
508 return CTX_RESULT_NO_DATA;
509}
511{
512 wmWindow *win = CTX_wm_window(C);
513 const Scene *scene = WM_window_get_active_scene(win);
515 BKE_view_layer_synced_ensure(scene, view_layer);
516 Object *obact = BKE_view_layer_active_object_get(view_layer);
517 Object *obpose = BKE_object_pose_armature_get(obact);
518
520 if (pchan) {
521 CTX_data_pointer_set(result, &obpose->id, &RNA_PoseBone, pchan);
522 return CTX_RESULT_OK;
523 }
524 return CTX_RESULT_NO_DATA;
525}
527{
528 wmWindow *win = CTX_wm_window(C);
529 const Scene *scene = WM_window_get_active_scene(win);
531 BKE_view_layer_synced_ensure(scene, view_layer);
532 Object *obact = BKE_view_layer_active_object_get(view_layer);
533
534 if (obact) {
536 }
537
538 return CTX_RESULT_OK;
539}
540
542{
544 PropertyRNA *prop;
545 int index;
546
547 UI_context_active_but_prop_get(C, &ptr, &prop, &index);
548 if (ptr.data && prop) {
549 /* UI_context_active_but_prop_get returns an index of 0 if the property is not
550 * an array, but other functions expect -1 for non-arrays. */
551 if (!RNA_property_array_check(prop)) {
552 index = -1;
553 }
554
557 CTX_data_prop_set(result, prop, index);
558 }
559
560 return CTX_RESULT_OK;
561}
562
564{
565 wmWindow *win = CTX_wm_window(C);
566 const Scene *scene = WM_window_get_active_scene(win);
568 BKE_view_layer_synced_ensure(scene, view_layer);
569 Object *obact = BKE_view_layer_active_object_get(view_layer);
570
571 if (obact) {
573 }
574
575 return CTX_RESULT_OK;
576}
578{
579 wmWindow *win = CTX_wm_window(C);
580 Scene *scene = WM_window_get_active_scene(win);
582 BKE_view_layer_synced_ensure(scene, view_layer);
583 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
584 /* convenience for now, 1 object per scene in editmode */
585 if (obedit) {
587 }
588
589 return CTX_RESULT_OK;
590}
592{
593 wmWindow *win = CTX_wm_window(C);
594 const Scene *scene = WM_window_get_active_scene(win);
596 BKE_view_layer_synced_ensure(scene, view_layer);
597 Object *obact = BKE_view_layer_active_object_get(view_layer);
598
599 if (obact && (obact->mode & OB_MODE_SCULPT)) {
601 }
602
603 return CTX_RESULT_OK;
604}
606{
607 wmWindow *win = CTX_wm_window(C);
608 const Scene *scene = WM_window_get_active_scene(win);
610 BKE_view_layer_synced_ensure(scene, view_layer);
611 Object *obact = BKE_view_layer_active_object_get(view_layer);
612 if (obact && (obact->mode & OB_MODE_VERTEX_PAINT)) {
614 }
615
616 return CTX_RESULT_OK;
617}
619{
620 wmWindow *win = CTX_wm_window(C);
621 const Scene *scene = WM_window_get_active_scene(win);
623 BKE_view_layer_synced_ensure(scene, view_layer);
624 Object *obact = BKE_view_layer_active_object_get(view_layer);
625 if (obact && (obact->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
627 }
628
629 return CTX_RESULT_OK;
630}
632{
633 wmWindow *win = CTX_wm_window(C);
634 const Scene *scene = WM_window_get_active_scene(win);
636 BKE_view_layer_synced_ensure(scene, view_layer);
637 Object *obact = BKE_view_layer_active_object_get(view_layer);
638 if (obact && (obact->mode & OB_MODE_TEXTURE_PAINT)) {
640 }
641
642 return CTX_RESULT_OK;
643}
646{
647 wmWindow *win = CTX_wm_window(C);
648 const Scene *scene = WM_window_get_active_scene(win);
650 BKE_view_layer_synced_ensure(scene, view_layer);
651 Object *obact = BKE_view_layer_active_object_get(view_layer);
652 if (obact && (obact->mode & OB_MODE_PARTICLE_EDIT)) {
654 }
655
656 return CTX_RESULT_OK;
657}
659{
660 wmWindow *win = CTX_wm_window(C);
661 const Scene *scene = WM_window_get_active_scene(win);
663 BKE_view_layer_synced_ensure(scene, view_layer);
664 Object *obact = BKE_view_layer_active_object_get(view_layer);
665 Object *obpose = BKE_object_pose_armature_get(obact);
666 if (obpose) {
668 }
669 return CTX_RESULT_OK;
670}
671
691{
692 bAnimContext ac;
693 if (ANIM_animdata_get_context(C, &ac) != 0) {
694 ListBase anim_data = {nullptr, nullptr};
695
697 &ac, &anim_data, ANIMFILTER_DATA_VISIBLE, ac.data, eAnimCont_Types(ac.datatype));
698 LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
699 if (ale->datatype != ALE_NLASTRIP) {
700 continue;
701 }
702 NlaTrack *nlt = (NlaTrack *)ale->data;
703 LISTBASE_FOREACH (NlaStrip *, strip, &nlt->strips) {
704 if (strip->flag & NLASTRIP_FLAG_SELECT) {
705 CTX_data_list_add(result, ale->id, &RNA_NlaStrip, strip);
706 }
707 }
708 }
709 ANIM_animdata_freelist(&anim_data);
710
712 return CTX_RESULT_OK;
713 }
714 return CTX_RESULT_NO_DATA;
715}
718{
719 SpaceClip *space_clip = CTX_wm_space_clip(C);
720 if (space_clip == nullptr) {
721 return CTX_RESULT_NO_DATA;
722 }
723 MovieClip *clip = ED_space_clip_get_clip(space_clip);
724 if (clip == nullptr) {
725 return CTX_RESULT_NO_DATA;
726 }
727
728 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
729 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
730 if (!TRACK_SELECTED(track)) {
731 continue;
732 }
733 CTX_data_list_add(result, &clip->id, &RNA_MovieTrackingTrack, track);
734 }
735
737 return CTX_RESULT_OK;
738}
739
741{
742 wmWindow *win = CTX_wm_window(C);
743 bScreen *screen = CTX_wm_screen(C);
744 ScrArea *area = CTX_wm_area(C);
745 Scene *scene = WM_window_get_active_scene(win);
746 bGPdata *gpd = ED_annotation_data_get_active_direct((ID *)screen, area, scene);
747
748 if (gpd) {
750 return CTX_RESULT_OK;
751 }
752 return CTX_RESULT_NO_DATA;
753}
756{
757 wmWindow *win = CTX_wm_window(C);
758 bScreen *screen = CTX_wm_screen(C);
759 ScrArea *area = CTX_wm_area(C);
760 Scene *scene = WM_window_get_active_scene(win);
761
762 /* Pointer to which data/datablock owns the reference to the Grease Pencil data being used. */
764 bGPdata **gpd_ptr = ED_annotation_data_get_pointers_direct((ID *)screen, area, scene, &ptr);
765
766 if (gpd_ptr) {
768 return CTX_RESULT_OK;
769 }
770 return CTX_RESULT_NO_DATA;
771}
774{
775 wmWindow *win = CTX_wm_window(C);
776 bScreen *screen = CTX_wm_screen(C);
777 ScrArea *area = CTX_wm_area(C);
778 Scene *scene = WM_window_get_active_scene(win);
779 bGPdata *gpd = ED_annotation_data_get_active_direct((ID *)screen, area, scene);
780
781 if (gpd) {
783
784 if (gpl) {
785 CTX_data_pointer_set(result, &gpd->id, &RNA_AnnotationLayer, gpl);
786 return CTX_RESULT_OK;
787 }
788 }
789 return CTX_RESULT_NO_DATA;
790}
792{
793 wmWindow *win = CTX_wm_window(C);
794 const Scene *scene = WM_window_get_active_scene(win);
796 BKE_view_layer_synced_ensure(scene, view_layer);
797 Object *obact = BKE_view_layer_active_object_get(view_layer);
798 if (obact && obact->type == OB_GREASE_PENCIL) {
799 GreasePencil *grease_pencil = static_cast<GreasePencil *>(obact->data);
800 CTX_data_id_pointer_set(result, &grease_pencil->id);
801 return CTX_RESULT_OK;
802 }
803 return CTX_RESULT_NO_DATA;
804}
806{
807 wmOperator *op = nullptr;
808
809 SpaceFile *sfile = CTX_wm_space_file(C);
810 if (sfile) {
811 op = sfile->op;
812 }
813 else if ((op = UI_context_active_operator_get(C))) {
814 /* do nothing */
815 }
816 else {
817 /* NOTE: this checks poll, could be a problem, but this also
818 * happens for the toolbar */
820 }
821 /* TODO: get the operator from popup's. */
822
823 if (op && op->ptr) {
824 CTX_data_pointer_set(result, nullptr, &RNA_Operator, op);
825 return CTX_RESULT_OK;
826 }
827 return CTX_RESULT_NO_DATA;
828}
831 bool active_only,
832 bool editable)
833{
834 bAnimContext ac;
836 return CTX_RESULT_NO_DATA;
837 }
838
839 /* In the Action and Shape Key editor always use the action field at the top. */
840 if (ac.spacetype == SPACE_ACTION) {
841 SpaceAction *saction = (SpaceAction *)ac.sl;
842
843 if (ELEM(saction->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY)) {
844 ID *active_action_id = ac.active_action ? &ac.active_action->id : nullptr;
845
846 if (active_only) {
847 CTX_data_id_pointer_set(result, active_action_id);
848 }
849 else {
850 if (active_action_id && !(editable && !ID_IS_EDITABLE(active_action_id))) {
851 CTX_data_id_list_add(result, active_action_id);
852 }
853
855 }
856
857 return CTX_RESULT_OK;
858 }
859 }
860
861 /* Search for selected animation data items. */
862 ListBase anim_data = {nullptr, nullptr};
863
865 bool check_selected = false;
866
867 switch (ac.spacetype) {
868 case SPACE_GRAPH:
870 (active_only ? ANIMFILTER_ACTIVE : ANIMFILTER_SEL);
871 break;
872
873 case SPACE_ACTION:
875 check_selected = true;
876 break;
877 default:
879 }
880
882 &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype));
883
885
886 LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
887 /* In dope-sheet check selection status of individual items, skipping
888 * if not selected or has no selection flag. This is needed so that
889 * selecting action or group rows without any channels works. */
890 if (check_selected && ANIM_channel_setting_get(&ac, ale, ACHANNEL_SETTING_SELECT) <= 0) {
891 continue;
892 }
893
894 bAction *action = ANIM_channel_action_get(ale);
895 if (!action) {
896 continue;
897 }
898
899 if (active_only) {
901 break;
902 }
903 if (editable && !ID_IS_EDITABLE(action)) {
904 continue;
905 }
906
907 /* Add the action to the output list if not already added. */
908 if (seen_set.add(action)) {
909 CTX_data_id_list_add(result, &action->id);
910 }
911 }
912
913 ANIM_animdata_freelist(&anim_data);
914
915 if (!active_only) {
917 }
918
919 return CTX_RESULT_OK;
920}
937 const int extra_filter)
938{
939 bAnimContext ac;
941 ListBase anim_data = {nullptr, nullptr};
942
944 (ac.spacetype == SPACE_GRAPH ?
947 extra_filter;
948
950 &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype));
951
952 LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
953 if (ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_NLACURVE)) {
954 CTX_data_list_add(result, ale->fcurve_owner_id, &RNA_FCurve, ale->data);
955 }
956 }
957
958 ANIM_animdata_freelist(&anim_data);
959
961 return CTX_RESULT_OK;
962 }
963 return CTX_RESULT_NO_DATA;
964}
985{
986 bAnimContext ac;
988 ListBase anim_data = {nullptr, nullptr};
989
992
994 &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype));
995
996 LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
997 if (ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_NLACURVE)) {
998 CTX_data_pointer_set(result, ale->fcurve_owner_id, &RNA_FCurve, ale->data);
999 break;
1000 }
1001 }
1002
1003 ANIM_animdata_freelist(&anim_data);
1004 return CTX_RESULT_OK;
1005 }
1006 return CTX_RESULT_NO_DATA;
1007}
1010{
1011 bAnimContext ac;
1013 ListBase anim_data = {nullptr, nullptr};
1014
1015 /* Use keyframes from editable selected FCurves. */
1018 (ac.spacetype == SPACE_GRAPH ?
1021
1023 &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype));
1024
1025 int i;
1026 FCurve *fcurve;
1027 BezTriple *bezt;
1028 LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) {
1029 if (!ELEM(ale->type, ANIMTYPE_FCURVE, ANIMTYPE_NLACURVE)) {
1030 continue;
1031 }
1032
1033 fcurve = (FCurve *)ale->data;
1034 if (fcurve->bezt == nullptr) {
1035 /* Skip baked FCurves. */
1036 continue;
1037 }
1038
1039 for (i = 0, bezt = fcurve->bezt; i < fcurve->totvert; i++, bezt++) {
1040 if ((bezt->f2 & SELECT) == 0) {
1041 continue;
1042 }
1043
1044 CTX_data_list_add(result, ale->fcurve_owner_id, &RNA_Keyframe, bezt);
1045 }
1046 }
1047
1048 ANIM_animdata_freelist(&anim_data);
1049
1051 return CTX_RESULT_OK;
1052 }
1053 return CTX_RESULT_NO_DATA;
1054}
1055
1057{
1058 WorkSpace *workspace = CTX_wm_workspace(C);
1060 result, &workspace->id, &RNA_AssetLibraryReference, &workspace->asset_library_ref);
1061 return CTX_RESULT_OK;
1062}
1063
1065{
1066 wmWindow *win = CTX_wm_window(C);
1067 ARegion *region = CTX_wm_region(C);
1068 if (region) {
1069 uiList *list = UI_list_find_mouse_over(region, win->eventstate);
1070 if (list) {
1071 CTX_data_pointer_set(result, nullptr, &RNA_UIList, list);
1072 return CTX_RESULT_OK;
1073 }
1074 }
1075 return CTX_RESULT_NO_DATA;
1076}
1077
1079{
1081 if (!scene) {
1082 return CTX_RESULT_NO_DATA;
1083 }
1084 Strip *strip = blender::seq::select_active_get(scene);
1085 if (strip) {
1086 CTX_data_pointer_set(result, &scene->id, &RNA_Strip, strip);
1087 return CTX_RESULT_OK;
1088 }
1089 return CTX_RESULT_NO_DATA;
1090}
1092{
1094 if (!scene) {
1095 return CTX_RESULT_NO_DATA;
1096 }
1098 if (ed) {
1099 LISTBASE_FOREACH (Strip *, strip, ed->current_strips()) {
1100 CTX_data_list_add(result, &scene->id, &RNA_Strip, strip);
1101 }
1103 return CTX_RESULT_OK;
1104 }
1105 return CTX_RESULT_NO_DATA;
1106}
1108{
1110 if (!scene) {
1111 return CTX_RESULT_NO_DATA;
1112 }
1114 if (ed) {
1115 LISTBASE_FOREACH (Strip *, strip, ed->current_strips()) {
1116 if (strip->flag & SELECT) {
1117 CTX_data_list_add(result, &scene->id, &RNA_Strip, strip);
1118 }
1119 }
1121 return CTX_RESULT_OK;
1122 }
1123 return CTX_RESULT_NO_DATA;
1124}
1127{
1129 if (!scene) {
1130 return CTX_RESULT_NO_DATA;
1131 }
1133 if (ed == nullptr) {
1134 return CTX_RESULT_NO_DATA;
1135 }
1136
1138 LISTBASE_FOREACH (Strip *, strip, ed->current_strips()) {
1139 if (strip->flag & SELECT && !blender::seq::transform_is_locked(channels, strip)) {
1140 CTX_data_list_add(result, &scene->id, &RNA_Strip, strip);
1141 }
1142 }
1144 return CTX_RESULT_OK;
1145}
1147{
1149 if (scene) {
1151 return CTX_RESULT_OK;
1152 }
1153 return CTX_RESULT_NO_DATA;
1154}
1155
1156/* Registry of context callback functions. */
1157
1159
1162{
1163 static blender::Map<blender::StringRef, context_callback> screen_context_functions = []() {
1165 map.add("scene", screen_ctx_scene);
1166 map.add("visible_objects", screen_ctx_visible_objects);
1167 map.add("selectable_objects", screen_ctx_selectable_objects);
1168 map.add("selected_objects", screen_ctx_selected_objects);
1169 map.add("selected_editable_objects", screen_ctx_selected_editable_objects);
1170 map.add("editable_objects", screen_ctx_editable_objects);
1171 map.add("objects_in_mode", screen_ctx_objects_in_mode);
1172 map.add("objects_in_mode_unique_data", screen_ctx_objects_in_mode_unique_data);
1173 map.add("visible_bones", screen_ctx_visible_bones);
1174 map.add("editable_bones", screen_ctx_editable_bones);
1175 map.add("selected_bones", screen_ctx_selected_bones);
1176 map.add("selected_editable_bones", screen_ctx_selected_editable_bones);
1177 map.add("visible_pose_bones", screen_ctx_visible_pose_bones);
1178 map.add("selected_pose_bones", screen_ctx_selected_pose_bones);
1179 map.add("selected_pose_bones_from_active_object",
1181 map.add("active_bone", screen_ctx_active_bone);
1182 map.add("active_pose_bone", screen_ctx_active_pose_bone);
1183 map.add("active_object", screen_ctx_active_object);
1184 map.add("object", screen_ctx_object);
1185 map.add("edit_object", screen_ctx_edit_object);
1186 map.add("sculpt_object", screen_ctx_sculpt_object);
1187 map.add("vertex_paint_object", screen_ctx_vertex_paint_object);
1188 map.add("weight_paint_object", screen_ctx_weight_paint_object);
1189 map.add("image_paint_object", screen_ctx_image_paint_object);
1190 map.add("particle_edit_object", screen_ctx_particle_edit_object);
1191 map.add("pose_object", screen_ctx_pose_object);
1192 map.add("active_nla_track", screen_ctx_active_nla_track);
1193 map.add("active_nla_strip", screen_ctx_active_nla_strip);
1194 map.add("selected_nla_strips", screen_ctx_selected_nla_strips);
1195 map.add("selected_movieclip_tracks", screen_ctx_selected_movieclip_tracks);
1196 map.add("annotation_data", screen_ctx_annotation_data);
1197 map.add("annotation_data_owner", screen_ctx_annotation_data_owner);
1198 map.add("active_annotation_layer", screen_ctx_active_annotation_layer);
1199 map.add("grease_pencil", screen_ctx_grease_pencil_data);
1200 map.add("active_operator", screen_ctx_active_operator);
1201 map.add("active_action", screen_ctx_active_action);
1202 map.add("selected_visible_actions", screen_ctx_selected_visible_actions);
1203 map.add("selected_editable_actions", screen_ctx_selected_editable_actions);
1204 map.add("editable_fcurves", screen_ctx_editable_fcurves);
1205 map.add("visible_fcurves", screen_ctx_visible_fcurves);
1206 map.add("selected_editable_fcurves", screen_ctx_selected_editable_fcurves);
1207 map.add("selected_visible_fcurves", screen_ctx_selected_visible_fcurves);
1208 map.add("active_editable_fcurve", screen_ctx_active_editable_fcurve);
1209 map.add("selected_editable_keyframes", screen_ctx_selected_editable_keyframes);
1210 map.add("asset_library_reference", screen_ctx_asset_library);
1211 map.add("ui_list", screen_ctx_ui_list);
1212 map.add("property", screen_ctx_property);
1213 map.add("active_strip", screen_ctx_active_strip);
1214 map.add("strips", screen_ctx_strips);
1215 map.add("selected_strips", screen_ctx_selected_strips);
1216 map.add("selected_editable_strips", screen_ctx_selected_editable_strips);
1217 map.add("sequencer_scene", screen_ctx_sequencer_scene);
1218 return map;
1219 }();
1220 return screen_context_functions;
1221}
1222
1223int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
1224{
1225 if (CTX_data_dir(member)) {
1227 return CTX_RESULT_OK;
1228 }
1229
1232 context_callback callback = functions.lookup_default(member, nullptr);
1233 if (callback == nullptr) {
1235 }
1236
1237 return callback(C, result);
1238}
Functions and classes to work with Actions.
Functions to deal with Armatures.
C++ functions to deal with Armature collections (i.e. the successor of bone layers).
Blender kernel action and pose functionality.
bPoseChannel * BKE_pose_channel_active_if_bonecoll_visible(Object *ob) ATTR_WARN_UNUSED_RESULT
#define FOREACH_PCHAN_SELECTED_IN_OBJECT_END
#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_BEGIN(_ob, _pchan)
#define FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN(_ob, _pchan)
#define FOREACH_PCHAN_VISIBLE_IN_OBJECT_END
WorkSpace * CTX_wm_workspace(const bContext *C)
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
void CTX_data_id_list_add(bContextDataResult *result, ID *id)
bScreen * CTX_wm_screen(const bContext *C)
void CTX_data_prop_set(bContextDataResult *result, PropertyRNA *prop, int index)
void CTX_data_pointer_set(bContextDataResult *result, ID *id, StructRNA *type, void *data)
bool CTX_data_dir(const char *member)
void CTX_data_id_pointer_set(bContextDataResult *result, ID *id)
void CTX_data_type_set(bContextDataResult *result, ContextDataType type)
SpaceFile * CTX_wm_space_file(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
eContextResult
@ CTX_RESULT_MEMBER_NOT_FOUND
@ CTX_RESULT_OK
@ CTX_RESULT_NO_DATA
void CTX_data_list_add(bContextDataResult *result, ID *id, StructRNA *type, void *data)
void CTX_data_pointer_set_ptr(bContextDataResult *result, const PointerRNA *ptr)
SpaceClip * CTX_wm_space_clip(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
struct bGPDlayer * BKE_gpencil_layer_active_get(struct bGPdata *gpd)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
#define FOREACH_OBJECT_IN_MODE_END
Definition BKE_layer.hh:382
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
#define FOREACH_OBJECT_IN_MODE_BEGIN(_scene, _view_layer, _v3d, _object_type, _object_mode, _instance)
Definition BKE_layer.hh:377
blender::Vector< Object * > BKE_view_layer_array_from_objects_in_edit_mode_unique_data(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
General operations, lookup, etc. for blender objects.
Object * BKE_object_pose_armature_get(Object *ob)
#define TRACK_SELECTED(track)
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define LISTBASE_FOREACH(type, var, list)
#define ELEM(...)
@ ID_TAG_DOIT
Definition DNA_ID.h:1036
#define ID_IS_EDITABLE(_id)
Definition DNA_ID.h:705
@ SACTCONT_ACTION
@ SACTCONT_SHAPEKEY
@ NLASTRIP_FLAG_SELECT
@ BONE_SELECTED
@ ARM_MIRROR_EDIT
#define OB_MODE_ALL_WEIGHT_PAINT
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_SCULPT
@ OB_MODE_POSE
@ OB_MODE_TEXTURE_PAINT
@ OB_MODE_OBJECT
@ OB_MODE_VERTEX_PAINT
Object is a sort of wrapper for general info.
@ OB_GREASE_PENCIL
@ OB_ARMATURE
#define BASE_SELECTED(v3d, base)
#define BASE_SELECTED_EDITABLE(v3d, base)
#define BASE_EDITABLE(v3d, base)
#define BASE_SELECTABLE(v3d, base)
#define BASE_VISIBLE(v3d, base)
@ SPACE_ACTION
@ SPACE_GRAPH
@ ANIMTYPE_NLACURVE
@ ANIMTYPE_FCURVE
@ ALE_NLASTRIP
eAnimCont_Types
@ ACHANNEL_SETTING_SELECT
bool ANIM_nla_context_strip_ptr(const bContext *C, PointerRNA *r_ptr)
bool ANIM_nla_context_track_ptr(const bContext *C, PointerRNA *r_ptr)
eAnimFilter_Flags
@ ANIMFILTER_ACTIVE
@ ANIMFILTER_FOREDIT
@ ANIMFILTER_DATA_VISIBLE
@ ANIMFILTER_CURVE_VISIBLE
@ ANIMFILTER_LIST_VISIBLE
@ ANIMFILTER_LIST_CHANNELS
@ ANIMFILTER_NODUPLIS
@ ANIMFILTER_FCURVESONLY
@ ANIMFILTER_SEL
#define EBONE_EDITABLE(ebone)
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
#define C
Definition RandGen.cpp:29
uiList * UI_list_find_mouse_over(const ARegion *region, const wmEvent *event)
uiBut * UI_context_active_but_prop_get(const bContext *C, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
wmOperator * UI_context_active_operator_get(const bContext *C)
bAction * ANIM_channel_action_get(const bAnimListElem *ale)
short ANIM_channel_setting_get(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting)
void ANIM_animdata_freelist(ListBase *anim_data)
Definition anim_deps.cc:463
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, void *data, const eAnimCont_Types datatype)
EditBone * ED_armature_ebone_get_mirrored(const ListBase *edbo, EditBone *ebo)
bool add(const Key &key, const Value &value)
Definition BLI_map.hh:295
Value lookup_default(const Key &key, const Value &default_value) const
Definition BLI_map.hh:570
bool add(const Key &key)
Definition BLI_set.hh:248
#define SELECT
bGPdata * ED_annotation_data_get_active_direct(ID *screen_id, ScrArea *area, Scene *scene)
bGPdata ** ED_annotation_data_get_pointers_direct(ID *screen_id, ScrArea *area, Scene *scene, PointerRNA *r_ptr)
#define filter
bool bone_is_visible(const bArmature *armature, const Bone *bone)
ListBase * channels_displayed_get(const Editing *ed)
Definition channels.cc:28
Editing * editing_get(const Scene *scene)
Definition sequencer.cc:286
Strip * select_active_get(const Scene *scene)
bool transform_is_locked(ListBase *channels, const Strip *strip)
bool RNA_property_array_check(PropertyRNA *prop)
static eContextResult screen_ctx_selected_pose_bones(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_objects_in_mode_unique_data(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_sequencer_scene(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_editable_objects(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_operator(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_sel_edit_fcurves_(const bContext *C, bContextDataResult *result, const int extra_filter)
static eContextResult screen_ctx_asset_library(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_ui_list(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_property(const bContext *C, bContextDataResult *result)
const char * screen_context_dir[]
static eContextResult screen_ctx_selected_objects(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_bones(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_nla_strips(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_strips(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_editable_objects(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_annotation_layer(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_visible_pose_bones(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_pose_object(const bContext *C, bContextDataResult *result)
eContextResult(*)(const bContext *C, bContextDataResult *result) context_callback
static eContextResult screen_ctx_selected_visible_fcurves(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_strips(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_annotation_data(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_edit_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_bone(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_objects_in_mode(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selectable_objects(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_annotation_data_owner(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_strip(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_visible_actions(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_visible_fcurves(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_editable_fcurves(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_editable_strips(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_editable_actions(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_particle_edit_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_editable_bones(const bContext *C, bContextDataResult *result)
int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
static eContextResult screen_ctx_visible_objects(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_editable_bones(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_editable_keyframes(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_editable_fcurves(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_sel_actions_impl(const bContext *C, bContextDataResult *result, bool active_only, bool editable)
static eContextResult screen_ctx_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_editable_fcurve(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_bones_(const bContext *C, bContextDataResult *result, const bool selected_editable_bones)
static eContextResult screen_ctx_grease_pencil_data(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_pose_bones_from_active_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_visible_bones(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_vertex_paint_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_pose_bone(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_sculpt_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_nla_strip(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_visible_or_editable_bones_(const bContext *C, bContextDataResult *result, const bool editable_bones)
static eContextResult screen_ctx_active_nla_track(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_image_paint_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_scene(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_weight_paint_object(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_active_action(const bContext *C, bContextDataResult *result)
static eContextResult screen_ctx_selected_movieclip_tracks(const bContext *C, bContextDataResult *result)
static const blender::Map< blender::StringRef, context_callback > & ensure_ed_screen_context_functions()
BezTriple * bezt
Definition DNA_ID.h:414
struct MovieTracking tracking
ListBase strips
struct bPose * pose
struct wmOperator * op
AssetLibraryReference asset_library_ref
SpaceLink * sl
eAnimCont_Types datatype
bAction * active_action
eSpace_Type spacetype
struct EditBone * act_edbone
ListBase * edbo
struct PointerRNA * ptr
struct wmEvent * eventstate
i
Definition text_draw.cc:230
PointerRNA * ptr
Definition wm_files.cc:4238
wmOperator * WM_operator_last_redo(const bContext *C)
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)