Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/screen/screen_context.c
| Show First 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
| #include "BLI_utildefines.h" | #include "BLI_utildefines.h" | ||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_object.h" | #include "BKE_object.h" | ||||
| #include "BKE_action.h" | #include "BKE_action.h" | ||||
| #include "BKE_armature.h" | #include "BKE_armature.h" | ||||
| #include "BKE_gpencil.h" | #include "BKE_gpencil.h" | ||||
| #include "BKE_localview.h" | |||||
| #include "BKE_screen.h" | #include "BKE_screen.h" | ||||
| #include "BKE_sequencer.h" | #include "BKE_sequencer.h" | ||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "ED_armature.h" | #include "ED_armature.h" | ||||
| #include "ED_gpencil.h" | #include "ED_gpencil.h" | ||||
| Show All 9 Lines | if (sc && sa_ctx && (sa_ctx->spacetype == SPACE_BUTS)) { | ||||
| const unsigned int lay = BKE_screen_view3d_layer_all(sc); | const unsigned int lay = BKE_screen_view3d_layer_all(sc); | ||||
| if (lay) { | if (lay) { | ||||
| return lay; | return lay; | ||||
| } | } | ||||
| } | } | ||||
| return scene->lay; | return scene->lay; | ||||
| } | } | ||||
| static LocalViewInfo context_localviews(bScreen *sc, ScrArea *sa_ctx) | |||||
| { | |||||
| LocalViewInfo views = {0}; | |||||
| if (sc && sa_ctx && (sa_ctx->spacetype == SPACE_BUTS)) { | |||||
| views = BKE_screen_view3d_localview_all(sc); | |||||
| } | |||||
| return views; | |||||
| } | |||||
| /* helper to check for local view if needed */ | |||||
| BLI_INLINE bool localview_check(LocalViewInfo localviews, Base *base) | |||||
| { | |||||
| return !BKE_localview_is_valid(localviews) || BKE_localview_info_cmp(localviews, base->object->localview); | |||||
| } | |||||
| const char *screen_context_dir[] = { | const char *screen_context_dir[] = { | ||||
| "scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases", | "scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases", | ||||
| "selected_objects", "selected_bases", | "selected_objects", "selected_bases", | ||||
| "editable_objects", "editable_bases", | "editable_objects", "editable_bases", | ||||
| "selected_editable_objects", "selected_editable_bases", | "selected_editable_objects", "selected_editable_bases", | ||||
| "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones", | "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones", | ||||
| "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone", | "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone", | ||||
| "active_base", "active_object", "object", "edit_object", | "active_base", "active_object", "object", "edit_object", | ||||
| Show All 19 Lines | #if 0 /* Using the context breaks adding objects in the UI. Need to find out why - campbell */ | ||||
| Object *obedit = CTX_data_edit_object(C); | Object *obedit = CTX_data_edit_object(C); | ||||
| base = CTX_data_active_base(C); | base = CTX_data_active_base(C); | ||||
| #else | #else | ||||
| Object *obedit = scene->obedit; | Object *obedit = scene->obedit; | ||||
| Object *obact = OBACT; | Object *obact = OBACT; | ||||
| base = BASACT; | base = BASACT; | ||||
| #endif | #endif | ||||
| if (CTX_data_dir(member)) { | if (CTX_data_dir(member)) { | ||||
| CTX_data_dir_set(result, screen_context_dir); | CTX_data_dir_set(result, screen_context_dir); | ||||
| return 1; | return 1; | ||||
brecht: I see no reason for this to be a macro, can be a static function. | |||||
| } | } | ||||
| else if (CTX_data_equals(member, "scene")) { | else if (CTX_data_equals(member, "scene")) { | ||||
| CTX_data_id_pointer_set(result, &scene->id); | CTX_data_id_pointer_set(result, &scene->id); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) { | else if (CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) { | ||||
| const unsigned int lay = context_layers(sc, scene, sa); | const unsigned int lay = context_layers(sc, scene, sa); | ||||
| const LocalViewInfo localviews = context_localviews(sc, sa); | |||||
| const bool visible_objects = CTX_data_equals(member, "visible_objects"); | const bool visible_objects = CTX_data_equals(member, "visible_objects"); | ||||
| for (base = scene->base.first; base; base = base->next) { | for (base = scene->base.first; base; base = base->next) { | ||||
| if (((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) && (base->lay & lay)) { | if ((base->object->restrictflag & OB_RESTRICT_VIEW) == 0 && (base->lay & lay)) { | ||||
| if (localview_check(localviews, base)) { | |||||
| if (visible_objects) | if (visible_objects) | ||||
| CTX_data_id_list_add(result, &base->object->id); | CTX_data_id_list_add(result, &base->object->id); | ||||
| else | else | ||||
| CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) { | else if (CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) { | ||||
| const unsigned int lay = context_layers(sc, scene, sa); | const unsigned int lay = context_layers(sc, scene, sa); | ||||
| const LocalViewInfo localviews = context_localviews(sc, sa); | |||||
| const bool selectable_objects = CTX_data_equals(member, "selectable_objects"); | const bool selectable_objects = CTX_data_equals(member, "selectable_objects"); | ||||
| for (base = scene->base.first; base; base = base->next) { | for (base = scene->base.first; base; base = base->next) { | ||||
| if (base->lay & lay) { | if ((base->object->restrictflag & (OB_RESTRICT_VIEW | OB_RESTRICT_SELECT)) == 0 && (base->lay & lay)) { | ||||
| if ((base->object->restrictflag & OB_RESTRICT_VIEW) == 0 && (base->object->restrictflag & OB_RESTRICT_SELECT) == 0) { | if (localview_check(localviews, base)) { | ||||
| if (selectable_objects) | if (selectable_objects) | ||||
| CTX_data_id_list_add(result, &base->object->id); | CTX_data_id_list_add(result, &base->object->id); | ||||
| else | else | ||||
| CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) { | else if (CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) { | ||||
| const unsigned int lay = context_layers(sc, scene, sa); | const unsigned int lay = context_layers(sc, scene, sa); | ||||
| const LocalViewInfo localviews = context_localviews(sc, sa); | |||||
| const bool selected_objects = CTX_data_equals(member, "selected_objects"); | const bool selected_objects = CTX_data_equals(member, "selected_objects"); | ||||
| for (base = scene->base.first; base; base = base->next) { | for (base = scene->base.first; base; base = base->next) { | ||||
| if ((base->flag & SELECT) && (base->lay & lay)) { | if ((base->flag & SELECT) && (base->lay & lay)) { | ||||
| if (localview_check(localviews, base)) { | |||||
| if (selected_objects) | if (selected_objects) | ||||
| CTX_data_id_list_add(result, &base->object->id); | CTX_data_id_list_add(result, &base->object->id); | ||||
| else | else | ||||
| CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) { | else if (CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) { | ||||
| const unsigned int lay = context_layers(sc, scene, sa); | const unsigned int lay = context_layers(sc, scene, sa); | ||||
| const LocalViewInfo localviews = context_localviews(sc, sa); | |||||
| const bool selected_editable_objects = CTX_data_equals(member, "selected_editable_objects"); | const bool selected_editable_objects = CTX_data_equals(member, "selected_editable_objects"); | ||||
| for (base = scene->base.first; base; base = base->next) { | for (base = scene->base.first; base; base = base->next) { | ||||
| if ((base->flag & SELECT) && (base->lay & lay)) { | if ((base->flag & SELECT) && (base->object->restrictflag & OB_RESTRICT_VIEW) == 0 && (base->lay & lay)) { | ||||
| if ((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) { | if (localview_check(localviews, base)) { | ||||
| if (0 == BKE_object_is_libdata(base->object)) { | if (0 == BKE_object_is_libdata(base->object)) { | ||||
| if (selected_editable_objects) | if (selected_editable_objects) | ||||
| CTX_data_id_list_add(result, &base->object->id); | CTX_data_id_list_add(result, &base->object->id); | ||||
| else | else | ||||
| CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "editable_objects") || CTX_data_equals(member, "editable_bases")) { | else if (CTX_data_equals(member, "editable_objects") || CTX_data_equals(member, "editable_bases")) { | ||||
| const unsigned int lay = context_layers(sc, scene, sa); | const unsigned int lay = context_layers(sc, scene, sa); | ||||
| const LocalViewInfo localviews = context_localviews(sc, sa); | |||||
| const bool editable_objects = CTX_data_equals(member, "editable_objects"); | const bool editable_objects = CTX_data_equals(member, "editable_objects"); | ||||
| /* Visible + Editable, but not necessarily selected */ | /* Visible + Editable, but not necessarily selected */ | ||||
| for (base = scene->base.first; base; base = base->next) { | for (base = scene->base.first; base; base = base->next) { | ||||
| if (((base->object->restrictflag & OB_RESTRICT_VIEW) == 0) && (base->lay & lay)) { | if ((base->object->restrictflag & OB_RESTRICT_VIEW) == 0 && (base->lay & lay)) { | ||||
| if (localview_check(localviews, base)) { | |||||
| if (0 == BKE_object_is_libdata(base->object)) { | if (0 == BKE_object_is_libdata(base->object)) { | ||||
| if (editable_objects) | if (editable_objects) | ||||
| CTX_data_id_list_add(result, &base->object->id); | CTX_data_id_list_add(result, &base->object->id); | ||||
| else | else | ||||
| CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "visible_bones") || CTX_data_equals(member, "editable_bones")) { | else if (CTX_data_equals(member, "visible_bones") || CTX_data_equals(member, "editable_bones")) { | ||||
| bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL; | bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL; | ||||
| EditBone *ebone, *flipbone = NULL; | EditBone *ebone, *flipbone = NULL; | ||||
| const bool editable_bones = CTX_data_equals(member, "editable_bones"); | const bool editable_bones = CTX_data_equals(member, "editable_bones"); | ||||
| ▲ Show 20 Lines • Show All 411 Lines • Show Last 20 Lines | |||||
I see no reason for this to be a macro, can be a static function.