[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