RNA: make mechanism used by operators to keep python instance alive more generic...
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 18 May 2011 11:21:10 +0000 (11:21 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 18 May 2011 11:21:10 +0000 (11:21 +0000)
13 files changed:
source/blender/makesrna/RNA_access.h
source/blender/makesrna/RNA_define.h
source/blender/makesrna/RNA_types.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_internal_types.h
source/blender/makesrna/intern/rna_render.c
source/blender/makesrna/intern/rna_ui.c
source/blender/makesrna/intern/rna_wm.c
source/blender/python/intern/bpy_rna.c

index f8811a5f464564b6ac157ec76243cf72824b8888..a9f7d9f246f24f1e84490538cbbcc008ff053a50 100644 (file)
@@ -31,7 +31,6 @@
 
 #include <stdarg.h>
 
-#include "DNA_listBase.h"
 #include "RNA_types.h"
 
 #ifdef __cplusplus
@@ -40,6 +39,7 @@ extern "C" {
 
 struct bContext;
 struct ID;
+struct ListBase;
 struct Main;
 struct ReportList;
 struct Scene;
@@ -611,6 +611,7 @@ int RNA_struct_is_a(StructRNA *type, StructRNA *srna);
 
 StructRegisterFunc RNA_struct_register(StructRNA *type);
 StructUnregisterFunc RNA_struct_unregister(StructRNA *type);
+void **RNA_struct_instance(PointerRNA *ptr);
 
 void *RNA_struct_py_type_get(StructRNA *srna);
 void RNA_struct_py_type_set(StructRNA *srna, void *py_type);
index f131f7c9ebe06d8e613bfd1467d3975028729667..f52a69182b58e5c1e10a64c5eef755f302e23d44 100644 (file)
@@ -60,7 +60,7 @@ void RNA_def_struct_flag(StructRNA *srna, int flag);
 void RNA_def_struct_clear_flag(StructRNA *srna, int flag);
 void RNA_def_struct_refine_func(StructRNA *srna, const char *refine);
 void RNA_def_struct_idprops_func(StructRNA *srna, const char *refine);
-void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg);
+void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg, const char *instance);
 void RNA_def_struct_path_func(StructRNA *srna, const char *path);
 void RNA_def_struct_identifier(StructRNA *srna, const char *identifier);
 void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description);
index 86d1e12a1985218cea23caa2b9e6f7ba0f81425a..ec6f05c0e6a6dc6c4d9ef3b1f4bdf163c8f76526 100644 (file)
@@ -333,6 +333,7 @@ typedef void (*StructFreeFunc)(void *data);
 typedef struct StructRNA *(*StructRegisterFunc)(struct Main *bmain, struct ReportList *reports, void *data,
        const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
 typedef void (*StructUnregisterFunc)(struct Main *bmain, struct StructRNA *type);
+typedef void **(*StructInstanceFunc)(PointerRNA *ptr);
 
 typedef struct StructRNA StructRNA;
 
index 97d0f535a5b557ca013882593ab2ff9628ad2609..b56019fd32f1190a2e35193409711afb9049a1b0 100644 (file)
@@ -2337,6 +2337,7 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
        fprintf(f, "\t%s,\n", rna_function_string(srna->path));
        fprintf(f, "\t%s,\n", rna_function_string(srna->reg));
        fprintf(f, "\t%s,\n", rna_function_string(srna->unreg));
+       fprintf(f, "\t%s,\n", rna_function_string(srna->instance));
        fprintf(f, "\t%s,\n", rna_function_string(srna->idproperties));
 
        if(srna->reg && !srna->refine) {
index 90edbaaadf0b977b9b26930c2317ab3b9f433618..46ad059ca02a4e18fe67e0e8d3dfe43b10b20410 100644 (file)
@@ -384,7 +384,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "IDPropertyGroup");
        RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties");
        RNA_def_struct_idprops_func(srna, "rna_PropertyGroup_idprops");
-       RNA_def_struct_register_funcs(srna, "rna_PropertyGroup_register", "rna_PropertyGroup_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_PropertyGroup_register", "rna_PropertyGroup_unregister", NULL);
        RNA_def_struct_refine_func(srna, "rna_PropertyGroup_refine");
 
        /* important so python types can have their name used in list views
index 36694e1adc1f629d99555d3388570c161ee01222..ff54ac6254f3726acd50496d497c5b70b0b2b13a 100644 (file)
@@ -681,6 +681,18 @@ StructUnregisterFunc RNA_struct_unregister(StructRNA *type)
        return NULL;
 }
 
+void **RNA_struct_instance(PointerRNA *ptr)
+{
+       StructRNA *type= ptr->type;
+
+       do {
+               if(type->instance)
+                       return type->instance(ptr);
+       } while((type=type->base));
+
+       return NULL;
+}
+
 void *RNA_struct_py_type_get(StructRNA *srna)
 {
        return srna->py_type;
index d60dc34fea21ffac18560e14af7d488de5adc2f3..7f817aa5b4b9547203c3321e9cd9b6630a80d22c 100644 (file)
@@ -509,7 +509,7 @@ static void rna_def_keyingset_info(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "KeyingSetInfo");
        RNA_def_struct_ui_text(srna, "Keying Set Info", "Callback function defines for builtin Keying Sets");
        RNA_def_struct_refine_func(srna, "rna_KeyingSetInfo_refine");
-       RNA_def_struct_register_funcs(srna, "rna_KeyingSetInfo_register", "rna_KeyingSetInfo_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_KeyingSetInfo_register", "rna_KeyingSetInfo_unregister", NULL);
        
        /* Properties --------------------- */
        
index 3afec03a13f5d54e086c054932e4bc62f275cdca..d66f0042d882bcd845d766b6fe1cc851cb666a90 100644 (file)
@@ -813,7 +813,7 @@ void RNA_def_struct_idprops_func(StructRNA *srna, const char *idproperties)
        if(idproperties) srna->idproperties= (IDPropertiesFunc)idproperties;
 }
 
