UI:
* Immediately do updates when working in the color picker popup. * Fix for color picking wrongly getting cancelled sometimes.
This commit is contained in:
@@ -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 */
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user