diff options
-rw-r--r-- | source/blender/blenkernel/intern/context.c | 54 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_context.c | 59 |
2 files changed, 48 insertions, 65 deletions
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 9509e408fba..9d753319cfa 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -399,6 +399,41 @@ static int ctx_data_collection_get(const bContext *C, const char *member, ListBa return 0; } +static int ctx_data_base_collection_get(const bContext *C, const char *member, ListBase *list) +{ + ListBase ctx_object_list; + bool ok = false; + + if (!ctx_data_collection_get(C, member, &ctx_object_list)) { + return 0; + } + + if (BLI_listbase_is_empty(&ctx_object_list)) { + return 0; + } + + bContextDataResult result; + memset(&result, 0, sizeof(bContextDataResult)); + + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + + CollectionPointerLink *ctx_object; + for (ctx_object = ctx_object_list.first; ctx_object; ctx_object = ctx_object->next) { + Object *ob = ctx_object->ptr.data; + Base *base = BKE_view_layer_base_find(view_layer, ob); + if (base != NULL) { + CTX_data_list_add(&result, &scene->id, &RNA_ObjectBase, base); + ok = true; + } + } + CTX_data_type_set(&result, CTX_DATA_TYPE_COLLECTION); + BLI_freelistN(&ctx_object_list); + + *list = result.list; + return ok; +} + PointerRNA CTX_data_pointer_get(const bContext *C, const char *member) { bContextDataResult result; @@ -1150,7 +1185,7 @@ int CTX_data_selected_editable_objects(const bContext *C, ListBase *list) int CTX_data_selected_editable_bases(const bContext *C, ListBase *list) { - return ctx_data_collection_get(C, "selected_editable_bases", list); + return ctx_data_base_collection_get(C, "selected_editable_objects", list); } int CTX_data_editable_objects(const bContext *C, ListBase *list) @@ -1160,7 +1195,7 @@ int CTX_data_editable_objects(const bContext *C, ListBase *list) int CTX_data_editable_bases(const bContext *C, ListBase *list) { - return ctx_data_collection_get(C, "editable_bases", list); + return ctx_data_base_collection_get(C, "editable_objects", list); } int CTX_data_selected_objects(const bContext *C, ListBase *list) @@ -1170,7 +1205,7 @@ int CTX_data_selected_objects(const bContext *C, ListBase *list) int CTX_data_selected_bases(const bContext *C, ListBase *list) { - return ctx_data_collection_get(C, "selected_bases", list); + return ctx_data_base_collection_get(C, "selected_objects", list); } int CTX_data_visible_objects(const bContext *C, ListBase *list) @@ -1180,7 +1215,7 @@ int CTX_data_visible_objects(const bContext *C, ListBase *list) int CTX_data_visible_bases(const bContext *C, ListBase *list) { - return ctx_data_collection_get(C, "visible_bases", list); + return ctx_data_base_collection_get(C, "visible_objects", list); } int CTX_data_selectable_objects(const bContext *C, ListBase *list) @@ -1190,7 +1225,7 @@ int CTX_data_selectable_objects(const bContext *C, ListBase *list) int CTX_data_selectable_bases(const bContext *C, ListBase *list) { - return ctx_data_collection_get(C, "selectable_bases", list); + return ctx_data_base_collection_get(C, "selectable_objects", list); } struct Object *CTX_data_active_object(const bContext *C) @@ -1200,7 +1235,14 @@ struct Object *CTX_data_active_object(const bContext *C) struct Base *CTX_data_active_base(const bContext *C) { - return ctx_data_pointer_get(C, "active_base"); + Object *ob = ctx_data_pointer_get(C, "active_object"); + + if (ob == NULL) { + return NULL; + } + + ViewLayer *view_layer = CTX_data_view_layer(C); + return BKE_view_layer_base_find(view_layer, ob); } struct Object *CTX_data_edit_object(const bContext *C) diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index c60469e092f..6a5df8a3776 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -69,15 +69,10 @@ const char *screen_context_dir[] = { "scene", "view_layer", "visible_objects", - "visible_bases", "selectable_objects", - "selectable_bases", "selected_objects", - "selected_bases", "editable_objects", - "editable_bases", "selected_editable_objects", - "selected_editable_bases", "objects_in_mode", "objects_in_mode_unique_data", "visible_bones", @@ -89,7 +84,6 @@ const char *screen_context_dir[] = { "selected_pose_bones_from_active_object", "active_bone", "active_pose_bone", - "active_base", "active_object", "object", "edit_object", @@ -179,52 +173,6 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } - else if (CTX_data_equals(member, "visible_bases")) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (BASE_VISIBLE(v3d, base)) { - CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); - } - } - CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); - return 1; - } - else if (CTX_data_equals(member, "selectable_bases")) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (BASE_SELECTABLE(v3d, base)) { - CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); - } - } - CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); - return 1; - } - else if (CTX_data_equals(member, "selected_bases")) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (BASE_SELECTED(v3d, base)) { - CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); - } - } - CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); - return 1; - } - else if (CTX_data_equals(member, "selected_editable_bases")) { - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (BASE_SELECTED_EDITABLE(v3d, base)) { - CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); - } - } - CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); - return 1; - } - else if (CTX_data_equals(member, "editable_bases")) { - /* Visible + Editable, but not necessarily selected */ - for (Base *base = view_layer->object_bases.first; base; base = base->next) { - if (BASE_EDITABLE(v3d, base)) { - CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); - } - } - CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); - return 1; - } else if (CTX_data_equals(member, "objects_in_mode")) { if (obact && (obact->mode != OB_MODE_OBJECT)) { FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, v3d, obact->type, obact->mode, ob_iter) { @@ -455,13 +403,6 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult return 1; } } - else if (CTX_data_equals(member, "active_base")) { - if (view_layer->basact) { - CTX_data_pointer_set(result, &scene->id, &RNA_ObjectBase, view_layer->basact); - } - - return 1; - } else if (CTX_data_equals(member, "active_object")) { if (obact) { CTX_data_id_pointer_set(result, &obact->id); |