[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