From 9abce5dfbaee953fcec0779a94cbadc3516b9daf Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 24 Jun 2009 13:44:19 +0000 Subject: 2.5 Medium sized Color Picker; consisting of number sliders, row buttons to select rgb/hsv/hex, HS circle and V slider. It opens persistant, like old picker. This one opens default, other two can be accessed with ALT or SHIFT click. On todo; - eyedropper tool back - method for click-drag to make mini picker appear Note for UI coders (brecht :), added a UI_HIDDEN flag in buttons, to support switching buttons in menus. Hidden buttons are not activated nor drawn. --- source/blender/editors/interface/interface.c | 3 +- .../blender/editors/interface/interface_handlers.c | 11 +- .../blender/editors/interface/interface_intern.h | 2 +- .../blender/editors/interface/interface_regions.c | 115 +++++++++++++++++++-- 4 files changed, 122 insertions(+), 9 deletions(-) (limited to 'source/blender/editors') diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 780d999cfbe..1c17962075f 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -671,7 +671,8 @@ void uiDrawBlock(const bContext *C, uiBlock *block) /* widgets */ for(but= block->buttons.first; but; but= but->next) { ui_but_to_pixelrect(&rect, ar, block, but); - ui_draw_but(C, ar, &style, but, &rect); + if(!(but->flag & UI_HIDDEN)) + ui_draw_but(C, ar, &style, but, &rect); } /* restore matrix */ diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index fb5afbf5e36..8eab0305047 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -404,7 +404,15 @@ static void ui_apply_but_TOG(bContext *C, uiBlock *block, uiBut *but, uiHandleBu static void ui_apply_but_ROW(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data) { + uiBut *bt; + ui_set_but_val(but, but->hardmax); + + /* states of other row buttons */ + for(bt= block->buttons.first; bt; bt= bt->next) + if(bt!=but && bt->poin==but->poin && bt->type==ROW) + ui_check_but(bt); + ui_apply_but_func(C, but); data->retval= but->retval; @@ -3232,7 +3240,8 @@ static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y) for(but=block->buttons.first; but; but= but->next) { if(ELEM3(but->type, LABEL, ROUNDBOX, SEPR)) continue; - + if(but->flag & UI_HIDDEN) + continue; if(ui_but_contains_pt(but, mx, my)) /* give precedence to already activated buttons */ if(!butover || (!butover->active && but->active)) diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 19a87c40d9c..187d7cccd97 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -98,7 +98,7 @@ typedef enum { #define UI_ACTIVE 4 #define UI_HAS_ICON 8 #define UI_TEXTINPUT 16 - +#define UI_HIDDEN 32 /* warn: rest of uiBut->flag in UI_interface.h */ /* internal panel drawing defines */ diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 32bcae77e6b..af1d4e91c67 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -1720,24 +1720,118 @@ static void do_picker_small_cb(bContext *C, void *bt1, void *hsv1) popup->menuretval= UI_RETURN_UPDATE; } +/* picker sizes S hsize, F full size, D spacer, B button/pallette height */ +#define SPICK1 150.0 +#define DPICK1 6.0 -/* only the color, a circle, slider */ -void uiBlockPickerSmall(uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval) +/* only the color, a HS circle and V slider */ +static void uiBlockPickerSmall(uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval) { uiBut *bt; VECCOPY(old, col); // old color stored there, for palette_cb to work /* HS circle */ - bt= uiDefButF(block, HSVCIRCLE, retval, "", 0, 0,SPICK,SPICK, col, 0.0, 0.0, 0, 0, ""); + bt= uiDefButF(block, HSVCIRCLE, retval, "", 0, 0,SPICK1,SPICK1, col, 0.0, 0.0, 0, 0, ""); + uiButSetFunc(bt, do_picker_small_cb, bt, hsv); + + /* value */ + bt= uiDefButF(block, HSVCUBE, retval, "", SPICK1+DPICK1,0,14,SPICK1, col, 0.0, 0.0, 4, 0, ""); uiButSetFunc(bt, do_picker_small_cb, bt, hsv); +} + +static void picker_new_hide_reveal(uiBlock *block, short colormode) +{ + uiBut *bt; + + /* tag buttons */ + for(bt= block->buttons.first; bt; bt= bt->next) { + + if(bt->type==NUMSLI || bt->type==TEX) { + if( bt->str[1]=='e') { + if(colormode==2) bt->flag &= ~UI_HIDDEN; + else bt->flag |= UI_HIDDEN; + } + else if( ELEM3(bt->str[0], 'R', 'G', 'B')) { + if(colormode==0) bt->flag &= ~UI_HIDDEN; + else bt->flag |= UI_HIDDEN; + } + else if( ELEM3(bt->str[0], 'H', 'S', 'V')) { + if(colormode==1) bt->flag &= ~UI_HIDDEN; + else bt->flag |= UI_HIDDEN; + } + } + } +} + +static void do_picker_new_mode_cb(bContext *C, void *bt1, void *colv) +{ + uiBut *bt= bt1; + short colormode= ui_get_but_val(bt); + + picker_new_hide_reveal(bt->block, colormode); +} + + +/* a HS circle, V slider, rgb/hsv/hex sliders */ +static void uiBlockPickerNew(uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval) +{ + static short colormode= 0; /* temp? 0=rgb, 1=hsv, 2=hex */ + uiBut *bt; + int width; + + VECCOPY(old, col); // old color stored there, for palette_cb to work + + /* HS circle */ + bt= uiDefButF(block, HSVCIRCLE, retval, "", 0, 0,SPICK1,SPICK1, col, 0.0, 0.0, 0, 0, ""); + uiButSetFunc(bt, do_picker_small_cb, bt, hsv); + /* value */ - bt= uiDefButF(block, HSVCUBE, retval, "", SPICK+DPICK,0,14,SPICK, col, 0.0, 0.0, 4, 0, ""); + bt= uiDefButF(block, HSVCUBE, retval, "", SPICK1+DPICK1,0,14,SPICK1, col, 0.0, 0.0, 4, 0, ""); uiButSetFunc(bt, do_picker_small_cb, bt, hsv); + + /* mode */ + width= (SPICK1+DPICK1+14)/3; + uiBlockBeginAlign(block); + bt= uiDefButS(block, ROW, retval, "RGB", 0, -30, width, 19, &colormode, 0.0, 0.0, 0, 0, ""); + uiButSetFunc(bt, do_picker_new_mode_cb, bt, col); + bt= uiDefButS(block, ROW, retval, "HSV", width, -30, width, 19, &colormode, 0.0, 1.0, 0, 0, ""); + uiButSetFunc(bt, do_picker_new_mode_cb, bt, hsv); + bt= uiDefButS(block, ROW, retval, "Hex", 2*width, -30, width, 19, &colormode, 0.0, 2.0, 0, 0, ""); + uiButSetFunc(bt, do_picker_new_mode_cb, bt, hexcol); + uiBlockEndAlign(block); + + /* sliders or hex */ + width= (SPICK1+DPICK1+14); + rgb_to_hsv(col[0], col[1], col[2], hsv, hsv+1, hsv+2); + sprintf(hexcol, "%02X%02X%02X", (unsigned int)(col[0]*255.0), (unsigned int)(col[1]*255.0), (unsigned int)(col[2]*255.0)); + + uiBlockBeginAlign(block); + bt= uiDefButF(block, NUMSLI, 0, "R ", 0, -60, width, 19, col, 0.0, 1.0, 10, 3, ""); + uiButSetFunc(bt, do_palette1_cb, bt, hsv); + bt= uiDefButF(block, NUMSLI, 0, "G ", 0, -80, width, 19, col+1, 0.0, 1.0, 10, 3, ""); + uiButSetFunc(bt, do_palette1_cb, bt, hsv); + bt= uiDefButF(block, NUMSLI, 0, "B ", 0, -100, width, 19, col+2, 0.0, 1.0, 10, 3, ""); + uiButSetFunc(bt, do_palette1_cb, bt, hsv); + uiBlockEndAlign(block); + uiBlockBeginAlign(block); + bt= uiDefButF(block, NUMSLI, 0, "H ", 0, -60, width, 19, hsv, 0.0, 1.0, 10, 3, ""); + uiButSetFunc(bt, do_palette2_cb, bt, col); + bt= uiDefButF(block, NUMSLI, 0, "S ", 0, -80, width, 19, hsv+1, 0.0, 1.0, 10, 3, ""); + uiButSetFunc(bt, do_palette2_cb, bt, col); + bt= uiDefButF(block, NUMSLI, 0, "V ", 0, -100, width, 19, hsv+2, 0.0, 1.0, 10, 3, ""); + uiButSetFunc(bt, do_palette2_cb, bt, col); + uiBlockEndAlign(block); + + bt= uiDefBut(block, TEX, 0, "Hex: ", 0, -80, width, 19, hexcol, 0, 8, 0, 0, "Hex triplet for color (#RRGGBB)"); + uiButSetFunc(bt, do_palette_hex_cb, bt, hexcol); + + picker_new_hide_reveal(block, colormode); } + static int ui_picker_small_wheel(const bContext *C, uiBlock *block, wmEvent *event) { float add= 0.0f; @@ -1790,13 +1884,22 @@ uiBlock *ui_block_func_COL(bContext *C, uiPopupBlockHandle *handle, void *arg_bu block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_KEEP_OPEN; uiBoundsBlock(block, 3); } - else { + else if(win->eventstate->alt) { uiBlockPickerSmall(block, handle->retvec, hsvcol, oldcol, hexcol, 'p', 0); block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1|UI_BLOCK_OUT_1; uiBoundsBlock(block, 10); block->block_event_func= ui_picker_small_wheel; - } + } + else { + uiBlockPickerNew(block, handle->retvec, hsvcol, oldcol, hexcol, 'p', 0); + block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_KEEP_OPEN; + uiBoundsBlock(block, 10); + + block->block_event_func= ui_picker_small_wheel; + } + + /* and lets go */ block->direction= UI_TOP; -- cgit v1.2.3