Revision: 17897
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17897
Author:   blendix
Date:     2008-12-16 21:03:28 +0100 (Tue, 16 Dec 2008)

Log Message:
-----------
UI:
* Added support for defining properties for operator buttons, with
  uiButGetOperatorPtrRNA. Needed to cleanup a hack that was there
  for operator properties in RNA, now a separate OperatorProperties
  type is used for storing operator properties, instead of being part
  of the Operator type itself.
* Allow selecting menu items with mouse release instead of press again.
* Fix some cases with hanging tooltips in the UI.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/UI_interface.h
    branches/blender2.5/blender/source/blender/editors/interface/interface.c
    branches/blender2.5/blender/source/blender/editors/interface/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/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/makesrna/RNA_access.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_access.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_wm.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    
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

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-16 18:42:12 UTC (rev 17896)
+++ branches/blender2.5/blender/source/blender/editors/include/UI_interface.h   
2008-12-16 20:03:28 UTC (rev 17897)
@@ -334,6 +334,8 @@
 void   uiButSetFlag            (uiBut *but, int flag);
 void   uiButClearFlag          (uiBut *but, int flag);
 
+struct PointerRNA *uiButGetOperatorPtrRNA(uiBut *but);
+
 void   uiBlockSetHandleFunc(uiBlock *block,    void (*func)(struct bContext 
*C, void *arg, int event), void *arg);
 void   uiBlockSetButmFunc      (uiBlock *block,        void (*func)(struct 
bContext *C, void *arg, int but_a2), void *arg);
 

Modified: 
branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c    
2008-12-16 18:42:12 UTC (rev 17896)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c    
2008-12-16 20:03:28 UTC (rev 17897)
@@ -42,6 +42,7 @@
 #include "BLI_dynstr.h"
 
 #include "BKE_global.h"
+#include "BKE_idprop.h"
 #include "BKE_library.h"
 #include "BKE_screen.h"
 #include "BKE_texture.h"
@@ -1343,6 +1344,11 @@
 
 static void ui_free_but(const bContext *C, uiBut *but)
 {
+       if(but->opproperties) {
+               IDP_FreeProperty(but->opproperties);
+               MEM_freeN(but->opproperties);
+       }
+       if(but->opptr) MEM_freeN(but->opptr);
        if(but->active) ui_button_active_cancel(C, but);
        if(but->str && but->str != but->strdata) MEM_freeN(but->str);
        ui_free_link(but->link);
@@ -2553,6 +2559,22 @@
        return but->retval;
 }
 
+PointerRNA *uiButGetOperatorPtrRNA(uiBut *but)
+{
+       wmOperatorType *ot;
+       
+       if(but->opname && !but->opptr) {
+               ot= WM_operatortype_find(but->opname);
+
+               if(ot) {
+                       but->opptr= MEM_callocN(sizeof(PointerRNA), 
"uiButOpPtr");
+                       RNA_pointer_create(NULL, NULL, ot->srna, 
&but->opproperties, but->opptr);
+               }
+       }
+
+       return but->opptr;
+}
+
 void uiBlockSetHandleFunc(uiBlock *block, void (*func)(struct bContext *C, 
void *arg, int event), void *arg)
 {
        block->handle_func= func;

Modified: 
branches/blender2.5/blender/source/blender/editors/interface/interface.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.h    
2008-12-16 18:42:12 UTC (rev 17896)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.h    
2008-12-16 20:03:28 UTC (rev 17897)
@@ -35,6 +35,7 @@
 
 struct ARegion;
 struct bContext;
+struct IDProperty;
 struct uiHandleButtonData;
 struct wmWindow;
 
@@ -162,6 +163,8 @@
                /* Operator */
        const char *opname;
        int opcontext;
+       struct IDProperty *opproperties;
+       struct PointerRNA *opptr;
 
                /* active button data */
        struct uiHandleButtonData *active;

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-16 18:42:12 UTC (rev 17896)
+++ 
branches/blender2.5/blender/source/blender/editors/interface/interface_handlers.c
   2008-12-16 20:03:28 UTC (rev 17897)
@@ -41,6 +41,7 @@
 #include "PIL_time.h"
 
 #include "BKE_colortools.h"
+#include "BKE_idprop.h"
 #include "BKE_global.h"
 #include "BKE_texture.h"
 #include "BKE_utildefines.h"
@@ -143,6 +144,7 @@
 
        const char *opname;
        int opcontext;
+       IDProperty *opproperties;
 } uiAfterFunc;
 
 static void button_activate_state(bContext *C, uiBut *but, uiHandleButtonState 
state);
@@ -182,7 +184,12 @@
 
                after->opname= but->opname;
                after->opcontext= but->opcontext;
