Revision: 26351
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26351
Author: theeth
Date: 2010-01-27 22:19:39 +0100 (Wed, 27 Jan 2010)
Log Message:
-----------
PROP_ENUM_NO_CONTEXT flag for rna properties, forcing enum item functions to be
passed a null context (to return non-contextual items).
This is set on keymap item operator properties and macro definition operator
properties to make them non-contextual (since the context at definition time is
most likely not the same then at execution time, it's better to have all
options visible).
This removes some more errors in keymap export and import.
This commit also sanitize some enum item function, making sure they can cope
with null context and have usable defaults in that case.
Modified Paths:
--------------
trunk/blender/source/blender/editors/armature/poselib.c
trunk/blender/source/blender/editors/mesh/editmesh_mods.c
trunk/blender/source/blender/editors/mesh/editmesh_tools.c
trunk/blender/source/blender/editors/object/object_group.c
trunk/blender/source/blender/editors/object/object_relations.c
trunk/blender/source/blender/makesrna/RNA_enum_types.h
trunk/blender/source/blender/makesrna/RNA_types.h
trunk/blender/source/blender/makesrna/intern/rna_access.c
trunk/blender/source/blender/windowmanager/WM_api.h
trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
trunk/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: trunk/blender/source/blender/editors/armature/poselib.c
===================================================================
--- trunk/blender/source/blender/editors/armature/poselib.c 2010-01-27
21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/editors/armature/poselib.c 2010-01-27
21:19:39 UTC (rev 26351)
@@ -64,6 +64,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_types.h"
+#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -432,6 +433,10 @@
int totitem= 0;
int i= 0;
+ if (C==NULL) {
+ return DummyRNA_DEFAULT_items;
+ }
+
memset(&item_tmp, 0, sizeof(item_tmp));
/* check that the action exists */
@@ -500,9 +505,6 @@
void POSELIB_OT_pose_remove (wmOperatorType *ot)
{
PropertyRNA *prop;
- static EnumPropertyItem prop_poses_dummy_types[] = {
- {0, NULL, 0, NULL, NULL}
- };
/* identifiers */
ot->name= "PoseLib Remove Pose";
@@ -518,7 +520,7 @@
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- prop= RNA_def_enum(ot->srna, "pose", prop_poses_dummy_types, 0, "Pose",
"The pose to remove");
+ prop= RNA_def_enum(ot->srna, "pose", DummyRNA_DEFAULT_items, 0, "Pose",
"The pose to remove");
RNA_def_enum_funcs(prop, poselib_stored_pose_itemf);
ot->prop= prop;
}
Modified: trunk/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_mods.c 2010-01-27
21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/editors/mesh/editmesh_mods.c 2010-01-27
21:19:39 UTC (rev 26351)
@@ -1260,6 +1260,10 @@
Object *obedit= CTX_data_edit_object(C);
EnumPropertyItem *item= NULL;
int a, totitem= 0;
+
+ if (C == NULL) {
+ return prop_similar_types;
+ }
if(obedit && obedit->type == OB_MESH) {
EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c 2010-01-27
21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c 2010-01-27
21:19:39 UTC (rev 26351)
@@ -5835,6 +5835,10 @@
EnumPropertyItem *item= NULL;
int totitem= 0;
+ if (C==NULL) {
+ return merge_type_items;
+ }
+
if(obedit && obedit->type == OB_MESH) {
EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
Modified: trunk/blender/source/blender/editors/object/object_group.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_group.c 2010-01-27
21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/editors/object/object_group.c 2010-01-27
21:19:39 UTC (rev 26351)
@@ -266,14 +266,16 @@
RNA_enum_items_add_value(&item, &totitem, group_items, -1);
- if(bmain->group.first)
- RNA_enum_item_add_separator(&item, &totitem);
+ if (bmain) {
+ if(bmain->group.first)
+ RNA_enum_item_add_separator(&item, &totitem);
- for(a=0, group=bmain->group.first; group; group=group->id.next, a++) {
- tmp.value= a;
- tmp.identifier= group->id.name+2;
- tmp.name= group->id.name+2;
- RNA_enum_item_add(&item, &totitem, &tmp);
+ for(a=0, group=bmain->group.first; group; group=group->id.next,
a++) {
+ tmp.value= a;
+ tmp.identifier= group->id.name+2;
+ tmp.name= group->id.name+2;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
}
RNA_enum_item_end(&item, &totitem);
Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c
2010-01-27 21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/editors/object/object_relations.c
2010-01-27 21:19:39 UTC (rev 26351)
@@ -357,7 +357,7 @@
GroupObject *go;
if(!ob || !ob->dup_group)
- return DummyRNA_NULL_items;
+ return DummyRNA_DEFAULT_items;
memset(&item_tmp, 0, sizeof(item_tmp));
@@ -393,7 +393,7 @@
/* properties */
RNA_def_string(ot->srna, "object", "", 19, "Proxy Object", "Name of
lib-linked/grouped object to make a proxy for.");
- prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type",
"Group object"); /* XXX, relies on hard coded ID at the moment */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Type",
"Group object"); /* XXX, relies on hard coded ID at the moment */
RNA_def_enum_funcs(prop, proxy_group_object_itemf);
ot->prop= prop;
}
Modified: trunk/blender/source/blender/makesrna/RNA_enum_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_enum_types.h 2010-01-27
21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/makesrna/RNA_enum_types.h 2010-01-27
21:19:39 UTC (rev 26351)
@@ -33,6 +33,7 @@
/* use in cases where only dynamic types are used */
extern EnumPropertyItem DummyRNA_NULL_items[];
+extern EnumPropertyItem DummyRNA_DEFAULT_items[];
extern EnumPropertyItem object_mode_items[];
Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h 2010-01-27 21:12:33 UTC
(rev 26350)
+++ trunk/blender/source/blender/makesrna/RNA_types.h 2010-01-27 21:19:39 UTC
(rev 26351)
@@ -187,7 +187,8 @@
PROP_RAW_ACCESS = 1<<13,
PROP_RAW_ARRAY = 1<<14,
PROP_FREE_POINTERS = 1<<15,
- PROP_DYNAMIC = 1<<17 /* for dynamic arrays, and retvals of type string
*/
+ PROP_DYNAMIC = 1<<17, /* for dynamic arrays, and retvals of type string
*/
+ PROP_ENUM_NO_CONTEXT = 1<<18 /* for enum that shouldn't be contextual */
} PropertyFlag;
typedef struct CollectionPropertyIterator {
Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c 2010-01-27
21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c 2010-01-27
21:19:39 UTC (rev 26351)
@@ -943,16 +943,26 @@
{0, NULL, 0, NULL, NULL}
};
+/* Reuse for dynamic types with default value */
+EnumPropertyItem DummyRNA_DEFAULT_items[] = {
+ {0, "DEFAULT", 0, "Default", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop,
EnumPropertyItem **item, int *totitem, int *free)
{
EnumPropertyRNA *eprop= (EnumPropertyRNA*)rna_ensure_property(prop);
*free= 0;
- if(eprop->itemf && C) {
+ if(eprop->itemf && (C != NULL || (prop->flag & PROP_ENUM_NO_CONTEXT))) {
int tot= 0;
- *item= eprop->itemf(C, ptr, free);
+ if (prop->flag & PROP_ENUM_NO_CONTEXT)
+ *item= eprop->itemf(NULL, ptr, free);
+ else
+ *item= eprop->itemf(C, ptr, free);
+
if(totitem) {
if(*item) {
for( ; (*item)[tot].identifier; tot++);
Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h 2010-01-27 21:12:33 UTC
(rev 26350)
+++ trunk/blender/source/blender/windowmanager/WM_api.h 2010-01-27 21:19:39 UTC
(rev 26351)
@@ -215,6 +215,7 @@
int WM_operator_call_py(struct bContext *C, struct
wmOperatorType *ot, int context, struct PointerRNA *properties, struct
ReportList *reports);
void WM_operator_properties_alloc(struct PointerRNA **ptr, struct
IDProperty **properties, const char *opstring); /* used for keymap and macro
items */
+void WM_operator_properties_sanitize(struct PointerRNA *ptr); /*
make props not context sensitive */
void WM_operator_properties_create(struct PointerRNA *ptr, const
char *opstring);
void WM_operator_properties_create_ptr(struct PointerRNA *ptr,
struct wmOperatorType *ot);
void WM_operator_properties_free(struct PointerRNA *ptr);
Modified: trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
2010-01-27 21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/windowmanager/intern/wm_keymap.c
2010-01-27 21:19:39 UTC (rev 26351)
@@ -57,6 +57,12 @@
/* ********************* key config ***********************/
+static void keymap_properties_set(wmKeyMapItem *kmi)
+{
+ WM_operator_properties_alloc(&(kmi->ptr), &(kmi->properties),
kmi->idname);
+ WM_operator_properties_sanitize(kmi->ptr);
+}
+
void WM_keymap_properties_reset(wmKeyMapItem *kmi)
{
WM_operator_properties_free(kmi->ptr);
@@ -65,14 +71,9 @@
kmi->ptr = NULL;
kmi->properties = NULL;
- WM_operator_properties_alloc(&(kmi->ptr), &(kmi->properties),
kmi->idname);
+ keymap_properties_set(kmi);
}
-static void keymap_properties_set(wmKeyMapItem *kmi)
-{
- WM_operator_properties_alloc(&(kmi->ptr), &(kmi->properties),
kmi->idname);
-}
-
wmKeyConfig *WM_keyconfig_add(wmWindowManager *wm, char *idname)
{
wmKeyConfig *keyconf;
Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c
2010-01-27 21:12:33 UTC (rev 26350)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c
2010-01-27 21:19:39 UTC (rev 26351)
@@ -391,6 +391,7 @@
/* do this on first use, since operatordefinitions might have been not
done yet */
WM_operator_properties_alloc(&(otmacro->ptr), &(otmacro->properties),
idname);
+ WM_operator_properties_sanitize(otmacro->ptr);
BLI_addtail(&ot->macro, otmacro);
@@ -592,7 +593,31 @@
}
+void WM_operator_properties_sanitize(PointerRNA *ptr)
+{
+ RNA_STRUCT_BEGIN(ptr, prop) {
+ switch(RNA_property_type(prop)) {
+ case PROP_ENUM:
+ RNA_def_property_flag(prop, PROP_ENUM_NO_CONTEXT);
+ break;
+ case PROP_POINTER:
+ {
+ StructRNA *ptype=
RNA_property_pointer_type(ptr, prop);
+ /* recurse into operator properties */
+ if (RNA_struct_is_a(ptype,
&RNA_OperatorProperties)) {
+ PointerRNA opptr =
RNA_property_pointer_get(ptr, prop);
+ WM_operator_properties_sanitize(&opptr);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ RNA_STRUCT_END;
+}
+
void WM_operator_properties_free(PointerRNA *ptr)
{
IDProperty *properties= ptr->data;
@@ -2971,9 +2996,9 @@
/* can add more */
EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *free)
{
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs