UI Code Quality: Use derived struct for color buttons
For the main rationale behind this design, see 03b122e2a18df. Further, this removes users of `uiBut.a1`/`uiBut.a2`, which is a very ugly design choice (hard to reason about). Part of Part of T74432.
This commit is contained in:
parent
49f088e2d0
commit
68c00e6f8f
|
@ -390,8 +390,6 @@ enum {
|
|||
UI_GRAD_L_ALT = 10,
|
||||
};
|
||||
|
||||
#define UI_PALETTE_COLOR 20
|
||||
|
||||
/* Drawing
|
||||
*
|
||||
* Functions to draw various shapes, taking theme settings into account.
|
||||
|
|
|
@ -2329,7 +2329,8 @@ bool ui_but_supports_cycling(const uiBut *but)
|
|||
{
|
||||
return ((ELEM(but->type, UI_BTYPE_ROW, UI_BTYPE_NUM, UI_BTYPE_NUM_SLIDER, UI_BTYPE_LISTBOX)) ||
|
||||
(but->type == UI_BTYPE_MENU && ui_but_menu_step_poll(but)) ||
|
||||
(but->type == UI_BTYPE_COLOR && but->a1 != -1) || (but->menu_step_func != NULL));
|
||||
(but->type == UI_BTYPE_COLOR && ((uiButColor *)but)->is_pallete_color) ||
|
||||
(but->menu_step_func != NULL));
|
||||
}
|
||||
|
||||
double ui_but_value_get(uiBut *but)
|
||||
|
@ -3772,6 +3773,10 @@ static void ui_but_alloc_info(const eButType type,
|
|||
bool has_custom_type = true;
|
||||
|
||||
switch (type) {
|
||||
case UI_BTYPE_COLOR:
|
||||
alloc_size = sizeof(uiButColor);
|
||||
alloc_str = "uiButColor";
|
||||
break;
|
||||
case UI_BTYPE_DECORATOR:
|
||||
alloc_size = sizeof(uiButDecorator);
|
||||
alloc_str = "uiButDecorator";
|
||||
|
|
|
@ -5713,21 +5713,24 @@ static bool ui_numedit_but_UNITVEC(
|
|||
return changed;
|
||||
}
|
||||
|
||||
static void ui_palette_set_active(uiBut *but)
|
||||
static void ui_palette_set_active(uiButColor *color_but)
|
||||
{
|
||||
if ((int)(but->a1) == UI_PALETTE_COLOR) {
|
||||
Palette *palette = (Palette *)but->rnapoin.owner_id;
|
||||
PaletteColor *color = but->rnapoin.data;
|
||||
if (color_but->is_pallete_color) {
|
||||
Palette *palette = (Palette *)color_but->but.rnapoin.owner_id;
|
||||
PaletteColor *color = color_but->but.rnapoin.data;
|
||||
palette->active_color = BLI_findindex(&palette->colors, color);
|
||||
}
|
||||
}
|
||||
|
||||
static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, const wmEvent *event)
|
||||
{
|
||||
BLI_assert(but->type == UI_BTYPE_COLOR);
|
||||
uiButColor *color_but = (uiButColor *)but;
|
||||
|
||||
if (data->state == BUTTON_STATE_HIGHLIGHT) {
|
||||
/* first handle click on icondrag type button */
|
||||
if (event->type == LEFTMOUSE && but->dragpoin && event->val == KM_PRESS) {
|
||||
ui_palette_set_active(but);
|
||||
ui_palette_set_active(color_but);
|
||||
if (ui_but_contains_point_px_icon(but, data->region, event)) {
|
||||
button_activate_state(C, but, BUTTON_STATE_WAIT_DRAG);
|
||||
data->dragstartx = event->x;
|
||||
|
@ -5737,7 +5740,7 @@ static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, co
|
|||
}
|
||||
#ifdef USE_DRAG_TOGGLE
|
||||
if (event->type == LEFTMOUSE && event->val == KM_PRESS) {
|
||||
ui_palette_set_active(but);
|
||||
ui_palette_set_active(color_but);
|
||||
button_activate_state(C, but, BUTTON_STATE_WAIT_DRAG);
|
||||
data->dragstartx = event->x;
|
||||
data->dragstarty = event->y;
|
||||
|
@ -5746,7 +5749,7 @@ static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, co
|
|||
#endif
|
||||
/* regular open menu */
|
||||
if (ELEM(event->type, LEFTMOUSE, EVT_PADENTER, EVT_RETKEY) && event->val == KM_PRESS) {
|
||||
ui_palette_set_active(but);
|
||||
ui_palette_set_active(color_but);
|
||||
button_activate_state(C, but, BUTTON_STATE_MENU_OPEN);
|
||||
return WM_UI_HANDLER_BREAK;
|
||||
}
|
||||
|
@ -5777,8 +5780,7 @@ static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, co
|
|||
ui_apply_but(C, but->block, but, data, true);
|
||||
return WM_UI_HANDLER_BREAK;
|
||||
}
|
||||
if ((int)(but->a1) == UI_PALETTE_COLOR && event->type == EVT_DELKEY &&
|
||||
event->val == KM_PRESS) {
|
||||
if (color_but->is_pallete_color && (event->type == EVT_DELKEY) && (event->val == KM_PRESS)) {
|
||||
Palette *palette = (Palette *)but->rnapoin.owner_id;
|
||||
PaletteColor *color = but->rnapoin.data;
|
||||
|
||||
|
@ -5809,7 +5811,7 @@ static int ui_do_but_COLOR(bContext *C, uiBut *but, uiHandleButtonData *data, co
|
|||
}
|
||||
|
||||
if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {
|
||||
if ((int)(but->a1) == UI_PALETTE_COLOR) {
|
||||
if (color_but->is_pallete_color) {
|
||||
if (!event->ctrl) {
|
||||
float color[3];
|
||||
Paint *paint = BKE_paint_get_active_from_context(C);
|
||||
|
@ -7613,13 +7615,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *
|
|||
retval = ui_do_but_BUT(C, but, data, event);
|
||||
break;
|
||||
case UI_BTYPE_COLOR:
|
||||
if (but->a1 == -1) {
|
||||
/* signal to prevent calling up color picker */
|
||||
retval = ui_do_but_EXIT(C, but, data, event);
|
||||
}
|
||||
else {
|
||||
retval = ui_do_but_COLOR(C, but, data, event);
|
||||
}
|
||||
retval = ui_do_but_COLOR(C, but, data, event);
|
||||
break;
|
||||
case UI_BTYPE_UNITVEC:
|
||||
retval = ui_do_but_UNITVEC(C, block, but, data, event);
|
||||
|
|
|
@ -177,7 +177,6 @@ struct uiBut {
|
|||
* - UI_BTYPE_LABEL: Use `(a1 == 1.0f)` to use a2 as a blending factor (imaginative!).
|
||||
* - UI_BTYPE_SCROLL: Use as scroll size.
|
||||
* - UI_BTYPE_SEARCH_MENU: Use as number or rows.
|
||||
* - UI_BTYPE_COLOR: Use as indication of color palette.
|
||||
* - UI_BTYPE_PROGRESS_BAR: Use to store progress (0..1).
|
||||
*/
|
||||
float a1;
|
||||
|
@ -188,7 +187,6 @@ struct uiBut {
|
|||
* - UI_BTYPE_NUM: Use to store RNA 'precision' value, for dragging and click-step.
|
||||
* - UI_BTYPE_LABEL: If `(a1 == 1.0f)` use a2 as a blending factor.
|
||||
* - UI_BTYPE_SEARCH_MENU: Use as number or columns.
|
||||
* - UI_BTYPE_COLOR: Use as index in palette (not so good, needs refactor).
|
||||
*/
|
||||
float a2;
|
||||
|
||||
|
@ -281,6 +279,14 @@ struct uiBut {
|
|||
uiBlock *block;
|
||||
};
|
||||
|
||||
/** Derived struct for #UI_BTYPE_COLOR */
|
||||
typedef struct uiButColor {
|
||||
uiBut but;
|
||||
|
||||
bool is_pallete_color;
|
||||
int palette_color_index;
|
||||
} uiButColor;
|
||||
|
||||
/** Derived struct for #UI_BTYPE_TAB */
|
||||
typedef struct uiButTab {
|
||||
uiBut but;
|
||||
|
|
|
@ -5512,22 +5512,24 @@ void uiTemplatePalette(uiLayout *layout,
|
|||
}
|
||||
|
||||
RNA_pointer_create(&palette->id, &RNA_PaletteColor, color, &color_ptr);
|
||||
uiDefButR(block,
|
||||
UI_BTYPE_COLOR,
|
||||
0,
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
UI_UNIT_X,
|
||||
UI_UNIT_Y,
|
||||
&color_ptr,
|
||||
"color",
|
||||
-1,
|
||||
0.0,
|
||||
1.0,
|
||||
UI_PALETTE_COLOR,
|
||||
col_id,
|
||||
"");
|
||||
uiButColor *color_but = (uiButColor *)uiDefButR(block,
|
||||
UI_BTYPE_COLOR,
|
||||
0,
|
||||
"",
|
||||
0,
|
||||
0,
|
||||
UI_UNIT_X,
|
||||
UI_UNIT_Y,
|
||||
&color_ptr,
|
||||
"color",
|
||||
-1,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
"");
|
||||
color_but->is_pallete_color = true;
|
||||
color_but->palette_color_index = col_id;
|
||||
row_cols++;
|
||||
col_id++;
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ uiBut *uiDefAutoButR(uiBlock *block,
|
|||
if (RNA_property_array_check(prop) && index == -1) {
|
||||
if (ELEM(RNA_property_subtype(prop), PROP_COLOR, PROP_COLOR_GAMMA)) {
|
||||
but = uiDefButR_prop(
|
||||
block, UI_BTYPE_COLOR, 0, name, x1, y1, x2, y2, ptr, prop, -1, 0, 0, -1, -1, NULL);
|
||||
block, UI_BTYPE_COLOR, 0, name, x1, y1, x2, y2, ptr, prop, -1, 0, 0, 0, 0, NULL);
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
|
|
|
@ -3768,6 +3768,8 @@ static void widget_numslider(
|
|||
static void widget_swatch(
|
||||
uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
|
||||
{
|
||||
BLI_assert(but->type == UI_BTYPE_COLOR);
|
||||
uiButColor *color_but = (uiButColor *)but;
|
||||
uiWidgetBase wtb;
|
||||
float rad, col[4];
|
||||
|
||||
|
@ -3822,8 +3824,8 @@ static void widget_swatch(
|
|||
}
|
||||
|
||||
widgetbase_draw_ex(&wtb, wcol, show_alpha_checkers);
|
||||
if (but->a1 == UI_PALETTE_COLOR &&
|
||||
((Palette *)but->rnapoin.owner_id)->active_color == (int)but->a2) {
|
||||
if (color_but->is_pallete_color &&
|
||||
((Palette *)but->rnapoin.owner_id)->active_color == color_but->palette_color_index) {
|
||||
float width = rect->xmax - rect->xmin;
|
||||
float height = rect->ymax - rect->ymin;
|
||||
/* find color luminance and change it slightly */
|
||||
|
|
Loading…
Reference in New Issue