diff options
author | Ton Roosendaal <ton@blender.org> | 2009-06-12 18:22:27 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2009-06-12 18:22:27 +0400 |
commit | a62bec6667c7ae0df7d0003b566a466b1047d728 (patch) | |
tree | 40e2baf1b662083d27a0f2dc5ccee310594a4ee0 /source/blender/editors/interface/interface_handlers.c | |
parent | 32b34f82fd782d45ee4b5389a1f961bc1f463631 (diff) |
2.5
Quick Color picker alternative!
- only a color circle + value slider
- exits immediate after use, or slight mouse move outside picker
- use scrollwheel to change HSV 'value'. Also works while picking.
- added nicer AA'ed cursor in picker
- All color swatches change 'value' on ALT+Wheel mouse-over
Old picker is still there, under SHIFT+click on swatch. Needs
evaluation... part of UI keymap? Per button type? Or divide
picker in left/right? Or just have all those old picker buttons
in another panel... I'm not to fond of this giant old popup.
Diffstat (limited to 'source/blender/editors/interface/interface_handlers.c')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 107 |
1 files changed, 104 insertions, 3 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 6eddb564945..bda16584811 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -621,6 +621,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut break; case BUT_NORMAL: case HSVCUBE: + case HSVCIRCLE: ui_apply_but_VEC(C, but, data); break; case BUT_COLORBAND: @@ -1432,7 +1433,7 @@ static void ui_numedit_begin(uiBut *but, uiHandleButtonData *data) data->coba= (ColorBand*)but->poin; but->editcoba= data->coba; } - else if(ELEM(but->type, BUT_NORMAL, HSVCUBE)) { + else if(ELEM3(but->type, BUT_NORMAL, HSVCUBE, HSVCIRCLE)) { ui_get_but_vectorf(but, data->origvec); VECCOPY(data->vec, data->origvec); but->editvec= data->vec; @@ -2100,6 +2101,25 @@ static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, wm return WM_UI_HANDLER_BREAK; } } + else if(but->type==COL) { + if( ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) { + float col[3]; + + ui_get_but_vectorf(but, col); + rgb_to_hsv(col[0], col[1], col[2], but->hsv, but->hsv+1, but->hsv+2); + + if(event->type==WHEELDOWNMOUSE) + but->hsv[2]= CLAMPIS(but->hsv[2]-0.05f, 0.0f, 1.0f); + else + but->hsv[2]= CLAMPIS(but->hsv[2]+0.05f, 0.0f, 1.0f); + + hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], data->vec, data->vec+1, data->vec+2); + + button_activate_state(C, but, BUTTON_STATE_EXIT); + ui_apply_button(C, but->block, but, data, 1); + return WM_UI_HANDLER_BREAK; + } + } } return WM_UI_HANDLER_CONTINUE; @@ -2223,8 +2243,11 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, but->hsv[2]= x; but->hsv[1]= y; } - else + else if(but->a1==3) { but->hsv[0]= x; + } + else + but->hsv[2]= y; ui_set_but_hsv(but); // converts to rgb @@ -2276,6 +2299,79 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu return WM_UI_HANDLER_CONTINUE; } +static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx, int my) +{ + rcti rect; + int changed= 1; + + rect.xmin= but->x1; rect.xmax= but->x2; + rect.ymin= but->y1; rect.ymax= but->y2; + + ui_hsvcircle_vals_from_pos(but->hsv, but->hsv+1, &rect, (float)mx, (float)my); + + ui_set_but_hsv(but); // converts to rgb + + // update button values and strings + // XXX ui_update_block_buts_hsv(but->block, but->hsv); + + data->draglastx= mx; + data->draglasty= my; + + return changed; +} + + +static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event) +{ + int mx, my; + + mx= event->x; + my= event->y; + ui_window_to_block(data->region, block, &mx, &my); + + if(data->state == BUTTON_STATE_HIGHLIGHT) { + if(event->type==LEFTMOUSE && event->val==KM_PRESS) { + data->dragstartx= mx; + data->dragstarty= my; + data->draglastx= mx; + data->draglasty= my; + button_activate_state(C, but, BUTTON_STATE_NUM_EDITING); + + /* also do drag the first time */ + if(ui_numedit_but_HSVCIRCLE(but, data, mx, my)) + ui_numedit_apply(C, block, but, data); + + return WM_UI_HANDLER_BREAK; + } + } + else if(data->state == BUTTON_STATE_NUM_EDITING) { + /* XXX hardcoded keymap check.... */ + if(event->type == WHEELDOWNMOUSE) { + but->hsv[2]= CLAMPIS(but->hsv[2]-0.05f, 0.0f, 1.0f); + ui_set_but_hsv(but); // converts to rgb + ui_numedit_apply(C, block, but, data); + } + else if(event->type == WHEELUPMOUSE) { + but->hsv[2]= CLAMPIS(but->hsv[2]+0.05f, 0.0f, 1.0f); + ui_set_but_hsv(but); // converts to rgb + ui_numedit_apply(C, block, but, data); + } + else if(event->type == MOUSEMOVE) { + if(mx!=data->draglastx || my!=data->draglasty) { + if(ui_numedit_but_HSVCIRCLE(but, data, mx, my)) + ui_numedit_apply(C, block, but, data); + } + } + else if(event->type==LEFTMOUSE && event->val!=KM_PRESS) + button_activate_state(C, but, BUTTON_STATE_EXIT); + + return WM_UI_HANDLER_BREAK; + } + + return WM_UI_HANDLER_CONTINUE; +} + + static int verg_colorband(const void *a1, const void *a2) { const CBData *x1=a1, *x2=a2; @@ -2847,6 +2943,9 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) case HSVCUBE: retval= ui_do_but_HSVCUBE(C, block, but, data, event); break; + case HSVCIRCLE: + retval= ui_do_but_HSVCIRCLE(C, block, but, data, event); + break; #ifdef INTERNATIONAL case CHARTAB: retval= ui_do_but_CHARTAB(C, block, but, data, event); @@ -3545,8 +3644,10 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, if(event->type == MOUSEMOVE) ui_mouse_motion_towards_init(menu, mx, my, 0); + /* first block own event func */ + if(block->block_event_func && block->block_event_func(C, block, event)); /* events not for active search menu button */ - if(but==NULL || but->type!=SEARCH_MENU) { + else if(but==NULL || but->type!=SEARCH_MENU) { switch(event->type) { /* closing sublevels of pulldowns */ case LEFTARROWKEY: |