diff options
23 files changed, 72 insertions, 32 deletions
diff --git a/release/scripts/io/export_3ds.py b/release/scripts/io/export_3ds.py index a60aeeb3cb2..163b683f60f 100644 --- a/release/scripts/io/export_3ds.py +++ b/release/scripts/io/export_3ds.py @@ -1131,7 +1131,7 @@ class Export3DS(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} def poll(self, context): # Poll isnt working yet return context.active_object != None diff --git a/release/scripts/io/export_fbx.py b/release/scripts/io/export_fbx.py index 401f645536f..19a3345bd94 100644 --- a/release/scripts/io/export_fbx.py +++ b/release/scripts/io/export_fbx.py @@ -3431,7 +3431,7 @@ class ExportFBX(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} bpy.types.register(ExportFBX) diff --git a/release/scripts/io/export_mdd.py b/release/scripts/io/export_mdd.py index 22e76ae2427..66db8c14027 100644 --- a/release/scripts/io/export_mdd.py +++ b/release/scripts/io/export_mdd.py @@ -178,7 +178,7 @@ class ExportMDD(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} bpy.types.register(ExportMDD) diff --git a/release/scripts/io/export_obj.py b/release/scripts/io/export_obj.py index 9d9b0e88732..77acffe325c 100644 --- a/release/scripts/io/export_obj.py +++ b/release/scripts/io/export_obj.py @@ -985,7 +985,7 @@ class ExportOBJ(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} diff --git a/release/scripts/io/export_ply.py b/release/scripts/io/export_ply.py index 301fb4c5fe8..f27b76d2cbe 100644 --- a/release/scripts/io/export_ply.py +++ b/release/scripts/io/export_ply.py @@ -302,7 +302,7 @@ class ExportPLY(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} def draw(self, context): layout = self.layout diff --git a/release/scripts/io/export_x3d.py b/release/scripts/io/export_x3d.py index 95ddb21b21d..c4f1b53146f 100644 --- a/release/scripts/io/export_x3d.py +++ b/release/scripts/io/export_x3d.py @@ -1238,7 +1238,7 @@ class ExportX3D(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} bpy.types.register(ExportX3D) diff --git a/release/scripts/io/import_anim_bvh.py b/release/scripts/io/import_anim_bvh.py index 0ea8dbe5356..cd040012840 100644 --- a/release/scripts/io/import_anim_bvh.py +++ b/release/scripts/io/import_anim_bvh.py @@ -892,7 +892,7 @@ class BvhImporter(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} bpy.types.register(BvhImporter) diff --git a/release/scripts/io/import_scene_3ds.py b/release/scripts/io/import_scene_3ds.py index d11b242b764..608fc6bf5a2 100644 --- a/release/scripts/io/import_scene_3ds.py +++ b/release/scripts/io/import_scene_3ds.py @@ -1164,7 +1164,7 @@ class IMPORT_OT_autodesk_3ds(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} bpy.types.register(IMPORT_OT_autodesk_3ds) diff --git a/release/scripts/io/import_scene_obj.py b/release/scripts/io/import_scene_obj.py index e4a218fce4d..f135bfbb6c0 100644 --- a/release/scripts/io/import_scene_obj.py +++ b/release/scripts/io/import_scene_obj.py @@ -1621,7 +1621,7 @@ class IMPORT_OT_obj(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} bpy.types.register(IMPORT_OT_obj) diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py index aac6431768d..a390acf7932 100644 --- a/release/scripts/modules/rna_prop_ui.py +++ b/release/scripts/modules/rna_prop_ui.py @@ -216,7 +216,7 @@ class WM_OT_properties_edit(bpy.types.Operator): #return wm.invoke_props_popup(self, event) wm.invoke_props_popup(self, event) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} class WM_OT_properties_add(bpy.types.Operator): diff --git a/release/scripts/op/object.py b/release/scripts/op/object.py index 1b421cac98c..08fac5d4d3c 100644 --- a/release/scripts/op/object.py +++ b/release/scripts/op/object.py @@ -63,7 +63,7 @@ class SelectPattern(bpy.types.Operator): wm = context.manager # return wm.invoke_props_popup(self, event) wm.invoke_props_popup(self, event) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} def draw(self, context): layout = self.layout diff --git a/release/scripts/op/presets.py b/release/scripts/op/presets.py index af338c9364d..76d84bc8b3d 100644 --- a/release/scripts/op/presets.py +++ b/release/scripts/op/presets.py @@ -61,7 +61,7 @@ class AddPresetBase(bpy.types.Operator): #return wm.invoke_props_popup(self, event) wm.invoke_props_popup(self, event) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} class AddPresetRender(AddPresetBase): diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py index 58cc2743932..c0a61017156 100644 --- a/release/scripts/op/wm.py +++ b/release/scripts/op/wm.py @@ -354,7 +354,7 @@ class WM_OT_doc_edit(bpy.types.Operator): class_name, class_prop = doc_id.split('.') if not doc_new: - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} # check if this is an operator op_name = class_name.upper() + '_OT_' + class_prop @@ -367,7 +367,7 @@ class WM_OT_doc_edit(bpy.types.Operator): rna = op_class.bl_rna doc_orig = rna.description if doc_orig == doc_new: - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} print("op - old:'%s' -> new:'%s'" % (doc_orig, doc_new)) upload["title"] = 'OPERATOR %s:%s' % (doc_id, doc_orig) @@ -379,7 +379,7 @@ class WM_OT_doc_edit(bpy.types.Operator): rna = getattr(bpy.types, class_name).bl_rna doc_orig = rna.properties[class_prop].description if doc_orig == doc_new: - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} print("rna - old:'%s' -> new:'%s'" % (doc_orig, doc_new)) upload["title"] = 'RNA %s:%s' % (doc_id, doc_orig) diff --git a/release/scripts/templates/operator.py b/release/scripts/templates/operator.py index c6fb887b091..9402a931db8 100644 --- a/release/scripts/templates/operator.py +++ b/release/scripts/templates/operator.py @@ -38,7 +38,7 @@ class ExportSomeData(bpy.types.Operator): if True: # File selector wm.add_fileselect(self) # will run self.execute() - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} elif 0: # Redo popup return wm.invoke_props_popup(self, event) # diff --git a/release/scripts/ui/properties_data_armature_rigify.py b/release/scripts/ui/properties_data_armature_rigify.py index 12f1b0ed5e5..c0270d9b8ca 100644 --- a/release/scripts/ui/properties_data_armature_rigify.py +++ b/release/scripts/ui/properties_data_armature_rigify.py @@ -275,7 +275,7 @@ class AsScript(bpy.types.Operator): self.properties.path = os.path.splitext(bpy.data.filename)[0] + "-" + bpy.utils.clean_name(obj.name) + ".py" wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} # operators that use the GUI diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py index 08efb92f00e..99cab8f9ac2 100644 --- a/release/scripts/ui/space_userpref.py +++ b/release/scripts/ui/space_userpref.py @@ -1741,7 +1741,7 @@ class WM_OT_keyconfig_export(bpy.types.Operator): def invoke(self, context, event): wm = context.manager wm.add_fileselect(self) - return ('RUNNING_MODAL',) + return {'RUNNING_MODAL'} class WM_OT_keymap_edit(bpy.types.Operator): diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index fb52a36cdcf..4e731cda5f3 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -175,7 +175,9 @@ static void file_panel_operator(const bContext *C, Panel *pa) int empty= 1, flag; if(op->type->ui) { - op->type->ui((bContext*)C, op, pa->layout); + op->layout= pa->layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; } else { RNA_STRUCT_BEGIN(op->ptr, prop) { diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index 5dbc6cc232c..0384a23579e 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -142,8 +142,11 @@ static void view3d_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOper } RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); - if(op->type->ui) - op->type->ui((bContext*)C, op, pa->layout); + if(op->type->ui) { + op->layout= pa->layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; + } else uiDefAutoButsRNA(C, pa->layout, &ptr, 1); } diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 66b50fbad04..48d67714f15 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -279,6 +279,7 @@ typedef struct wmOperator { ListBase macro; /* list of operators, can be a tree */ struct wmOperator *opm; /* current running macro, not saved */ + struct uiLayout *layout; /* runtime for drawing */ short flag, pad[3]; } wmOperator; diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 51cd9d5d3ac..7abba3c004a 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -675,6 +675,21 @@ static int operator_invoke(bContext *C, wmOperator *op, wmEvent *event) return result; } +static void operator_draw(bContext *C, wmOperator *op) +{ + PointerRNA opr; + ParameterList list; + FunctionRNA *func; + + RNA_pointer_create(&CTX_wm_screen(C)->id, op->type->ext.srna, op, &opr); + func= RNA_struct_find_function(&opr, "draw"); + + RNA_parameter_list_create(&list, &opr, func); + RNA_parameter_set_lookup(&list, "context", &C); + op->type->ext.call(&opr, func, &list); + + RNA_parameter_list_free(&list); +} void operator_wrapper(wmOperatorType *ot, void *userdata); @@ -686,7 +701,7 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports, wmOperatorType dummyot = {0}; wmOperator dummyop= {0}; PointerRNA dummyotr; - int have_function[3]; + int have_function[4]; /* setup dummy operator & operator type to store static properties in */ dummyop.type= &dummyot; @@ -737,6 +752,7 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports, dummyot.pyop_poll= (have_function[0])? operator_poll: NULL; dummyot.exec= (have_function[1])? operator_exec: NULL; dummyot.invoke= (have_function[2])? operator_invoke: NULL; + dummyot.ui= (have_function[3])? operator_draw: NULL; WM_operatortype_append_ptr(operator_wrapper, (void *)&dummyot); @@ -778,6 +794,9 @@ static void rna_def_operator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Properties", ""); RNA_def_property_pointer_funcs(prop, "rna_Operator_properties_get", NULL, NULL); + prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "UILayout"); + /* Registration */ prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "type->idname"); diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index dcaff1a7c07..1afedf1c6a6 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -205,14 +205,14 @@ void RNA_api_operator(StructRNA *srna) /* poll */ func= RNA_def_function(srna, "poll", NULL); RNA_def_function_ui_description(func, "Test if the operator can be called or not."); - RNA_def_function_flag(func, FUNC_REGISTER|FUNC_REGISTER_OPTIONAL); + RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", "")); RNA_def_pointer(func, "context", "Context", "", ""); /* exec */ func= RNA_def_function(srna, "execute", NULL); RNA_def_function_ui_description(func, "Execute the operator."); - RNA_def_function_flag(func, FUNC_REGISTER); + RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); RNA_def_pointer(func, "context", "Context", "", ""); parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name? @@ -222,13 +222,19 @@ void RNA_api_operator(StructRNA *srna) /* invoke */ func= RNA_def_function(srna, "invoke", NULL); RNA_def_function_ui_description(func, "Invoke the operator."); - RNA_def_function_flag(func, FUNC_REGISTER); + RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); RNA_def_pointer(func, "context", "Context", "", ""); RNA_def_pointer(func, "event", "Event", "", ""); parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name? RNA_def_property_flag(parm, PROP_ENUM_FLAG); RNA_def_function_return(func, parm); + + /* draw */ + func= RNA_def_function(srna, "draw", NULL); + RNA_def_function_ui_description(func, "Draw function for the operator."); + RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); + RNA_def_pointer(func, "context", "Context", "", ""); } void RNA_api_keyconfig(StructRNA *srna) diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index f0ccbed06c3..78125954816 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -383,7 +383,7 @@ typedef struct wmOperatorType { int (*poll)(struct bContext *); /* optional panel for redo and repeat, autogenerated if not set */ - void (*ui)(struct bContext *, struct wmOperator *, struct uiLayout *); + void (*ui)(struct bContext *, struct wmOperator *); /* rna for properties */ struct StructRNA *srna; diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 6d008d5cbb3..8a9fb1fa5b5 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -774,8 +774,11 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op) layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, 20, style); uiItemL(layout, op->type->name, 0); - if(op->type->ui) - op->type->ui((bContext*)C, op, layout); + if(op->type->ui) { + op->layout= layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; + } else uiDefAutoButsRNA(C, layout, &ptr, columns); @@ -808,8 +811,11 @@ static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData) RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, style); - if(op->type->ui) - op->type->ui((bContext*)C, op, layout); + if(op->type->ui) { + op->layout= layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; + } uiPopupBoundsBlock(block, 4.0f, 0, 0); uiEndBlock(C, block); @@ -862,8 +868,11 @@ static uiBlock *wm_block_create_menu(bContext *C, ARegion *ar, void *arg_op) layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style); uiItemL(layout, op->type->name, 0); - if(op->type->ui) - op->type->ui(C, op, layout); + if(op->type->ui) { + op->layout= layout; + op->type->ui(C, op); + op->layout= NULL; + } else uiDefAutoButsRNA(C, layout, op->ptr, 2); |