diff options
Diffstat (limited to 'source/blender/blenkernel/intern/lib_principle_properties.c')
-rw-r--r-- | source/blender/blenkernel/intern/lib_principle_properties.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/lib_principle_properties.c b/source/blender/blenkernel/intern/lib_principle_properties.c new file mode 100644 index 00000000000..204ca9ff9d6 --- /dev/null +++ b/source/blender/blenkernel/intern/lib_principle_properties.c @@ -0,0 +1,106 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + * Copyright 2022 Blender Foundation. All rights reserved. */ + +/** \file + * \ingroup bke + */ + +#include <stddef.h> +#include <stdlib.h> +#include <string.h> + +#include "CLG_log.h" + +#include "MEM_guardedalloc.h" + +#include "DNA_ID.h" + +#include "BKE_lib_id.h" +#include "BKE_lib_principle_properties.h" +#include "BKE_report.h" + +#include "BLO_readfile.h" + +#include "BLI_listbase.h" +#include "BLI_string.h" + +#include "RNA_access.h" +#include "RNA_prototypes.h" +#include "RNA_types.h" + +static CLG_LogRef LOG = {"bke.idprincipleprops"}; + +IDPrincipleProperties *BKE_lib_principleprop_init(ID *id) +{ + BLI_assert(id->principle_properties == NULL); + + /* Else, generate new empty override. */ + id->principle_properties = MEM_callocN(sizeof(*id->principle_properties), __func__); + + return id->principle_properties; +} + +void BKE_lib_principleprop_clear(IDPrincipleProperties *principle_props, bool UNUSED(do_id_user)) +{ + LISTBASE_FOREACH_MUTABLE (IDPrincipleProperty *, pprop, &principle_props->properties) { + BLI_assert(pprop->rna_path != NULL); + MEM_freeN(pprop->rna_path); + MEM_freeN(pprop); + } + BLI_listbase_clear(&principle_props->properties); + principle_props->flag = 0; +} + +void BKE_lib_principleprop_free(IDPrincipleProperties **principle_props, bool do_id_user) +{ + BLI_assert(*principle_props != NULL); + + BKE_lib_principleprop_clear(*principle_props, do_id_user); + MEM_freeN(*principle_props); + *principle_props = NULL; +} + +IDPrincipleProperty *BKE_lib_principleprop_find(IDPrincipleProperties *principle_props, + const char *rna_path) +{ + return BLI_findstring_ptr( + &principle_props->properties, rna_path, offsetof(IDPrincipleProperty, rna_path)); +} + +IDPrincipleProperty *BKE_lib_principleprop_get(IDPrincipleProperties *principle_props, + const char *rna_path, + bool *r_created) +{ + IDPrincipleProperty *pprop = BKE_lib_principleprop_find(principle_props, rna_path); + + if (pprop == NULL) { + pprop = MEM_callocN(sizeof(*pprop), __func__); + pprop->rna_path = BLI_strdup(rna_path); + BLI_addtail(&principle_props->properties, pprop); + + if (r_created) { + *r_created = true; + } + } + else if (r_created) { + *r_created = false; + } + + return pprop; +} + +void BKE_lib_principleprop_delete(IDPrincipleProperties *principle_props, + IDPrincipleProperty *principle_prop) +{ + BLI_remlink(&principle_props->properties, principle_prop); +} + +bool BKE_lib_principleprop_rna_property_find(struct PointerRNA *idpoin, + const struct IDPrincipleProperty *principle_prop, + struct PointerRNA *r_principle_poin, + struct PropertyRNA **r_principle_prop) +{ + BLI_assert(RNA_struct_is_ID(idpoin->type)); + return RNA_path_resolve_property( + idpoin, principle_prop->rna_path, r_principle_poin, r_principle_prop); +} |