+               after->opproperties= but->opproperties;
 
+               but->opname= NULL;
+               but->opcontext= 0;
+               but->opproperties= NULL;
+
                BLI_addtail(&UIAfterFuncs, after);
        }
 }
@@ -205,8 +212,12 @@
                if(after->butm_func)
                        after->butm_func(C, after->butm_func_arg, after->a2);
 
-               if(after->opname) /* make WM_operatora_call option? */
-                       WM_operator_call(C, after->opname, after->opcontext);
+               if(after->opname)
+                       WM_operator_call(C, after->opname, after->opcontext, 
after->opproperties);
+               if(after->opproperties) {
+                       IDP_FreeProperty(after->opproperties);
+                       MEM_freeN(after->opproperties);
+               }
        }
 
        BLI_freelistN(&funcs);
@@ -1430,6 +1441,10 @@
                        button_activate_state(C, but, 
BUTTON_STATE_WAIT_RELEASE);
                        return WM_UI_HANDLER_BREAK;
                }
+               else if(event->type == LEFTMOUSE && but->block->handle) {
+                       button_activate_state(C, but, BUTTON_STATE_EXIT);
+                       return WM_UI_HANDLER_BREAK;
+               }
                else if(ELEM(event->type, PADENTER, RETKEY) && event->val) {
                        button_activate_state(C, but, BUTTON_STATE_WAIT_FLASH);
                        return WM_UI_HANDLER_BREAK;
@@ -2659,10 +2674,9 @@
                block->tooltipdisabled= !enable;
 }
 
