107 const TreeElement *te,
int *scenelevel,
int *objectlevel,
int *idlevel,
int *datalevel)
109 *scenelevel = *objectlevel = *idlevel = *datalevel = 0;
118 *datalevel = tselem->
type;
121 const int idcode = int(
GS(tselem->
id->
name));
122 bool is_standard_id =
false;
167 is_standard_id =
true;
179 is_standard_id =
true;
182 if (is_standard_id) {
188 BLI_assert(((*scenelevel != 0) && (*objectlevel == 0) && (*idlevel == 0) && (*datalevel == 0)) ||
189 ((*scenelevel == 0) && (*objectlevel != 0) && (*idlevel == 0) && (*datalevel == 0)) ||
190 ((*scenelevel == 0) && (*objectlevel == 0) && (*idlevel != 0) && (*datalevel == 0)) ||
191 ((*scenelevel == 0) && (*objectlevel == 0) && (*idlevel == 0) && (*datalevel != 0)) ||
193 ((*scenelevel == 0) && (*objectlevel == 0) && (*idlevel == 0) && (*datalevel == 0)));
229 "Cannot unlink action '%s'. It's not clear which object or object-data it "
230 "should be unlinked from, there's no object or object-data as parent in the "
250 if (!te_is_material) {
261 "Cannot unlink material '%s'. It's not clear which object or object-data it "
262 "should be unlinked from, there's no object or object-data as parent in the "
271 "Cannot unlink the material '%s' from linked object data",
288 totcol =
mesh->totcol;
326 if (
LIKELY(matar !=
nullptr)) {
327 for (a = 0; a < totcol; a++) {
328 if (a == te->
index && matar[a]) {
348 "Cannot unlink texture '%s'. It's not clear which Freestyle line style it should "
349 "be unlinked from, there's no Freestyle line style as parent in the Outliner tree",
354 MTex **mtex =
nullptr;
366 if (a == te->
index && mtex[a]) {
369 mtex[a]->
tex =
nullptr;
390 "Cannot unlink collection '%s'. It's not clear which scene, collection or "
391 "instance empties it should be unlinked from, there's no scene, collection or "
392 "instance empties as parent in the Outliner tree",
400 "Cannot unlink collection '%s' parented to another linked collection '%s'",
438 if (tsep && tsep->
id) {
455 "Cannot unlink object '%s' parented to another linked object '%s'",
460 te_parent = te_parent->
parent;
461 tsep = te_parent ?
TREESTORE(te_parent) :
nullptr;
465 if (tsep && tsep->
id) {
469 "Cannot unlink object '%s' from linked collection or scene '%s'",
528 "Cannot unlink world '%s'. It's not clear which scene it should be unlinked from, "
529 "there's no scene as parent in the Outliner tree",
539 parscene->
world =
nullptr;
555 operation_fn(
C,
reports, scene, te, tsep, tselem);
575 "Apply the operation over selected data-blocks only"},
580 "Apply the operation over content of the selected items only (the data-blocks in their "
583 "SELECTED_AND_CONTENT",
585 "Selected & Content",
586 "Apply the operation over selected data-blocks and all their dependencies"},
587 {0,
nullptr, 0,
nullptr,
nullptr},
596 const bool has_parent_selected,
600 const bool do_selected =
ELEM(selection_set,
603 const bool do_content =
ELEM(selection_set,
608 if ((is_selected && do_selected) || (has_parent_selected && do_content)) {
624 const bool has_parent_selected,
634 C,
reports, scene,
element, tselem, has_parent_selected, operation_fn, selection_set);
643 is_selected || has_parent_selected,
655 const bool do_active_element_first)
657 if (do_active_element_first) {
660 if (active_element !=
nullptr) {
665 C,
reports, scene, active_element, tselem,
false, operation_fn, selection_set);
670 C,
reports, scene, space_outliner, subtree, is_selected, operation_fn, selection_set);
675 C,
reports, scene, space_outliner, space_outliner->
tree,
false, operation_fn, selection_set);
690 {0,
nullptr, 0,
nullptr,
nullptr},
699 bool success =
false;
705 if (operation_fn(
C, event, te, tselem)) {
758 ot->name =
"Outliner Scene Operation";
759 ot->idname =
"OUTLINER_OT_scene_operation";
760 ot->description =
"Context menu for scene operations";
849 static char search[64] =
"";
862 block, search, 0, ICON_VIEWZOOM,
sizeof(search), 0, 0, menu_width,
UI_UNIT_Y,
"");
876 block,
UI_BTYPE_LABEL, 0,
"", 0, -height, menu_width, height,
nullptr, 0, 0, std::nullopt);
879 const int offset[2] = {-(menu_width / 2), 0};
966 "Cannot delete object '%s' from scene '%s', indirectly used objects need at "
1045 ID *id_root_reference,
1046 ID *id_instance_hint,
1047 const bool is_override_instancing_object)
1056 id_hierarchy_root_reference);
1057 value.
append(id_root_data);
1068 id_hierarchy_root_reference);
1070 value.
append(id_root_data);
1086 const bool do_hierarchy =
data->do_hierarchy;
1087 ID *id_root_reference = tselem->
id;
1113 "Could not create library override from data-block '%s', as it is not overridable",
1114 id_root_reference->
name);
1130 data->selected_id_uid.add(object_iter->id.session_uid);
1136 ID *id_instance_hint =
nullptr;
1137 bool is_override_instancing_object =
false;
1146 id_instance_hint = tsep->
id;
1147 is_override_instancing_object =
true;
1161 ID *id_hierarchy_root_reference = id_root_reference;
1162 while ((te = te->
parent) !=
nullptr) {
1172 if (id_current_hierarchy_root->
lib != id_root_reference->
lib) {
1185 id_hierarchy_root_reference =
1197 "Invalid anchor ('%s') found, needed to create library override from "
1199 id_current_hierarchy_root->
name,
1200 id_root_reference->
name);
1216 "Could not create library override from data-block '%s', one of its parents "
1217 "is not overridable ('%s')",
1218 id_root_reference->
name,
1219 id_current_hierarchy_root->
name);
1223 id_hierarchy_root_reference = id_current_hierarchy_root;
1229 if (!((id_hierarchy_root_reference->
lib == id_root_reference->
lib) ||
1233 id_root_reference->
lib)))
1238 "Invalid hierarchy root ('%s') found, needed to create library override from "
1240 id_hierarchy_root_reference->
name,
1241 id_root_reference->
name);
1252 if (!is_selected &&
data->id_hierarchy_roots.contains(id_hierarchy_root_reference)) {
1256 data->id_root_add(id_hierarchy_root_reference,
1259 is_override_instancing_object);
1263 id_root_reference, id_root_reference, id_instance_hint, is_override_instancing_object);
1272 ID *id_hierarchy_root_reference,
1274 bool &r_aggregated_success)
1279 const bool do_hierarchy =
data.do_hierarchy;
1298 bool success =
false;
1300 ID *id_root_override =
nullptr;
1305 data_idroot.id_root_reference,
1306 id_hierarchy_root_reference,
1307 data_idroot.id_instance_hint,
1309 data.do_fully_editable);
1320 id_hierarchy_root_reference);
1324 id_hierarchy_root_reference = id_hierarchy_root_override;
1327 BLI_assert(id_hierarchy_root_override == id_hierarchy_root_reference);
1329 data_idroot.id_hierarchy_root_override = id_hierarchy_root_override;
1330 data.id_hierarchy_roots_uid.add(id_hierarchy_root_override->
session_uid);
1335 &bmain, data_idroot.id_root_reference,
true);
1337 success = id_root_override !=
nullptr;
1352 if (success && data_idroot.is_override_instancing_object) {
1355 &bmain, scene,
reinterpret_cast<Object *
>(data_idroot.id_instance_hint));
1358 r_aggregated_success = r_aggregated_success && success;
1371 const bool do_hierarchy =
data.do_hierarchy;
1373 bool success =
true;
1374 for (
auto &&[id_hierarchy_root_reference, data_idroots] :
data.id_hierarchy_roots.items()) {
1376 *bmain, scene, view_layer,
data, id_hierarchy_root_reference, data_idroots, success);
1382 "Could not create library override from one or more of the selected data-blocks");
1385 if (!do_hierarchy) {
1395 !
data.id_hierarchy_roots_uid.contains(
1414 ID *id_root = tselem->
id;
1415 const bool do_hierarchy =
data->do_hierarchy;
1418 CLOG_WARN(&
LOG,
"Could not reset library override of data block '%s'", id_root->
name);
1445 bool do_process_leaves =
true;
1446 while (!
data.id_hierarchy_roots.is_empty()) {
1447 bool has_found_leaves =
false;
1449 for (
auto &&
id :
data.id_hierarchy_roots.keys()) {
1450 if (do_process_leaves) {
1455 bool do_remap_active =
false;
1459 do_remap_active =
true;
1463 if (do_remap_active) {
1465 Object *ref_object =
reinterpret_cast<Object *
>(
id->override_library->reference);
1467 if (basact !=
nullptr) {
1468 view_layer->
basact = basact;
1474 data.id_hierarchy_roots.remove(
id);
1475 has_found_leaves =
true;
1481 data.id_hierarchy_roots.remove(
id);
1485 do_process_leaves = has_found_leaves;
1495 ID *
id = tselem->
id;
1503 "Cannot clear embedded library override '%s', only overrides of real data-blocks "
1504 "can be directly cleared",
1512 "Cannot clear linked library override '%s', only local overrides can be directly cleared",
1517 data->id_root_set(
id);
1523 ID *id_root = tselem->
id;
1526 CLOG_WARN(&
LOG,
"Could not resync library override of data block '%s'", id_root->
name);
1534 data->id_root_set(id_root);
1544 const bool do_hierarchy_enforce =
data.do_resync_hierarchy_enforce;
1549 for (
auto &&id_hierarchy_root :
data.id_hierarchy_roots.keys()) {
1555 do_hierarchy_enforce,
1566 ID *id_root = tselem->
id;
1569 CLOG_WARN(&
LOG,
"Could not delete library override of data block '%s'", id_root->
name);
1577 data->id_root_set(id_root);
1587 for (
auto &&id_hierarchy_root :
data.id_hierarchy_roots.keys()) {
1599 ID *
id = tselem->
id;
1611 ID *
id = tselem->
id;
1623 ID *
id = tselem->
id;
1641 ID *
id = tselem->
id;
1661 ID *
id = tselem->
id;
1681 bool recurse_selected)
1685 bool select_handled =
false;
1690 if (scene_owner && scene_act != scene_owner) {
1696 operation_fn(
C,
reports, scene_owner ? scene_owner : scene_act, te,
nullptr, tselem);
1697 select_handled =
true;
1701 if ((select_handled ==
false) || recurse_selected) {
1703 C,
reports, scene_act, space_outliner, &te->subtree, operation_fn, recurse_selected);
1794 "OVERRIDE_LIBRARY_CREATE_HIERARCHY",
1797 "Create a local override of the selected linked data-blocks, and their hierarchy of "
1800 "OVERRIDE_LIBRARY_RESET",
1803 "Reset the selected local overrides to their linked references values"},
1805 "OVERRIDE_LIBRARY_CLEAR_SINGLE",
1808 "Delete the selected local overrides and relink their usages to the linked data-blocks if "
1809 "possible, else reset them and mark them as non editable"},
1810 {0,
nullptr, 0,
nullptr,
nullptr},
1815 "OVERRIDE_LIBRARY_RESYNC_HIERARCHY",
1818 "Rebuild the selected local overrides from their linked references, as well as their "
1819 "hierarchies of dependencies"},
1821 "OVERRIDE_LIBRARY_RESYNC_HIERARCHY_ENFORCE",
1824 "Rebuild the selected local overrides from their linked references, as well as their "
1825 "hierarchies of dependencies, enforcing these hierarchies to match the linked data (i.e. "
1826 "ignoring existing overrides on data-blocks pointer properties)"},
1829 "OVERRIDE_LIBRARY_DELETE_HIERARCHY",
1832 "Delete the selected local overrides (including their hierarchies of override dependencies) "
1833 "and relink their usages to the linked data-blocks"},
1834 {0,
nullptr, 0,
nullptr,
nullptr},
1851 if (space_outliner ==
nullptr) {
1876 id_override_library_create_hierarchy_pre_process(
1877 C, &override_data, reports, te, tsep, tselem);
1899 TreeStoreElem *tselem) { id_override_library_reset(C, &override_data, tselem); },
1921 id_override_library_clear_single(&override_data, reports, tselem);
1945 TreeStoreElem *tselem) { id_override_library_resync(&override_data, tselem); },
1968 TreeStoreElem *tselem) { id_override_library_resync(&override_data, tselem); },
1974 ED_undo_push(
C,
"Resync Overridden Data Hierarchy Enforce");
1991 id_override_library_delete_hierarchy(&override_data, tselem);
2016 ot->name =
"Outliner Library Override Operation";
2017 ot->idname =
"OUTLINER_OT_liboverride_operation";
2018 ot->description =
"Create, reset or clear library override hierarchies";
2033 "Over which part of the tree items to apply the operation");
2039 ot->name =
"Outliner Library Override Troubleshoot Operation";
2040 ot->idname =
"OUTLINER_OT_liboverride_troubleshoot_operation";
2041 ot->description =
"Advanced operations over library override to help fix broken hierarchies";
2054 "Library Override Troubleshoot Operation",
2061 "Over which part of the tree items to apply the operation");
2205 node.set_selected(
true);
2208 node.set_selected(
false);
2211 node.set_visible(
false);
2214 node.set_visible(
true);
2224 if (!te_rna_struct) {
2232 ID *
id =
static_cast<ID *
>(
ptr.data);
2329 if (tselem->
type == type) {
2330 operation_fn(event, te, tselem, arg);
2353 "Cannot delete object '%s' from scene '%s', indirectly used objects need at least "
2374 base_iter !=
nullptr;
2375 base_iter = base_iter->
next)
2378 for (parent_ob_iter = base_iter->object->
parent;
2379 (parent_ob_iter !=
nullptr && parent_ob_iter !=
object &&
2381 parent_ob_iter = parent_ob_iter->
parent)
2385 if (parent_ob_iter !=
nullptr) {
2392 for (parent_ob_iter = base_iter->object;
2393 (parent_ob_iter !=
nullptr && parent_ob_iter !=
object &&
2395 parent_ob_iter = parent_ob_iter->
parent)
2424 if (base ==
nullptr) {
2429 for (; obedit && (obedit != base->
object); obedit = obedit->
parent) {
2432 if (obedit == base->
object) {
2452 if (ob_iter->id.us != 0) {
2476 {
OL_OP_SELECT,
"SELECT", ICON_RESTRICT_SELECT_OFF,
"Select",
""},
2483 "Make all users of selected data-blocks to use instead a new chosen one"},
2485 {0,
nullptr, 0,
nullptr,
nullptr},
2495 const char *
str =
nullptr;
2496 bool selection_changed =
false;
2499 if (space_outliner ==
nullptr) {
2516 str =
"Select Objects";
2517 selection_changed =
true;
2526 &space_outliner->
tree,
2534 str =
"Select Object Hierarchy";
2535 selection_changed =
true;
2541 str =
"Deselect Objects";
2542 selection_changed =
true;
2552 str =
"Rename Object";
2559 if (selection_changed) {
2565 if (
str !=
nullptr) {
2575 ot->name =
"Outliner Object Operation";
2576 ot->idname =
"OUTLINER_OT_object_operation";
2608 for (
Object *ob : objects_to_delete) {
2631 ID *id_parent = tselem_parent->
id;
2641 ID *
id = tselem->
id;
2645 if (!(
data->is_liboverride_hierarchy_root_allowed ||
data->is_liboverride_allowed)) {
2650 if (!
data->is_liboverride_allowed) {
2656 data->objects_set.add(
reinterpret_cast<Object *
>(
id));
2679 &space_outliner->
tree,
2683 &object_delete_data);
2685 if (delete_hierarchy) {
2736 ot->name =
"Delete";
2737 ot->idname =
"OUTLINER_OT_delete";
2738 ot->description =
"Delete selected objects and collections";
2749 ot->srna,
"hierarchy",
false,
"Hierarchy",
"Delete child objects and collections");
2788 "Make all users of selected data-blocks to use instead current (clicked) one"},
2797 "Ensure data-block gets saved even if it isn't in use (e.g. for motion and material "
2802 {0,
nullptr, 0,
nullptr,
nullptr},
2808 const int enum_value)
2821 switch (enum_value) {
2863 int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
2866 if (space_outliner ==
nullptr) {
2965 if (idlevel > 0 || objectlevel) {
2973 wm->op_undo_depth++;
2975 wm->op_undo_depth--;
2980 wm->op_undo_depth++;
2982 wm->op_undo_depth--;
3036 ot->name =
"Outliner ID Data Operation";
3037 ot->idname =
"OUTLINER_OT_id_operation";
3038 ot->description =
"General data-block management operations";
3066 {
OL_LIB_DELETE,
"DELETE", ICON_X,
"Delete",
"Delete this library and all its items"},
3071 "Select a new path for this library, and reload all its data"},
3072 {
OL_LIB_RELOAD,
"RELOAD", ICON_FILE_REFRESH,
"Reload",
"Reload all data from this library"},
3073 {0,
nullptr, 0,
nullptr,
nullptr},
3083 if (space_outliner ==
nullptr) {
3127 ot->name =
"Outliner Library Operation";
3128 ot->idname =
"OUTLINER_OT_lib_operation";
3154 if (tselem->
type == type) {
3156 operation_fn(te, tselem, tsep, newid);
3187 int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
3196 if (act ==
nullptr) {
3205 "Action '%s' does not specify what data-blocks it can be used on "
3206 "(try setting the 'ID Root Type' setting from the data-blocks editor "
3207 "for this action to avoid future problems)",
3215 else if (idlevel ==
ID_AC) {
3236 ot->name =
"Outliner Set Action";
3237 ot->idname =
"OUTLINER_OT_action_set";
3238 ot->description =
"Change the active action used";
3278 "Clear Animation Data",
3279 "Remove this animation data container"},
3284 {0,
nullptr, 0,
nullptr,
nullptr},
3291 int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
3312 wm->op_undo_depth++;
3315 wm->op_undo_depth--;
3356 ot->name =
"Outliner Animation Data Operation";
3357 ot->idname =
"OUTLINER_OT_animdata_operation";
3379 {0,
nullptr, 0,
nullptr,
nullptr},
3401 ot->name =
"Outliner Constraint Operation";
3402 ot->idname =
"OUTLINER_OT_constraint_operation";
3427 {0,
nullptr, 0,
nullptr,
nullptr},
3453 ot->name =
"Outliner Modifier Operation";
3454 ot->idname =
"OUTLINER_OT_modifier_operation";
3480 if (te ==
nullptr) {
3484 int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
3493 int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
3498 switch (datalevel) {
3568 if (space_outliner ==
nullptr) {
3573 if (te ==
nullptr) {
3584 {0,
nullptr, 0,
nullptr,
nullptr}};
3588 {0,
nullptr, 0,
nullptr,
nullptr}};
3591 return optype_sel_linked;
3594 return optype_sel_and_hide;
3600 ot->name =
"Outliner Data Operation";
3601 ot->idname =
"OUTLINER_OT_data_operation";
3647 int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
3685 else if (datalevel) {
3731 ®ion->
v2d, event->
mval[0], event->
mval[1], &view_mval[0], &view_mval[1]);
3734 space_outliner, &space_outliner->
tree, view_mval[1]);
3745 ot->name =
"Context Menu";
3746 ot->idname =
"OUTLINER_OT_operation";
3747 ot->description =
"Context menu for item operations";
Functions for backward compatibility with the legacy Action API.
bool BKE_animdata_set_action(ReportList *reports, ID *id, bAction *act)
void BKE_animdata_free(ID *id, bool do_id_user)
bool BKE_collection_object_remove(Main *bmain, Collection *collection, Object *ob, bool free_us)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END
#define FOREACH_SCENE_COLLECTION_END
bool BKE_scene_collections_object_remove(Main *bmain, Scene *scene, Object *ob, bool free_us)
bool BKE_collection_child_remove(Main *bmain, Collection *parent, Collection *child)
bool BKE_collection_has_object(Collection *collection, const Object *ob)
#define FOREACH_SCENE_COLLECTION_BEGIN(scene, _instance)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)
bool BKE_constraint_remove_ex(ListBase *list, struct Object *ob, struct bConstraint *con)
void BKE_constraints_active_set(ListBase *list, struct bConstraint *con)
ReportList * CTX_wm_reports(const bContext *C)
SpaceOutliner * CTX_wm_space_outliner(const bContext *C)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Object * CTX_data_edit_object(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
wmMsgBus * CTX_wm_message_bus(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
void BKE_fcurves_free(ListBase *list)
Low-level operations for grease pencil.
bool BKE_idtype_idcode_is_linkable(short idcode)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
void BKE_id_newptr_and_tag_clear(ID *id)
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
bool id_single_user(bContext *C, ID *id, PointerRNA *ptr, PropertyRNA *prop)
void size_t BKE_id_multi_tagged_delete(Main *bmain) ATTR_NONNULL()
void id_fake_user_set(ID *id)
@ LIB_ID_MAKELOCAL_ASSET_DATA_CLEAR
void BKE_main_id_newptr_and_tag_clear(Main *bmain)
bool BKE_lib_id_make_local(Main *bmain, ID *id, int flags)
void id_fake_user_clear(ID *id)
void BKE_main_id_tag_all(Main *mainvar, int tag, bool value)
ID * BKE_lib_override_library_create_from_id(Main *bmain, ID *reference_id, bool do_tagged_remap)
void BKE_lib_override_library_id_reset(Main *bmain, ID *id_root, bool do_reset_system_override)
bool BKE_lib_override_library_resync(Main *bmain, Scene *scene, ViewLayer *view_layer, ID *id_root, Collection *override_resync_residual_storage, bool do_hierarchy_enforce, BlendFileReadReport *reports)
bool BKE_lib_override_library_create(Main *bmain, Scene *scene, ViewLayer *view_layer, Library *owner_library, ID *id_root_reference, ID *id_hierarchy_root_reference, ID *id_instance_hint, ID **r_id_root_override, const bool do_fully_editable)
void BKE_lib_override_library_id_hierarchy_reset(Main *bmain, ID *id_root, bool do_reset_system_override)
void BKE_lib_override_library_make_local(Main *bmain, ID *id)
void BKE_lib_override_library_delete(Main *bmain, ID *id_root)
bool BKE_lib_override_library_is_hierarchy_leaf(Main *bmain, ID *id)
bool BKE_library_ID_is_indirectly_used(Main *bmain, void *idv)
@ ID_REMAP_SKIP_INDIRECT_USAGE
void void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, int remap_flags) ATTR_NONNULL(1
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
void BKE_main_ensure_invariants(Main &bmain, std::optional< blender::Span< ID * > > modified_ids=std::nullopt)
General operations, lookup, etc. for blender objects.
bool BKE_object_is_in_editmode(const Object *ob)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_unreachable()
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
char * STRNCPY(char(&dst)[N], const char *src)
int char * BLI_strcasestr(const char *s, const char *find) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
#define UNUSED_VARS_NDEBUG(...)
external readfile function prototypes.
#define CLOG_WARN(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_FLAG_EMBEDDED_DATA_LIB_OVERRIDE
@ LIBOVERRIDE_FLAG_SYSTEM_DEFINED
Object groups, one object can be in many groups at once.
Object is a sort of wrapper for general info.
#define TSE_IS_REAL_ID(_tse)
@ TSE_VIEW_COLLECTION_BASE
@ TSE_SCENE_COLLECTION_BASE
#define BASE_SELECTED(v3d, base)
void ED_outliner_select_sync_from_object_tag(bContext *C)
void ED_outliner_select_sync_from_outliner(bContext *C, SpaceOutliner *space_outliner)
void ED_outliner_select_sync_from_all_tag(bContext *C)
bool ED_scene_delete(bContext *C, Main *bmain, Scene *scene) ATTR_NONNULL()
bool ED_operator_region_outliner_active(bContext *C)
void ED_region_tag_redraw_no_rebuild(ARegion *region)
bool ED_operator_outliner_active(bContext *C)
void ED_undo_push(bContext *C, const char *str)
Read Guarded memory(de)allocation.
const EnumPropertyItem * RNA_action_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
#define RNA_ENUM_ITEM_SEPR
@ UI_BLOCK_THEME_STYLE_POPUP
void UI_block_theme_style_set(uiBlock *block, char theme_style)
uiBlock * UI_block_begin(const bContext *C, ARegion *region, std::string name, blender::ui::EmbossType emboss)
void UI_block_bounds_set_popup(uiBlock *block, int addval, const int bounds_offset[2])
uiBut * uiDefBut(uiBlock *block, int type, int retval, blender::StringRef str, int x, int y, short width, short height, void *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_popup_block_invoke(bContext *C, uiBlockCreateFunc func, void *arg, uiFreeArgFunc arg_free)
void UI_but_func_search_set(uiBut *but, uiButSearchCreateFn search_create_fn, uiButSearchUpdateFn search_update_fn, void *arg, bool free_arg, uiFreeArgFunc search_arg_free_fn, uiButHandleFunc search_exec_fn, void *active)
void UI_popup_menu_end(bContext *C, uiPopupMenu *pup)
uiBut * uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxncpy, int x, int y, short width, short height, std::optional< blender::StringRef > tip)
void UI_but_tooltip_timer_remove(bContext *C, uiBut *but)
uiBut * UI_context_active_but_get(const bContext *C)
bool UI_search_item_add(uiSearchItems *items, blender::StringRef name, void *poin, int iconid, int but_flag, uint8_t name_prefix_offset)
uiPopupMenu * UI_popup_menu_begin(bContext *C, const char *title, int icon) ATTR_NONNULL()
#define UI_SEARCHBOX_BOUNDS
uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
int UI_search_items_find_index(const uiSearchItems *items, const char *name)
int UI_searchbox_size_y()
@ UI_BLOCK_MOVEMOUSE_QUIT
void UI_block_flag_enable(uiBlock *block, int flag)
@ UI_BUT_ACTIVATE_ON_INIT
void UI_but_flag_enable(uiBut *but, int flag)
void uiItemsEnumO(uiLayout *layout, blender::StringRefNull opname, blender::StringRefNull propname)
void uiItemMContents(uiLayout *layout, blender::StringRef menuname)
void uiLayoutSetOperatorContext(uiLayout *layout, wmOperatorCallContext opcontext)
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
#define ND_LIB_OVERRIDE_CHANGED
@ WM_OP_INVOKE_REGION_WIN
#define ND_SPACE_OUTLINER
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const void * element
BPy_StructRNA * depsgraph
void append(const T &value)
const PointerRNA & get_pointer_rna() const
Strip & get_strip() const
#define ID_IS_OVERRIDE_LIBRARY_VIRTUAL(_id)
#define ID_EXTRA_USERS(id)
#define ID_IS_OVERRIDE_LIBRARY_REAL(_id)
#define ID_IS_OVERRIDABLE_LIBRARY(_id)
#define ID_IS_OVERRIDABLE_LIBRARY_HIERARCHY(_id)
#define ID_IS_LINKED(_id)
#define ID_IS_EDITABLE(_id)
#define ID_REAL_USERS(id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
#define ID_IS_OVERRIDE_LIBRARY_HIERARCHY_ROOT(_id)
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
bool action_treat_as_legacy(const bAction &action)
bool modifier_apply(Main *bmain, ReportList *reports, Depsgraph *depsgraph, Scene *scene, Object *ob, ModifierData *md, int mode, bool keep_modifier, bool do_all_keyframes)
void constraint_update(Main *bmain, Object *ob)
void base_select(Base *base, eObjectSelect_Mode mode)
bool editmode_exit(bContext *C, int flag)
void select_linked_by_id(bContext *C, ID *id)
void base_free_and_unlink(Main *bmain, Scene *scene, Object *ob)
bool editmode_exit_ex(Main *bmain, Scene *scene, Object *obedit, int flag)
bool modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
void all_open(const SpaceOutliner &space_outliner, const VisitorFn visitor)
@ OUTLINER_IDOP_FAKE_CLEAR
@ OUTLINER_IDOP_SELECT_LINKED
static bool outliner_liboverride_operation_poll(bContext *C)
void OUTLINER_OT_delete(wmOperatorType *ot)
static void unlink_texture_fn(bContext *, ReportList *reports, Scene *, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
static void ebone_fn(int event, TreeElement *te, TreeStoreElem *, void *)
static const EnumPropertyItem outliner_lib_op_type_items[]
static void object_deselect_fn(bContext *C, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
static bool outliner_do_libdata_operation_selection_set_element(bContext *C, ReportList *reports, Scene *scene, TreeElement *element, TreeStoreElem *tselem, const bool has_parent_selected, outliner_operation_fn operation_fn, eOutlinerLibOpSelectionSet selection_set)
static void id_override_library_create_hierarchy_process(bContext *C, ReportList *reports, OutlinerLibOverrideData &data)
static wmOperatorStatus outliner_scene_operation_exec(bContext *C, wmOperator *op)
void OUTLINER_OT_scene_operation(wmOperatorType *ot)
static const EnumPropertyItem * outliner_data_op_sets_enum_item_fn(bContext *C, PointerRNA *, PropertyRNA *, bool *)
static void object_select_hierarchy_fn(bContext *C, ReportList *, Scene *, TreeElement *te, TreeStoreElem *, TreeStoreElem *)
static void unlink_action_fn(bContext *C, ReportList *reports, Scene *, TreeElement *, TreeStoreElem *tsep, TreeStoreElem *tselem)
static void unlink_object_fn(bContext *C, ReportList *reports, Scene *, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
static TreeTraversalAction outliner_collect_objects_to_delete(TreeElement *te, void *customdata)
static bool scene_fn(bContext *C, eOutliner_PropSceneOps event, TreeElement *, TreeStoreElem *tselem)
static wmOperatorStatus outliner_animdata_operation_exec(bContext *C, wmOperator *op)
bool outliner_is_collection_tree_element(const TreeElement *te)
static void get_element_operation_type(const TreeElement *te, int *scenelevel, int *objectlevel, int *idlevel, int *datalevel)
static void clear_animdata_fn(int, TreeElement *, TreeStoreElem *tselem, void *)
void OUTLINER_OT_data_operation(wmOperatorType *ot)
void OUTLINER_OT_lib_operation(wmOperatorType *ot)
void OUTLINER_OT_constraint_operation(wmOperatorType *ot)
static const EnumPropertyItem prop_constraint_op_types[]
static const EnumPropertyItem prop_lib_op_selection_set[]
static void id_fake_user_set_fn(bContext *, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
static void modifier_fn(int event, TreeElement *te, TreeStoreElem *, void *arg)
static void object_select_fn(bContext *C, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
static void id_override_library_clear_single_process(bContext *C, ReportList *, OutlinerLibOverrideData &data)
static void outliner_batch_delete_object_hierarchy(Main *bmain, Scene *scene)
static void refreshdrivers_animdata_fn(int, TreeElement *, TreeStoreElem *tselem, void *)
static wmOperatorStatus outliner_object_operation_exec(bContext *C, wmOperator *op)
void id_delete_tag_fn(bContext *C, ReportList *reports, Scene *, TreeElement *te, TreeStoreElem *, TreeStoreElem *tselem)
static void id_override_library_reset(bContext *C, OutlinerLibOverrideData *data, TreeStoreElem *tselem)
static void merged_element_search_fn_recursive(const ListBase *tree, short tselem_type, short type, const char *str, uiSearchItems *items)
static wmOperatorStatus outliner_constraint_operation_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem prop_scene_op_types[]
static void pchan_fn(int event, TreeElement *te, TreeStoreElem *, void *)
static wmOperatorStatus outliner_id_operation_exec(bContext *C, wmOperator *op)
static void outliner_batch_delete_object_hierarchy_tag(ReportList *reports, Main *bmain, ViewLayer *view_layer, Scene *scene, Base *base)
void OUTLINER_OT_modifier_operation(wmOperatorType *ot)
static void unlinkact_animdata_fn(int, TreeElement *, TreeStoreElem *tselem, void *)
void outliner_collection_delete(bContext *C, Main *bmain, Scene *scene, ReportList *reports, bool do_hierarchy)
TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
static void object_batch_delete_hierarchy_tag_fn(bContext *C, ReportList *reports, Scene *scene, Object *ob)
TreeElement * outliner_find_item_at_y(const SpaceOutliner *space_outliner, const ListBase *tree, float view_co_y)
static void outliner_object_delete_fn(bContext *C, ReportList *reports, Scene *scene, Object *ob)
@ OUTLINER_ANIMOP_CLEAR_DRV
@ OUTLINER_ANIMOP_INVALID
@ OUTLINER_ANIMOP_SET_ACT
@ OUTLINER_ANIMOP_CLEAR_ACT
@ OUTLINER_ANIMOP_REFRESH_DRV
@ OUTLINER_ANIMOP_CLEAR_ADT
static const EnumPropertyItem prop_animdata_op_types[]
static void merged_element_search_update_fn(const bContext *, void *data, const char *str, uiSearchItems *items, const bool)
static void data_select_linked_fn(int event, TreeElement *te, TreeStoreElem *, void *C_v)
static void merged_element_search_exec_fn(bContext *C, void *, void *element)
eOutliner_PropModifierOps
static bool outliner_data_operation_poll(bContext *C)
static void id_override_library_resync(OutlinerLibOverrideData *data, TreeStoreElem *tselem)
void outliner_do_object_operation_ex(bContext *C, ReportList *reports, Scene *scene, SpaceOutliner *space_outliner, ListBase *lb, outliner_operation_fn operation_fn, bool recurse_selected)
static void singleuser_action_fn(bContext *C, ReportList *, Scene *, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
void OUTLINER_OT_object_operation(wmOperatorType *ot)
static void id_fake_user_clear_fn(bContext *, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
static void id_select_linked_fn(bContext *C, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
static void id_local_fn(bContext *C, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
static void bone_fn(int event, TreeElement *te, TreeStoreElem *, void *)
void OUTLINER_OT_animdata_operation(wmOperatorType *ot)
static void unlink_world_fn(bContext *, ReportList *reports, Scene *, TreeElement *, TreeStoreElem *tsep, TreeStoreElem *tselem)
void lib_relocate_fn(bContext *C, ReportList *, Scene *, TreeElement *te, TreeStoreElem *, TreeStoreElem *tselem)
int tree_element_id_type_to_index(TreeElement *te)
static void id_override_library_clear_single(OutlinerLibOverrideData *data, ReportList *reports, TreeStoreElem *tselem)
static void id_override_library_create_hierarchy(Main &bmain, Scene *scene, ViewLayer *view_layer, OutlinerLibOverrideData &data, ID *id_hierarchy_root_reference, Vector< OutlinerLiboverrideDataIDRoot > &data_idroots, bool &r_aggregated_success)
static void unlink_collection_fn(bContext *C, ReportList *reports, Scene *, TreeElement *, TreeStoreElem *tsep, TreeStoreElem *tselem)
static wmOperatorStatus outliner_lib_operation_exec(bContext *C, wmOperator *op)
static void outliner_do_data_operation(SpaceOutliner *space_outliner, int type, int event, void(*operation_fn)(int, TreeElement *, TreeStoreElem *, void *), void *arg)
static const EnumPropertyItem prop_liboverride_op_types[]
static void id_override_library_delete_hierarchy(OutlinerLibOverrideData *data, TreeStoreElem *tselem)
void OUTLINER_OT_action_set(wmOperatorType *ot)
static bool outliner_id_operation_item_poll(bContext *C, PointerRNA *, PropertyRNA *, const int enum_value)
bool outliner_tree_traverse(const SpaceOutliner *space_outliner, ListBase *tree, int filter_te_flag, int filter_tselem_flag, TreeTraversalFunc func, void *customdata)
static const EnumPropertyItem prop_id_op_types[]
static void id_override_library_resync_hierarchy_process(bContext *C, ReportList *reports, OutlinerLibOverrideData &data)
static wmOperatorStatus outliner_data_operation_exec(bContext *C, wmOperator *op)
TreeElementT * tree_element_cast(const TreeElement *te)
ID * outliner_search_back(TreeElement *te, short idcode)
static void cleardrivers_animdata_fn(int, TreeElement *, TreeStoreElem *tselem, void *)
static wmOperatorStatus outliner_operator_menu(bContext *C, const char *opname)
void merged_element_search_menu_invoke(bContext *C, TreeElement *parent_te, TreeElement *activate_te)
static uiBlock * merged_element_search_menu(bContext *C, ARegion *region, void *data)
blender::FunctionRef< void(bContext *C, ReportList *reports, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)> outliner_operation_fn
static TreeElement * get_target_element(const SpaceOutliner *space_outliner)
static void unlink_material_fn(bContext *, ReportList *reports, Scene *, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
static void constraint_fn(int event, TreeElement *te, TreeStoreElem *, void *C_v)
static void actionset_id_fn(TreeElement *, TreeStoreElem *tselem, TreeStoreElem *tsep, ID *actId)
eOutlinerLibOpSelectionSet
@ OUTLINER_LIB_LIB_SELECTIONSET_SELECTED_AND_CONTENT
@ OUTLINER_LIB_LIB_SELECTIONSET_CONTENT
@ OUTLINER_LIB_SELECTIONSET_SELECTED
static void outliner_batch_delete_object_tag(ReportList *reports, Main *bmain, Scene *scene, Object *object)
void id_remap_fn(bContext *C, ReportList *, Scene *, TreeElement *, TreeStoreElem *, TreeStoreElem *tselem)
void lib_reload_fn(bContext *C, ReportList *, Scene *, TreeElement *te, TreeStoreElem *, TreeStoreElem *tselem)
void outliner_cleanup_tree(SpaceOutliner *space_outliner)
static void singleuser_world_fn(bContext *C, ReportList *, Scene *, TreeElement *, TreeStoreElem *tsep, TreeStoreElem *tselem)
void outliner_do_object_operation(bContext *C, ReportList *reports, Scene *scene, SpaceOutliner *space_outliner, ListBase *lb, outliner_operation_fn operation_fn)
static wmOperatorStatus outliner_operation_invoke(bContext *C, wmOperator *, const wmEvent *event)
TreeElement * outliner_find_element_with_flag(const ListBase *lb, short flag)
static void outliner_do_libdata_operation(bContext *C, ReportList *reports, Scene *scene, SpaceOutliner *space_outliner, outliner_operation_fn operation_fn)
static wmOperatorStatus outliner_delete_exec(bContext *C, wmOperator *op)
void OUTLINER_OT_liboverride_troubleshoot_operation(wmOperatorType *ot)
eOutlinerLibOverrideOpTypes
@ OUTLINER_LIBOVERRIDE_OP_RESYNC_HIERARCHY_ENFORCE
@ OUTLINER_LIBOVERRIDE_OP_INVALID
@ OUTLINER_LIBOVERRIDE_OP_CLEAR_SINGLE
@ OUTLINER_LIBOVERRIDE_OP_DELETE_HIERARCHY
@ OUTLINER_LIBOVERRIDE_OP_CREATE_HIERARCHY
@ OUTLINER_LIBOVERRIDE_OP_RESYNC_HIERARCHY
@ OUTLINER_LIBOVERRIDE_OP_RESET
static wmOperatorStatus outliner_liboverride_operation_exec(bContext *C, wmOperator *op)
static wmOperatorStatus outliner_modifier_operation_exec(bContext *C, wmOperator *op)
void OUTLINER_OT_operation(wmOperatorType *ot)
static const EnumPropertyItem * outliner_id_operation_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
static const EnumPropertyItem prop_modifier_op_types[]
void item_rename_fn(bContext *C, ReportList *reports, Scene *, TreeElement *te, TreeStoreElem *, TreeStoreElem *tselem)
static bool outliner_do_scene_operation(bContext *C, SpaceOutliner *space_outliner, eOutliner_PropSceneOps event, bool(*operation_fn)(bContext *, eOutliner_PropSceneOps, TreeElement *, TreeStoreElem *))
static void sequence_fn(int event, TreeElement *te, TreeStoreElem *, void *scene_ptr)
static void outliner_do_id_set_operation(SpaceOutliner *space_outliner, int type, ID *newid, void(*operation_fn)(TreeElement *, TreeStoreElem *, TreeStoreElem *, ID *))
static void gpencil_layer_fn(int event, TreeElement *te, TreeStoreElem *, void *)
static wmOperatorStatus do_outliner_operation_event(bContext *C, ARegion *region, SpaceOutliner *space_outliner, TreeElement *te)
void(*)(bContext *C, ReportList *reports, Scene *scene, Object *ob) OutlinerDeleteFn
static const EnumPropertyItem prop_liboverride_troubleshoot_op_types[]
static wmOperatorStatus outliner_action_set_exec(bContext *C, wmOperator *op)
eOutliner_PropConstraintOps
@ OL_CONSTRAINTOP_DISABLE
void OUTLINER_OT_id_operation(wmOperatorType *ot)
void OUTLINER_OT_liboverride_operation(wmOperatorType *ot)
static void id_override_library_delete_hierarchy_process(bContext *C, ReportList *, OutlinerLibOverrideData &data)
void outliner_item_select(bContext *C, SpaceOutliner *space_outliner, TreeElement *te, short select_flag)
static void id_override_library_create_hierarchy_pre_process(bContext *C, OutlinerLibOverrideData *data, ReportList *reports, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
static void outliner_do_libdata_operation_selection_set(bContext *C, ReportList *reports, Scene *scene, SpaceOutliner *space_outliner, const ListBase &subtree, const bool has_parent_selected, outliner_operation_fn operation_fn, eOutlinerLibOpSelectionSet selection_set)
static void outliner_do_object_delete(bContext *C, ReportList *reports, Scene *scene, const Set< Object * > &objects_to_delete, OutlinerDeleteFn delete_fn)
static const EnumPropertyItem prop_object_op_types[]
static void grease_pencil_node_fn(int event, TreeElement *te, TreeStoreElem *, void *)
static bool outliner_operation_tree_element_poll(bContext *C)
void select_strip_single(Scene *scene, Strip *strip, bool deselect_all)
void relations_invalidate_cache(Scene *scene, Strip *strip)
Editing * editing_get(const Scene *scene)
#define TSELEM_OPEN(telm, sv)
bool RNA_struct_is_ID(const StructRNA *type)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
const char * RNA_property_identifier(const PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
const EnumPropertyItem rna_enum_dummy_NULL_items[]
const EnumPropertyItem rna_enum_dummy_DEFAULT_items[]
struct ID * hierarchy_root
IDOverrideLibrary * override_library
struct Collection * instance_collection
struct Collection * master_collection
TreeElement * parent_element
TreeElement * select_element
Set< Object * > objects_set
bool is_liboverride_hierarchy_root_allowed
bool is_liboverride_allowed
Set< uint > selected_id_uid
Map< ID *, Vector< OutlinerLiboverrideDataIDRoot > > id_hierarchy_roots
bool do_resync_hierarchy_enforce
Set< uint > id_hierarchy_roots_uid
void id_root_add(ID *id_hierarchy_root_reference, ID *id_root_reference, ID *id_instance_hint, const bool is_override_instancing_object)
void id_root_set(ID *id_hierarchy_root_reference)
bool is_override_instancing_object
ID * id_hierarchy_root_override
TreeStoreElem * store_elem
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
struct ReportList * reports
void WM_menu_name_call(bContext *C, const char *menu_name, short context)
bool WM_operator_poll(bContext *C, wmOperatorType *ot)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
wmOperatorStatus WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)
wmOperatorStatus WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *)
void WM_window_set_active_scene(Main *bmain, bContext *C, wmWindow *win, Scene *scene)