-void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg)
+void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char *unreg, const char *instance)
 {
        if(!DefRNA.preprocess) {
                fprintf(stderr, "RNA_def_struct_register_funcs: only during preprocessing.\n");
@@ -822,6 +822,7 @@ void RNA_def_struct_register_funcs(StructRNA *srna, const char *reg, const char
 
        if(reg) srna->reg= (StructRegisterFunc)reg;
        if(unreg) srna->unreg= (StructUnregisterFunc)unreg;
+       if(instance) srna->instance= (StructInstanceFunc)instance;
 }
 
 void RNA_def_struct_path_func(StructRNA *srna, const char *path)
index eb1beb90567d3f19a344e73fc992e1dac0133a5d..a59db1834535f361f489ecedb92c3e590a5bc3e8 100644 (file)
@@ -330,6 +330,7 @@ struct StructRNA {
        /* function to register/unregister subclasses */
        StructRegisterFunc reg; 
        StructUnregisterFunc unreg; 
+       StructInstanceFunc instance;
 
        /* callback to get id properties */
        IDPropertiesFunc idproperties;
index 88722a1d30570ae87988c7bba4abf3c52edbf440..da2704ab641f44a0020ac703e38c89cba72a554c 100644 (file)
@@ -233,7 +233,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "RenderEngine");
        RNA_def_struct_ui_text(srna, "Render Engine", "Render engine");
        RNA_def_struct_refine_func(srna, "rna_RenderEngine_refine");
-       RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister", NULL);
 
        /* render */
        func= RNA_def_function(srna, "render", NULL);
index 5fe4d21c1ae8fd377662b5c546e2b51043e3ad33..13c7ac238a333cd29fa03c6094cf8ab49df12504 100644 (file)
@@ -611,7 +611,7 @@ static void rna_def_panel(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Panel", "Panel containing UI elements");
        RNA_def_struct_sdna(srna, "Panel");
        RNA_def_struct_refine_func(srna, "rna_Panel_refine");
-       RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister", NULL);
 
        /* poll */
        func= RNA_def_function(srna, "poll", NULL);
@@ -688,7 +688,7 @@ static void rna_def_header(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Header", "Editor header containing UI elements.");
        RNA_def_struct_sdna(srna, "Header");
        RNA_def_struct_refine_func(srna, "rna_Header_refine");
-       RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister", NULL);
 
        /* draw */
        func= RNA_def_function(srna, "draw", NULL);
@@ -730,7 +730,7 @@ static void rna_def_menu(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Menu", "Editor menu containing buttons");
        RNA_def_struct_sdna(srna, "Menu");
        RNA_def_struct_refine_func(srna, "rna_Menu_refine");
-       RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister", NULL);
 
        /* poll */
        func= RNA_def_function(srna, "poll", NULL);
index b6d22def81e85f925f6eeeda9ba381f9651ebf14..e8b127b68bb618565eda3cf97b591fd796fc6d46 100644 (file)
@@ -961,6 +961,11 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void *
        return dummyot.ext.srna;
 }
 
+void **rna_Operator_instance(PointerRNA *ptr)
+{
+       wmOperator *op = ptr->data;
+       return &op->py_instance;
+}
 
 static StructRNA *rna_MacroOperator_register(Main *bmain, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
 {
@@ -1160,7 +1165,7 @@ static void rna_def_operator(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "wmOperator");
        RNA_def_struct_refine_func(srna, "rna_Operator_refine");
 #ifdef WITH_PYTHON
-       RNA_def_struct_register_funcs(srna, "rna_Operator_register", "rna_Operator_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_Operator_register", "rna_Operator_unregister", "rna_Operator_instance");
 #endif
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
@@ -1229,7 +1234,7 @@ static void rna_def_macro_operator(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "wmOperator");
        RNA_def_struct_refine_func(srna, "rna_MacroOperator_refine");
 #ifdef WITH_PYTHON
-       RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister");
+       RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister", "rna_Operator_instance");
 #endif
 
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
index 917015b905ba410b84ddef08058d29963954a860..4f62c545a71bdca3e6ff19ceccf59e60f1efa5ed 100644 (file)
@@ -6040,17 +6040,18 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
        bpy_context_set(C, &gilstate);
 
        if (!is_static) {
-               /* exception, operators store their PyObjects for re-use */
+               /* some datatypes (operator, render engine) can store PyObjects for re-use */
                if(ptr->data) {
-                       if(RNA_struct_is_a(ptr->type, &RNA_Operator)) {
-                               wmOperator *op= ptr->data;
-                               if(op->py_instance) {
-                                       py_class_instance= op->py_instance;
+                       void **instance = RNA_struct_instance(ptr);
+
+                       if(instance) {
+                               if(*instance) {
+                                       py_class_instance= *instance;
                                        Py_INCREF(py_class_instance);
                                }
                                else {
                                        /* store the instance here once its created */
-                                       py_class_instance_store= &op->py_instance;
+                                       py_class_instance_store= instance;
                                }
                        }
                }