[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18045] branches/blender2.5/blender/source /blender: 2.5
Ton Roosendaal
ton at blender.org
Wed Dec 24 15:52:20 CET 2008
Revision: 18045
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18045
Author: ton
Date: 2008-12-24 15:52:17 +0100 (Wed, 24 Dec 2008)
Log Message:
-----------
2.5
Fix: popup menus were not freeing operators.
Made a new Popup menu call for this case:
uiPupmenuOperator(C, maxrow, op, propname, menustr);
It will set enum "propname" to the menu item and call operator,
register it optionally and free it. Use it in "invoke" calls.
Next: automatic menu generating for enum properties!
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
branches/blender2.5/blender/source/blender/editors/object/object_edit.c
branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c
branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c
branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
branches/blender2.5/blender/source/blender/windowmanager/wm.h
Modified: branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/UI_interface.h 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h 2008-12-24 14:52:17 UTC (rev 18045)
@@ -35,6 +35,7 @@
struct ARegion;
struct wmWindow;
struct wmWindowManager;
+struct wmOperator;
struct AutoComplete;
struct bContext;
struct PointerRNA;
@@ -194,7 +195,10 @@
int popup;
void (*popup_func)(struct bContext *C, void *arg, int event);
void *popup_arg;
-
+ /* for operator menus */
+ struct wmOperator *op_arg;
+ const char *propname;
+
/* return values */
int butretval;
int menuretval;
@@ -206,8 +210,9 @@
typedef void (*uiPupmenuFunc)(struct bContext *C, void *arg, int event);
void uiPupmenuSetActive(int val);
+
+void uiPupmenuOperator(struct bContext *C, int maxrow, struct wmOperator *op, const char *propname, char *str);
void uiPupmenu(struct bContext *C, int maxrow, uiPupmenuFunc func, void *arg, char *str, ...);
-
void uiPupmenuOkee(struct bContext *C, char *opname, char *str, ...);
void uiPupmenuSaveOver(struct bContext *C, char *opname, char *filename, ...);
void uiPupmenuNotice(struct bContext *C, char *str, ...);
Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c 2008-12-24 14:52:17 UTC (rev 18045)
@@ -53,6 +53,8 @@
#include "UI_text.h"
#include "interface.h"
+#include "RNA_access.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -214,7 +216,7 @@
after->butm_func(C, after->butm_func_arg, after->a2);
if(after->opname)
- WM_operator_call(C, after->opname, after->opcontext, after->opproperties);
+ WM_operator_name_call(C, after->opname, after->opcontext, after->opproperties);
if(after->opproperties) {
IDP_FreeProperty(after->opproperties);
MEM_freeN(after->opproperties);
@@ -3647,28 +3649,35 @@
return WM_UI_HANDLER_BREAK;
}
+/* two types of popups, one with operator + enum, other with regular callbacks */
static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata)
{
uiMenuBlockHandle *menu= userdata;
- void (*popup_func)(struct bContext *C, void *arg, int event)= NULL;
- void *popup_arg= NULL;
- int retval= 0;
ui_handle_menus_recursive(C, event, menu);
/* free if done, does not free handle itself */
if(menu->menuretval) {
- if(menu->menuretval == UI_RETURN_OK) {
- popup_func= menu->popup_func;
- popup_arg= menu->popup_arg;
- retval= menu->retvalue;
- }
-
+ /* copy values, we have to free first (closes region) */
+ uiMenuBlockHandle temp= *menu;
+
ui_menu_block_free(C, menu);
WM_event_remove_ui_handler(&CTX_wm_window(C)->handlers, ui_handler_popup, ui_handler_remove_popup, menu);
- if(popup_func)
- popup_func(C, popup_arg, retval);
+ if(temp.menuretval == UI_RETURN_OK) {
+ if(temp.popup_func) {
+ temp.popup_func(C, temp.op_arg, temp.retvalue);
+ }
+ else if(temp.op_arg) {
+ if(temp.propname)
+ RNA_enum_set(temp.op_arg->ptr, temp.propname, temp.retvalue);
+ WM_operator_call(C, temp.op_arg);
+ }
+ }
+ /* always free operator */
+ else if(temp.op_arg)
+ WM_operator_free(temp.op_arg);
+
}
else {
/* re-enable tooltips */
@@ -3704,4 +3713,3 @@
{
WM_event_add_ui_handler(NULL, handlers, ui_handler_popup, ui_handler_remove_popup, menu);
}
-
Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c 2008-12-24 14:52:17 UTC (rev 18045)
@@ -1629,6 +1629,33 @@
return block;
}
+/* This one will set enum propname, call operator and register it, and free the operator itself,
+ call it in op->invoke with returning OPERATOR_RUNNING_MODAL */
+/* Note: propname has to be static */
+void uiPupmenuOperator(bContext *C, int maxrow, wmOperator *op, const char *propname, char *str)
+{
+ wmWindow *window= CTX_wm_window(C);
+ uiPupMenuInfo info;
+ uiMenuBlockHandle *menu;
+
+ memset(&info, 0, sizeof(info));
+ info.mx= window->eventstate->x;
+ info.my= window->eventstate->y;
+ info.maxrow= maxrow;
+ info.instr= str;
+
+ menu= ui_menu_block_create(C, NULL, NULL, ui_block_func_PUPMENU, &info);
+ menu->popup= 1;
+
+ UI_add_popup_handlers(&window->handlers, menu);
+ WM_event_add_mousemove(C);
+
+ menu->op_arg= op;
+ menu->propname= propname;
+}
+
+
+/* this one only to be called with operatortype name option */
void uiPupmenu(bContext *C, int maxrow, uiPupmenuFunc func, void *arg, char *str, ...)
{
wmWindow *window= CTX_wm_window(C);
@@ -1658,7 +1685,7 @@
const char *opname= arg;
if(opname && retval > 0)
- WM_operator_call(C, opname, WM_OP_DEFAULT, NULL);
+ WM_operator_name_call(C, opname, WM_OP_DEFAULT, NULL);
}
static void vconfirm(bContext *C, char *opname, char *title, char *itemfmt, va_list ap)
Modified: branches/blender2.5/blender/source/blender/editors/object/object_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_edit.c 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/editors/object/object_edit.c 2008-12-24 14:52:17 UTC (rev 18045)
@@ -1512,16 +1512,6 @@
return OPERATOR_FINISHED;
}
-static void makeparent_callback(bContext *C, void *arg, int event)
-{
- wmOperator *op= (wmOperator *)arg;
-
- /* set the properties for the exec */
- RNA_enum_set(op->ptr, "partype", event);
-
- make_parent_exec(C, op);
-}
-
static int make_parent_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *ob= CTX_data_active_object(C);
@@ -1549,7 +1539,7 @@
else
str += sprintf(str, formatstr, "Object", PAR_OBJECT);
- uiPupmenu(C, 0, makeparent_callback, op, string);
+ uiPupmenuOperator(C, 0, op, "partype", string);
return OPERATOR_RUNNING_MODAL;
}
Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c 2008-12-24 14:52:17 UTC (rev 18045)
@@ -461,7 +461,7 @@
// XXX mainqenter(PADASTERKEY, 1);
break;
case 6: /* Center View and Cursor to Origin */
- WM_operator_call(C, "ED_VIEW3D_OT_viewcenter", WM_OP_REGION_WIN, NULL);
+ WM_operator_name_call(C, "ED_VIEW3D_OT_viewcenter", WM_OP_REGION_WIN, NULL);
curs= give_cursor(scene, v3d);
curs[0]=curs[1]=curs[2]= 0.0;
break;
@@ -545,10 +545,10 @@
endlocalview(scene, sa);
break;
case 9: /* View All (Home) */
- WM_operator_call(C, "ED_VIEW3D_OT_viewhome", WM_OP_REGION_WIN, NULL);
+ WM_operator_name_call(C, "ED_VIEW3D_OT_viewhome", WM_OP_REGION_WIN, NULL);
break;
case 11: /* View Selected */
- WM_operator_call(C, "ED_VIEW3D_OT_viewcenter", WM_OP_REGION_WIN, NULL);
+ WM_operator_name_call(C, "ED_VIEW3D_OT_viewcenter", WM_OP_REGION_WIN, NULL);
break;
case 13: /* Play Back Animation */
play_anim(0);
@@ -560,7 +560,7 @@
add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
break;
case 17: /* Set Clipping Border */
- WM_operator_call(C, "ED_VIEW3D_OT_clipping", WM_OP_REGION_WIN, NULL);
+ WM_operator_name_call(C, "ED_VIEW3D_OT_clipping", WM_OP_REGION_WIN, NULL);
break;
case 18: /* render preview */
toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
@@ -5325,7 +5325,7 @@
switch(event) {
case B_HOME:
- WM_operator_call(C, "ED_VIEW3D_OT_viewhome", WM_OP_REGION_WIN, NULL);
+ WM_operator_name_call(C, "ED_VIEW3D_OT_viewhome", WM_OP_REGION_WIN, NULL);
break;
case B_SCENELOCK:
if(v3d->scenelock) {
Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_operator.c 2008-12-24 14:52:17 UTC (rev 18045)
@@ -110,7 +110,7 @@
}
}
- WM_operator_call(self->C, self->name, WM_OP_DEFAULT, properties);
+ WM_operator_name_call(self->C, self->name, WM_OP_DEFAULT, properties);
if (properties) {
IDP_FreeProperty(properties);
Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h 2008-12-24 14:52:17 UTC (rev 18045)
@@ -114,11 +114,13 @@
void WM_error(struct bContext *C, char *str);
/* operator api */
+void WM_operator_free (struct wmOperator *op);
wmOperatorType *WM_operatortype_find(const char *idname);
wmOperatorType *WM_operatortype_first(void);
void WM_operatortype_append (void (*opfunc)(wmOperatorType*));
-int WM_operator_call (struct bContext *C, const char *opstring, int context, struct IDProperty *properties);
+int WM_operator_call (struct bContext *C, struct wmOperator *op);
+int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct IDProperty *properties);
/* default operator callbacks for border/circle/lasso */
int WM_border_select_invoke (struct bContext *C, wmOperator *op, struct wmEvent *event);
Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c 2008-12-24 11:17:45 UTC (rev 18044)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c 2008-12-24 14:52:17 UTC (rev 18045)
@@ -51,7 +51,7 @@
#define MAX_OP_REGISTERED 32
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list