From 28e5c1412ec4ff3866e6cf4dbd32014a0b573e16 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 26 Sep 2024 21:55:26 +0200 Subject: [PATCH] UI: Editor Edge Highlighting Customizable highlighting of editor edges that can be used to help differentiate between areas, indicate active area, and/or help users with visual impairment. Can be completely removed as well. This replaces the active area header highlighting, which doesn't work for transparent headers. Pull Request: https://projects.blender.org/blender/blender/pulls/116684 --- .../datafiles/userdef/userdef_default_theme.c | 4 +- scripts/startup/bl_ui/space_userpref.py | 2 + .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_userdef.cc | 6 ++ .../blender/editors/include/UI_resources.hh | 3 +- source/blender/editors/interface/resources.cc | 18 ++---- source/blender/editors/screen/area.cc | 19 ++---- source/blender/editors/screen/screen_draw.cc | 62 ++++++++++++++++++- source/blender/makesdna/DNA_userdef_types.h | 2 + source/blender/makesrna/intern/rna_userdef.cc | 17 ++++- 10 files changed, 102 insertions(+), 33 deletions(-) diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index 0eddaed132a..db7777ab0bc 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -221,7 +221,9 @@ const bTheme U_theme_default = { .widget_emboss = RGBA(0x00000026), .menu_shadow_fac = 0.4f, .menu_shadow_width = 2, - .editor_outline = RGBA(0x161616ff), + .editor_border = RGBA(0x161616ff), + .editor_outline = RGBA(0xffffff15), + .editor_outline_active = RGBA(0xffffff2a), .transparent_checker_primary = RGBA(0x333333ff), .transparent_checker_secondary = RGBA(0x262626ff), .transparent_checker_size = 8, diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 679f07ca5df..858b53067ec 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -1166,7 +1166,9 @@ class USERPREF_PT_theme_interface_styles(ThemePanel, CenterAlignMixIn, Panel): col = flow.column() col.prop(ui, "widget_text_cursor") + col.prop(ui, "editor_border") col.prop(ui, "editor_outline") + col.prop(ui, "editor_outline_active") col.prop(ui, "widget_emboss") col.prop(ui, "panel_roundness") diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index ee5083dd751..755d8a57273 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -31,7 +31,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 26 +#define BLENDER_FILE_SUBVERSION 27 /* 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 944f3d50dd7..9da16394428 100644 --- a/source/blender/blenloader/intern/versioning_userdef.cc +++ b/source/blender/blenloader/intern/versioning_userdef.cc @@ -198,6 +198,12 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme) FROM_DEFAULT_V4_UCHAR(space_node.node_zone_foreach_geometry_element); } + if (!USER_VERSION_ATLEAST(403, 27)) { + FROM_DEFAULT_V4_UCHAR(tui.editor_border); + FROM_DEFAULT_V4_UCHAR(tui.editor_outline); + FROM_DEFAULT_V4_UCHAR(tui.editor_outline_active); + } + /** * 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/include/UI_resources.hh b/source/blender/editors/include/UI_resources.hh index c6eaafe1fa7..b87fdb95008 100644 --- a/source/blender/editors/include/UI_resources.hh +++ b/source/blender/editors/include/UI_resources.hh @@ -57,7 +57,6 @@ enum ThemeColorID { TH_TAB_OUTLINE, TH_HEADER, - TH_HEADER_ACTIVE, TH_HEADER_TEXT, TH_HEADER_TEXT_HI, @@ -319,6 +318,8 @@ enum ThemeColorID { TH_WIDGET_TEXT_SELECTION, TH_WIDGET_TEXT_HIGHLIGHT, TH_EDITOR_OUTLINE, + TH_EDITOR_OUTLINE_ACTIVE, + TH_EDITOR_BORDER, TH_TRANSPARENT_CHECKER_PRIMARY, TH_TRANSPARENT_CHECKER_SECONDARY, diff --git a/source/blender/editors/interface/resources.cc b/source/blender/editors/interface/resources.cc index 98e25fc1e3a..fa82e9b6293 100644 --- a/source/blender/editors/interface/resources.cc +++ b/source/blender/editors/interface/resources.cc @@ -63,7 +63,6 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) ThemeSpace *ts = nullptr; static uchar error[4] = {240, 0, 240, 255}; static uchar alert[4] = {240, 60, 60, 255}; - static uchar header_active[4] = {0, 0, 0, 255}; static uchar back[4] = {0, 0, 0, 255}; static uchar setting = 0; const uchar *cp = error; @@ -246,17 +245,6 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) cp = ts->header; break; - case TH_HEADER_ACTIVE: { - cp = ts->header; - const int factor = 5; - /* Lighten the header color when editor is active. */ - header_active[0] = cp[0] > 245 ? cp[0] - factor : cp[0] + factor; - header_active[1] = cp[1] > 245 ? cp[1] - factor : cp[1] + factor; - header_active[2] = cp[2] > 245 ? cp[2] - factor : cp[2] + factor; - header_active[3] = cp[3]; - cp = header_active; - break; - } case TH_HEADER_TEXT: cp = ts->header_text; break; @@ -943,9 +931,15 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) cp = btheme->tui.widget_emboss; break; + case TH_EDITOR_BORDER: + cp = btheme->tui.editor_border; + break; case TH_EDITOR_OUTLINE: cp = btheme->tui.editor_outline; break; + case TH_EDITOR_OUTLINE_ACTIVE: + cp = btheme->tui.editor_outline_active; + break; case TH_WIDGET_TEXT_CURSOR: cp = btheme->tui.widget_text_cursor; break; diff --git a/source/blender/editors/screen/area.cc b/source/blender/editors/screen/area.cc index f41227cf616..bc047e2a62f 100644 --- a/source/blender/editors/screen/area.cc +++ b/source/blender/editors/screen/area.cc @@ -79,7 +79,7 @@ static void region_draw_emboss(const ARegion *region, const rcti *scirct, int si GPU_blend(GPU_BLEND_ALPHA); float color[4] = {0.0f, 0.0f, 0.0f, 0.25f}; - UI_GetThemeColor3fv(TH_EDITOR_OUTLINE, color); + UI_GetThemeColor3fv(TH_EDITOR_BORDER, color); GPUVertFormat *format = immVertexFormat(); uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); @@ -342,7 +342,7 @@ static void region_draw_azones(ScrArea *area, ARegion *region) static void region_draw_status_text(ScrArea * /*area*/, ARegion *region) { float header_color[4]; - UI_GetThemeColor4fv(TH_HEADER_ACTIVE, header_color); + UI_GetThemeColor4fv(TH_HEADER, header_color); /* Clear the region from the buffer. */ GPU_clear_color(0.0f, 0.0f, 0.0f, 0.0f); @@ -517,7 +517,7 @@ void ED_region_do_draw(bContext *C, ARegion *region) UI_SetTheme(area ? area->spacetype : 0, at->regionid); if (area && area_is_pseudo_minimized(area)) { - UI_ThemeClearColor(TH_EDITOR_OUTLINE); + UI_ThemeClearColor(TH_EDITOR_BORDER); return; } /* optional header info instead? */ @@ -572,7 +572,7 @@ void ED_region_do_draw(bContext *C, ARegion *region) /* draw separating lines between the quad views */ float color[4] = {0.0f, 0.0f, 0.0f, 0.8f}; - UI_GetThemeColor3fv(TH_EDITOR_OUTLINE, color); + UI_GetThemeColor3fv(TH_EDITOR_BORDER, color); GPUVertFormat *format = immVertexFormat(); uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); @@ -2943,19 +2943,12 @@ int ED_area_header_switchbutton(const bContext *C, uiBlock *block, int yco) /************************ standard UI regions ************************/ -static ThemeColorID region_background_color_id(const bContext *C, const ARegion *region) +static ThemeColorID region_background_color_id(const bContext * /*C*/, const ARegion *region) { - ScrArea *area = CTX_wm_area(C); - switch (region->regiontype) { case RGN_TYPE_HEADER: case RGN_TYPE_TOOL_HEADER: - if (ED_screen_area_active(C) && !ED_area_is_global(area)) { - return TH_HEADER_ACTIVE; - } - else { - return TH_HEADER; - } + return TH_HEADER; case RGN_TYPE_PREVIEW: return TH_PREVIEW_BACK; default: diff --git a/source/blender/editors/screen/screen_draw.cc b/source/blender/editors/screen/screen_draw.cc index 72fa6cc5bec..12dc4213b33 100644 --- a/source/blender/editors/screen/screen_draw.cc +++ b/source/blender/editors/screen/screen_draw.cc @@ -7,12 +7,16 @@ */ #include "ED_screen.hh" +#include "ED_screen_types.hh" #include "GPU_batch_presets.hh" #include "GPU_immediate.hh" #include "GPU_platform.hh" #include "GPU_state.hh" +#include "BKE_global.hh" +#include "BKE_screen.hh" + #include "BLF_api.hh" #include "BLI_listbase.h" @@ -165,6 +169,38 @@ void ED_screen_draw_edges(wmWindow *win) return; } + ARegion *region = screen->active_region; + ScrArea *active_area = nullptr; + + if (region) { + /* Find active area from active region. */ + const int pos[2] = {region->winrct.xmin, region->winrct.ymin}; + active_area = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, pos); + } + + if (!active_area) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + AZone *zone = ED_area_actionzone_find_xy(area, win->eventstate->xy); + /* Get area from action zone, if not scrollbar. */ + if (zone && zone->type != AZONE_REGION_SCROLL) { + active_area = area; + break; + } + } + } + + if (!active_area && G.moving & G_TRANSFORM_WM) { + active_area = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, win->eventstate->xy); + /* We don't want an active area if at a border edge. */ + if (active_area) { + rcti rect = active_area->totrct; + BLI_rcti_pad(&rect, -BORDERPADDING, -BORDERPADDING); + if (!BLI_rcti_isect_pt_v(&rect, win->eventstate->xy)) { + active_area = nullptr; + } + } + } + const blender::int2 win_size = WM_window_native_pixel_size(win); float col[4], corner_scale, edge_thickness; int verts_per_corner = 0; @@ -193,7 +229,7 @@ void ED_screen_draw_edges(wmWindow *win) GPU_scissor_test(true); } - UI_GetThemeColor4fv(TH_EDITOR_OUTLINE, col); + UI_GetThemeColor4fv(TH_EDITOR_BORDER, col); col[3] = 1.0f; corner_scale = U.pixelsize * 8.0f; edge_thickness = corner_scale * 0.21f; @@ -206,8 +242,28 @@ void ED_screen_draw_edges(wmWindow *win) GPU_batch_uniform_1f(batch, "scale", corner_scale); GPU_batch_uniform_4fv(batch, "color", col); + float outline1[4]; + float outline2[4]; + UI_GetThemeColor4fv(TH_EDITOR_OUTLINE, outline1); + UI_GetThemeColor4fv(TH_EDITOR_OUTLINE_ACTIVE, outline2); + UI_draw_roundbox_corner_set(UI_CNR_ALL); + const float offset = UI_SCALE_FAC * 1.34f; + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { drawscredge_area(area, win_size[0], win_size[1], edge_thickness); + + rctf rectf2 = {float(area->totrct.xmin) + offset - 0.5f, + float(area->totrct.xmax) - offset + 1.0f, + float(area->totrct.ymin) + offset - 0.5f, + float(area->totrct.ymax) - offset + 1.0f}; + + UI_draw_roundbox_4fv_ex(&rectf2, + nullptr, + nullptr, + 1.0f, + (area == active_area) ? outline2 : outline1, + U.pixelsize, + 6.0f * U.pixelsize); } GPU_blend(GPU_BLEND_NONE); @@ -369,7 +425,7 @@ void screen_draw_dock_preview( float outline[4] = {1.0f, 1.0f, 1.0f, 0.4f}; float inner[4] = {1.0f, 1.0f, 1.0f, 0.1f}; float border[4]; - UI_GetThemeColor4fv(TH_EDITOR_OUTLINE, border); + UI_GetThemeColor4fv(TH_EDITOR_BORDER, border); UI_draw_roundbox_corner_set(UI_CNR_ALL); float half_line_width = 2.0f * U.pixelsize; @@ -432,7 +488,7 @@ void screen_draw_split_preview(ScrArea *area, const eScreenAxis dir_axis, const float outline[4] = {1.0f, 1.0f, 1.0f, 0.4f}; float inner[4] = {1.0f, 1.0f, 1.0f, 0.10f}; float border[4]; - UI_GetThemeColor4fv(TH_EDITOR_OUTLINE, border); + UI_GetThemeColor4fv(TH_EDITOR_BORDER, border); UI_draw_roundbox_corner_set(UI_CNR_ALL); rctf rect; diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 79cf768b836..7831efd3456 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -165,7 +165,9 @@ typedef struct ThemeUI { float menu_shadow_fac; short menu_shadow_width; + unsigned char editor_border[4]; unsigned char editor_outline[4]; + unsigned char editor_outline_active[4]; /* Transparent Grid */ unsigned char transparent_checker_primary[4], transparent_checker_secondary[4]; diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 4d5c46bc9d4..196cffdb64d 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -1950,11 +1950,24 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) prop, "Widget Emboss", "Color of the 1px shadow line underlying widgets"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "editor_border", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, nullptr, "editor_border"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Editor Border", "Color of the border between editors"); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "editor_outline", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, nullptr, "editor_outline"); - RNA_def_property_array(prop, 3); + RNA_def_property_array(prop, 4); RNA_def_property_ui_text( - prop, "Editor Outline", "Color of the outline of the editors and their round corners"); + prop, "Editor Outline", "Color of the outline of each editor, except the active one"); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + + prop = RNA_def_property(srna, "editor_outline_active", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, nullptr, "editor_outline_active"); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text( + prop, "Active Editor Outline", "Color of the outline of the active editor"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); prop = RNA_def_property(srna, "widget_text_cursor", PROP_FLOAT, PROP_COLOR_GAMMA);