Blender V5.0
BKE_context.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include <variant>
12
13#include "BLI_string_ref.hh"
14#include "BLI_vector.hh"
15
16#include "DNA_listBase.h"
17#include "DNA_object_enums.h"
18#include "RNA_types.hh"
19
20struct ARegion;
23struct Base;
24struct bGPDframe;
25struct bGPDlayer;
26struct bPoseChannel;
27struct bScreen;
28struct CacheFile;
29struct Collection;
30struct Depsgraph;
31struct EditBone;
32struct ID;
33struct Image;
34struct LayerCollection;
35struct ListBase;
36struct Main;
37struct Mask;
38struct MovieClip;
39struct Object;
40struct PointerRNA;
41struct RegionView3D;
42struct RenderEngineType;
43struct ReportList;
44struct Scene;
45struct ScrArea;
46struct SpaceAction;
47struct SpaceClip;
48struct SpaceClip;
49struct SpaceConsole;
50struct SpaceFile;
51struct SpaceGraph;
52struct SpaceImage;
53struct SpaceInfo;
54struct SpaceLink;
55struct SpaceNla;
56struct SpaceNode;
57struct SpaceOutliner;
58struct SpaceProperties;
59struct SpaceSeq;
60struct SpaceSpreadsheet;
61struct SpaceText;
62struct SpaceTopBar;
63struct SpaceUserPref;
64struct StructRNA;
65struct Text;
66struct ToolSettings;
67struct View3D;
68struct ViewLayer;
69struct wmGizmoGroup;
70struct wmMsgBus;
71struct wmWindow;
72struct wmWindowManager;
73struct WorkSpace;
74
75/* Structs */
76
77struct bContext;
78
80
81/* Result of context lookups.
82 * The specific values are important, and used implicitly in ctx_data_get(). Some functions also
83 * still accept/return `int` instead, to ensure that the compiler uses the correct storage size
84 * when mixing C/C++ code. */
86 /* The context member was found, and its data is available. */
88
89 /* The context member was not found. */
91
92 /* The context member was found, but its data is not available.
93 * For example, "active_bone" is a valid context member, but has not data in Object mode. */
95};
96
97/* Function mapping a context member name to its value. */
98using bContextDataCallback = int /*eContextResult*/ (*)(const bContext *C,
99 const char *member,
101
103 std::string name;
104 std::variant<PointerRNA, std::string, int64_t> value;
105};
106
111
112namespace blender::asset_system {
113class AssetRepresentation;
114}
115
116/* for the context's rna mode enum
117 * keep aligned with data_mode_strings in context.cc */
147#define CTX_MODE_NUM (CTX_MODE_VERTEX_GREASE_PENCIL + 1)
148
149/* Context */
150
152void CTX_free(bContext *C);
153
154bContext *CTX_copy(const bContext *C);
155
156/* Stored Context */
157
158bContextStore *CTX_store_add(blender::Vector<std::unique_ptr<bContextStore>> &contexts,
160 const PointerRNA *ptr);
161bContextStore *CTX_store_add(blender::Vector<std::unique_ptr<bContextStore>> &contexts,
164bContextStore *CTX_store_add(blender::Vector<std::unique_ptr<bContextStore>> &contexts,
166 int64_t value);
167bContextStore *CTX_store_add_all(blender::Vector<std::unique_ptr<bContextStore>> &contexts,
168 const bContextStore *context);
170void CTX_store_set(bContext *C, const bContextStore *store);
173 const StructRNA *type = nullptr);
174std::optional<blender::StringRefNull> CTX_store_string_lookup(const bContextStore *store,
176std::optional<int64_t> CTX_store_int_lookup(const bContextStore *store, blender::StringRef name);
177
179bool CTX_py_init_get(const bContext *C);
180void CTX_py_init_set(bContext *C, bool value);
181
182void *CTX_py_dict_get(const bContext *C);
183void *CTX_py_dict_get_orig(const bContext *C);
184
189void CTX_py_state_push(bContext *C, bContext_PyState *pystate, void *value);
191
192/* Window Manager Context */
193
201void *CTX_wm_region_data(const bContext *C);
206
225
228void CTX_wm_screen_set(bContext *C, bScreen *screen); /* to be removed */
229void CTX_wm_area_set(bContext *C, ScrArea *area);
230void CTX_wm_region_set(bContext *C, ARegion *region);
231void CTX_wm_region_popup_set(bContext *C, ARegion *region_popup);
233
241 char *(*get_fn)(bContext *C, void *user_data);
243 void (*free_fn)(bContext *C, void *user_data);
245};
246
247const char *CTX_wm_operator_poll_msg_get(bContext *C, bool *r_free);
248
260void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg);
263
264/* Data Context
265 *
266 * - The dir #ListBase consists of #LinkData items.
267 */
268
277
278PointerRNA CTX_data_pointer_get(const bContext *C, const char *member);
279PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type);
281 const char *member,
282 StructRNA *type);
284
294 const char *propname);
295
296std::optional<blender::StringRefNull> CTX_data_string_get(const bContext *C, const char *member);
297std::optional<int64_t> CTX_data_int_get(const bContext *C, const char *member);
298
305ListBase CTX_data_dir_get_ex(const bContext *C, bool use_store, bool use_rna, bool use_all);
307int /*eContextResult*/ CTX_data_get(const bContext *C,
308 const char *member,
309 PointerRNA *r_ptr,
311 PropertyRNA **r_prop,
312 int *r_index,
313 blender::StringRef *r_str,
314 std::optional<int64_t> *r_int_value,
315 ContextDataType *r_type);
316
320
324
333
334void CTX_data_dir_set(bContextDataResult *result, const char **dir);
335
338
339bool CTX_data_equals(const char *member, const char *str);
340bool CTX_data_dir(const char *member);
341
342#define CTX_DATA_BEGIN(C, Type, instance, member) \
343 { \
344 blender::Vector<PointerRNA> ctx_data_list; \
345 CTX_data_##member(C, &ctx_data_list); \
346 for (PointerRNA &ctx_link : ctx_data_list) { \
347 Type instance = (Type)ctx_link.data;
348
349#define CTX_DATA_END \
350 } \
351 } \
352 (void)0
353
354#define CTX_DATA_BEGIN_WITH_ID(C, Type, instance, member, Type_id, instance_id) \
355 CTX_DATA_BEGIN (C, Type, instance, member) \
356 Type_id instance_id = (Type_id)ctx_link.owner_id;
357
359 bool (*func)(const bContext *, blender::Vector<PointerRNA> *));
360
361#define CTX_DATA_COUNT(C, member) ctx_data_list_count(C, CTX_data_##member)
362
363/* Data Context Members */
364
380
381const char *CTX_data_mode_string(const bContext *C);
383 const Object *ob,
384 eObjectMode object_mode);
386
387void CTX_data_main_set(bContext *C, Main *bmain);
388void CTX_data_scene_set(bContext *C, Scene *scene);
389
390/* Only Outliner currently! */
392
395
398
401
404
407
411
413
417
419
421
427
433
436
438
448Depsgraph *CTX_data_depsgraph_pointer(const bContext *C);
449
458
469
470/* Will Return NULL if depsgraph is not allocated yet.
471 * Only used by handful of operators which are run on file load.
472 */
473Depsgraph *CTX_data_depsgraph_on_load(const bContext *C);
474
478void CTX_member_logging_set(bContext *C, bool enable);
479
SpaceGraph * CTX_wm_space_graph(const bContext *C)
Image * CTX_data_edit_image(const bContext *C)
blender::Vector< PointerRNA > CTX_data_collection_get(const bContext *C, const char *member)
bool CTX_data_selectable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
Depsgraph * CTX_data_expect_evaluated_depsgraph(const bContext *C)
void CTX_data_main_set(bContext *C, Main *bmain)
void CTX_member_logging_set(bContext *C, bool enable)
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
void CTX_wm_gizmo_group_set(bContext *C, wmGizmoGroup *gzgroup)
const char * CTX_data_mode_string(const bContext *C)
void CTX_py_state_push(bContext *C, bContext_PyState *pystate, void *value)
WorkSpace * CTX_wm_workspace(const bContext *C)
bContextStore * CTX_store_add_all(blender::Vector< std::unique_ptr< bContextStore > > &contexts, const bContextStore *context)
bool CTX_data_visible_bones(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_wm_interface_locked(const bContext *C)
SpaceText * CTX_wm_space_text(const bContext *C)
std::optional< blender::StringRefNull > CTX_store_string_lookup(const bContextStore *store, blender::StringRef name)
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
bool CTX_data_selected_bones(const bContext *C, blender::Vector< PointerRNA > *list)
bPoseChannel * CTX_data_active_pose_bone(const bContext *C)
PointerRNA CTX_data_pointer_get_type_silent(const bContext *C, const char *member, StructRNA *type)
SpaceUserPref * CTX_wm_space_userpref(const bContext *C)
SpaceTopBar * CTX_wm_space_topbar(const bContext *C)
void CTX_data_id_list_add(bContextDataResult *result, ID *id)
SpaceImage * CTX_wm_space_image(const bContext *C)
bool CTX_data_equals(const char *member, const char *str)
ReportList * CTX_wm_reports(const bContext *C)
bScreen * CTX_wm_screen(const bContext *C)
SpaceNla * CTX_wm_space_nla(const bContext *C)
bool CTX_data_visible_bases(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_visible_objects(const bContext *C, blender::Vector< PointerRNA > *list)
Mask * CTX_data_edit_mask(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)
LayerCollection * CTX_data_layer_collection(const bContext *C)
bool CTX_data_selected_pose_bones_from_active_object(const bContext *C, blender::Vector< PointerRNA > *list)
SpaceOutliner * CTX_wm_space_outliner(const bContext *C)
CacheFile * CTX_data_edit_cachefile(const bContext *C)
MovieClip * CTX_data_edit_movieclip(const bContext *C)
bool CTX_data_dir(const char *member)
void CTX_data_id_pointer_set(bContextDataResult *result, ID *id)
void * CTX_wm_region_data(const bContext *C)
void CTX_data_type_set(bContextDataResult *result, ContextDataType type)
void CTX_py_state_pop(bContext *C, bContext_PyState *pystate)
SpaceAction * CTX_wm_space_action(const bContext *C)
SpaceConsole * CTX_wm_space_console(const bContext *C)
void CTX_wm_manager_set(bContext *C, wmWindowManager *wm)
ARegion * CTX_wm_region_popup(const bContext *C)
void CTX_wm_operator_poll_msg_clear(bContext *C)
int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, blender::Vector< PointerRNA > *r_lb, PropertyRNA **r_prop, int *r_index, blender::StringRef *r_str, std::optional< int64_t > *r_int_value, ContextDataType *r_type)
void CTX_py_init_set(bContext *C, bool value)
SpaceFile * CTX_wm_space_file(const bContext *C)
bContextStore * CTX_store_add(blender::Vector< std::unique_ptr< bContextStore > > &contexts, blender::StringRef name, const PointerRNA *ptr)
eContextObjectMode
@ CTX_MODE_VERTEX_GPENCIL_LEGACY
@ CTX_MODE_WEIGHT_GPENCIL_LEGACY
@ CTX_MODE_SCULPT_GPENCIL_LEGACY
@ CTX_MODE_PAINT_GREASE_PENCIL
@ CTX_MODE_PAINT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_CURVE
@ CTX_MODE_PAINT_TEXTURE
@ CTX_MODE_EDIT_SURFACE
@ CTX_MODE_SCULPT_GREASE_PENCIL
@ CTX_MODE_PARTICLE
@ CTX_MODE_SCULPT
@ CTX_MODE_OBJECT
@ CTX_MODE_EDIT_MESH
@ CTX_MODE_EDIT_POINTCLOUD
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_SCULPT_CURVES
@ CTX_MODE_EDIT_TEXT
@ CTX_MODE_EDIT_CURVES
@ CTX_MODE_EDIT_ARMATURE
@ CTX_MODE_EDIT_LATTICE
@ CTX_MODE_WEIGHT_GREASE_PENCIL
@ CTX_MODE_VERTEX_GREASE_PENCIL
@ CTX_MODE_PAINT_VERTEX
@ CTX_MODE_EDIT_METABALL
@ CTX_MODE_PAINT_WEIGHT
@ CTX_MODE_EDIT_GPENCIL_LEGACY
@ CTX_MODE_POSE
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
SpaceNode * CTX_wm_space_node(const bContext *C)
bContext * CTX_copy(const bContext *C)
SpaceProperties * CTX_wm_space_properties(const bContext *C)
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
bool CTX_data_editable_bones(const bContext *C, blender::Vector< PointerRNA > *list)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
std::optional< int64_t > CTX_store_int_lookup(const bContextStore *store, blender::StringRef name)
void CTX_free(bContext *C)
Object * CTX_data_active_object(const bContext *C)
ListBase CTX_data_dir_get(const bContext *C)
const AssetLibraryReference * CTX_wm_asset_library_ref(const bContext *C)
void CTX_wm_operator_poll_msg_set_dynamic(bContext *C, const bContextPollMsgDyn_Params *params)
Text * CTX_data_edit_text(const bContext *C)
const PointerRNA * CTX_store_ptr_lookup(const bContextStore *store, blender::StringRef name, const StructRNA *type=nullptr)
std::optional< int64_t > CTX_data_int_get(const bContext *C, const char *member)
bool CTX_py_init_get(const bContext *C)
ListBase CTX_data_dir_get_ex(const bContext *C, bool use_store, bool use_rna, bool use_all)
RenderEngineType * CTX_data_engine_type(const bContext *C)
eContextResult
@ CTX_RESULT_MEMBER_NOT_FOUND
@ CTX_RESULT_OK
@ CTX_RESULT_NO_DATA
SpaceLink * CTX_wm_space_data(const bContext *C)
void CTX_wm_screen_set(bContext *C, bScreen *screen)
void CTX_data_scene_set(bContext *C, Scene *scene)
Scene * CTX_data_scene(const bContext *C)
int ctx_data_list_count(const bContext *C, bool(*func)(const bContext *, blender::Vector< PointerRNA > *))
SpaceSeq * CTX_wm_space_seq(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, eObjectMode object_mode)
class blender::asset_system::AssetRepresentation * CTX_wm_asset(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
void CTX_data_list_add(bContextDataResult *result, ID *id, StructRNA *type, void *data)
bool CTX_data_selectable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
Base * CTX_data_active_base(const bContext *C)
void CTX_wm_window_set(bContext *C, wmWindow *win)
bool CTX_data_selected_objects(const bContext *C, blender::Vector< PointerRNA > *list)
Main * CTX_data_main(const bContext *C)
bool CTX_data_selected_editable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_visible_pose_bones(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_editable_objects(const bContext *C, blender::Vector< PointerRNA > *list)
bool CTX_data_editable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
void * CTX_py_dict_get_orig(const bContext *C)
const bContextStore * CTX_store_get(const bContext *C)
void CTX_data_list_add_ptr(bContextDataResult *result, const PointerRNA *ptr)
bool CTX_data_selected_nodes(const bContext *C, blender::Vector< PointerRNA > *list)
const char * CTX_wm_operator_poll_msg_get(bContext *C, bool *r_free)
void CTX_data_pointer_set_ptr(bContextDataResult *result, const PointerRNA *ptr)
void CTX_store_set(bContext *C, const bContextStore *store)
wmGizmoGroup * CTX_wm_gizmo_group(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
bool CTX_data_selected_editable_bases(const bContext *C, blender::Vector< PointerRNA > *list)
SpaceInfo * CTX_wm_space_info(const bContext *C)
bool CTX_data_selected_pose_bones(const bContext *C, blender::Vector< PointerRNA > *list)
ContextDataType CTX_data_type_get(bContextDataResult *result)
void CTX_data_collection_remap_property(blender::MutableSpan< PointerRNA > collection_pointers, const char *propname)
void CTX_wm_area_set(bContext *C, ScrArea *area)
SpaceClip * CTX_wm_space_clip(const bContext *C)
bool CTX_data_selected_bases(const bContext *C, blender::Vector< PointerRNA > *list)
EditBone * CTX_data_active_bone(const bContext *C)
void CTX_wm_region_set(bContext *C, ARegion *region)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
bool CTX_member_logging_get(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
Collection * CTX_data_collection(const bContext *C)
bool CTX_data_selected_editable_bones(const bContext *C, blender::Vector< PointerRNA > *list)
void * CTX_py_dict_get(const bContext *C)
Depsgraph * CTX_data_depsgraph_on_load(const bContext *C)
SpaceSpreadsheet * CTX_wm_space_spreadsheet(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
int(*)(const bContext *C, const char *member, bContextDataResult *result) bContextDataCallback
bContext * CTX_create()
std::optional< blender::StringRefNull > CTX_data_string_get(const bContext *C, const char *member)
wmMsgBus * CTX_wm_message_bus(const bContext *C)
ContextDataType
void CTX_wm_region_popup_set(bContext *C, ARegion *region_popup)
View3D * CTX_wm_view3d(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
bool CTX_data_selected_ids(const bContext *C, blender::Vector< PointerRNA > *list)
These structs are the foundation for all linked lists in the library system.
eObjectMode
#define C
Definition RandGen.cpp:29
BMesh const char void * data
long long int int64_t
#define str(s)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
const char * name
Definition DNA_ID.h:414
void(* free_fn)(bContext *C, void *user_data)
std::variant< PointerRNA, std::string, int64_t > value
blender::Vector< bContextStoreEntry > entries
PointerRNA * ptr
Definition wm_files.cc:4238