Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-23 05:07:13 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-23 05:07:13 +0300
commit76c035bd11ac6dc07796566aa2ebce9acf799d68 (patch)
treeef5a60d6e43e33850b190e3d47af2fcd5918c9e8 /source/blender/blenkernel
parent8d6c2e6ec0adb0e9beeee7f49111962245a0c278 (diff)
2.5: Data Context
* Worked out data context implementation more, now with initial context callbacks implemented for the screen and 3d view. * For collections, switch from iterators to simpler ListBase. Though that still means it uses LinkData* rather than the actual Object* for example, since those can only be part of one list. So I added a macro as well to make iteration easier when possible. CTX_DATA_BEGIN(C, Object*, ob, selected_objects) { printf("object name: %s\n", ob->id.name); } CTX_DATA_END;
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_context.h57
-rw-r--r--source/blender/blenkernel/BKE_screen.h5
-rw-r--r--source/blender/blenkernel/intern/context.c106
3 files changed, 110 insertions, 58 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 90f158cd714..e8bd72ac3f3 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -55,30 +55,10 @@ struct wmWindowManager;
struct bContext;
typedef struct bContext bContext;
-struct bContextDataMember;
-typedef struct bContextDataMember bContextDataMember;
-
-extern bContextDataMember CTX_DataMain;
-extern bContextDataMember CTX_DataScene;
-extern bContextDataMember CTX_DataObjects;
-extern bContextDataMember CTX_DataEditObject;
-extern bContextDataMember CTX_DataEditArmature;
-extern bContextDataMember CTX_DataEditMesh;
-
-typedef struct bContextDataIterator {
- void *data;
- int valid;
-
- void (*begin)(bContext *C, struct bContextDataIterator *iter);
- void (*next)(struct bContextDataIterator *iter);
- void (*end)(struct bContextDataIterator *iter);
- void *internal;
-} bContextDataIterator;
-
-typedef struct bContextDataResult {
- void *pointer;
- bContextDataIterator iterator;
-} bContextDataResult;
+typedef void bContextDataMember;
+
+struct bContextDataResult;
+typedef struct bContextDataResult bContextDataResult;
typedef int (*bContextDataCallback)(const bContext *C,
const bContextDataMember *member, bContextDataResult *result);
@@ -124,7 +104,28 @@ void CTX_wm_area_set(bContext *C, struct ScrArea *win);
void CTX_wm_region_set(bContext *C, struct ARegion *win);
void CTX_wm_ui_block_set(bContext *C, struct uiBlock *block, bContextDataCallback cb);
-/* Data Context */
+/* Data Context
+
+ - note: listbases consist of LinkData items and must be
+ freed with BLI_freelistN! */
+
+void CTX_data_pointer_set(bContextDataResult *result, void *data);
+void CTX_data_list_add(bContextDataResult *result, void *data);
+
+#define CTX_DATA_BEGIN(C, Type, instance, member) \
+ { \
+ ListBase ctx_data_list; \
+ LinkData *link; \
+ CTX_data_##member(C, &ctx_data_list); \
+ for(link=ctx_data_list.first; link; link=link->next) { \
+ Type instance= link->data;
+
+#define CTX_DATA_END \
+ } \
+ BLI_freelistN(&ctx_data_list); \
+ }
+
+/* Data Context Members */
struct Main *CTX_data_main(const bContext *C);
struct Scene *CTX_data_scene(const bContext *C);
@@ -133,7 +134,11 @@ struct ToolSettings *CTX_data_tool_settings(const bContext *C);
void CTX_data_main_set(bContext *C, struct Main *bmain);
void CTX_data_scene_set(bContext *C, struct Scene *bmain);
-int CTX_data_objects(const bContext *C, bContextDataIterator *iter);
+int CTX_data_selected_objects(const bContext *C, ListBase *list);
+int CTX_data_selected_bases(const bContext *C, ListBase *list);
+
+struct Object *CTX_data_active_object(const bContext *C);
+struct Base *CTX_data_active_base(const bContext *C);
struct Object *CTX_data_edit_object(const bContext *C);
struct EditMesh *CTX_data_edit_mesh(const bContext *C);
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 35bc40ded4c..60072ec2553 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -33,7 +33,6 @@
struct ARegion;
struct bContext;
-struct bContextDataMember;
struct bContextDataResult;
struct bScreen;
struct ListBase;
@@ -77,7 +76,7 @@ typedef struct SpaceType {
void (*cursor)(struct wmWindow *win, struct ARegion *ar);
/* return context data */
- int (*context)(const struct bContext *, const struct bContextDataMember *, struct bContextDataResult *);
+ int (*context)(const struct bContext *, const void *, struct bContextDataResult *);
/* region type definitions */
ListBase regiontypes;
@@ -111,7 +110,7 @@ typedef struct ARegionType {
void (*keymap)(struct wmWindowManager *);
/* return context data */
- int (*context)(const struct bContext *, const struct bContextDataMember *, struct bContextDataResult *);
+ int (*context)(const struct bContext *, const void *, struct bContextDataResult *);
/* hardcoded constraints, smaller than these values region is not visible */
int minsizex, minsizey;
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index b8633d8618e..703bb4c2b00 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -35,6 +35,8 @@
#include "RNA_access.h"
+#include "BLI_listbase.h"
+
#include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_report.h"
@@ -58,8 +60,6 @@ struct bContext {
struct ARegion *region;
struct uiBlock *block;
- bContextDataCallback manager_cb;
- bContextDataCallback window_cb;
bContextDataCallback screen_cb;
bContextDataCallback area_cb;
bContextDataCallback region_cb;
@@ -70,6 +70,8 @@ struct bContext {
struct {
struct Main *main;
struct Scene *scene;
+
+ int recursion;
} data;
/* data evaluation */
@@ -189,12 +191,14 @@ void CTX_wm_window_set(bContext *C, wmWindow *win)
C->wm.window= win;
C->wm.screen= (win)? win->screen: NULL;
C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
+ C->wm.screen_cb= (C->wm.screen)? C->wm.screen->context: NULL;
}
void CTX_wm_screen_set(bContext *C, bScreen *screen)
{
C->wm.screen= screen;
C->data.scene= (C->wm.screen)? C->wm.screen->scene: NULL;
+ C->wm.screen_cb= (C->wm.screen)? C->wm.screen->context: NULL;
}
void CTX_wm_area_set(bContext *C, ScrArea *area)
@@ -223,32 +227,46 @@ struct bContextDataMember {
int collection;
};
-bContextDataMember CTX_DataMain = {&RNA_Main, "main", 0};
-bContextDataMember CTX_DataScene = {&RNA_Scene, "scene", 0};
+struct bContextDataResult {
+ void *pointer;
+ ListBase list;
+};
-bContextDataMember CTX_DataObjects = {&RNA_Object, "objects", 1};
+static int ctx_data_get(bContext *C, const bContextDataMember *member, bContextDataResult *result)
+{
+ int done= 0, recursion= C->data.recursion;
-bContextDataMember CTX_DataEditObject = {&RNA_Object, "edit_object", 0};
-bContextDataMember CTX_DataEditArmature = {NULL, "edit_armature", 0};
-bContextDataMember CTX_DataEditMesh = {NULL, "edit_mesh", 0};
+ memset(result, 0, sizeof(bContextDataResult));
-static int ctx_data_get(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
-{
- if(C->wm.block_cb && C->wm.block_cb(C, member, result)) return 1;
- if(C->wm.region_cb && C->wm.region_cb(C, member, result)) return 1;
- if(C->wm.area_cb && C->wm.area_cb(C, member, result)) return 1;
- if(C->wm.screen_cb && C->wm.screen_cb(C, member, result)) return 1;
- if(C->wm.window_cb && C->wm.window_cb(C, member, result)) return 1;
- if(C->wm.manager_cb && C->wm.manager_cb(C, member, result)) return 1;
+ /* we check recursion to ensure that we do not get infinite
+ * loops requesting data from ourselfs in a context callback */
+ if(!done && recursion < 1 && C->wm.block_cb) {
+ C->data.recursion= 1;
+ done= C->wm.block_cb(C, member, result);
+ }
+ if(!done && recursion < 2 && C->wm.region_cb) {
+ C->data.recursion= 2;
+ done= C->wm.region_cb(C, member, result);
+ }
+ if(!done && recursion < 3 && C->wm.area_cb) {
+ C->data.recursion= 3;
+ done= C->wm.area_cb(C, member, result);
+ }
+ if(!done && recursion < 4 && C->wm.screen_cb) {
+ C->data.recursion= 4;
+ done= C->wm.screen_cb(C, member, result);
+ }
- return 0;
+ C->data.recursion= recursion;
+
+ return done;
}
static void *ctx_data_pointer_get(const bContext *C, const bContextDataMember *member)
{
bContextDataResult result;
- if(ctx_data_get(C, member, &result))
+ if(ctx_data_get((bContext*)C, member, &result))
return result.pointer;
return NULL;
@@ -258,7 +276,7 @@ static int ctx_data_pointer_verify(const bContext *C, const bContextDataMember *
{
bContextDataResult result;
- if(ctx_data_get(C, member, &result)) {
+ if(ctx_data_get((bContext*)C, member, &result)) {
*pointer= result.pointer;
return 1;
}
@@ -268,25 +286,40 @@ static int ctx_data_pointer_verify(const bContext *C, const bContextDataMember *
}
}
-static int ctx_data_collection_get(const bContext *C, const bContextDataMember *member, bContextDataIterator *iter)
+static int ctx_data_collection_get(const bContext *C, const bContextDataMember *member, ListBase *list)
{
bContextDataResult result;
- if(ctx_data_get(C, member, &result)) {
- *iter= result.iterator;
+ if(ctx_data_get((bContext*)C, member, &result)) {
+ *list= result.list;
return 1;
}
return 0;
}
+void CTX_data_pointer_set(bContextDataResult *result, void *data)
+{
+ result->pointer= data;
+}
+
+void CTX_data_list_add(bContextDataResult *result, void *data)
+{
+ LinkData *link;
+
+ link= MEM_callocN(sizeof(LinkData), "LinkData");
+ link->data= data;
+
+ BLI_addtail(&result->list, link);
+}
+
/* data context */
Main *CTX_data_main(const bContext *C)
{
Main *bmain;
- if(ctx_data_pointer_verify(C, &CTX_DataMain, (void*)&bmain))
+ if(ctx_data_pointer_verify(C, CTX_data_main, (void*)&bmain))
return bmain;
else
return C->data.main;
@@ -301,7 +334,7 @@ Scene *CTX_data_scene(const bContext *C)
{
Scene *scene;
- if(ctx_data_pointer_verify(C, &CTX_DataScene, (void*)&scene))
+ if(ctx_data_pointer_verify(C, CTX_data_scene, (void*)&scene))
return scene;
else
return C->data.scene;
@@ -322,24 +355,39 @@ ToolSettings *CTX_data_tool_settings(const bContext *C)
return NULL;
}
-int CTX_data_objects(const bContext *C, bContextDataIterator *iter)
+int CTX_data_selected_objects(const bContext *C, ListBase *list)
+{
+ return ctx_data_collection_get(C, CTX_data_selected_objects, list);
+}
+
+int CTX_data_selected_bases(const bContext *C, ListBase *list)
+{
+ return ctx_data_collection_get(C, CTX_data_selected_bases, list);
+}
+
+struct Object *CTX_data_active_object(const bContext *C)
+{
+ return ctx_data_pointer_get(C, CTX_data_active_object);
+}
+
+struct Base *CTX_data_active_base(const bContext *C)
{
- return ctx_data_collection_get(C, &CTX_DataObjects, iter);
+ return ctx_data_pointer_get(C, CTX_data_active_base);
}
struct Object *CTX_data_edit_object(const bContext *C)
{
- return ctx_data_pointer_get(C, &CTX_DataEditObject);
+ return ctx_data_pointer_get(C, CTX_data_edit_object);
}
struct EditMesh *CTX_data_edit_mesh(const bContext *C)
{
- return ctx_data_pointer_get(C, &CTX_DataEditMesh);
+ return ctx_data_pointer_get(C, CTX_data_edit_mesh);
}
ListBase *CTX_data_edit_armature(const bContext *C)
{
- return ctx_data_pointer_get(C, &CTX_DataEditArmature);
+ return ctx_data_pointer_get(C, CTX_data_edit_armature);
}
/* data evaluation */