[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19493] branches/blender2.5/blender/source /blender: 2.5: added generic WM_operator_redo for use as invoke callback, similar

Brecht Van Lommel brecht at blender.org
Wed Apr 1 16:02:06 CEST 2009


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)





More information about the Bf-blender-cvs mailing list