add RNA_property_is_set function, use for WM_menu_invoke to avoid double lookup and...
authorCampbell Barton <ideasman42@gmail.com>
Wed, 11 Jan 2012 16:48:22 +0000 (16:48 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 11 Jan 2012 16:48:22 +0000 (16:48 +0000)
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_access.c
source/blender/python/intern/bpy_rna.c
source/blender/windowmanager/intern/wm_operators.c

index 7e8ea11..9c8cd83 100644 (file)
@@ -933,7 +933,8 @@ void RNA_collection_clear(PointerRNA *ptr, const char *name);
        }
 
 /* check if the idproperty exists, for operators */
-int RNA_struct_property_is_set(PointerRNA *ptr, const char *name);
+int RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop);
+int RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier);
 int RNA_property_is_idprop(PropertyRNA *prop);
 
 /* python compatible string representation of this property, (must be freed!) */
index 41641af..ddd0fa1 100644 (file)
@@ -4412,15 +4412,22 @@ int RNA_collection_length(PointerRNA *ptr, const char *name)
        }
 }
 
-int RNA_struct_property_is_set(PointerRNA *ptr, const char *name)
+int RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
 {
-       PropertyRNA *prop= RNA_struct_find_property(ptr, name);
+       if(prop->flag & PROP_IDPROPERTY) {
+               return (rna_idproperty_find(ptr, prop->identifier) != NULL);
+       }
+       else {
+               return 1;
+       }
+}
+
+int RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
+{
+       PropertyRNA *prop= RNA_struct_find_property(ptr, identifier);
 
        if(prop) {
-               if(prop->flag & PROP_IDPROPERTY)
-                       return (rna_idproperty_find(ptr, name) != NULL);
-               else
-                       return 1;
+               return RNA_property_is_set(ptr, prop);
        }
        else {
                /* python raises an error */
index a54e650..588f082 100644 (file)
@@ -3055,7 +3055,6 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
 {
        PropertyRNA *prop;
        const char *name;
-       int ret;
 
        PYRNA_STRUCT_CHECK_OBJ(self);
 
@@ -3069,22 +3068,7 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
                return NULL;
        }
 
-       /* double property lookup, could speed up */
-       /* return PyBool_FromLong(RNA_struct_property_is_set(&self->ptr, name)); */
-       if (RNA_property_flag(prop) & PROP_IDPROPERTY) {
-               IDProperty *group = RNA_struct_idprops(&self->ptr, 0);
-               if (group) {
-                       ret = IDP_GetPropertyFromGroup(group, name) ? 1:0;
-               }
-               else {
-                       ret = 0;
-               }
-       }
-       else {
-               ret = 1;
-       }
-
-       return PyBool_FromLong(ret);
+       return PyBool_FromLong(RNA_property_is_set(&self->ptr, prop));
 }
 
 PyDoc_STRVAR(pyrna_struct_is_property_hidden_doc,
index 1905020..c917031 100644 (file)
@@ -665,7 +665,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
                printf("%s: %s \"%s\" is not an enum property\n",
                       __func__, op->type->idname, RNA_property_identifier(prop));
        }
-       else if (RNA_struct_property_is_set(op->ptr, RNA_property_identifier(prop))) {
+       else if (RNA_property_is_set(op->ptr, prop)) {
                const int retval= op->type->exec(C, op);
                OPERATOR_RETVAL_CHECK(retval);
                return retval;