diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-06-12 17:53:08 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-06-12 17:53:08 +0400 |
commit | 32b34f82fd782d45ee4b5389a1f961bc1f463631 (patch) | |
tree | d256e8b11ebe0ef9e3a5a96b1ba0d35103f9ce30 | |
parent | ec8b2593ecdee9493210df0e6f9c4dbbcb2a1985 (diff) |
UI:
* Immediately do updates when working in the color picker popup.
* Fix for color picking wrongly getting cancelled sometimes.
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 29 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_regions.c | 27 |
3 files changed, 49 insertions, 8 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 0604a5e27e1..7b18380b54f 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -96,6 +96,7 @@ typedef struct uiLayout uiLayout; #define UI_RETURN_CANCEL 1 /* cancel all menus cascading */ #define UI_RETURN_OK 2 /* choice made */ #define UI_RETURN_OUT 4 /* left the menu */ +#define UI_RETURN_UPDATE 8 /* update the button that opened */ /* block->flag bits 12-15 are identical to but->flag bits */ diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index f8f0ebad700..6eddb564945 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -3362,7 +3362,8 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but) uiBut *bt= ui_but_find_mouse_over(ar, event->x, event->y); if(bt && bt->active != data) { - data->cancel= 1; + if(but->type != COL) /* exception */ + data->cancel= 1; button_activate_state(C, but, BUTTON_STATE_EXIT); } break; @@ -3391,7 +3392,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but) return retval; } -static void ui_handle_button_closed_submenu(bContext *C, wmEvent *event, uiBut *but) +static void ui_handle_button_return_submenu(bContext *C, wmEvent *event, uiBut *but) { uiHandleButtonData *data; uiPopupBlockHandle *menu; @@ -3400,12 +3401,19 @@ static void ui_handle_button_closed_submenu(bContext *C, wmEvent *event, uiBut * menu= data->menu; /* copy over return values from the closing menu */ - if(menu->menuretval == UI_RETURN_OK) { + if(menu->menuretval == UI_RETURN_OK || menu->menuretval == UI_RETURN_UPDATE) { if(but->type == COL) VECCOPY(data->vec, menu->retvec) else if(ELEM3(but->type, MENU, ICONROW, ICONTEXTROW)) data->value= menu->retvalue; } + + if(menu->menuretval == UI_RETURN_UPDATE) { + if(data->interactive) ui_apply_button(C, but->block, but, data, 1); + else ui_check_but(but); + + menu->menuretval= 0; + } /* now change button state or exit, which will close the submenu */ if(ELEM(menu->menuretval, UI_RETURN_OK, UI_RETURN_CANCEL)) { @@ -3716,7 +3724,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, * buttons inside this region. disabled inside check .. not sure * anymore why it was there? but i meant enter enter didn't work * for example when mouse was not over submenu */ - if((/*inside &&*/ !menu->menuretval && retval == WM_UI_HANDLER_CONTINUE) || event->type == TIMER) { + if((/*inside &&*/ (!menu->menuretval || menu->menuretval == UI_RETURN_UPDATE) && retval == WM_UI_HANDLER_CONTINUE) || event->type == TIMER) { but= ui_but_find_activated(ar); if(but) { @@ -3746,7 +3754,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, return retval; } -static int ui_handle_menu_closed_submenu(bContext *C, wmEvent *event, uiPopupBlockHandle *menu) +static int ui_handle_menu_return_submenu(bContext *C, wmEvent *event, uiPopupBlockHandle *menu) { ARegion *ar; uiBut *but; @@ -3771,10 +3779,15 @@ static int ui_handle_menu_closed_submenu(bContext *C, wmEvent *event, uiPopupBlo menu->butretval= data->retval; } } + else if(submenu->menuretval == UI_RETURN_UPDATE) + menu->menuretval = UI_RETURN_UPDATE; /* now let activated button in this menu exit, which * will actually close the submenu too */ - ui_handle_button_closed_submenu(C, event, but); + ui_handle_button_return_submenu(C, event, but); + + if(submenu->menuretval == UI_RETURN_UPDATE) + submenu->menuretval = 0; } /* for cases where close does not cascade, allow the user to @@ -3808,7 +3821,7 @@ static int ui_handle_menus_recursive(bContext *C, wmEvent *event, uiPopupBlockHa /* 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, event, menu); + retval= ui_handle_menu_return_submenu(C, event, menu); else retval= ui_handle_menu_event(C, event, menu, (submenu == NULL)); } @@ -3901,7 +3914,7 @@ static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata) /* 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, event, but); + ui_handle_button_return_submenu(C, event, but); else ui_handle_button_event(C, event, but); } diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 31d0bf5d97d..5d562805b51 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -1480,6 +1480,7 @@ static void do_palette_cb(bContext *C, void *bt1, void *col1) { wmWindow *win= CTX_wm_window(C); uiBut *but1= (uiBut *)bt1; + uiPopupBlockHandle *popup= but1->block->handle; float *col= (float *)col1; float *fp, hsv[3]; @@ -1495,6 +1496,18 @@ static void do_palette_cb(bContext *C, void *bt1, void *col1) rgb_to_hsv(col[0], col[1], col[2], hsv, hsv+1, hsv+2); ui_update_block_buts_hsv(but1->block, hsv); update_picker_hex(but1->block, col); + + if(popup) + popup->menuretval= UI_RETURN_UPDATE; +} + +static void do_hsv_cb(bContext *C, void *bt1, void *unused) +{ + uiBut *but1= (uiBut *)bt1; + uiPopupBlockHandle *popup= but1->block->handle; + + if(popup) + popup->menuretval= UI_RETURN_UPDATE; } /* bt1 is num but, hsv1 is pointer to original color in hsv space*/ @@ -1502,6 +1515,7 @@ static void do_palette_cb(bContext *C, void *bt1, void *col1) static void do_palette1_cb(bContext *C, void *bt1, void *hsv1) { uiBut *but1= (uiBut *)bt1; + uiPopupBlockHandle *popup= but1->block->handle; float *hsv= (float *)hsv1; float *fp= NULL; @@ -1514,6 +1528,9 @@ static void do_palette1_cb(bContext *C, void *bt1, void *hsv1) rgb_to_hsv(fp[0], fp[1], fp[2], hsv, hsv+1, hsv+2); } ui_update_block_buts_hsv(but1->block, hsv); + + if(popup) + popup->menuretval= UI_RETURN_UPDATE; } /* bt1 is num but, col1 is pointer to original color */ @@ -1521,6 +1538,7 @@ static void do_palette1_cb(bContext *C, void *bt1, void *hsv1) static void do_palette2_cb(bContext *C, void *bt1, void *col1) { uiBut *but1= (uiBut *)bt1; + uiPopupBlockHandle *popup= but1->block->handle; float *rgb= (float *)col1; float *fp= NULL; @@ -1533,14 +1551,21 @@ static void do_palette2_cb(bContext *C, void *bt1, void *col1) hsv_to_rgb(fp[0], fp[1], fp[2], rgb, rgb+1, rgb+2); } ui_update_block_buts_hsv(but1->block, fp); + + if(popup) + popup->menuretval= UI_RETURN_UPDATE; } static void do_palette_hex_cb(bContext *C, void *bt1, void *hexcl) { uiBut *but1= (uiBut *)bt1; + uiPopupBlockHandle *popup= but1->block->handle; char *hexcol= (char *)hexcl; ui_update_block_buts_hex(but1->block, hexcol); + + if(popup) + popup->menuretval= UI_RETURN_UPDATE; } /* used for both 3d view and image window */ @@ -1623,8 +1648,10 @@ void uiBlockPickerButtons(uiBlock *block, float *col, float *hsv, float *old, ch // the cube intersection bt= uiDefButF(block, HSVCUBE, retval, "", 0,DPICK+BPICK,FPICK,FPICK, col, 0.0, 0.0, 2, 0, ""); + uiButSetFunc(bt, do_hsv_cb, bt, NULL); bt= uiDefButF(block, HSVCUBE, retval, "", 0,0,FPICK,BPICK, col, 0.0, 0.0, 3, 0, ""); + uiButSetFunc(bt, do_hsv_cb, bt, NULL); // palette |