diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-03-19 22:03:38 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-03-19 22:03:38 +0300 |
commit | 1b94cb752ca18aac122b444261e76dc63022f99f (patch) | |
tree | c0d4ec35be53898e07462f41bb50f7629a3d323e /source/blender/editors/screen | |
parent | 77e0199dc386c26aa106a884f24b336fce82d351 (diff) |
Context
* Made it based on string lookups rather than fixed enum, to make
it extensible by python scripts.
* Context callbacks now also have to specify RNA type when returning
pointers or collections. For non-RNA wrapped data, UnknownType can
be used.
* RNA wrapped context. The WM entries are fixed, for data context
only main and scene are defined properties. Other data entries have
to be dynamically looked up.
* I've added some special code in python for the dynamic context
lookups. Tried to hide it behind RNA but didn't find a clean way to
do it yet. Still unused/untested.
* Also minor fix for warning about propertional edit property in
transform code, and fix for usage of operator poll with checking if
it was NULL.
Diffstat (limited to 'source/blender/editors/screen')
-rw-r--r-- | source/blender/editors/screen/screen_context.c | 31 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_intern.h | 2 |
2 files changed, 19 insertions, 14 deletions
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index 2406c1c5e32..11d1d019005 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -25,6 +25,7 @@ */ #include <stdlib.h> +#include <string.h> #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -33,44 +34,48 @@ #include "BKE_context.h" #include "BKE_utildefines.h" -int ed_screen_context(const bContext *C, bContextDataMember member, bContextDataResult *result) +#include "RNA_access.h" + +int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result) { bScreen *sc= CTX_wm_screen(C); Scene *scene= sc->scene; Base *base; - if(member == CTX_DATA_SCENE) { - CTX_data_pointer_set(result, scene); + if(CTX_data_equals(member, "scene")) { + CTX_data_id_pointer_set(result, &scene->id); return 1; } - else if(ELEM(member, CTX_DATA_SELECTED_OBJECTS, CTX_DATA_SELECTED_BASES)) { + else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) { + int selected_objects= CTX_data_equals(member, "selected_objects"); + for(base=scene->base.first; base; base=base->next) { if((base->flag & SELECT) && (base->lay & scene->lay)) { - if(member == CTX_DATA_SELECTED_OBJECTS) - CTX_data_list_add(result, base->object); + if(selected_objects) + CTX_data_id_list_add(result, &base->object->id); else - CTX_data_list_add(result, base); + CTX_data_list_add(result, &scene->id, &RNA_UnknownType, base); } } return 1; } - else if(member == CTX_DATA_ACTIVE_BASE) { + else if(CTX_data_equals(member, "active_base")) { if(scene->basact) - CTX_data_pointer_set(result, scene->basact); + CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact); return 1; } - else if(member == CTX_DATA_ACTIVE_OBJECT) { + else if(CTX_data_equals(member, "active_object")) { if(scene->basact) - CTX_data_pointer_set(result, scene->basact->object); + CTX_data_id_pointer_set(result, &scene->basact->object->id); return 1; } - else if(member == CTX_DATA_EDIT_OBJECT) { + else if(CTX_data_equals(member, "edit_object")) { /* convenience for now, 1 object per scene in editmode */ if(scene->obedit) - CTX_data_pointer_set(result, scene->obedit); + CTX_data_id_pointer_set(result, &scene->obedit->id); return 1; } diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h index f39ca7d4c3e..a0804f3e633 100644 --- a/source/blender/editors/screen/screen_intern.h +++ b/source/blender/editors/screen/screen_intern.h @@ -55,7 +55,7 @@ AZone *is_in_area_actionzone(ScrArea *sa, int x, int y); void ed_screen_fullarea(bContext *C, ScrArea *sa); /* screen_context.c */ -void ed_screen_context(const bContext *C, bContextDataMember member, bContextDataResult *result); +void ed_screen_context(const bContext *C, const char *member, bContextDataResult *result); /* screendump.c */ void SCREEN_OT_screenshot(struct wmOperatorType *ot); |