Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-06-12 17:53:08 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-06-12 17:53:08 +0400
commit32b34f82fd782d45ee4b5389a1f961bc1f463631 (patch)
treed256e8b11ebe0ef9e3a5a96b1ba0d35103f9ce30
parentec8b2593ecdee9493210df0e6f9c4dbbcb2a1985 (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.h1
-rw-r--r--source/blender/editors/interface/interface_handlers.c29
-rw-r--r--source/blender/editors/interface/interface_regions.c27
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