diff options
6 files changed, 102 insertions, 50 deletions
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index abbe95e7b77..eb12f19cf1d 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1170,8 +1170,7 @@ void uiBlockUpdateFromOld(const bContext *C, uiBlock *block) block->auto_open = block->oldblock->auto_open; block->auto_open_last = block->oldblock->auto_open_last; block->tooltipdisabled = block->oldblock->tooltipdisabled; - copy_v3_v3(ui_block_hsv_get(block), - ui_block_hsv_get(block->oldblock)); + BLI_movelisttolist(&block->color_pickers.list, &block->oldblock->color_pickers.list); block->oldblock = NULL; } @@ -2446,6 +2445,7 @@ void uiFreeBlock(const bContext *C, uiBlock *block) CTX_store_free_list(&block->contexts); BLI_freelistN(&block->saferct); + BLI_freelistN(&block->color_pickers.list); MEM_freeN(block); } diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index a3c52ec3e3c..0e3b8e8da63 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -4294,7 +4294,9 @@ static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, co return WM_UI_HANDLER_BREAK; } else if (ELEM(event->type, MOUSEPAN, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) { - float *hsv = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + float hsv_static[3] = {0.0f}; + float *hsv = cpicker ? cpicker->color_data : hsv_static; float col[3]; ui_get_but_vectorf(but, col); @@ -4473,8 +4475,9 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, int my, const enum eSnapType snap, const bool shift) { + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; float rgb[3]; - float *hsv = ui_block_hsv_get(but->block); float x, y; float mx_fl, my_fl; bool changed = true; @@ -4510,7 +4513,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, if (use_display_colorspace) ui_block_to_display_space_v3(but->block, rgb); - copy_v3_v3(hsvo, ui_block_hsv_get(but->block)); + copy_v3_v3(hsvo, hsv); ui_rgb_to_color_picker_HSVCUBE_compat_v(but, rgb, hsvo); @@ -4591,7 +4594,8 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, const wmNDOFMotionData *ndof, const enum eSnapType snap, const bool shift) { - float *hsv = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; const float hsv_v_max = max_ff(hsv[2], but->softmax); float rgb[3]; float sensitivity = (shift ? 0.15f : 0.3f) * ndof->dt; @@ -4704,8 +4708,9 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu if (ELEM(len, 3, 4)) { float rgb[3], def_hsv[3]; float def[4]; - float *hsv = ui_block_hsv_get(but->block); - + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; + RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def); ui_rgb_to_color_picker_HSVCUBE_v(but, def, def_hsv); @@ -4758,7 +4763,8 @@ static bool ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, bool changed = true; float mx_fl, my_fl; float rgb[3]; - float *hsv = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; bool use_display_colorspace = ui_color_picker_use_display_colorspace(but); ui_mouse_scale_warp(data, mx, my, &mx_fl, &my_fl, shift); @@ -4794,8 +4800,8 @@ static bool ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, if (hsv[2] == 0.f) hsv[2] = 0.0001f; } else { - if (hsv[2] == 0.f) hsv[2] = 0.0001f; - if (hsv[2] == 1.f) hsv[2] = 0.9999f; + if (hsv[2] == 0.0f) hsv[2] = 0.0001f; + if (hsv[2] >= 0.9999f) hsv[2] = 0.9999f; } } @@ -4804,7 +4810,7 @@ static bool ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, float xpos, ypos, hsvo[3], rgbo[3]; /* calculate original hsv again */ - copy_v3_v3(hsvo, ui_block_hsv_get(but->block)); + copy_v3_v3(hsvo, hsv); copy_v3_v3(rgbo, data->origvec); if (use_display_colorspace) ui_block_to_display_space_v3(but->block, rgbo); @@ -4850,7 +4856,8 @@ static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, const wmNDOFMotionData *ndof, const enum eSnapType snap, const bool shift) { - float *hsv = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; bool use_display_colorspace = ui_color_picker_use_display_colorspace(but); float rgb[3]; float phi, r /*, sqr */ /* UNUSED */, v[2]; @@ -4919,6 +4926,8 @@ static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, const wmEvent *event) { + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; int mx, my; mx = event->x; my = event->y; @@ -4960,7 +4969,6 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle if (len >= 3) { float rgb[3], def_hsv[3]; float *def; - float *hsv = ui_block_hsv_get(but->block); def = MEM_callocN(sizeof(float) * len, "reset_defaults - float"); RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def); @@ -4992,13 +5000,11 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle } /* XXX hardcoded keymap check.... */ else if (event->type == WHEELDOWNMOUSE) { - float *hsv = ui_block_hsv_get(but->block); hsv[2] = CLAMPIS(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) { - float *hsv = ui_block_hsv_get(but->block); hsv[2] = CLAMPIS(hsv[2] + 0.05f, 0.0f, 1.0f); ui_set_but_hsv(but); /* converts to rgb */ ui_numedit_apply(C, block, but, data); diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 47d0e29061c..54e15a2604d 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -36,6 +36,7 @@ #include "BLI_compiler_attrs.h" #include "UI_resources.h" #include "RNA_types.h" +#include "DNA_listBase.h" struct ARegion; struct bContext; @@ -306,6 +307,16 @@ struct uiBut { uiBlock *block; }; +typedef struct ColorPicker { + struct ColorPicker *next, *prev; + float color_data[3]; /* colr data may be HSV or HSL for now */ + int representation; /* store hsv/hsl value */ +} ColorPicker; + +typedef struct ColorPickerData { + ListBase list; +} ColorPickerData; + struct PieMenuData { float pie_dir[2]; float pie_center_init[2]; @@ -392,7 +403,7 @@ struct uiBlock { void *evil_C; /* XXX hack for dynamic operator enums */ struct UnitSettings *unit; /* unit system, used a lot for numeric buttons so include here rather then fetching through the scene every time. */ - float _hsv[3]; /* XXX, only access via ui_block_hsv_get() */ + ColorPickerData color_pickers; /* XXX, only accessed by color picker templates */ bool color_profile; /* color profile for correcting linear colors for display */ @@ -540,7 +551,7 @@ void ui_popup_menu_memory_set(uiBlock *block, struct uiBut *but); void ui_popup_translate(struct bContext *C, struct ARegion *ar, const int mdiff[2]); -float *ui_block_hsv_get(struct uiBlock *block); +ColorPicker *ui_block_picker_new(struct uiBlock *block); void ui_popup_block_scrolltest(struct uiBlock *block); void ui_rgb_to_color_picker_compat_v(const float rgb[3], float r_cp[3]); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index db893896f89..097dbe9e23a 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -1878,18 +1878,20 @@ static void ui_warp_pointer(int x, int y) void ui_set_but_hsv(uiBut *but) { float col[3]; - const float *hsv = ui_block_hsv_get(but->block); - + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; + ui_color_picker_to_rgb_v(hsv, col); ui_set_but_vectorf(but, col); } -/* also used by small picker, be careful with name checks below... */ -static void ui_update_block_buts_rgb(uiBlock *block, const float rgb[3], bool is_display_space) +/* Updates all buttons who share the same color picker as the one passed + * also used by small picker, be careful with name checks below... */ +static void ui_update_color_picker_buts_rgb(uiBlock *block, ColorPicker *cpicker, const float rgb[3], bool is_display_space) { uiBut *bt; - float *hsv = ui_block_hsv_get(block); + float *hsv = cpicker->color_data; struct ColorManagedDisplay *display = NULL; /* this is to keep the H and S value when V is equal to zero * and we are working in HSV mode, of course! @@ -1911,6 +1913,9 @@ static void ui_update_block_buts_rgb(uiBlock *block, const float rgb[3], bool is /* this updates button strings, is hackish... but button pointers are on stack of caller function */ for (bt = block->buttons.first; bt; bt = bt->next) { + if (bt->custom_data != cpicker) + continue; + if (bt->rnaprop) { ui_set_but_vectorf(bt, rgb); @@ -1978,7 +1983,7 @@ static void do_picker_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg)) if (prop) { RNA_property_float_get_array(&ptr, prop, rgb); - ui_update_block_buts_rgb(but->block, rgb, (RNA_property_subtype(prop) == PROP_COLOR_GAMMA)); + ui_update_color_picker_buts_rgb(but->block, but->custom_data, rgb, (RNA_property_subtype(prop) == PROP_COLOR_GAMMA)); } if (popup) @@ -1990,7 +1995,8 @@ static void do_color_wheel_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(a uiBut *but = (uiBut *)bt1; uiPopupBlockHandle *popup = but->block->handle; float rgb[3]; - const float *hsv = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; bool use_display_colorspace = ui_color_picker_use_display_colorspace(but); ui_color_picker_to_rgb_v(hsv, rgb); @@ -2000,7 +2006,7 @@ static void do_color_wheel_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(a ui_block_to_scene_linear_v3(but->block, rgb); } - ui_update_block_buts_rgb(but->block, rgb, !use_display_colorspace); + ui_update_color_picker_buts_rgb(but->block, cpicker, rgb, !use_display_colorspace); if (popup) popup->menuretval = UI_RETURN_UPDATE; @@ -2010,6 +2016,7 @@ static void do_hex_rna_cb(bContext *UNUSED(C), void *bt1, void *hexcl) { uiBut *but = (uiBut *)bt1; uiPopupBlockHandle *popup = but->block->handle; + ColorPicker *cpicker = but->custom_data; char *hexcol = (char *)hexcl; float rgb[3]; @@ -2021,7 +2028,7 @@ static void do_hex_rna_cb(bContext *UNUSED(C), void *bt1, void *hexcl) ui_block_to_scene_linear_v3(but->block, rgb); } - ui_update_block_buts_rgb(but->block, rgb, false); + ui_update_color_picker_buts_rgb(but->block, cpicker, rgb, false); if (popup) popup->menuretval = UI_RETURN_UPDATE; @@ -2074,13 +2081,14 @@ static void do_picker_new_mode_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(a #define PICKER_TOTAL_W (PICKER_W + PICKER_SPACE + PICKER_BAR) -static void circle_picker(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop) +static void circle_picker(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, ColorPicker *cpicker) { uiBut *bt; /* HS circle */ bt = uiDefButR_prop(block, HSVCIRCLE, 0, "", 0, 0, PICKER_H, PICKER_W, ptr, prop, -1, 0.0, 0.0, 0.0, 0, TIP_("Color")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; /* value */ if (U.color_picker_type == USER_CP_CIRCLE_HSL) { @@ -2091,10 +2099,11 @@ static void circle_picker(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop) bt = uiDefButR_prop(block, HSVCUBE, 0, "", PICKER_W + PICKER_SPACE, 0, PICKER_BAR, PICKER_H, ptr, prop, -1, 0.0, 0.0, UI_GRAD_V_ALT, 0, TIP_("Value")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); } + bt->custom_data = cpicker; } -static void square_picker(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int type) +static void square_picker(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int type, ColorPicker *cpicker) { uiBut *bt; int bartype = type + 3; @@ -2102,10 +2111,12 @@ static void square_picker(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, in /* HS square */ bt = uiDefButR_prop(block, HSVCUBE, 0, "", 0, PICKER_BAR + PICKER_SPACE, PICKER_TOTAL_W, PICKER_H, ptr, prop, -1, 0.0, 0.0, type, 0, TIP_("Color")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; /* value */ bt = uiDefButR_prop(block, HSVCUBE, 0, "", 0, 0, PICKER_TOTAL_W, PICKER_BAR, ptr, prop, -1, 0.0, 0.0, bartype, 0, TIP_("Value")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; } @@ -2120,8 +2131,9 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper float rgb_gamma[3]; unsigned char rgb_gamma_uchar[3]; float softmin, softmax, hardmin, hardmax, step, precision; - float *hsv = ui_block_hsv_get(block); int yco; + ColorPicker *cpicker = ui_block_picker_new(block); + float *hsv = cpicker->color_data; width = PICKER_TOTAL_W; butwidth = width - 1.5f * UI_UNIT_X; @@ -2149,20 +2161,20 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper switch (U.color_picker_type) { case USER_CP_SQUARE_SV: - square_picker(block, ptr, prop, UI_GRAD_SV); + square_picker(block, ptr, prop, UI_GRAD_SV, cpicker); break; case USER_CP_SQUARE_HS: - square_picker(block, ptr, prop, UI_GRAD_HS); + square_picker(block, ptr, prop, UI_GRAD_HS, cpicker); break; case USER_CP_SQUARE_HV: - square_picker(block, ptr, prop, UI_GRAD_HV); + square_picker(block, ptr, prop, UI_GRAD_HV, cpicker); break; /* user default */ case USER_CP_CIRCLE_HSV: case USER_CP_CIRCLE_HSL: default: - circle_picker(block, ptr, prop); + circle_picker(block, ptr, prop, cpicker); break; } @@ -2171,29 +2183,36 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper uiBlockBeginAlign(block); bt = uiDefButS(block, ROW, 0, IFACE_("RGB"), 0, yco, width / 3, UI_UNIT_Y, &colormode, 0.0, 0.0, 0, 0, ""); uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL); + bt->custom_data = cpicker; if (U.color_picker_type == USER_CP_CIRCLE_HSL) bt = uiDefButS(block, ROW, 0, IFACE_("HSL"), width / 3, yco, width / 3, UI_UNIT_Y, &colormode, 0.0, 1.0, 0, 0, ""); else bt = uiDefButS(block, ROW, 0, IFACE_("HSV"), width / 3, yco, width / 3, UI_UNIT_Y, &colormode, 0.0, 1.0, 0, 0, ""); uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL); + bt->custom_data = cpicker; bt = uiDefButS(block, ROW, 0, IFACE_("Hex"), 2 * width / 3, yco, width / 3, UI_UNIT_Y, &colormode, 0.0, 2.0, 0, 0, ""); uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL); + bt->custom_data = cpicker; uiBlockEndAlign(block); yco = -3.0f * UI_UNIT_Y; if (show_picker) { bt = uiDefIconButO(block, BUT, "UI_OT_eyedropper_color", WM_OP_INVOKE_DEFAULT, ICON_EYEDROPPER, butwidth + 10, yco, UI_UNIT_X, UI_UNIT_Y, NULL); uiButSetFunc(bt, close_popup_cb, bt, NULL); + bt->custom_data = cpicker; } /* RGB values */ uiBlockBeginAlign(block); bt = uiDefButR_prop(block, NUMSLI, 0, IFACE_("R:"), 0, yco, butwidth, UI_UNIT_Y, ptr, prop, 0, 0.0, 0.0, 0, 3, TIP_("Red")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; bt = uiDefButR_prop(block, NUMSLI, 0, IFACE_("G:"), 0, yco -= UI_UNIT_Y, butwidth, UI_UNIT_Y, ptr, prop, 1, 0.0, 0.0, 0, 3, TIP_("Green")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; bt = uiDefButR_prop(block, NUMSLI, 0, IFACE_("B:"), 0, yco -= UI_UNIT_Y, butwidth, UI_UNIT_Y, ptr, prop, 2, 0.0, 0.0, 0, 3, TIP_("Blue")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; /* could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NONE); * but need to use uiButSetFunc for updating other fake buttons */ @@ -2203,8 +2222,10 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper uiBlockBeginAlign(block); bt = uiDefButF(block, NUMSLI, 0, IFACE_("H:"), 0, yco, butwidth, UI_UNIT_Y, hsv, 0.0, 1.0, 10, 3, TIP_("Hue")); uiButSetFunc(bt, do_color_wheel_rna_cb, bt, hsv); + bt->custom_data = cpicker; bt = uiDefButF(block, NUMSLI, 0, IFACE_("S:"), 0, yco -= UI_UNIT_Y, butwidth, UI_UNIT_Y, hsv + 1, 0.0, 1.0, 10, 3, TIP_("Saturation")); uiButSetFunc(bt, do_color_wheel_rna_cb, bt, hsv); + bt->custom_data = cpicker; if (U.color_picker_type == USER_CP_CIRCLE_HSL) bt = uiDefButF(block, NUMSLI, 0, IFACE_("L:"), 0, yco -= UI_UNIT_Y, butwidth, UI_UNIT_Y, hsv + 2, 0.0, 1.0, 10, 3, TIP_("Lightness")); else @@ -2212,12 +2233,14 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper bt->hardmax = hardmax; /* not common but rgb may be over 1.0 */ uiButSetFunc(bt, do_color_wheel_rna_cb, bt, hsv); + bt->custom_data = cpicker; uiBlockEndAlign(block); if (rgba[3] != FLT_MAX) { bt = uiDefButR_prop(block, NUMSLI, 0, IFACE_("A: "), 0, yco -= UI_UNIT_Y, butwidth, UI_UNIT_Y, ptr, prop, 3, 0.0, 0.0, 0, 3, TIP_("Alpha")); uiButSetFunc(bt, do_picker_rna_cb, bt, NULL); + bt->custom_data = cpicker; } else { rgba[3] = 1.0f; @@ -2229,6 +2252,7 @@ static void uiBlockPicker(uiBlock *block, float rgba[4], PointerRNA *ptr, Proper yco = -3.0f * UI_UNIT_Y; bt = uiDefBut(block, TEX, 0, IFACE_("Hex: "), 0, yco, butwidth, UI_UNIT_Y, hexcol, 0, 8, 0, 0, TIP_("Hex triplet for color (#RRGGBB)")); uiButSetFunc(bt, do_hex_rna_cb, bt, hexcol); + bt->custom_data = cpicker; uiDefBut(block, LABEL, 0, IFACE_("(Gamma Corrected)"), 0, yco - UI_UNIT_Y, butwidth, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); ui_rgb_to_color_picker_v(rgb_gamma, hsv); @@ -2253,7 +2277,8 @@ static int ui_picker_small_wheel_cb(const bContext *UNUSED(C), uiBlock *block, c if (but->type == HSVCUBE && but->active == NULL) { uiPopupBlockHandle *popup = block->handle; float rgb[3]; - float *hsv = ui_block_hsv_get(block); + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; bool use_display_colorspace = ui_color_picker_use_display_colorspace(but); ui_get_but_vectorf(but, rgb); @@ -2271,7 +2296,7 @@ static int ui_picker_small_wheel_cb(const bContext *UNUSED(C), uiBlock *block, c ui_set_but_vectorf(but, rgb); - ui_update_block_buts_rgb(block, rgb, !use_display_colorspace); + ui_update_color_picker_buts_rgb(block, cpicker, rgb, !use_display_colorspace); if (popup) popup->menuretval = UI_RETURN_UPDATE; @@ -3033,9 +3058,12 @@ void uiPupBlockClose(bContext *C, uiBlock *block) } } -float *ui_block_hsv_get(uiBlock *block) +ColorPicker *ui_block_picker_new(struct uiBlock *block) { - return block->_hsv; + ColorPicker *cpicker = MEM_callocN(sizeof(ColorPicker), "color_picker"); + BLI_addhead(&block->color_pickers.list, cpicker); + + return cpicker; } void ui_rgb_to_color_picker_compat_v(const float rgb[3], float r_cp[3]) diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 73a8c5c664c..c1e42666a96 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2278,6 +2278,7 @@ void uiTemplateColorPicker(uiLayout *layout, PointerRNA *ptr, const char *propna uiBlock *block = uiLayoutGetBlock(layout); uiLayout *col, *row; uiBut *but = NULL; + ColorPicker *cpicker = ui_block_picker_new(block); float softmin, softmax, step, precision; if (!prop) { @@ -2314,6 +2315,8 @@ void uiTemplateColorPicker(uiLayout *layout, PointerRNA *ptr, const char *propna } + but->custom_data = cpicker; + if (lock) { but->flag |= UI_BUT_COLOR_LOCK; } @@ -2333,33 +2336,35 @@ void uiTemplateColorPicker(uiLayout *layout, PointerRNA *ptr, const char *propna switch (U.color_picker_type) { case USER_CP_CIRCLE_HSL: uiItemS(row); - uiDefButR_prop(block, HSVCUBE, 0, "", WHEEL_SIZE + 6, 0, 14, WHEEL_SIZE, ptr, prop, - -1, softmin, softmax, UI_GRAD_L_ALT, 0, ""); + but = uiDefButR_prop(block, HSVCUBE, 0, "", WHEEL_SIZE + 6, 0, 14, WHEEL_SIZE, ptr, prop, + -1, softmin, softmax, UI_GRAD_L_ALT, 0, ""); break; case USER_CP_SQUARE_SV: uiItemS(col); - uiDefButR_prop(block, HSVCUBE, 0, "", 0, 4, WHEEL_SIZE, 18, ptr, prop, - -1, softmin, softmax, UI_GRAD_SV + 3, 0, ""); + but = uiDefButR_prop(block, HSVCUBE, 0, "", 0, 4, WHEEL_SIZE, 18, ptr, prop, + -1, softmin, softmax, UI_GRAD_SV + 3, 0, ""); break; case USER_CP_SQUARE_HS: uiItemS(col); - uiDefButR_prop(block, HSVCUBE, 0, "", 0, 4, WHEEL_SIZE, 18, ptr, prop, - -1, softmin, softmax, UI_GRAD_HS + 3, 0, ""); + but = uiDefButR_prop(block, HSVCUBE, 0, "", 0, 4, WHEEL_SIZE, 18, ptr, prop, + -1, softmin, softmax, UI_GRAD_HS + 3, 0, ""); break; case USER_CP_SQUARE_HV: uiItemS(col); - uiDefButR_prop(block, HSVCUBE, 0, "", 0, 4, WHEEL_SIZE, 18, ptr, prop, - -1, softmin, softmax, UI_GRAD_HV + 3, 0, ""); + but = uiDefButR_prop(block, HSVCUBE, 0, "", 0, 4, WHEEL_SIZE, 18, ptr, prop, + -1, softmin, softmax, UI_GRAD_HV + 3, 0, ""); break; /* user default */ case USER_CP_CIRCLE_HSV: default: uiItemS(row); - uiDefButR_prop(block, HSVCUBE, 0, "", WHEEL_SIZE + 6, 0, 14, WHEEL_SIZE, ptr, prop, - -1, softmin, softmax, UI_GRAD_V_ALT, 0, ""); + but = uiDefButR_prop(block, HSVCUBE, 0, "", WHEEL_SIZE + 6, 0, 14, WHEEL_SIZE, ptr, prop, + -1, softmin, softmax, UI_GRAD_V_ALT, 0, ""); break; } + + but->custom_data = cpicker; } } diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 46c2da902fe..c496bae741c 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2137,7 +2137,8 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti * float radius = (float)min_ii(BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)) / 2.0f; /* gouraud triangle fan */ - const float *hsv_ptr = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + const float *hsv_ptr = cpicker->color_data; float xpos, ypos, ang = 0.0f; float rgb[3], hsvo[3], hsv[3], col[3], colcent[3]; int a; @@ -2404,7 +2405,8 @@ static void ui_draw_but_HSVCUBE(uiBut *but, const rcti *rect) { float rgb[3]; float x = 0.0f, y = 0.0f; - const float *hsv = ui_block_hsv_get(but->block); + ColorPicker *cpicker = but->custom_data; + float *hsv = cpicker->color_data; float hsv_n[3]; bool use_display_colorspace = ui_color_picker_use_display_colorspace(but); |