[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18022] branches/blender2.5/blender/source /blender: 2.5: Data Context

Brecht Van Lommel brecht at blender.org
Tue Dec 23 03:07:14 CET 2008


Revision: 18022
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18022
Author:   blendix
Date:     2008-12-23 03:07:13 +0100 (Tue, 23 Dec 2008)

Log Message:
-----------
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;

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/context.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
    branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h

Added Paths:
-----------
    branches/blender2.5/blender/source/blender/editors/screen/screen_context.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h	2008-12-23 02:03:08 UTC (rev 18021)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h	2008-12-23 02:07:13 UTC (rev 18022)
@@ -55,31 +55,11 @@
 struct bContext;
 typedef struct bContext bContext;
 
-struct bContextDataMember;
-typedef struct bContextDataMember bContextDataMember;
+typedef void 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;
+struct bContextDataResult;
+typedef struct bContextDataResult bContextDataResult;
 
-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 int (*bContextDataCallback)(const bContext *C,
 	const bContextDataMember *member, bContextDataResult *result);
 
@@ -124,8 +104,29 @@
 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);
 struct ToolSettings *CTX_data_tool_settings(const bContext *C);
@@ -133,8 +134,12 @@
 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);
 struct ListBase *CTX_data_edit_armature(const bContext *C);

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-23 02:03:08 UTC (rev 18021)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h	2008-12-23 02:07:13 UTC (rev 18022)
@@ -33,7 +33,6 @@
 
 struct ARegion;
 struct bContext;
-struct bContextDataMember;
 struct bContextDataResult;
 struct bScreen;
 struct ListBase;
@@ -77,7 +76,7 @@
 	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 @@
 	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;

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/context.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/context.c	2008-12-23 02:03:08 UTC (rev 18021)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/context.c	2008-12-23 02:07:13 UTC (rev 18022)
@@ -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 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 {
 		struct Main *main;
 		struct Scene *scene;
+
+		int recursion;
 	} data;
 	
 	/* data evaluation */
@@ -189,12 +191,14 @@
 	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 @@
 	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 @@
 {
 	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_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 *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 @@
 		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_DataObjects, iter);
+	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_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 */


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list