Revision: 19493
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19493
Author:   blendix
Date:     2009-04-01 16:02:06 +0200 (Wed, 01 Apr 2009)

Log Message:
-----------
2.5: added generic WM_operator_redo for use as invoke callback, similar
to WM_operator_menu for example, but popping up the redo menu. This is
useful for operators like particles rekey, which makes no sense without
specifying the number of keys.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/curve/editcurve.c
    branches/blender2.5/blender/source/blender/editors/physics/editparticle.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/blender2.5/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/curve/editcurve.c        
2009-04-01 12:43:07 UTC (rev 19492)
+++ branches/blender2.5/blender/source/blender/editors/curve/editcurve.c        
2009-04-01 14:02:06 UTC (rev 19493)
@@ -1069,10 +1069,9 @@
        
        /* api callbacks */
        ot->exec= set_weight_exec;
+       ot->invoke= WM_operator_redo;
        ot->poll= ED_operator_editsurfcurve;
 
-       // XXX invoke popup?
-
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
@@ -1121,10 +1120,9 @@
        
        /* api callbacks */
        ot->exec= set_radius_exec;
+       ot->invoke= WM_operator_redo;
        ot->poll= ED_operator_editsurfcurve;
 
-       // XXX invoke popup?
-
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
@@ -4147,9 +4145,8 @@
        
        /* api callbacks */
        ot->exec= select_random_exec;
+       ot->invoke= WM_operator_redo;
        ot->poll= ED_operator_editsurfcurve;
-       
-       // XXX invoke popup?
 
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -4182,9 +4179,8 @@
        
        /* api callbacks */
        ot->exec= select_every_nth_exec;
+       ot->invoke= WM_operator_redo;
        ot->poll= ED_operator_editsurfcurve;
-
-       // XXX invoke popup?
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;

Modified: 
branches/blender2.5/blender/source/blender/editors/physics/editparticle.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/physics/editparticle.c   
2009-04-01 12:43:07 UTC (rev 19492)
+++ branches/blender2.5/blender/source/blender/editors/physics/editparticle.c   
2009-04-01 14:02:06 UTC (rev 19493)
@@ -1821,7 +1821,7 @@
        
        /* api callbacks */
        ot->exec= rekey_exec;
-       // XXX show buttons ot->invoke= rekey_invoke;
+       ot->invoke= WM_operator_redo;
        ot->poll= PE_poll;
 
        /* flags */

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c      
2009-04-01 12:43:07 UTC (rev 19492)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c      
2009-04-01 14:02:06 UTC (rev 19493)
@@ -1622,44 +1622,6 @@
 
 /* ********************** redo operator ***************************** */
 
-static void redo_last_cb(bContext *C, void *arg_op, void *arg2)
-{
-       wmOperator *lastop= arg_op;
-       
-       if(lastop) {
-               ED_undo_pop(C);
-               WM_operator_repeat(C, lastop);
-       }
-       
-}
-
-static uiBlock *ui_block_create_redo_last(bContext *C, ARegion *ar, void 
*arg_op)
-{
-       wmWindowManager *wm= CTX_wm_manager(C);
-       wmOperator *op= arg_op;
-       PointerRNA ptr;
-       uiBlock *block;
-       int height;
-       
-       block= uiBeginBlock(C, ar, "redo_last_popup", UI_EMBOSS, UI_HELV);
-       uiBlockClearFlag(block, UI_BLOCK_LOOP);
-       uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
-       uiBlockSetFunc(block, redo_last_cb, arg_op, NULL);
-
-       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);
-       height= uiDefAutoButsRNA(C, block, &ptr);
-
-       uiPopupBoundsBlock(block, 4.0f, 0, 0);
-       uiEndBlock(C, block);
-
-       return block;
-}
-
 static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
        wmWindowManager *wm= CTX_wm_manager(C);
@@ -1670,11 +1632,9 @@
                if((lastop->type->flag & OPTYPE_REGISTER) && 
(lastop->type->flag & OPTYPE_UNDO))
                        break;
        
-       if(!lastop)
-               return OPERATOR_CANCELLED;
+       if(lastop)
+               WM_operator_redo_popup(C, lastop);
 
-       uiPupBlock(C, ui_block_create_redo_last, lastop);
-
        return OPERATOR_CANCELLED;
 }
 

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h   
2009-04-01 12:43:07 UTC (rev 19492)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h   
2009-04-01 14:02:06 UTC (rev 19493)
@@ -123,6 +123,9 @@
 int                    WM_operator_filesel             (struct bContext *C, 
struct wmOperator *op, struct wmEvent *event);
                        /* poll callback, context checks */
 int                    WM_operator_winactive   (struct bContext *C);
+                       /* invoke callback, exec + redo popup */
+int                    WM_operator_redo                (struct bContext *C, 
struct wmOperator *op, struct wmEvent *event);
+int                    WM_operator_redo_popup  (struct bContext *C, struct 
wmOperator *op);
 
                /* operator api */
 void           WM_operator_free                (struct wmOperator *op);

Modified: 
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c  
    2009-04-01 12:43:07 UTC (rev 19492)
+++ 
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c  
    2009-04-01 14:02:06 UTC (rev 19493)
@@ -54,6 +54,7 @@
 #include "IMB_imbuf_types.h"
 
 #include "ED_screen.h"
+#include "ED_util.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -248,6 +249,64 @@
        return 1;
 }
 
+/* op->invoke */
+static void redo_cb(bContext *C, void *arg_op, void *arg2)
+{
+       wmOperator *lastop= arg_op;
+       
+       if(lastop) {
+               ED_undo_pop(C);
+               WM_operator_repeat(C, lastop);
+       }
+}
+
+static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
+{
+       wmWindowManager *wm= CTX_wm_manager(C);
+       wmOperator *op= arg_op;
+       PointerRNA ptr;
+       uiBlock *block;
+       int height;
+       
+       block= uiBeginBlock(C, ar, "redo_popup", UI_EMBOSS, UI_HELV);
+       uiBlockClearFlag(block, UI_BLOCK_LOOP);
+       uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
+       uiBlockSetFunc(block, redo_cb, arg_op, NULL);
+
+       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);
+       height= uiDefAutoButsRNA(C, block, &ptr);
+
+       uiPopupBoundsBlock(block, 4.0f, 0, 0);
+       uiEndBlock(C, block);
+
+       return block;
+}
+
+int WM_operator_redo(bContext *C, wmOperator *op, wmEvent *event)
+{
+       int retval= OPERATOR_CANCELLED;
+       
+       if(op->type->exec)
+               retval= op->type->exec(C, op);
+
+       if(retval != OPERATOR_CANCELLED)
+               uiPupBlock(C, wm_block_create_redo, op);
+
+       return retval;
+}
+
+int WM_operator_redo_popup(bContext *C, wmOperator *op)
+{
+       uiPupBlock(C, wm_block_create_redo, op);
+
+       return OPERATOR_CANCELLED;
+}
+
 /* ************ window / screen operator definitions ************** */
 
 static void WM_OT_window_duplicate(wmOperatorType *ot)


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to