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. @@

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

Reply via email to