add IDP_MergeGroup(dst, src, overwrite) function,
like PyDict_Merge()
This commit is contained in:
@@ -154,6 +154,12 @@ __attribute__((nonnull))
|
|||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
|
void IDP_MergeGroup(IDProperty *dest, IDProperty *src, const int do_overwrite)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__attribute__((nonnull))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function has a sanity check to make sure ID properties with the same name don't
|
* This function has a sanity check to make sure ID properties with the same name don't
|
||||||
* get added to the group.
|
* get added to the group.
|
||||||
|
@@ -492,6 +492,30 @@ void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If a property is missing in \a dest, add it.
|
||||||
|
*/
|
||||||
|
void IDP_MergeGroup(IDProperty *dest, IDProperty *src, const int do_overwrite)
|
||||||
|
{
|
||||||
|
IDProperty *prop;
|
||||||
|
|
||||||
|
if (do_overwrite) {
|
||||||
|
for (prop = src->data.group.first; prop; prop = prop->next) {
|
||||||
|
IDProperty *copy = IDP_CopyProperty(prop);
|
||||||
|
IDP_ReplaceInGroup(dest, copy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (prop = src->data.group.first; prop; prop = prop->next) {
|
||||||
|
if (IDP_GetPropertyFromGroup(dest, prop->name) == NULL) {
|
||||||
|
IDProperty *copy = IDP_CopyProperty(prop);
|
||||||
|
dest->len++;
|
||||||
|
BLI_addtail(&dest->data.group, copy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* returns 0 if an id property with the same name exists and it failed,
|
/* returns 0 if an id property with the same name exists and it failed,
|
||||||
* or 1 if it succeeded in adding to the group.*/
|
* or 1 if it succeeded in adding to the group.*/
|
||||||
int IDP_AddToGroup(IDProperty *group, IDProperty *prop)
|
int IDP_AddToGroup(IDProperty *group, IDProperty *prop)
|
||||||
|
@@ -43,10 +43,6 @@
|
|||||||
#include "py_capi_utils.h"
|
#include "py_capi_utils.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern PyTypeObject BPy_IDArray_Type;
|
|
||||||
extern PyTypeObject BPy_IDGroup_Iter_Type;
|
|
||||||
extern PyTypeObject BPy_IDGroup_Type;
|
|
||||||
|
|
||||||
/*********************** ID Property Main Wrapper Stuff ***************/
|
/*********************** ID Property Main Wrapper Stuff ***************/
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
@@ -809,17 +805,28 @@ static PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *value)
|
|||||||
PyObject *pkey, *pval;
|
PyObject *pkey, *pval;
|
||||||
Py_ssize_t i = 0;
|
Py_ssize_t i = 0;
|
||||||
|
|
||||||
if (!PyDict_Check(value)) {
|
if (BPy_IDGroup_Check(value)) {
|
||||||
|
BPy_IDProperty *other = (BPy_IDProperty *)value;
|
||||||
|
if (UNLIKELY(self->prop == other->prop)) {
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX, possible one is inside the other */
|
||||||
|
IDP_MergeGroup(self->prop, other->prop, TRUE);
|
||||||
|
}
|
||||||
|
else if (PyDict_Check(value)) {
|
||||||
|
while (PyDict_Next(value, &i, &pkey, &pval)) {
|
||||||
|
BPy_IDGroup_Map_SetItem(self, pkey, pval);
|
||||||
|
if (PyErr_Occurred()) return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"expected a dict not a %.200s",
|
"expected a dict or an IDPropertyGroup type, not a %.200s",
|
||||||
Py_TYPE(value)->tp_name);
|
Py_TYPE(value)->tp_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (PyDict_Next(value, &i, &pkey, &pval)) {
|
|
||||||
BPy_IDGroup_Map_SetItem(self, pkey, pval);
|
|
||||||
if (PyErr_Occurred()) return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
@@ -32,6 +32,17 @@ struct ID;
|
|||||||
struct IDProperty;
|
struct IDProperty;
|
||||||
struct BPy_IDGroup_Iter;
|
struct BPy_IDGroup_Iter;
|
||||||
|
|
||||||
|
extern PyTypeObject BPy_IDArray_Type;
|
||||||
|
extern PyTypeObject BPy_IDGroup_Iter_Type;
|
||||||
|
extern PyTypeObject BPy_IDGroup_Type;
|
||||||
|
|
||||||
|
#define BPy_IDArray_Check(v) (PyObject_TypeCheck(v, &BPy_IDArray_Type))
|
||||||
|
#define BPy_IDArray_CheckExact(v) (Py_TYPE(v) == &BPy_IDArray_Type)
|
||||||
|
#define BPy_IDGroup_Iter_Check(v) (PyObject_TypeCheck(v, &BPy_IDGroup_Iter_Type))
|
||||||
|
#define BPy_IDGroup_Iter_CheckExact(v) (Py_TYPE(v) == &BPy_IDGroup_Iter_Type)
|
||||||
|
#define BPy_IDGroup_Check(v) (PyObject_TypeCheck(v, &BPy_IDGroup_Type))
|
||||||
|
#define BPy_IDGroup_CheckExact(v) (Py_TYPE(v) == &BPy_IDGroup_Type)
|
||||||
|
|
||||||
typedef struct BPy_IDProperty {
|
typedef struct BPy_IDProperty {
|
||||||
PyObject_VAR_HEAD
|
PyObject_VAR_HEAD
|
||||||
struct ID *id; /* can be NULL */
|
struct ID *id; /* can be NULL */
|
||||||
|
Reference in New Issue
Block a user