From b74e696accaa33dcceee70b57d44c4400ebadb71 Mon Sep 17 00:00:00 2001 From: Pablo Vazquez Date: Thu, 25 Sep 2025 17:44:33 +0200 Subject: [PATCH] UI: Theme: Add Curve widget theme settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add theme settings for the Curve and CurveProfile widgets. Even though the curve widget is used all over Blender, it never had its own theme settings. It was using a mix of colors from the “regular” toggle widget with text colors inherited from the editor. Thanks to the recent cleanup and removal of so many redundant theme options, we can now add new/missing settings without overwhelming the theme. See PR for details and screenshots. Pull Request: https://projects.blender.org/blender/blender/pulls/146274 --- .../datafiles/userdef/userdef_default_theme.c | 10 + scripts/startup/bl_ui/space_userpref.py | 1 + .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_userdef.cc | 11 + .../editors/interface/interface_draw.cc | 194 +++++++++--------- .../editors/interface/interface_widgets.cc | 4 +- source/blender/makesdna/DNA_theme_types.h | 2 +- source/blender/makesrna/intern/rna_userdef.cc | 5 + 8 files changed, 123 insertions(+), 106 deletions(-) diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index b28f7eb9845..6e5319d0c1f 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -121,6 +121,16 @@ const bTheme U_theme_default = { .text_sel = RGBA(0xffffffff), .roundness = 0.2f, }, + .wcol_curve = { + .outline = RGBA(0x727272ff), + .outline_sel = RGBA(0x9a9a9aff), + .inner = RGBA(0x545454ff), + .inner_sel = RGBA(0x000000ff), + .item = RGBA(0x00000059), + .text = RGBA(0x08080800), + .text_sel = RGBA(0xc9c9c900), + .roundness = 0.2f, + }, .wcol_menu = { .outline = RGBA(0x3d3d3dff), .outline_sel = RGBA(0x3d3d3dff), diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index ff55a34124b..a1739aa5d3a 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -1455,6 +1455,7 @@ class ThemeGenericClassGenerator: def generate_panel_classes_for_wcols(): wcols = [ ("Box", "wcol_box"), + ("Curve", "wcol_curve"), ("List Item", "wcol_list_item"), ("Menu", "wcol_menu"), ("Menu Background", "wcol_menu_back"), diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 932b26bcc7a..ccfc6883980 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -27,7 +27,7 @@ /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 92 +#define BLENDER_FILE_SUBVERSION 93 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and cancel loading the file, showing a warning to diff --git a/source/blender/blenloader/intern/versioning_userdef.cc b/source/blender/blenloader/intern/versioning_userdef.cc index eb98279d893..59b98641050 100644 --- a/source/blender/blenloader/intern/versioning_userdef.cc +++ b/source/blender/blenloader/intern/versioning_userdef.cc @@ -375,6 +375,17 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme) FROM_DEFAULT_V4_UCHAR(space_view3d.freestyle); } + if (!USER_VERSION_ATLEAST(500, 93)) { + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.text); + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.text_sel); + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.item); + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.inner); + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.inner_sel); + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.outline); + FROM_DEFAULT_V4_UCHAR(tui.wcol_curve.outline_sel); + btheme->tui.wcol_curve.roundness = U_theme_default.tui.wcol_curve.roundness; + } + /** * Always bump subversion in BKE_blender_version.h when adding versioning * code here, and wrap it inside a USER_VERSION_ATLEAST check. diff --git a/source/blender/editors/interface/interface_draw.cc b/source/blender/editors/interface/interface_draw.cc index 588b4b457c0..f17e84a73ec 100644 --- a/source/blender/editors/interface/interface_draw.cc +++ b/source/blender/editors/interface/interface_draw.cc @@ -1595,34 +1595,6 @@ static void ui_draw_but_curve_grid(const uint pos, immEnd(); } -static void gl_shaded_color_get(const uchar color[3], int shade, uchar r_color[3]) -{ - r_color[0] = color[0] - shade > 0 ? color[0] - shade : 0; - r_color[1] = color[1] - shade > 0 ? color[1] - shade : 0; - r_color[2] = color[2] - shade > 0 ? color[2] - shade : 0; -} - -static void gl_shaded_color_get_fl(const uchar *color, int shade, float r_color[3]) -{ - uchar color_shaded[3]; - gl_shaded_color_get(color, shade, color_shaded); - rgb_uchar_to_float(r_color, color_shaded); -} - -static void gl_shaded_color(const uchar *color, int shade) -{ - uchar color_shaded[3]; - gl_shaded_color_get(color, shade, color_shaded); - immUniformColor3ubv(color_shaded); -} - -static void gl_shaded_color(const uchar *color, int shade, uchar alpha) -{ - uchar color_shaded[3]; - gl_shaded_color_get(color, shade, color_shaded); - immUniformColor3ubvAlpha(color_shaded, alpha); -} - void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol, const rcti *rect) { uiButCurveMapping *but_cumap = (uiButCurveMapping *)but; @@ -1630,8 +1602,8 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol, but_cumap->edit_cumap; const bool inactive = but->flag & UI_BUT_INACTIVE; - const uchar alpha = inactive ? 192 : 255; - const float float_alpha = inactive ? 0.75f : 1.0f; + const float fade_factor_float = inactive ? 0.33f : 1.0f; + const uchar fade_factor_uchar = inactive ? 3 : 1; const float clip_size_x = BLI_rctf_size_x(&cumap->curr); const float clip_size_y = BLI_rctf_size_y(&cumap->curr); @@ -1701,34 +1673,44 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol, ui_draw_but_curve_grid(pos, rect, zoomx, zoomy, offsx, offsy, 0.1666666f); } else { + /* Draw backdrop. */ + immUniformColor3ubvAlpha(wcol->inner, (wcol->inner[3] / fade_factor_uchar)); + immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); + + /* Draw an outline around the clipped limits. */ if (cumap->flag & CUMA_DO_CLIP) { - gl_shaded_color_get_fl(wcol->inner, -20, color_backdrop); - immUniformColor3fvAlpha(color_backdrop, float_alpha); - immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); - immUniformColor3ubvAlpha(wcol->inner, alpha); - immRectf(pos, - rect->xmin + zoomx * (cumap->clipr.xmin - offsx), - rect->ymin + zoomy * (cumap->clipr.ymin - offsy), - rect->xmin + zoomx * (cumap->clipr.xmax - offsx), - rect->ymin + zoomy * (cumap->clipr.ymax - offsy)); - } - else { - rgb_uchar_to_float(color_backdrop, wcol->inner); - immUniformColor3fvAlpha(color_backdrop, float_alpha); - immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); + format = immVertexFormat(); + pos = GPU_vertformat_attr_add(format, "pos", blender::gpu::VertAttrType::SFLOAT_32_32); + + immUniformColor3ubvAlpha(wcol->item, (wcol->item[3] / fade_factor_uchar)); + GPU_line_width(2.0f); + imm_draw_box_wire_2d(pos, + rect->xmin + zoomx * (cumap->clipr.xmin - offsx), + rect->ymin + zoomy * (cumap->clipr.ymin - offsy), + rect->xmin + zoomx * (cumap->clipr.xmax - offsx), + rect->ymin + zoomy * (cumap->clipr.ymax - offsy)); + GPU_line_width(1.0f); } /* grid, every 0.25 step */ - gl_shaded_color(wcol->inner, -16, alpha); + immUniformColor3ubvAlpha(wcol->outline_sel, 64 / fade_factor_uchar); ui_draw_but_curve_grid(pos, rect, zoomx, zoomy, offsx, offsy, 0.25f); /* grid, every 1.0 step */ - gl_shaded_color(wcol->inner, -24, alpha); + immUniformColor3ubvAlpha(wcol->outline_sel, 92 / fade_factor_uchar); ui_draw_but_curve_grid(pos, rect, zoomx, zoomy, offsx, offsy, 1.0f); /* axes */ - gl_shaded_color(wcol->inner, -50, alpha); - immBegin(GPU_PRIM_LINES, 4); + uchar col_axis_x[3], col_axis_y[3]; + UI_GetThemeColor3ubv(TH_AXIS_X, col_axis_x); + UI_GetThemeColor3ubv(TH_AXIS_Y, col_axis_y); + + immBegin(GPU_PRIM_LINES, 2); + immUniformColor3ubvAlpha(col_axis_x, 128 / fade_factor_uchar); immVertex2f(pos, rect->xmin, rect->ymin + zoomy * (-offsy)); immVertex2f(pos, rect->xmax, rect->ymin + zoomy * (-offsy)); + immEnd(); + + immBegin(GPU_PRIM_LINES, 2); + immUniformColor3ubvAlpha(col_axis_y, 128 / fade_factor_uchar); immVertex2f(pos, rect->xmin + zoomx * (-offsx), rect->ymin); immVertex2f(pos, rect->xmin + zoomx * (-offsx), rect->ymax); immEnd(); @@ -1815,8 +1797,7 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol, immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); /* Curve filled. */ - uchar filled_alpha = inactive ? 64 : 128; - immUniformColor3ubvAlpha(wcol->item, filled_alpha); + immUniformColor3ubvAlpha(wcol->item, wcol->item[3] / fade_factor_uchar); immBegin(GPU_PRIM_TRI_STRIP, (CM_TABLE * 2 + 2) + 4); immVertex2f(pos, line_range.xmin, rect->ymin); immVertex2f(pos, line_range.xmin, line_range.ymin); @@ -1832,7 +1813,7 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol, /* Curve line. */ GPU_line_width(1.0f); - immUniformColor3ubvAlpha(wcol->item, alpha); + immUniformColor3ubvAlpha(wcol->inner_sel, wcol->inner_sel[3] / fade_factor_uchar); GPU_line_smooth(true); immBegin(GPU_PRIM_LINE_STRIP, (CM_TABLE + 1) + 2); immVertex2f(pos, line_range.xmin, line_range.ymin); @@ -1859,35 +1840,49 @@ void ui_draw_but_CURVE(ARegion *region, uiBut *but, const uiWidgetColors *wcol, GPU_program_point_size(true); - /* Calculate vertex colors based on text theme. */ - float color_vert[4], color_vert_select[4]; - UI_GetThemeColor4fv(TH_TEXT_HI, color_vert); - UI_GetThemeColor4fv(TH_TEXT, color_vert_select); - if (inactive) { - color_vert[3] *= float_alpha; - color_vert_select[3] *= float_alpha; - } - if (len_squared_v3v3(color_vert, color_vert_select) < 0.1f) { - interp_v3_v3v3(color_vert, color_vert_select, color_backdrop, 0.75f); - } - if (len_squared_v3(color_vert) > len_squared_v3(color_vert_select)) { - /* Ensure brightest text color is used for selection. */ - swap_v3_v3(color_vert, color_vert_select); - } + float color_point[4], color_point_select[4], color_point_outline[4]; + rgba_uchar_to_float(color_point, wcol->text); + rgba_uchar_to_float(color_point_select, wcol->text_sel); + rgba_uchar_to_float(color_point_outline, wcol->inner_sel); + color_point[3] = fade_factor_float; + color_point_select[3] = fade_factor_float; + color_point_outline[3] *= fade_factor_float; cmp = cuma->curve; - const float point_size = max_ff(U.pixelsize * 3.0f, - min_ff(UI_SCALE_FAC / but->block->aspect * 6.0f, 20.0f)); + const float point_size = max_ff(U.pixelsize * 2.0f, + min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 20.0f)); + GPU_blend(GPU_BLEND_ALPHA); + + /* Curve widgets using a gradient background (such as Hue Correct), draw + * an additional point in the back, forming an outline so they stand out. */ + if (but_cumap->gradient_type == UI_GRAD_H) { + immBegin(GPU_PRIM_POINTS, cuma->totpoint); + for (int a = 0; a < cuma->totpoint; a++) { + const float fx = rect->xmin + zoomx * (cmp[a].x - offsx); + const float fy = rect->ymin + zoomy * (cmp[a].y - offsy); + const float size_factor = (cmp[a].flag & CUMA_SELECT) ? 1.4f : 1.2f; + + /* First the point the back, slightly larger so it makes an outline. */ + immAttr4fv(col, color_point_outline); + immAttr1f(size, point_size * size_factor); + immVertex2f(pos, fx, fy); + } + immEnd(); + } + immBegin(GPU_PRIM_POINTS, cuma->totpoint); for (int a = 0; a < cuma->totpoint; a++) { const float fx = rect->xmin + zoomx * (cmp[a].x - offsx); const float fy = rect->ymin + zoomy * (cmp[a].y - offsy); - immAttr4fv(col, (cmp[a].flag & CUMA_SELECT) ? color_vert_select : color_vert); + + /* The point in front. */ + immAttr4fv(col, (cmp[a].flag & CUMA_SELECT) ? color_point_select : color_point); immAttr1f(size, point_size); immVertex2f(pos, fx, fy); } immEnd(); immUnbindProgram(); + GPU_blend(GPU_BLEND_NONE); /* Restore scissor-test. */ GPU_scissor(scissor[0], scissor[1], scissor[2], scissor[3]); @@ -1958,30 +1953,27 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); /* Draw the backdrop. */ - float color_backdrop[4] = {0, 0, 0, 1}; - if (profile->flag & PROF_USE_CLIP) { - gl_shaded_color_get_fl((uchar *)wcol->inner, -20, color_backdrop); - immUniformColor3fv(color_backdrop); - immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); - immUniformColor3ubv((uchar *)wcol->inner); + GPU_blend(GPU_BLEND_ALPHA); + /* Main backdrop. */ + immUniformColor4ubv(wcol->inner); + immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); + + if (!(profile->flag & PROF_USE_CLIP)) { + immUniformColor3ubvAlpha(wcol->outline_sel, 16); immRectf(pos, rect->xmin + zoomx * (profile->clip_rect.xmin - offsx), rect->ymin + zoomy * (profile->clip_rect.ymin - offsy), rect->xmin + zoomx * (profile->clip_rect.xmax - offsx), rect->ymin + zoomy * (profile->clip_rect.ymax - offsy)); } - else { - rgb_uchar_to_float(color_backdrop, (uchar *)wcol->inner); - immUniformColor3fv(color_backdrop); - immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax); - } /* 0.25 step grid. */ - gl_shaded_color((uchar *)wcol->inner, -16); + immUniformColor3ubvAlpha(wcol->outline_sel, 64); ui_draw_but_curve_grid(pos, rect, zoomx, zoomy, offsx, offsy, 0.25f); /* 1.0 step grid. */ - gl_shaded_color((uchar *)wcol->inner, -24); + immUniformColor3ubvAlpha(wcol->outline_sel, 92); ui_draw_but_curve_grid(pos, rect, zoomx, zoomy, offsx, offsy, 1.0f); + GPU_blend(GPU_BLEND_NONE); /* Draw the path's fill. */ if (profile->table == nullptr) { @@ -2041,7 +2033,7 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, BLI_polyfill_calc(table_coords, tot_points, -1, tri_indices); /* Draw the triangles for the profile fill. */ - immUniformColor3ubvAlpha(wcol->item, 128); + immUniformColor4ubv(wcol->item); GPU_blend(GPU_BLEND_ALPHA); GPU_polygon_smooth(false); immBegin(GPU_PRIM_TRIS, 3 * tot_triangles); @@ -2062,7 +2054,7 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, const int edges_len = tot_points - 1; if (edges_len > 0) { GPU_line_width(1.0f); - immUniformColor3ubvAlpha((const uchar *)wcol->item, 255); + immUniformColor4ubv(wcol->inner_sel); GPU_line_smooth(true); immBegin(GPU_PRIM_LINE_STRIP, tot_points); for (int i = 0; i < tot_points; i++) { @@ -2087,7 +2079,7 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, /* Draw the lines to the handles from the points. */ if (selected_free_points > 0) { GPU_line_width(1.0f); - gl_shaded_color((uchar *)wcol->inner, -24); + immUniformColor4ubv(wcol->inner_sel); GPU_line_smooth(true); immBegin(GPU_PRIM_LINES, selected_free_points * 4); float ptx, pty; @@ -2121,21 +2113,14 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, GPU_program_point_size(true); - /* Calculate vertex colors based on text theme. */ - float color_vert[4], color_vert_select[4], color_sample[4]; - UI_GetThemeColor4fv(TH_TEXT_HI, color_vert); - UI_GetThemeColor4fv(TH_TEXT, color_vert_select); + float color_point[4], color_point_select[4], color_point_outline[4], color_sample[4]; + rgba_uchar_to_float(color_point, wcol->text); + rgba_uchar_to_float(color_point_select, wcol->text_sel); + rgba_uchar_to_float(color_point_outline, wcol->inner_sel); color_sample[0] = float(wcol->item[0]) / 255.0f; color_sample[1] = float(wcol->item[1]) / 255.0f; color_sample[2] = float(wcol->item[2]) / 255.0f; color_sample[3] = float(wcol->item[3]) / 255.0f; - if (len_squared_v3v3(color_vert, color_vert_select) < 0.1f) { - interp_v3_v3v3(color_vert, color_vert_select, color_backdrop, 0.75f); - } - if (len_squared_v3(color_vert) > len_squared_v3(color_vert_select)) { - /* Ensure brightest text color is used for selection. */ - swap_v3_v3(color_vert, color_vert_select); - } float point_size; @@ -2143,13 +2128,17 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, GPU_line_smooth(false); if (path_len > 0) { GPU_blend(GPU_BLEND_NONE); - point_size = max_ff(3.0f, min_ff(UI_SCALE_FAC / but->block->aspect * 5.0f, 5.0f)); + point_size = max_ff(U.pixelsize * 2.0f, + min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 20.0f)); + immBegin(GPU_PRIM_POINTS, path_len); for (int i = 0; i < path_len; i++) { fx = rect->xmin + zoomx * (pts[i].x - offsx); fy = rect->ymin + zoomy * (pts[i].y - offsy); - immAttr1f(size, point_size); - immAttr4fv(col, (pts[i].flag & PROF_SELECT) ? color_vert_select : color_vert); + const float size_factor = (pts[i].flag & PROF_SELECT) ? 1.5f : 1.0f; + + immAttr1f(size, point_size * size_factor); + immAttr4fv(col, (pts[i].flag & PROF_SELECT) ? color_point_select : color_point); immVertex2f(pos, fx, fy); } immEnd(); @@ -2159,18 +2148,19 @@ void ui_draw_but_CURVEPROFILE(ARegion *region, if (selected_free_points > 0) { GPU_line_smooth(false); GPU_blend(GPU_BLEND_NONE); - point_size = max_ff(2.0f, min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 4.0f)); + point_size = max_ff(U.pixelsize * 2.0f, + min_ff(UI_SCALE_FAC / but->block->aspect * 4.0f, 20.0f)); immBegin(GPU_PRIM_POINTS, selected_free_points * 2); for (int i = 0; i < path_len; i++) { if (point_draw_handles(&pts[i])) { fx = rect->xmin + zoomx * (pts[i].h1_loc[0] - offsx); fy = rect->ymin + zoomy * (pts[i].h1_loc[1] - offsy); immAttr1f(size, point_size); - immAttr4fv(col, (pts[i].flag & PROF_H1_SELECT) ? color_vert_select : color_vert); + immAttr4fv(col, (pts[i].flag & PROF_H1_SELECT) ? color_point_select : color_point); immVertex2f(pos, fx, fy); fx = rect->xmin + zoomx * (pts[i].h2_loc[0] - offsx); fy = rect->ymin + zoomy * (pts[i].h2_loc[1] - offsy); - immAttr4fv(col, (pts[i].flag & PROF_H2_SELECT) ? color_vert_select : color_vert); + immAttr4fv(col, (pts[i].flag & PROF_H2_SELECT) ? color_point_select : color_point); immVertex2f(pos, fx, fy); } } diff --git a/source/blender/editors/interface/interface_widgets.cc b/source/blender/editors/interface/interface_widgets.cc index 665e3a9f3f8..0aad4d044b0 100644 --- a/source/blender/editors/interface/interface_widgets.cc +++ b/source/blender/editors/interface/interface_widgets.cc @@ -5272,11 +5272,11 @@ void ui_draw_but(const bContext *C, ARegion *region, uiStyle *style, uiBut *but, break; case ButType::Curve: - ui_draw_but_CURVE(region, but, &tui->wcol_regular, rect); + ui_draw_but_CURVE(region, but, &tui->wcol_curve, rect); break; case ButType::CurveProfile: - ui_draw_but_CURVEPROFILE(region, but, &tui->wcol_regular, rect); + ui_draw_but_CURVEPROFILE(region, but, &tui->wcol_curve, rect); break; case ButType::Progress: diff --git a/source/blender/makesdna/DNA_theme_types.h b/source/blender/makesdna/DNA_theme_types.h index a86bb486b31..c79f79e492a 100644 --- a/source/blender/makesdna/DNA_theme_types.h +++ b/source/blender/makesdna/DNA_theme_types.h @@ -211,7 +211,7 @@ typedef struct ThemeUI { /* Interface Elements (buttons, menus, icons) */ uiWidgetColors wcol_regular, wcol_tool, wcol_toolbar_item, wcol_text; uiWidgetColors wcol_radio, wcol_option, wcol_toggle; - uiWidgetColors wcol_num, wcol_numslider, wcol_tab; + uiWidgetColors wcol_num, wcol_numslider, wcol_tab, wcol_curve; uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item, wcol_tooltip; uiWidgetColors wcol_box, wcol_scroll, wcol_progress, wcol_list_item, wcol_pie_menu; diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index b151c293379..6f73994f7ec 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -1860,6 +1860,11 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Box Backdrop Colors", ""); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "wcol_curve", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_ui_text(prop, "Curve Widget Colors", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "wcol_menu", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); RNA_def_property_ui_text(prop, "Menu Widget Colors", "");