Revision: 24713
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24713
Author:   campbellbarton
Date:     2009-11-20 21:58:46 +0100 (Fri, 20 Nov 2009)

Log Message:
-----------
use a metaclass to have operator attributes register and display in the order 
defined.

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/bpy_types.py
    trunk/blender/release/scripts/modules/rna_prop_ui.py
    trunk/blender/source/blender/python/intern/bpy_operator_wrap.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/release/scripts/modules/bpy_types.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy_types.py  2009-11-20 20:53:23 UTC 
(rev 24712)
+++ trunk/blender/release/scripts/modules/bpy_types.py  2009-11-20 20:58:46 UTC 
(rev 24713)
@@ -92,3 +92,18 @@
         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)
+
+
+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

Modified: trunk/blender/release/scripts/modules/rna_prop_ui.py
===================================================================
--- trunk/blender/release/scripts/modules/rna_prop_ui.py        2009-11-20 
20:53:23 UTC (rev 24712)
+++ trunk/blender/release/scripts/modules/rna_prop_ui.py        2009-11-20 
20:58:46 UTC (rev 24713)
@@ -138,14 +138,13 @@
     '''Internal use (edit a property path)'''
     bl_idname = "wm.properties_edit"
     bl_label = "Edit Property!"
-
-    description = StringProperty(name="Tip", default="")
+    
     path = rna_path
-    value = rna_value
     property = rna_property
-    
+    value = rna_value
     min = rna_min
     max = rna_max
+    description = StringProperty(name="Tip", default="")
     
     # the class instance is not persistant, need to store in the class
     # not ideal but changes as the op runs.

Modified: trunk/blender/source/blender/python/intern/bpy_operator_wrap.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_operator_wrap.c      
2009-11-20 20:53:23 UTC (rev 24712)
+++ trunk/blender/source/blender/python/intern/bpy_operator_wrap.c      
2009-11-20 20:58:46 UTC (rev 24713)
@@ -294,7 +294,6 @@
                 * later */
                RNA_def_struct_identifier(ot->srna, ot->idname);
 
-
                if(pyrna_deferred_register_props(ot->srna, item)!=0) {
                        /* failed to register operator props */
                        PyErr_Print();

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c        2009-11-20 
20:53:23 UTC (rev 24712)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c        2009-11-20 
20:58:46 UTC (rev 24713)
@@ -3550,55 +3550,86 @@
        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;
+       /* We only care about results from C which
+        * are for sure types, save some time with error */
+       if(PyTuple_CheckExact(item) && PyTuple_GET_SIZE(item)==2) {
 
-       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
-                * are for sure types, save some time with error */
-               if(PyTuple_CheckExact(item)) {
-                       if(PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, 
&py_func_ptr, &PyDict_Type, &py_kw)) {
 
-                               PyObject *(*pyfunc)(PyObject *, PyObject *, 
PyObject *);
-                               pyfunc = PyCObject_AsVoidPtr(py_func_ptr);
-                               py_srna_cobject = PyCObject_FromVoidPtr(srna, 
NULL);
+               if(PyArg_ParseTuple(item, "O!O!", &PyCObject_Type, 
&py_func_ptr, &PyDict_Type, &py_kw)) {
 
-                               /* not 100% nice :/, modifies the dict passed, 
should be ok */
-                               PyDict_SetItemString(py_kw, "attr", key);
+                       PyObject *(*pyfunc)(PyObject *, PyObject *, PyObject *);
 
-                               py_ret = pyfunc(py_srna_cobject, dummy_args, 
py_kw);
-                               Py_DECREF(py_srna_cobject);
+                       pyfunc = PyCObject_AsVoidPtr(py_func_ptr);
+                       py_srna_cobject = PyCObject_FromVoidPtr(srna, NULL);
 
-                               if(py_ret) {
-                                       Py_DECREF(py_ret);
-                               }
-                               else {
-                                       PyErr_Print();
-                                       PyErr_Clear();
+                       /* not 100% nice :/, modifies the dict passed, should 
be ok */
+                       PyDict_SetItemString(py_kw, "attr", key);
 
-                                       PyErr_Format(PyExc_ValueError, 
"StructRNA \"%.200s\" registration error: %.200s could not register\n", 
RNA_struct_identifier(srna), _PyUnicode_AsString(key));
-                                       Py_DECREF(dummy_args);
-                                       return -1;
-                               }
+                       py_ret = pyfunc(py_srna_cobject, dummy_args, py_kw);
+                       Py_DECREF(py_srna_cobject);
+
+                       if(py_ret) {
+                               Py_DECREF(py_ret);
                        }
                        else {
-                               /* Since this is a class dict, ignore args that 
can't be passed */
-
-                               /* for testing only */
-                               /* PyObSpit("Why doesn't this work??", item);
-                               PyErr_Print(); */
+                               PyErr_Print();
                                PyErr_Clear();
 
+                               PyErr_Format(PyExc_ValueError, "StructRNA 
\"%.200s\" registration error: %.200s could not register\n", 
RNA_struct_identifier(srna), _PyUnicode_AsString(key));
+                               Py_DECREF(dummy_args);
+                               return -1;
                        }
                }
+               else {
+                       /* Since this is a class dict, ignore args that can't 
be passed */
+
+                       /* for testing only */
+                       /* PyObSpit("Why doesn't this work??", item);
+                       PyErr_Print(); */
+                       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);
+
        return 0;
 }
 


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to