From 0608d506846fa2ecb4b9bcb12bbb29daa036a104 Mon Sep 17 00:00:00 2001 From: markmental Date: Sat, 28 Mar 2026 14:09:04 -0400 Subject: [PATCH] Guide UI refinements, more borders --- src/theme.h | 42 ++++++++++++++++++++++++++++++++---------- src/ui.c | 41 +++++++++++++++++++++++------------------ src/ui.o | Bin 39512 -> 39344 bytes 3 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/theme.h b/src/theme.h index 53d6233..0a38c78 100644 --- a/src/theme.h +++ b/src/theme.h @@ -43,6 +43,8 @@ typedef struct GuideTheme { SDL_Color block_active_bottom; SDL_Color block_text; SDL_Color block_active_text; + SDL_Color block_border; + SDL_Color block_active_border; SDL_Color selection_edge; SDL_Color grid_line; SDL_Color row_line_hi; @@ -154,7 +156,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0x2e,0x4a,0x6f,0xff}, .block_active_bottom = {0x1f,0x33,0x4f,0xff}, .block_text = {0xff,0xff,0xff,0xff}, - .block_active_text = {0xff,0xff,0xff,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0xcc,0xd8,0xe8,0xff}, + .block_active_border = {0xe8,0xf0,0xf8,0xff}, .selection_edge = {0x4a,0x90,0xe2,0xff}, .grid_line = {0x5a,0x6a,0x7a,0xaa}, .row_line_hi = {0x7a,0x8a,0x9a,0xff}, @@ -203,7 +207,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0x53,0x34,0x83,0xff}, .block_active_bottom = {0x36,0x1f,0x5f,0xff}, .block_text = {0xea,0xea,0xea,0xff}, - .block_active_text = {0xea,0xea,0xea,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0x4a,0x4a,0x5a,0xff}, + .block_active_border = {0x8a,0x7a,0xa6,0xff}, .selection_edge = {0xe9,0x45,0x60,0xff}, .grid_line = {0x64,0x68,0x7a,0xaa}, .row_line_hi = {0x3b,0x3d,0x55,0xff}, @@ -252,7 +258,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0xff,0x6b,0x00,0xff}, .block_active_bottom = {0xdc,0x26,0x26,0xff}, .block_text = {0xff,0xff,0xff,0xff}, - .block_active_text = {0xff,0xff,0xff,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0x6a,0x9a,0xf8,0xff}, + .block_active_border = {0xff,0xba,0x80,0xff}, .selection_edge = {0xff,0xff,0xff,0xff}, .grid_line = {0x85,0xa0,0xff,0xaa}, .row_line_hi = {0x6a,0x8d,0xff,0xff}, @@ -301,7 +309,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0xff,0x10,0xf0,0xff}, .block_active_bottom = {0xb0,0x00,0xa5,0xff}, .block_text = {0xe0,0xf7,0xfa,0xff}, - .block_active_text = {0x1a,0x10,0x3c,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0xaa,0x4b,0xd6,0xff}, + .block_active_border = {0xff,0x7a,0xf4,0xff}, .selection_edge = {0x00,0xff,0xf9,0xff}, .grid_line = {0x00,0xff,0xf9,0xaa}, .row_line_hi = {0x8f,0x59,0xb6,0xff}, @@ -350,7 +360,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0x33,0xff,0x00,0xff}, .block_active_bottom = {0x15,0x6e,0x15,0xff}, .block_text = {0x33,0xff,0x00,0xff}, - .block_active_text = {0x0c,0x0c,0x0c,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0x4a,0x8a,0x4a,0xff}, + .block_active_border = {0x6a,0xff,0x4a,0xff}, .selection_edge = {0x33,0xff,0x00,0xff}, .grid_line = {0x33,0xff,0x00,0xaa}, .row_line_hi = {0x27,0x55,0x27,0xff}, @@ -399,7 +411,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0xff,0xe6,0x6d,0xff}, .block_active_bottom = {0xd8,0xb8,0x25,0xff}, .block_text = {0xff,0xff,0xff,0xff}, - .block_active_text = {0x20,0x10,0x10,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0x9b,0xe8,0xe0,0xff}, + .block_active_border = {0xff,0xfa,0xa6,0xff}, .selection_edge = {0xff,0xff,0x00,0xff}, .grid_line = {0xff,0xed,0xa1,0xaa}, .row_line_hi = {0xff,0xdb,0xaf,0xff}, @@ -448,7 +462,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0xf4,0xe4,0xc1,0xff}, .block_active_bottom = {0xb8,0xa2,0x74,0xff}, .block_text = {0xff,0xf8,0xdc,0xff}, - .block_active_text = {0x1a,0x05,0x08,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0x8a,0x3a,0x3a,0xff}, + .block_active_border = {0xfa,0xe8,0xc8,0xff}, .selection_edge = {0xff,0xd7,0x00,0xff}, .grid_line = {0xaa,0x72,0x72,0xaa}, .row_line_hi = {0x7d,0x3b,0x3b,0xff}, @@ -497,7 +513,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0x7d,0xd3,0xfc,0xff}, .block_active_bottom = {0x4a,0xae,0xe0,0xff}, .block_text = {0x0c,0x4a,0x6e,0xff}, - .block_active_text = {0x0c,0x4a,0x6e,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0xfc,0xff,0xff,0xff}, + .block_active_border = {0xab,0xe4,0xfb,0xff}, .selection_edge = {0xff,0xff,0xff,0xff}, .grid_line = {0x7d,0xd3,0xfc,0xaa}, .row_line_hi = {0xf0,0xf9,0xff,0xff}, @@ -546,7 +564,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0xde,0xb8,0x87,0xff}, .block_active_bottom = {0xa4,0x74,0x46,0xff}, .block_text = {0xff,0xf8,0xdc,0xff}, - .block_active_text = {0xff,0xf8,0xdc,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0xa0,0x72,0x46,0xff}, + .block_active_border = {0xf0,0xd8,0xa8,0xff}, .selection_edge = {0xda,0x8e,0x00,0xff}, .grid_line = {0xc2,0x98,0x6b,0xaa}, .row_line_hi = {0xc6,0xa1,0x5d,0xff}, @@ -595,7 +615,9 @@ static const GuideTheme GUIDE_THEMES[GUIDE_THEME_COUNT] = { .block_active_mid = {0x00,0xf6,0xed,0xff}, .block_active_bottom = {0x09,0x7b,0x95,0xff}, .block_text = {0xff,0xff,0xff,0xff}, - .block_active_text = {0xff,0xff,0xff,0xff}, + .block_active_text = {0xf5,0xf5,0xf0,0xff}, + .block_border = {0x7b,0x40,0xde,0xff}, + .block_active_border = {0x4a,0xff,0xf0,0xff}, .selection_edge = {0xff,0xf0,0x1f,0xff}, .grid_line = {0x00,0xf6,0xed,0xaa}, .row_line_hi = {0x67,0x2c,0xb2,0xff}, diff --git a/src/ui.c b/src/ui.c index 769ba5e..6def0e9 100644 --- a/src/ui.c +++ b/src/ui.c @@ -244,22 +244,28 @@ static void draw_program_block(SDL_Renderer *renderer, SDL_Color gloss, SDL_Color border, int is_selected, - SDL_Color selection_edge) { + SDL_Color selection_edge, + SDL_Color block_border) { SDL_Rect inner; + SDL_Rect outer_border; - if (!rect || rect->w <= 2 || rect->h <= 2) { + if (!rect || rect->w <= 4 || rect->h <= 4) { return; } draw_beveled_bar(renderer, rect, top, mid, bottom, gloss, border); - stroke_rect(renderer, rect, border); - inner = (SDL_Rect){rect->x + 1, rect->y + 1, rect->w - 2, rect->h - 2}; + outer_border = (SDL_Rect){rect->x + 1, rect->y + 1, rect->w - 2, rect->h - 2}; + if (outer_border.w > 0 && outer_border.h > 0) { + stroke_rect(renderer, &outer_border, block_border); + } + + inner = (SDL_Rect){rect->x + 2, rect->y + 2, rect->w - 4, rect->h - 4}; if (inner.w > 1 && inner.h > 1) { - stroke_rect_alpha(renderer, &inner, color_with_alpha(COLOR_TEXT_LIGHT, is_selected ? 64 : 42)); + stroke_rect_alpha(renderer, &inner, color_with_alpha(COLOR_TEXT_LIGHT, is_selected ? 80 : 50)); fill_rect_alpha(renderer, &(SDL_Rect){inner.x + 1, inner.y + 1, SDL_max(inner.w - 2, 0), 2}, - color_with_alpha(COLOR_TEXT_LIGHT, is_selected ? 34 : 20)); + color_with_alpha(COLOR_TEXT_LIGHT, is_selected ? 45 : 25)); } if (is_selected) { @@ -496,12 +502,12 @@ static void draw_status_bar(SDL_Renderer *renderer, } static void draw_info_panel(SDL_Renderer *renderer, - const UiFonts *fonts, - const GuideTheme *theme, - const Channel *selected_channel, - const SDL_Rect *rect, - time_t app_start_time, - time_t guide_focus_time) { + const UiFonts *fonts, + const GuideTheme *theme, + const Channel *selected_channel, + const SDL_Rect *rect, + time_t app_start_time, + time_t guide_focus_time) { SDL_Rect accent; SDL_Rect clip_rect; char time_range[64]; @@ -519,12 +525,10 @@ static void draw_info_panel(SDL_Renderer *renderer, panel_text = ensure_contrast(theme->panel_text, theme->panel_fill); - draw_panel_shadow(renderer, rect); - draw_rounded_top_panel(renderer, rect, theme->panel_fill, theme->panel_border, theme->rounded_radius > 0 ? theme->rounded_radius : 8); - accent = (SDL_Rect){rect->x + 1, rect->y + 1, rect->w - 2, 38}; - fill_rect(renderer, &accent, theme->panel_fill); - draw_panel_bevel(renderer, rect, theme->gloss); + fill_rect(renderer, rect, theme->panel_fill); stroke_rect(renderer, rect, theme->panel_border); + accent = (SDL_Rect){rect->x + 1, rect->y + 1, rect->w - 2, 36}; + fill_rect(renderer, &accent, blend_color(theme->panel_fill, theme->ribbon_mid, 40)); program = channel_resolve_program_at_elapsed(selected_channel, channel_schedule_elapsed_seconds(app_start_time, guide_focus_time), @@ -1027,7 +1031,8 @@ void ui_render_guide(SDL_Renderer *renderer, theme->gloss, theme->panel_border, is_selected, - theme->selection_edge); + theme->selection_edge, + is_selected ? theme->block_active_border : theme->block_border); if (title_rect.w > 24) { fit_text_with_ellipsis(is_selected ? fonts->medium : fonts->small, diff --git a/src/ui.o b/src/ui.o index b82cf0ab49d89efc0e1c2f14b7bc870d9734456a..304cea0a4264fed77926c7055950d12bf5fd49db 100644 GIT binary patch delta 13373 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 delta 13545 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