bugfix [#25230] Quick extrude Ctrl-LMB : wrong behaviour of 'RotateSource' option.
[blender-staging.git] / source / blender / windowmanager / intern / wm_operators.c
index 9f18f23bdd660dc9398d93321eb19df1122fd799..d7c84392a12d5da14391bb06b226db7d51056a9d 100644 (file)
@@ -869,17 +869,6 @@ int WM_operator_winactive(bContext *C)
        return 1;
 }
 
-/* op->exec */
-static void redo_cb(bContext *C, void *arg_op, int UNUSED(event))
-{
-       wmOperator *lastop= arg_op;
-       
-       if(lastop) {
-               ED_undo_pop_op(C, lastop);
-               WM_operator_repeat(C, lastop);
-       }
-}
-
 static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
 {
        wmWindowManager *wm= CTX_wm_manager(C);
@@ -896,10 +885,10 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
        uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
 
        /* if register is not enabled, the operator gets freed on OPERATOR_FINISHED
-        * ui_apply_but_funcs_after calls redo_cb and crashes */
+        * ui_apply_but_funcs_after calls ED_undo_operator_repeate_cb and crashes */
        assert(op->type->flag & OPTYPE_REGISTER);
 
-       uiBlockSetHandleFunc(block, redo_cb, arg_op);
+       uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op);
 
        if(!op->properties) {
                IDPropertyTemplate val = {0};
@@ -910,6 +899,13 @@ 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);
 
+       /* poll() on this operator may still fail, at the moment there is no nice feedback when this happens
+        * just fails silently */
+       if(!WM_operator_repeat_check(C, op)) {
+               uiBlockSetButLock(uiLayoutGetBlock(layout), TRUE, "Operator cannot redo");
+               uiItemL(layout, "* Redo Unsupported *", 0); // XXX, could give some nicer feedback or not show redo panel at all?
+       }
+
        if(op->type->ui) {
                op->layout= layout;
                op->type->ui((bContext*)C, op);