Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-05-05 10:57:45 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-05-05 10:57:45 +0300
commitf91e9529dacb21ef709e7fd1ef8f989731a5a2f3 (patch)
tree4156f2a01563a526a116297966cda041afa98643 /source/blender/python
parent3b0475bc6407d37329b729f6125edbac23404dd7 (diff)
parentd83681807e1ef39228620d10fee22003d753a050 (diff)
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/python')
-rw-r--r--source/blender/python/generic/idprop_py_api.c44
-rw-r--r--source/blender/python/intern/bpy_rna.c51
2 files changed, 74 insertions, 21 deletions
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index 164fe656129..c35472026fa 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -855,7 +855,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
}
PyDoc_STRVAR(BPy_IDGroup_pop_doc,
-".. method:: pop(key)\n"
+".. method:: pop(key, default)\n"
"\n"
" Remove an item from the group, returning a Python representation.\n"
"\n"
@@ -863,38 +863,40 @@ PyDoc_STRVAR(BPy_IDGroup_pop_doc,
"\n"
" :arg key: Name of item to remove.\n"
" :type key: string\n"
+" :arg default: Value to return when key isn't found, otherwise raise an exception.\n"
+" :type default: Undefined\n"
);
-static PyObject *BPy_IDGroup_pop(BPy_IDProperty *self, PyObject *value)
+static PyObject *BPy_IDGroup_pop(BPy_IDProperty *self, PyObject *args)
{
IDProperty *idprop;
PyObject *pyform;
- const char *name = _PyUnicode_AsString(value);
- if (!name) {
- PyErr_Format(PyExc_TypeError,
- "pop expected at least a string argument, not %.200s",
- Py_TYPE(value)->tp_name);
+ char *key;
+ PyObject *def = NULL;
+
+ if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) {
return NULL;
}
- idprop = IDP_GetPropertyFromGroup(self->prop, name);
-
- if (idprop) {
- pyform = BPy_IDGroup_MapDataToPy(idprop);
-
- if (!pyform) {
- /* ok something bad happened with the pyobject,
- * so don't remove the prop from the group. if pyform is
- * NULL, then it already should have raised an exception.*/
+ idprop = IDP_GetPropertyFromGroup(self->prop, key);
+ if (idprop == NULL) {
+ if (def == NULL) {
+ PyErr_SetString(PyExc_KeyError, "item not in group");
return NULL;
}
+ return Py_INCREF_RET(def);
+ }
- IDP_RemoveFromGroup(self->prop, idprop);
- return pyform;
+ pyform = BPy_IDGroup_MapDataToPy(idprop);
+ if (pyform == NULL) {
+ /* ok something bad happened with the pyobject,
+ * so don't remove the prop from the group. if pyform is
+ * NULL, then it already should have raised an exception.*/
+ return NULL;
}
- PyErr_SetString(PyExc_KeyError, "item not in group");
- return NULL;
+ IDP_RemoveFromGroup(self->prop, idprop);
+ return pyform;
}
PyDoc_STRVAR(BPy_IDGroup_iter_items_doc,
@@ -1126,7 +1128,7 @@ static PyObject *BPy_IDGroup_get(BPy_IDProperty *self, PyObject *args)
}
static struct PyMethodDef BPy_IDGroup_methods[] = {
- {"pop", (PyCFunction)BPy_IDGroup_pop, METH_O, BPy_IDGroup_pop_doc},
+ {"pop", (PyCFunction)BPy_IDGroup_pop, METH_VARARGS, BPy_IDGroup_pop_doc},
{"iteritems", (PyCFunction)BPy_IDGroup_iter_items, METH_NOARGS, BPy_IDGroup_iter_items_doc},
{"keys", (PyCFunction)BPy_IDGroup_keys, METH_NOARGS, BPy_IDGroup_keys_doc},
{"values", (PyCFunction)BPy_IDGroup_values, METH_NOARGS, BPy_IDGroup_values_doc},
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index f6feac1deeb..aa808118613 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -4714,6 +4714,56 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
return Py_INCREF_RET(def);
}
+PyDoc_STRVAR(pyrna_struct_pop_doc,
+".. method:: pop(key, default=None)\n"
+"\n"
+" Remove and return the value of the custom property assigned to key or default\n"
+" when not found (matches pythons dictionary function of the same name).\n"
+"\n"
+" :arg key: The key associated with the custom property.\n"
+" :type key: string\n"
+" :arg default: Optional argument for the value to return if\n"
+" *key* is not found.\n"
+" :type default: Undefined\n"
+"\n"
+BPY_DOC_ID_PROP_TYPE_NOTE
+);
+static PyObject *pyrna_struct_pop(BPy_StructRNA *self, PyObject *args)
+{
+ IDProperty *group, *idprop;
+
+ const char *key;
+ PyObject *def = NULL;
+
+ PYRNA_STRUCT_CHECK_OBJ(self);
+
+ if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
+ return NULL;
+
+ /* mostly copied from BPy_IDGroup_Map_GetItem */
+ if (RNA_struct_idprops_check(self->ptr.type) == 0) {
+ PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
+ return NULL;
+ }
+
+ group = RNA_struct_idprops(&self->ptr, 0);
+ if (group) {
+ idprop = IDP_GetPropertyFromGroup(group, key);
+
+ if (idprop) {
+ PyObject *ret = BPy_IDGroup_WrapData(self->ptr.id.data, idprop, group);
+ IDP_RemoveFromGroup(group, idprop);
+ return ret;
+ }
+ }
+
+ if (def == NULL) {
+ PyErr_SetString(PyExc_KeyError, "key not found");
+ return NULL;
+ }
+ return Py_INCREF_RET(def);
+}
+
PyDoc_STRVAR(pyrna_struct_as_pointer_doc,
".. method:: as_pointer()\n"
"\n"
@@ -5171,6 +5221,7 @@ static struct PyMethodDef pyrna_struct_methods[] = {
{"items", (PyCFunction)pyrna_struct_items, METH_NOARGS, pyrna_struct_items_doc},
{"get", (PyCFunction)pyrna_struct_get, METH_VARARGS, pyrna_struct_get_doc},
+ {"pop", (PyCFunction)pyrna_struct_pop, METH_VARARGS, pyrna_struct_pop_doc},
{"as_pointer", (PyCFunction)pyrna_struct_as_pointer, METH_NOARGS, pyrna_struct_as_pointer_doc},