Index: source/blender/makesrna/intern/rna_wm_api.c =================================================================== --- source/blender/makesrna/intern/rna_wm_api.c (revision 27619) +++ source/blender/makesrna/intern/rna_wm_api.c (working copy) @@ -208,6 +208,11 @@ RNA_def_function_ui_description(func, "Operator popup invoke."); rna_generic_op_invoke(func, 1, 1); + /* invoked dialog opens popup with OK button, does not auto-exec operator. */ + func= RNA_def_function(srna, "invoke_props_dialog", "WM_operator_props_dialog_popup"); + RNA_def_function_ui_description(func, "Operator dialog (non-autoexec popup) invoke."); + rna_generic_op_invoke(func, 0, 0); + /* invoke enum */ func= RNA_def_function(srna, "invoke_search_popup", "rna_Operator_enum_search_invoke"); rna_generic_op_invoke(func, 0, 0); Index: source/blender/windowmanager/intern/wm_operators.c =================================================================== --- source/blender/windowmanager/intern/wm_operators.c (revision 27619) +++ source/blender/windowmanager/intern/wm_operators.c (working copy) @@ -910,7 +910,60 @@ return block; } +/* Only invoked by OK button in popups created with wm_block_create_dialog() */ +static void dialog_exec_cb(bContext *C, void *arg1, void *arg2) +{ + wmOperator *op= arg1; + uiBlock *block= arg2; + WM_operator_call(C, op); + + uiPupBlockClose(C, block); +} + +/* Dialogs are popups that require user verification (click OK) before exec */ +static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *arg_op) +{ + wmWindowManager *wm= CTX_wm_manager(C); + wmOperator *op= arg_op; + PointerRNA ptr; + uiBlock *block; + uiLayout *layout; + uiBut *btn; + uiStyle *style= U.uistyles.first; + int columns= 2, width=300; + + block = uiBeginBlock(C, ar, "operator dialog", UI_EMBOSS); + uiBlockClearFlag(block, UI_BLOCK_LOOP); + uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT); + + if (!op->properties) { + IDPropertyTemplate val = {0}; + op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties"); + } + + RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); + 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->layout= layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; + } + else + uiDefAutoButsRNA(C, layout, &ptr, columns); + + /* Create OK button, the callback of which will execute op */ + btn= uiDefBut(block, BUT, 0, "OK", 0, 0, 0, 20, NULL, 0, 0, 0, 0, ""); + uiButSetFunc(btn, dialog_exec_cb, op, block); + + uiPopupBoundsBlock(block, 4.0f, 0, 0); + uiEndBlock(C, block); + + return block; +} + static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData) { struct { wmOperator *op; int width; int height; } * data = userData; @@ -958,6 +1011,14 @@ return retval; } +int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, wmEvent *event) +{ + /* op is not executed until popup OK but is clicked */ + uiPupBlock(C, wm_block_create_dialog, op); + + return OPERATOR_RUNNING_MODAL; +} + void WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height) { struct { wmOperator *op; int width; int height; } data;