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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-05-29 03:13:42 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-05-29 03:13:42 +0400
commit9cc638fb161c1a9795dc3351520ad16c573b4f1f (patch)
treea9b8f4a300e4bda8b9537f452be6fe88ac9d8bfa /source
parenta843d7e31612a0f9c53fe7b2131bd2b873c5ce7f (diff)
Context:
Added a system for adding a "local" context in a UI layout. This way you can define for example within a modifier panel all operators to get the modifier in the context. In the layout code: uiLayoutSetContextPointer(layout, "modifier", &ptr) layout.set_context_pointer("modifier", md) In the operator: ptr = CTX_data_pointer_get(C, "modifier") md = context.modifier
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_context.h22
-rw-r--r--source/blender/blenkernel/intern/context.c87
-rw-r--r--source/blender/editors/include/UI_interface.h3
-rw-r--r--source/blender/editors/interface/interface.c2
-rw-r--r--source/blender/editors/interface/interface_api.c7
-rw-r--r--source/blender/editors/interface/interface_intern.h5
-rw-r--r--source/blender/editors/interface/interface_layout.c11
7 files changed, 129 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index f08b14c7820..6a43f4ca25c 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -72,6 +72,20 @@ typedef struct bContextDataResult bContextDataResult;
typedef int (*bContextDataCallback)(const bContext *C,
const char *member, bContextDataResult *result);
+typedef struct bContextStoreEntry {
+ struct bContextStoreEntry *next, *prev;
+
+ char name[128];
+ PointerRNA ptr;
+} bContextStoreEntry;
+
+typedef struct bContextStore {
+ struct bContextStore *next, *prev;
+
+ ListBase entries;
+ int used;
+} bContextStore;
+
/* Context */
bContext *CTX_create(void);
@@ -79,6 +93,14 @@ void CTX_free(bContext *C);
bContext *CTX_copy(const bContext *C);
+/* Stored Context */
+
+bContextStore *CTX_store_add(ListBase *contexts, char *name, PointerRNA *ptr);
+void CTX_store_set(bContext *C, bContextStore *store);
+bContextStore *CTX_store_copy(bContextStore *store);
+void CTX_store_free(bContextStore *store);
+void CTX_store_free_list(ListBase *contexts);
+
/* Window Manager Context */
struct wmWindowManager *CTX_wm_manager(const bContext *C);
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 9d2830983e1..ae541365b1e 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -38,6 +38,7 @@
#include "RNA_access.h"
#include "BLI_listbase.h"
+#include "BLI_string.h"
#include "BKE_context.h"
#include "BKE_main.h"
@@ -58,6 +59,7 @@ struct bContext {
struct ScrArea *area;
struct ARegion *region;
struct ARegion *menu;
+ struct bContextStore *store;
} wm;
/* data context */
@@ -97,6 +99,69 @@ void CTX_free(bContext *C)
MEM_freeN(C);
}
+/* store */
+
+bContextStore *CTX_store_add(ListBase *contexts, char *name, PointerRNA *ptr)
+{
+ bContextStoreEntry *entry;
+ bContextStore *ctx, *lastctx;
+
+ /* ensure we have a context to put the entry in, if it was already used
+ * we have to copy the context to ensure */
+ ctx= contexts->last;
+
+ if(!ctx || ctx->used) {
+ if(ctx) {
+ lastctx= ctx;
+ ctx= MEM_dupallocN(lastctx);
+ BLI_duplicatelist(&ctx->entries, &lastctx->entries);
+ }
+ else
+ ctx= MEM_callocN(sizeof(bContextStore), "bContextStore");
+
+ BLI_addtail(contexts, ctx);
+ }
+
+ entry= MEM_callocN(sizeof(bContextStoreEntry), "bContextStoreEntry");
+ BLI_strncpy(entry->name, name, sizeof(entry->name));
+ entry->ptr= *ptr;
+
+ BLI_addtail(&ctx->entries, entry);
+
+ return ctx;
+}
+
+void CTX_store_set(bContext *C, bContextStore *store)
+{
+ C->wm.store= store;
+}
+
+bContextStore *CTX_store_copy(bContextStore *store)
+{
+ bContextStore *ctx;
+
+ ctx= MEM_dupallocN(store);
+ BLI_duplicatelist(&ctx->entries, &store->entries);
+
+ return ctx;
+}
+
+void CTX_store_free(bContextStore *store)
+{
+ BLI_freelistN(&store->entries);
+ MEM_freeN(store);
+}
+
+void CTX_store_free_list(ListBase *contexts)
+{
+ bContextStore *ctx;
+
+ while((ctx= contexts->first)) {
+ BLI_remlink(contexts, ctx);
+ CTX_store_free(ctx);
+ }
+}
+
/* window manager context */
wmWindowManager *CTX_wm_manager(const bContext *C)
@@ -225,19 +290,31 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res
/* 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.region) {
+ if(!done && recursion < 1 && C->wm.store) {
+ bContextStoreEntry *entry;
+
C->data.recursion= 1;
+
+ for(entry=C->wm.store->entries.first; entry; entry=entry->next) {
+ if(strcmp(entry->name, member) == 0) {
+ result->ptr= entry->ptr;
+ done= 1;
+ }
+ }
+ }
+ if(!done && recursion < 2 && C->wm.region) {
+ C->data.recursion= 2;
if(C->wm.region->type && C->wm.region->type->context)
done= C->wm.region->type->context(C, member, result);
}
- if(!done && recursion < 2 && C->wm.area) {
- C->data.recursion= 2;
+ if(!done && recursion < 3 && C->wm.area) {
+ C->data.recursion= 3;
if(C->wm.area->type && C->wm.area->type->context)
done= C->wm.area->type->context(C, member, result);
}
- if(!done && recursion < 3 && C->wm.screen) {
+ if(!done && recursion < 4 && C->wm.screen) {
bContextDataCallback cb= C->wm.screen->context;
- C->data.recursion= 3;
+ C->data.recursion= 4;
if(cb)
done= cb(C, member, result);
}
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index b5ed2c59a26..981bc23162c 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -541,12 +541,13 @@ uiBut *uiDefMenuTogR(uiBlock *block, struct PointerRNA *ptr, char *propname, cha
uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, struct uiStyle *style);
void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout);
void uiBlockLayoutResolve(const struct bContext *C, uiBlock *block, int *x, int *y);
-float uiBlockAspect(uiBlock *block); /* temporary */
void uiLayoutContext(uiLayout *layout, int opcontext);
void uiLayoutFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
uiBlock *uiLayoutBlock(uiLayout *layout);
+void uiLayoutSetContextPointer(uiLayout *layout, char *name, struct PointerRNA *ptr);
+
/* layout specifiers */
uiLayout *uiLayoutRow(uiLayout *layout, int align);
uiLayout *uiLayoutColumn(uiLayout *layout, int align);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index e86e79f7887..e9a886375c3 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1692,6 +1692,8 @@ void uiFreeBlock(const bContext *C, uiBlock *block)
ui_free_but(C, but);
}
+ CTX_store_free_list(&block->contexts);
+
BLI_freelistN(&block->saferct);
MEM_freeN(block);
diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c
index 1bb34a71d0a..9c63859dd6f 100644
--- a/source/blender/editors/interface/interface_api.c
+++ b/source/blender/editors/interface/interface_api.c
@@ -175,6 +175,13 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "itemS", "uiItemS");
+ /* context */
+ func= RNA_def_function(srna, "set_context_pointer", "uiLayoutSetContextPointer");
+ parm= RNA_def_string(func, "name", "", 0, "Name", "Name of entry in the context.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "data", "AnyType", "", "Pointer to put in context.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
/* templates */
func= RNA_def_function(srna, "template_header", "uiTemplateHeader");
parm= RNA_def_pointer(func, "context", "Context", "", "Current context.");
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index b59846738ce..090c0313dae 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -43,6 +43,7 @@ struct wmWindow;
struct uiStyle;
struct uiWidgetColors;
struct uiLayout;
+struct bContextStore;
/* ****************** general defines ************** */
@@ -166,6 +167,8 @@ struct uiBut {
uiButHandleNFunc funcN;
void *func_argN;
+ struct bContextStore *context;
+
void (*embossfunc)(int , int , float, float, float, float, float, int);
void (*sliderfunc)(int , float, float, float, float, float, float, int);
@@ -224,6 +227,8 @@ struct uiBlock {
ListBase layouts;
struct uiLayout *curlayout;
+
+ ListBase contexts;
char name[UI_MAX_NAME_STR];
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 1b633c0fd77..b85d12cd9b7 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -126,6 +126,7 @@ struct uiLayout {
uiItem item;
uiLayoutRoot *root;
+ bContextStore *context;
ListBase items;
int x, y, w, h;
@@ -1731,6 +1732,11 @@ void ui_layout_add_but(uiLayout *layout, uiBut *but)
bitem->item.type= ITEM_BUTTON;
bitem->but= but;
BLI_addtail(&layout->items, bitem);
+
+ if(layout->context) {
+ but->context= layout->context;
+ but->context->used= 1;
+ }
}
void uiLayoutContext(uiLayout *layout, int opcontext)
@@ -1769,8 +1775,9 @@ void uiBlockLayoutResolve(const bContext *C, uiBlock *block, int *x, int *y)
}
}
-float uiBlockAspect(uiBlock *block)
+void uiLayoutSetContextPointer(uiLayout *layout, char *name, PointerRNA *ptr)
{
- return block->aspect; /* temporary */
+ uiBlock *block= layout->root->block;
+ layout->context= CTX_store_add(&block->contexts, name, ptr);
}