forked from bartvdbraak/blender
use a metaclass to have operator attributes register and display in the order defined.
This commit is contained in:
parent
19aa69f6f2
commit
34e7eb1676
@ -92,3 +92,18 @@ class MeshFace(StructRNA):
|
|||||||
return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0])
|
return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0])
|
||||||
|
|
||||||
edge_keys = property(_get_edge_keys)
|
edge_keys = property(_get_edge_keys)
|
||||||
|
|
||||||
|
|
||||||
|
import collections
|
||||||
|
class OrderedMeta(type):
|
||||||
|
def __init__(cls, name, bases, attributes):
|
||||||
|
super(OrderedMeta, cls).__init__(name, bases, attributes)
|
||||||
|
cls.order = list(attributes.keys())
|
||||||
|
def __prepare__(name, bases, **kwargs):
|
||||||
|
return collections.OrderedDict()
|
||||||
|
|
||||||
|
class Operator(StructRNA, metaclass=OrderedMeta):
|
||||||
|
'''
|
||||||
|
Only defined so operators members can be used by accessing self.order
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
@ -139,13 +139,12 @@ class WM_OT_properties_edit(bpy.types.Operator):
|
|||||||
bl_idname = "wm.properties_edit"
|
bl_idname = "wm.properties_edit"
|
||||||
bl_label = "Edit Property!"
|
bl_label = "Edit Property!"
|
||||||
|
|
||||||
description = StringProperty(name="Tip", default="")
|
|
||||||
path = rna_path
|
path = rna_path
|
||||||
value = rna_value
|
|
||||||
property = rna_property
|
property = rna_property
|
||||||
|
value = rna_value
|
||||||
min = rna_min
|
min = rna_min
|
||||||
max = rna_max
|
max = rna_max
|
||||||
|
description = StringProperty(name="Tip", default="")
|
||||||
|
|
||||||
# the class instance is not persistant, need to store in the class
|
# the class instance is not persistant, need to store in the class
|
||||||
# not ideal but changes as the op runs.
|
# not ideal but changes as the op runs.
|
||||||
|
@ -294,7 +294,6 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
|
|||||||
* later */
|
* later */
|
||||||
RNA_def_struct_identifier(ot->srna, ot->idname);
|
RNA_def_struct_identifier(ot->srna, ot->idname);
|
||||||
|
|
||||||
|
|
||||||
if(pyrna_deferred_register_props(ot->srna, item)!=0) {
|
if(pyrna_deferred_register_props(ot->srna, item)!=0) {
|
||||||
/* failed to register operator props */
|
/* failed to register operator props */
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
|
@ -3550,21 +3550,19 @@ PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
|
|
||||||
|
static int deferred_register_prop(StructRNA *srna, PyObject *item, PyObject *key, PyObject *dummy_args)
|
||||||
{
|
{
|
||||||
PyObject *dummy_args, *item, *key;
|
|
||||||
Py_ssize_t pos = 0;
|
|
||||||
|
|
||||||
dummy_args = PyTuple_New(0);
|
|
||||||
|
|
||||||
while (PyDict_Next(class_dict, &pos, &key, &item)) {
|
|
||||||
PyObject *py_func_ptr, *py_kw, *py_srna_cobject, *py_ret;
|
|
||||||
/* We only care about results from C which
|
/* We only care about results from C which
|
||||||
* are for sure types, save some time with error */
|
* are for sure types, save some time with error */
|
||||||
if(PyTuple_CheckExact(item)) {
|
if(PyTuple_CheckExact(item) && PyTuple_GET_SIZE(item)==2) {
|
||||||
|
|
||||||
|
PyObject *py_func_ptr, *py_kw, *py_srna_cobject, *py_ret;
|
||||||
|
|
||||||
if(PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
|
if(PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
|
||||||
|
|
||||||
PyObject *(*pyfunc)(PyObject *, PyObject *, PyObject *);
|
PyObject *(*pyfunc)(PyObject *, PyObject *, PyObject *);
|
||||||
|
|
||||||
pyfunc = PyCObject_AsVoidPtr(py_func_ptr);
|
pyfunc = PyCObject_AsVoidPtr(py_func_ptr);
|
||||||
py_srna_cobject = PyCObject_FromVoidPtr(srna, NULL);
|
py_srna_cobject = PyCObject_FromVoidPtr(srna, NULL);
|
||||||
|
|
||||||
@ -3593,12 +3591,45 @@ int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
|
|||||||
/* PyObSpit("Why doesn't this work??", item);
|
/* PyObSpit("Why doesn't this work??", item);
|
||||||
PyErr_Print(); */
|
PyErr_Print(); */
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
|
||||||
|
{
|
||||||
|
PyObject *item, *key;
|
||||||
|
PyObject *order;
|
||||||
|
PyObject *dummy_args;
|
||||||
|
Py_ssize_t pos = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
dummy_args = PyTuple_New(0);
|
||||||
|
|
||||||
|
order= PyDict_GetItemString(class_dict, "order");
|
||||||
|
|
||||||
|
if(order && PyList_Check(order)) {
|
||||||
|
printf("using order\n");
|
||||||
|
for(pos= 0; pos<PyList_GET_SIZE(order); pos++) {
|
||||||
|
key= PyList_GET_ITEM(order, pos);
|
||||||
|
item= PyDict_GetItem(class_dict, key);
|
||||||
|
ret= deferred_register_prop(srna, item, key, dummy_args);
|
||||||
|
if(ret==-1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (PyDict_Next(class_dict, &pos, &key, &item)) {
|
||||||
|
ret= deferred_register_prop(srna, item, key, dummy_args);
|
||||||
|
|
||||||
|
if(ret==-1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_DECREF(dummy_args);
|
Py_DECREF(dummy_args);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user