RNA: Add a way to prevent automatic addition of 'no ownership' flag for ID pointer properties.

Since makesrna runs after all properties have been defined, we have to
remember with a new internal flag when we explicitely disable the
'PROP_PTR_NO_OWNERSHIP' flag for a property.

Otherwise there was no way to do so for ID pointer properties...
This commit is contained in:
Bastien Montagne 2020-06-26 18:08:12 +02:00
parent febb2351ad
commit 28f4e5cd6b
3 changed files with 10 additions and 2 deletions

View File

@ -3770,7 +3770,8 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
/* XXX This systematically enforces that flag on ID pointers...
* we'll probably have to revisit. :/ */
StructRNA *type = rna_find_struct((const char *)pprop->type);
if (type && (type->flag & STRUCT_ID)) {
if (type && (type->flag & STRUCT_ID) &&
!(prop->flag_internal & PROP_INTERN_PTR_OWNERSHIP_FORCED)) {
prop->flag |= PROP_PTR_NO_OWNERSHIP;
}
break;
@ -3781,7 +3782,8 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
/* XXX This systematically enforces that flag on ID pointers...
* we'll probably have to revisit. :/ */
StructRNA *type = rna_find_struct((const char *)cprop->item_type);
if (type && (type->flag & STRUCT_ID)) {
if (type && (type->flag & STRUCT_ID) &&
!(prop->flag_internal & PROP_INTERN_PTR_OWNERSHIP_FORCED)) {
prop->flag |= PROP_PTR_NO_OWNERSHIP;
}
break;

View File

@ -1515,6 +1515,9 @@ void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
{
prop->flag &= ~flag;
if (flag & PROP_PTR_NO_OWNERSHIP) {
prop->flag_internal |= PROP_INTERN_PTR_OWNERSHIP_FORCED;
}
}
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)

View File

@ -329,6 +329,9 @@ typedef enum PropertyFlagIntern {
PROP_INTERN_RAW_ACCESS = (1 << 2),
PROP_INTERN_RAW_ARRAY = (1 << 3),
PROP_INTERN_FREE_POINTERS = (1 << 4),
/* Negative mirror of PROP_PTR_NO_OWNERSHIP, used to prevent automatically setting that one in
* makesrna when pointer is an ID... */
PROP_INTERN_PTR_OWNERSHIP_FORCED = (1 << 5),
} PropertyFlagIntern;
/* Property Types */