Modified python rna property types (BPy_PropertyRNA), so PySequence_Check() returns true

this means you can do...
C = {"selected_editable_objects":bpy.data.objects}
...when defining pythons context, without doing list(bpy.data.objects)
This commit is contained in:
2009-10-29 10:03:34 +00:00
parent c508e6198a
commit e14a8635cc
5 changed files with 45 additions and 25 deletions

View File

@@ -971,28 +971,36 @@ int bpy_context_get(bContext *C, const char *member, bContextDataResult *result)
CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data);
done= 1;
}
else if (PyList_Check(item)) {
int len= PyList_Size(item);
int i;
for(i = 0; i < len; i++) {
PyObject *list_item = PyList_GET_ITEM(item, i); // XXX check type
if(BPy_StructRNA_Check(list_item)) {
/*
CollectionPointerLink *link= MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get");
link->ptr= ((BPy_StructRNA *)item)->ptr;
BLI_addtail(&result->list, link);
*/
ptr= &(((BPy_StructRNA *)list_item)->ptr);
CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data);
}
else {
printf("List item not a valid type\n");
}
else if (PySequence_Check(item)) {
PyObject *seq_fast= PySequence_Fast(item, "bpy_context_get sequence conversion");
if (seq_fast==NULL) {
PyErr_Print();
PyErr_Clear();
}
else {
int len= PySequence_Fast_GET_SIZE(seq_fast);
int i;
for(i = 0; i < len; i++) {
PyObject *list_item= PySequence_Fast_GET_ITEM(seq_fast, i);
done= 1;
if(BPy_StructRNA_Check(list_item)) {
/*
CollectionPointerLink *link= MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get");
link->ptr= ((BPy_StructRNA *)item)->ptr;
BLI_addtail(&result->list, link);
*/
ptr= &(((BPy_StructRNA *)list_item)->ptr);
CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data);
}
else {
printf("List item not a valid type\n");
}
}
Py_DECREF(seq_fast);
done= 1;
}
}
if(done==0) {

View File

@@ -1124,11 +1124,24 @@ static int pyrna_prop_contains(BPy_PropertyRNA * self, PyObject *value)
return 0;
}
static PyObject *pyrna_prop_item(BPy_PropertyRNA * self, Py_ssize_t index)
{
/* reuse subscript functions */
if (RNA_property_type(self->prop) == PROP_COLLECTION) {
return prop_subscript_collection_int(self, index);
} else if (RNA_property_array_check(&self->ptr, self->prop)) {
return prop_subscript_array_int(self, index);
}
PyErr_SetString(PyExc_TypeError, "rna type is not an array or a collection");
return NULL;
}
static PySequenceMethods pyrna_prop_as_sequence = {
NULL, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
NULL, /* sq_item */
(ssizeargfunc)pyrna_prop_item, /* sq_item */ /* Only set this so PySequence_Check() returns True */
NULL, /* sq_slice */
NULL, /* sq_ass_item */
NULL, /* sq_ass_slice */