From 250384dd57fbf4b776fa95096511eace7dd9a8b9 Mon Sep 17 00:00:00 2001 From: Nika Kutsniashvili Date: Fri, 12 Sep 2025 16:25:56 +0200 Subject: [PATCH] UI: Theme: Scrubbing/Markers shared region Continues and depends on #145609, part of #140360 project. Previously, all 5 animation/video editors had different properties for Scrubbing/Markers region. This PR adds new Region panel for it, so that all editors can share one color. Text color in this region was coming from regular editor text color. To differentiate between editors (as is the pattern already with other editors), and allow more modular themeability of regions, new Text color is added for that region as well. Video in PR Pull Request: https://projects.blender.org/blender/blender/pulls/146113 --- .../datafiles/userdef/userdef_default_theme.c | 15 ++-- .../presets/interface_theme/Blender_Light.xml | 16 ++-- scripts/startup/bl_ui/space_userpref.py | 1 + .../blender/blenkernel/BKE_blender_version.h | 2 +- .../blenloader/intern/versioning_userdef.cc | 9 ++- .../blender/editors/animation/anim_markers.cc | 6 +- .../editors/animation/time_scrub_ui.cc | 4 +- .../blender/editors/include/UI_resources.hh | 1 + source/blender/editors/interface/resources.cc | 9 ++- source/blender/makesdna/DNA_theme_types.h | 14 ++-- .../blender/makesdna/intern/dna_rename_defs.h | 1 - source/blender/makesrna/intern/rna_userdef.cc | 73 ++++++++++--------- 12 files changed, 82 insertions(+), 69 deletions(-) diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index 97b1ff58712..077c587be9a 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -287,17 +287,21 @@ const bTheme U_theme_default = { .text = RGBA(0xb8b8b8ff), .text_selected = RGBA(0xffaf23ff), }, + .scrubbing = { + .back = RGBA(0x161616ff), + .text = RGBA(0xc3c3c3ff), + .time_marker = RGBA(0xffffff4d), + .time_marker_selected = RGBA(0xffffffb3), + }, .sidebars = { .back = RGBA(0x30303000), .tab_back = RGBA(0x18181800), - } + }, }, .common = { .anim = { .playhead = RGBA(0x4772b3ff), .preview_range = RGBA(0xa14d0066), - .time_marker = RGBA(0xffffff4d), - .time_marker_selected = RGBA(0xffffffb3), .channels = RGBA(0x194e8080), .channels_sub = RGBA(0x0f2c4d80), .channel_group = RGBA(0x1a332d37), @@ -448,7 +452,6 @@ const bTheme U_theme_default = { .vertex = RGBA(0x000000ff), .vertex_select = RGBA(0xff8500ff), .vertex_active = RGBA(0xffffffff), - .time_scrub_background = RGBA(0x161616ff), .vertex_size = 6, .outline_width = 1, .facedot_size = 4, @@ -486,7 +489,6 @@ const bTheme U_theme_default = { .header_text_hi = RGBA(0xffffffff), .shade1 = RGBA(0xc0c0c000), .grid = RGBA(0x161616ff), - .time_scrub_background = RGBA(0x1d1d1dff), .ds_ipoline = RGBA(0x94e575cc), .keyborder = RGBA(0x000000ff), .keyborder_select = RGBA(0x000000ff), @@ -509,7 +511,6 @@ const bTheme U_theme_default = { .grid = RGBA(0x2a2a2aff), .strip = RGBA(0x0d0d0d80), .strip_select = RGBA(0xff8c00ff), - .time_scrub_background = RGBA(0x161616ff), .keyborder = RGBA(0x000000ff), .keyborder_select = RGBA(0x000000ff), .vertex_size = 3, @@ -540,7 +541,6 @@ const bTheme U_theme_default = { .bone_pose = RGBA(0x50c8ff50), .before_current_frame = RGBA(0xf22e23ff), .after_current_frame = RGBA(0x78f244ff), - .time_scrub_background = RGBA(0x121212ff), .keyborder = RGBA(0x000000ff), .keyborder_select = RGBA(0x000000ff), .vertex_size = 3, @@ -728,7 +728,6 @@ const bTheme U_theme_default = { .header_text = RGBA(0xeeeeeeff), .header_text_hi = RGBA(0xffffffff), .grid = RGBA(0x181818ff), - .time_scrub_background = RGBA(0x181818ff), .vertex_size = 3, .outline_width = 1, .facedot_size = 4, diff --git a/scripts/presets/interface_theme/Blender_Light.xml b/scripts/presets/interface_theme/Blender_Light.xml index fd11ed05a57..3f09efcb613 100644 --- a/scripts/presets/interface_theme/Blender_Light.xml +++ b/scripts/presets/interface_theme/Blender_Light.xml @@ -400,6 +400,15 @@ > + + + + diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 292d6e1256d..8e670a4472b 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -985,6 +985,7 @@ class USERPREF_MT_interface_theme_presets(Menu): "ThemeRegions", "ThemeRegionsAssetShelf", "ThemeRegionsChannels", + "ThemeRegionsScrubbing", "ThemeRegionsSidebars", "ThemeSequenceEditor", "ThemeSpaceGeneric", diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 7a8f17aa9f0..6b13f9efbab 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 79 +#define BLENDER_FILE_SUBVERSION 80 /* 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 fa005614d55..05a67191fd7 100644 --- a/source/blender/blenloader/intern/versioning_userdef.cc +++ b/source/blender/blenloader/intern/versioning_userdef.cc @@ -302,8 +302,6 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme) if (!USER_VERSION_ATLEAST(500, 56)) { FROM_DEFAULT_V4_UCHAR(common.anim.playhead); - FROM_DEFAULT_V4_UCHAR(common.anim.time_marker); - FROM_DEFAULT_V4_UCHAR(common.anim.time_marker_selected); FROM_DEFAULT_V4_UCHAR(common.anim.channel_group); FROM_DEFAULT_V4_UCHAR(common.anim.channel_group_active); } @@ -362,6 +360,13 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme) FROM_DEFAULT_V4_UCHAR(common.anim.channel_selected); } + if (!USER_VERSION_ATLEAST(500, 80)) { + FROM_DEFAULT_V4_UCHAR(regions.scrubbing.back); + FROM_DEFAULT_V4_UCHAR(regions.scrubbing.text); + FROM_DEFAULT_V4_UCHAR(regions.scrubbing.time_marker); + FROM_DEFAULT_V4_UCHAR(regions.scrubbing.time_marker_selected); + } + /** * 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/animation/anim_markers.cc b/source/blender/editors/animation/anim_markers.cc index 1f70dcfe84e..412f2fd05e0 100644 --- a/source/blender/editors/animation/anim_markers.cc +++ b/source/blender/editors/animation/anim_markers.cc @@ -401,11 +401,11 @@ void debug_markers_print_list(ListBase *markers) static void marker_color_get(const TimeMarker *marker, uchar *r_text_color, uchar *r_line_color) { if (marker->flag & SELECT) { - UI_GetThemeColor4ubv(TH_TEXT_HI, r_text_color); + UI_GetThemeColor4ubv(TH_TIME_MARKER_LINE_SELECTED, r_text_color); UI_GetThemeColor4ubv(TH_TIME_MARKER_LINE_SELECTED, r_line_color); } else { - UI_GetThemeColor4ubv(TH_TEXT, r_text_color); + UI_GetThemeColor4ubv(TH_TIME_MARKER_LINE, r_text_color); UI_GetThemeColor4ubv(TH_TIME_MARKER_LINE, r_line_color); } } @@ -502,7 +502,7 @@ static void draw_marker(const uiFontStyle *fstyle, UI_GetThemeColor4ubv(TH_TIME_MARKER_LINE_SELECTED, marker_color); } else { - UI_GetThemeColor4ubv(TH_TEXT, marker_color); + UI_GetThemeColor4ubv(TH_TIME_MARKER_LINE, marker_color); } UI_icon_draw_ex(xpos - (0.5f * UI_ICON_SIZE) - (0.5f * U.pixelsize), diff --git a/source/blender/editors/animation/time_scrub_ui.cc b/source/blender/editors/animation/time_scrub_ui.cc index f5831fceeb8..be12cff9da2 100644 --- a/source/blender/editors/animation/time_scrub_ui.cc +++ b/source/blender/editors/animation/time_scrub_ui.cc @@ -211,11 +211,11 @@ void ED_time_scrub_draw(const ARegion *region, numbers_rect.ymin = get_centered_text_y(&scrub_region_rect) - 4 * UI_SCALE_FAC; if (discrete_frames) { UI_view2d_draw_scale_x__discrete_frames_or_seconds( - region, v2d, &numbers_rect, scene, display_seconds, TH_TEXT); + region, v2d, &numbers_rect, scene, display_seconds, TH_TIME_SCRUB_TEXT); } else { UI_view2d_draw_scale_x__frames_or_seconds( - region, v2d, &numbers_rect, scene, display_seconds, TH_TEXT); + region, v2d, &numbers_rect, scene, display_seconds, TH_TIME_SCRUB_TEXT); } GPU_matrix_pop_projection(); diff --git a/source/blender/editors/include/UI_resources.hh b/source/blender/editors/include/UI_resources.hh index 9d8b9205807..76486d4a40c 100644 --- a/source/blender/editors/include/UI_resources.hh +++ b/source/blender/editors/include/UI_resources.hh @@ -118,6 +118,7 @@ enum ThemeColorID { TH_FRAME_BEFORE, TH_FRAME_AFTER, TH_TIME_SCRUB_BACKGROUND, + TH_TIME_SCRUB_TEXT, TH_TIME_MARKER_LINE, TH_TIME_MARKER_LINE_SELECTED, TH_TIME_GP_KEYFRAME, diff --git a/source/blender/editors/interface/resources.cc b/source/blender/editors/interface/resources.cc index 190d83caa70..c3832d806b2 100644 --- a/source/blender/editors/interface/resources.cc +++ b/source/blender/editors/interface/resources.cc @@ -323,13 +323,16 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) cp = ts->grid; break; case TH_TIME_SCRUB_BACKGROUND: - cp = ts->time_scrub_background; + cp = btheme->regions.scrubbing.back; + break; + case TH_TIME_SCRUB_TEXT: + cp = btheme->regions.scrubbing.text; break; case TH_TIME_MARKER_LINE: - cp = btheme->common.anim.time_marker; + cp = btheme->regions.scrubbing.time_marker; break; case TH_TIME_MARKER_LINE_SELECTED: - cp = btheme->common.anim.time_marker_selected; + cp = btheme->regions.scrubbing.time_marker_selected; break; case TH_VIEW_OVERLAY: cp = ts->view_overlay; diff --git a/source/blender/makesdna/DNA_theme_types.h b/source/blender/makesdna/DNA_theme_types.h index cb593d99616..5a919253438 100644 --- a/source/blender/makesdna/DNA_theme_types.h +++ b/source/blender/makesdna/DNA_theme_types.h @@ -118,6 +118,12 @@ typedef struct ThemeRegionsChannels { char _pad0[4]; } ThemeRegionsChannels; +typedef struct ThemeRegionsScrubbing { + unsigned char back[4]; + unsigned char text[4]; + unsigned char time_marker[4], time_marker_selected[4]; +} ThemeRegionsScrubbing; + typedef struct ThemeRegionsSidebars { unsigned char back[4]; unsigned char tab_back[4]; @@ -126,6 +132,7 @@ typedef struct ThemeRegionsSidebars { typedef struct ThemeRegions { ThemeRegionsAssetShelf asset_shelf; ThemeRegionsChannels channels; + ThemeRegionsScrubbing scrubbing; ThemeRegionsSidebars sidebars; } ThemeRegions; @@ -133,8 +140,6 @@ typedef struct ThemeCommonAnim { unsigned char playhead[4]; unsigned char preview_range[4]; - unsigned char time_marker[4], time_marker_selected[4]; - unsigned char channels[4], channels_sub[4]; unsigned char channel_group[4], channel_group_active[4]; unsigned char channel[4], channel_selected[4]; @@ -301,8 +306,6 @@ typedef struct ThemeSpace { char _pad2[4]; /* button/tool regions */ - unsigned char _pad3[4]; - unsigned char shade1[4]; unsigned char shade2[4]; @@ -332,7 +335,6 @@ typedef struct ThemeSpace { unsigned char before_current_frame[4], after_current_frame[4]; unsigned char time_gp_keyframe[4]; unsigned char freestyle_edge_mark[4], freestyle_face_mark[4]; - unsigned char time_scrub_background[4]; unsigned char nurb_uline[4], nurb_vline[4]; unsigned char act_spline[4], nurb_sel_uline[4], nurb_sel_vline[4]; @@ -380,7 +382,7 @@ typedef struct ThemeSpace { float keyframe_scale_fac; unsigned char editmesh_active[4]; - char _pad6[1]; + char _pad3[1]; unsigned char clipping_border_3d[4]; diff --git a/source/blender/makesdna/intern/dna_rename_defs.h b/source/blender/makesdna/intern/dna_rename_defs.h index 0e2cc73b2fb..36adba13c3d 100644 --- a/source/blender/makesdna/intern/dna_rename_defs.h +++ b/source/blender/makesdna/intern/dna_rename_defs.h @@ -230,7 +230,6 @@ DNA_STRUCT_RENAME_MEMBER(SurfaceDeformModifierData, numverts, bind_verts_num) DNA_STRUCT_RENAME_MEMBER(Text, name, filepath) DNA_STRUCT_RENAME_MEMBER(TextVars, align_y, align_y_legacy) DNA_STRUCT_RENAME_MEMBER(TextVars, text, text_legacy) -DNA_STRUCT_RENAME_MEMBER(ThemeSpace, scrubbing_background, time_scrub_background) DNA_STRUCT_RENAME_MEMBER(ThemeSpace, show_back_grad, background_type) DNA_STRUCT_RENAME_MEMBER(UVProjectModifierData, num_projectors, projectors_num) DNA_STRUCT_RENAME_MEMBER(UnifiedPaintSettings, unprojected_radius, unprojected_size) diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index a3d7cb1640e..64b77a6e7ca 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -2195,6 +2195,37 @@ static void rna_def_userdef_theme_regions_channels(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); } +/* Scrubbing / Markers region */ +static void rna_def_userdef_theme_regions_scrubbing(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "ThemeRegionsScrubbing", nullptr); + RNA_def_struct_ui_text(srna, "Scrubbing & Markers Region Settings", ""); + + prop = RNA_def_property(srna, "back", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Background", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + + prop = RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Timestamp", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + + /* Marker properties */ + prop = RNA_def_property(srna, "time_marker", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Marker", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + + prop = RNA_def_property(srna, "time_marker_selected", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Marker Selected", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); +} + /* Sidebar & Toolbar region */ static void rna_def_userdef_theme_regions_sidebars(BlenderRNA *brna) { @@ -2222,6 +2253,7 @@ static void rna_def_userdef_theme_regions(BlenderRNA *brna) rna_def_userdef_theme_regions_channels(brna); rna_def_userdef_theme_regions_asset_shelf(brna); + rna_def_userdef_theme_regions_scrubbing(brna); rna_def_userdef_theme_regions_sidebars(brna); srna = RNA_def_struct(brna, "ThemeRegions", nullptr); @@ -2239,6 +2271,11 @@ static void rna_def_userdef_theme_regions(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Channels", ""); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "scrubbing", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_ui_text(prop, "Scrubbing / Markers", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "sidebars", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); RNA_def_property_ui_text(prop, "Toolbar / Sidebar", ""); @@ -2266,17 +2303,6 @@ static void rna_def_userdef_theme_common_anim(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Preview Range", "Color of preview range overlay"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - /* Marker properties */ - prop = RNA_def_property(srna, "time_marker", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Marker Line", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - - prop = RNA_def_property(srna, "time_marker_selected", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Marker Line Selected", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - /* Channel properties */ prop = RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_array(prop, 4); @@ -3042,11 +3068,6 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Grid", ""); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - prop = RNA_def_property(srna, "time_scrub_background", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Scrubbing/Markers Region", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - rna_def_userdef_theme_spaces_vertex(srna, true, false); } @@ -3762,11 +3783,6 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Selected Strips", ""); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - prop = RNA_def_property(srna, "time_scrub_background", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Scrubbing/Markers Region", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - prop = RNA_def_property(srna, "keyframe_border", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, nullptr, "keyborder"); RNA_def_property_array(prop, 4); @@ -3833,11 +3849,6 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Grid", ""); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - prop = RNA_def_property(srna, "time_scrub_background", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Scrubbing/Markers Region", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - prop = RNA_def_property(srna, "keyframe_border", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, nullptr, "keyborder"); RNA_def_property_array(prop, 4); @@ -3987,11 +3998,6 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna) RNA_def_property_array(prop, 4); RNA_def_property_ui_text(prop, "Keyframe Border Selected", "Color of selected keyframe border"); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - - prop = RNA_def_property(srna, "time_scrub_background", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Scrubbing/Markers Region", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); } static void rna_def_userdef_theme_colorset(BlenderRNA *brna) @@ -4140,11 +4146,6 @@ static void rna_def_userdef_theme_space_clip(BlenderRNA *brna) prop, "Path Keyframe After", "Color of keyframes on a path after current frame"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop = RNA_def_property(srna, "time_scrub_background", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Scrubbing/Markers Region", ""); - RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); - prop = RNA_def_property(srna, "metadatabg", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_float_sdna(prop, nullptr, "metadatabg"); RNA_def_property_array(prop, 3);