-static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
+static int ui_mouse_inside_region(ARegion *ar, int x, int y)
 {
        uiBlock *block;
-       uiBut *but, *butover= NULL;
        int mx, my;
 
        /* check if the mouse is in the region, and in case of a view2d also 
check
@@ -2671,7 +2685,7 @@
                for(block=ar->uiblocks.first; block; block=block->next)
                        block->auto_open= 0;
 
-               return NULL;
+               return 0;
        }
 
        if(ar->v2d.mask.xmin!=ar->v2d.mask.xmax) {
@@ -2680,9 +2694,34 @@
                ui_window_to_region(ar, &mx, &my);
 
                if(!BLI_in_rcti(&ar->v2d.mask, mx, my))
-                       return NULL;
+                       return 0;
        }
 
+       return 1;
+}
+
+static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y)
+{
+       if(!ui_mouse_inside_region(ar, x, y))
+               return 0;
+
+       ui_window_to_block(ar, but->block, &x, &y);
+
+       if(!ui_but_contains_pt(but, x, y))
+               return 0;
+       
+       return 1;
+}
+
+static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
+{
+       uiBlock *block;
+       uiBut *but, *butover= NULL;
+       int mx, my;
+
+       if(!ui_mouse_inside_region(ar, x, y))
+               return NULL;
+
        for(block=ar->uiblocks.first; block; block=block->next) {
                mx= x;
                my= y;
@@ -2949,7 +2988,7 @@
        ARegion *ar;
        uiBut *postbut;
        uiButtonActivateType posttype;
-       int retval, mx, my;
+       int retval;
 
        data= but->active;
        block= but->block;
@@ -2961,11 +3000,7 @@
                switch(event->type) {
                        case MOUSEMOVE:
                                /* verify if we are still over the button, if 
not exit */
-                               mx= event->x;
-                               my= event->y;
-                               ui_window_to_block(ar, block, &mx, &my);
-
-                               if(!ui_but_contains_pt(but, mx, my)) {
+                               if(!ui_mouse_inside_button(ar, but, event->x, 
event->y)) {
                                        data->cancel= 1;
                                        button_activate_state(C, but, 
BUTTON_STATE_EXIT);
                                }
@@ -2990,11 +3025,7 @@
                                        
WM_event_remove_window_timer(data->window, data->autoopentimer);
                                        data->autoopentimer= NULL;
 
-                                       mx= event->x;
-                                       my= event->y;
-                                       ui_window_to_block(ar, block, &mx, &my);
-
-                                       if(ui_but_contains_pt(but, mx, my))
+                                       if(ui_mouse_inside_button(ar, but, 
event->x, event->y))
                                                button_activate_state(C, but, 
BUTTON_STATE_MENU_OPEN);
                                }
 
@@ -3010,11 +3041,7 @@
                switch(event->type) {
                        case MOUSEMOVE:
                                /* deselect the button when moving the mouse 
away */
-                               mx= event->x;
-                               my= event->y;
-                               ui_window_to_block(ar, block, &mx, &my);
-
-                               if(ui_but_contains_pt(but, mx, my)) {
+                               if(ui_mouse_inside_button(ar, but, event->x, 
event->y)) {
                                        if(!(but->flag & UI_SELECT)) {
                                                but->flag |= UI_SELECT;
                                                data->cancel= 0;
@@ -3082,7 +3109,7 @@
        return retval;
 }
 
-static void ui_handle_button_closed_submenu(bContext *C, uiBut *but)
+static void ui_handle_button_closed_submenu(bContext *C, wmEvent *event, uiBut 
*but)
 {
        uiHandleButtonData *data;
        uiMenuBlockHandle *menu;
@@ -3105,8 +3132,15 @@
 
                button_activate_exit(C, data, but, 1);
        }
-       else if(menu->menuretval == UI_RETURN_OUT)
-               button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
+       else if(menu->menuretval == UI_RETURN_OUT) {
+               if(ui_mouse_inside_button(data->region, but, event->x, 
event->y)) {
+                       button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT);
+               }
+               else {
+                       data->cancel= 1;
+                       button_activate_exit(C, data, but, 1);
+               }
+       }
 }
 
 /* ******************** menu navigation helpers ************** */
@@ -3451,7 +3485,7 @@
                return retval;
 }
 
-static int ui_handle_menu_closed_submenu(bContext *C, uiMenuBlockHandle *menu)
+static int ui_handle_menu_closed_submenu(bContext *C, wmEvent *event, 
uiMenuBlockHandle *menu)
 {
        ARegion *ar;
        uiBut *but;
@@ -3477,7 +3511,7 @@
 
                /* now let activated button in this menu exit, which
                 * will actually close the submenu too */
-               ui_handle_button_closed_submenu(C, but);
+               ui_handle_button_closed_submenu(C, event, but);
        }
 
        if(menu->menuretval)
@@ -3504,7 +3538,7 @@
        /* now handle events for our own menu */
        if(retval == WM_UI_HANDLER_CONTINUE || event->type == TIMER) {
                if(submenu && submenu->menuretval)
-                       retval= ui_handle_menu_closed_submenu(C, menu);
+                       retval= ui_handle_menu_closed_submenu(C, event, menu);
                else
                        retval= ui_handle_menu_event(C, event, menu, (submenu 
== NULL));
        }
@@ -3589,7 +3623,7 @@
                        /* handle events for the activated button */
                        if(retval == WM_UI_HANDLER_CONTINUE || event->type == 
TIMER) {
                                if(data->menu->menuretval)
-                                       ui_handle_button_closed_submenu(C, but);
+                                       ui_handle_button_closed_submenu(C, 
event, but);
                                else
                                        ui_handle_button_event(C, event, but);
                        }

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-16 18:42:12 UTC (rev 17896)
+++ 
branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
    2008-12-16 20:03:28 UTC (rev 17897)
@@ -1679,7 +1679,7 @@
        const char *opname= arg;
 
        if(retval > 0)
-               WM_operator_call(C, opname, WM_OP_DEFAULT);
+               WM_operator_call(C, opname, WM_OP_DEFAULT, NULL);
 }
 
 void okee_operator(bContext *C, char *opname, char *str, ...)

Modified: 
branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- 
branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h   
    2008-12-16 18:42:12 UTC (rev 17896)
+++ 
branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h   
    2008-12-16 20:03:28 UTC (rev 17897)
@@ -142,7 +142,6 @@
 typedef struct wmKeymapItem {
        struct wmKeymapItem *next, *prev;
        

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