From d91b8d5cff5fd5dd95ee393a7b80717f8ee33bf6 Mon Sep 17 00:00:00 2001 From: markmental Date: Sat, 28 Mar 2026 02:12:06 -0400 Subject: [PATCH] Adds about screen for v 0.1 --- src/app.c | 25 ++++++++++++++++++ src/app.h | 1 + src/app.o | Bin 14248 -> 14744 bytes src/ui.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++- src/ui.h | 5 ++++ src/ui.o | Bin 32688 -> 35888 bytes 6 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/app.c b/src/app.c index bdd1957..bf0127f 100644 --- a/src/app.c +++ b/src/app.c @@ -162,6 +162,17 @@ static void handle_event(App *app, const SDL_Event *event) { return; } + if (app->about_modal_open) { + switch (event->key.keysym.sym) { + case SDLK_ESCAPE: + case SDLK_a: + app->about_modal_open = 0; + return; + default: + return; + } + } + if (app->theme_picker_open) { switch (event->key.keysym.sym) { case SDLK_ESCAPE: @@ -202,9 +213,17 @@ static void handle_event(App *app, const SDL_Event *event) { if (app->mode == MODE_FULLSCREEN) { app->mode = MODE_GUIDE; } + app->about_modal_open = 0; app->theme_picker_open = !app->theme_picker_open; app->theme_picker_selection = app->theme_index; break; + case SDLK_a: + if (app->mode == MODE_FULLSCREEN) { + app->mode = MODE_GUIDE; + } + app->theme_picker_open = 0; + app->about_modal_open = !app->about_modal_open; + break; case SDLK_UP: tune_relative(app, -1); break; @@ -348,6 +367,12 @@ void app_run(App *app) { &GUIDE_THEMES[app->theme_index], app->theme_index, app->theme_picker_selection); + } else if (app->about_modal_open) { + ui_render_about_modal(app->renderer, + &app->fonts, + output_width, + output_height, + &GUIDE_THEMES[app->theme_index]); } } else { if (!in_blackout) { diff --git a/src/app.h b/src/app.h index b057ac9..7ad2d10 100644 --- a/src/app.h +++ b/src/app.h @@ -20,6 +20,7 @@ typedef struct App { int theme_index; int theme_picker_open; int theme_picker_selection; + int about_modal_open; int startup_handoff_active; int last_blackout_state; Uint32 startup_handoff_until; diff --git a/src/app.o b/src/app.o index 83a38e8c80642aa02bb1bd845d3164a2c709884d..be656684d39c3a76f530da293378a0ad12316cc8 100644 GIT binary patch delta 3425 zcmZ`*drVu`8Nc`PunpMP5QI;$vm`YR0 zQ0yq)4GrDtA9PKmRNXYxN^2@>EnTz@NEV>2+LTs-Ze4`dm0^+*LKZ?ule6y}U$diW zJ<>hr+~4>7edoK!9y&PKF<=oI3f{}^Qykxd=UDI-15y{q`atE$tq5F@ z-A({}@xZCv{}0i(3>%MJ*XRi}JIe``9|O>L#KeofSpiwqR(=@mQKxx#MRVMLNpJ&D zR*1}nUb~C2nC=809l7QHl}<;=E{=1GzGSGBc%qOvgSsU5t?us>`&PB0zZnc{wA zI_}P;E_MMj01BedOpV?Ilo%a_VnRNE^{qan5&hYq=aHLDwh@x~Ya;=-DUr$K!`!WdJU{+r+gTBf@H zEfaJ-RhIhQ4b}3V8oACW1w3Z8)a>3W_0xu{?ngzSCZF{V(oCz(o233|rw3ZuD9Igq zX>>ML;wR*)O|IRz)2w#YJw^%zTZ^mKRbQhdhlGP33z5ZK4*M1|8^ma&3J|wtb`wwkbFbX{_JF<13pK z>F@rJlt<5Kwm4|Jc>;6cn-H9a3l!P|7LXnRLOWq^TcIq-#jyYs(8cKcGeZx6;9TUw ziChP+J505MjS1(Y#6+VRFD|d(>DhVwr;oovnR;vd{NhcFr#Xz5hf$rrTh!}Q@ci80 z@bs4x_}m}QpilH!;>C*>@$m34URYSbQ&Usu4(KI;ucaHe@ZaYb@#iz&qK-ss{M;g( z@TcHw;dS&@Vz)SZYYkUgJMd33_G3#*1xib@#!oC>#~i+mPvSeMDydt{hc~@ZkG08K z9H);%=aRC-R$Pf|XG-xY?87hqs}-oSr;+l!j-12^A};J>`W;p-FK2;J8$LR|cS zz7QJ|at8O5hq<7ZX?TuR4y^;EDpC5ulw1BW(5P7a1c1=GXm=Z1^}?YwTD-=SOL z+hBF+W_jVmI9-uTm+R75%5=o19M*!?Zdl6+5{K3d8zJH*2>K*SHRd3vF&at6Lqd-#_y^cUZpyx>HK>-U!e0eov+aOE}3Iu zqd88GY{ul^<0fqs3T7sw{h7{;ru_%II`_35JkazU*Y)(i!!7LxS`P2)e5$3bW#6Hv zo1bktj4osz4>p*G)w~uZS`DcW#fD>pKQ0>{I72!rkqe}cDpL5B;L;gs6M7z`&oQ>- znu*vRMQ?)iZAMzkNWVc}fD|)QCnGID{5C^s2{~36B஺yQ*8%TQ?DY@4o(qpJ; zo1p?R(kwk>H8M+KV>l7@CF{X(c25kin}Me2&3) zFgPCvFEB`*Nns*U%F%l{2JfLCkRDfXlH0?K)tMjA=i@;M2GOsCClcj(1^?gZuY~a= zYVZhSkdMB|HF%#?x|g`iW2Bu7UcunK4DMj?V+u~fn;HBBgKuW=*TeV|G_402!Ec!W zY}b6o;5Cf?G=sx`y7hW|N9pnOM=xA0__MSw)iQV;gQqcgJ%d{q{80wCGWc!=&ky6V zl-^^g&6dfJpjT~%iXQT#2!kwefpBfgyOR_SMg%{i;8cmhk16;Fx^6Qh_K;&^q(jJ- zXUKRzVyk?f5ualb+gMbaw>Pm-c_op_GZGxlQ}KdJi$2aT)EKuA#~fFKG(tQEJ}_HJ@xRVN!T#qq;s3u+MJwkTG! z&9({URvmu*V@482G_piZgeI8yD+R%c_-iRhqh?}D4_r138V*Doe-o4M~ z`|Ew*_uY;6Pi`M`!w#?IU~QOppU>y0XptZ0w5s`$BeMt`Nt=GtUYk;69yu+3X-a8K ze#!6Ui+lv|Tn-V)pM1)s3Wch^N^Xgzr0COTIFT>&V=$Y4-Ozxp%C063)um{!z;R8S ziQ@*(4L>C>;|5Rb;acSDV}=y%BILas=a-@hRFR(h9D&H(bpyqbxd#UdBXdQAle$tL zSE{F!T9PTIbAimU)Zj~feKnFZN>-fY^mBdErBhN>r@UE$hs~8X#rLaJTtvuN3SKf- zR46`@=NSY-@qcg+SwB*A3O+Y?3xDN7O~KMTRDD$5OLX+8Jd86g$8pm1PWcIH5sDjh z))imifxyOCYM@BfH~3p(-$*fU9zcOwr|KPzt?>_AVyC3&aWrm;eJ4e)U^P@-*{sHU z8fnFJ1R`MrPM_pdIS$VS6}a>O zYLjh8=K7?llNRqq#7Xf!!Qx5L9$HGP6kCm&dcVt)id~joNW~Rb+DC0OrPISSrI=xt zqSM3yO=&wCleA+^28dQ?Z;e5sVfdys^t8^RW>Xh^U5d`qpI*uFnbZ6kHZXtPZ$KBJq#13ExR1YOyc426$to3wMYYC+*q;F_fbs)P_X?k&W zNVaH+2uV^)*q&Fh>&rF0zgSBw+N~vMZ)%CgX}xWU-ccS{XAH=eKu2H=&hGX==X$bF z8bR-`)gs6Iczn@eEH(`o`N=}~Q2cu>f&McQTI18ix87DCO5}ZUuRau#tFb(8>gE3X z(h6E*IkE?@xbPMgOerqhITnpvG4d8y>eFBRdG*YWlh^;88J~90QV*kgrn@iVnk|Iq zGO5APlFXjts%*)YEK>+trK_d+pK7EpT??S;w`=5M(MXeWzt0!rojx%bpu55?D0+t* zoBI@PZg+Yys?k=xz%9k}Zdd%$Gw=Lm7=gC(1rE4)=iBanpmNym*0MCC>7X;v5vu^TK-zL|;Ix z4T$cb=n9JEL9sX}S^|ZpIssKwR1J!A_zVlGxJw9#V?t0I$9Y0%NAq^n*@8NE;~c=X zNrO>GMSeL3?1DEOx59bH4q?okTvKr_&r0(^<}=uTy*=6P+{*KI*zdCQwRH5;aXlFw z+wqbt#Q%fKhWaQYnTZQio!xZYN5?nmc!Z8$(eVd5&XO@{xk)rZO=Y8PU~BKT-c36m z>UpI1F(|2YK%!F5BTkcLx4doPt6;ju?$|^Mg+d6@8u)Rb@-XnX+8u*g7QcL)lVL}| zgX}0{OFj%a+gD)=vL7>SGs9kiJ;*u>5JDkw{rKc;*TNBGyBRjfu)E+FWM5%em0@3p z8*A;YZ!v5Y!U(up*@8Np%Bk^;gj=x zkilCSe1^eU{j&`2W%R$x;-o`l2LCaG-_H@^MuzyEaa76RQnu|$qU@2^F!();z8Ch? z+4&Zj#!YTvbnst$b(7l|9RJZ*@i2pTF!(M8?_}@c!zhhY82k_WO&5|ccxP-JWknf&(()kGAhXNS z%<@n}vyc+u*M{Z=9R7odjG1Ajw?TNq1CM!|^T)~%f|Bb?;UllxIzd(_E|_+dg3Tuj zsj_Pke6lr_RoDSLeO_T}9USsC!>rfByJ6nvUC`yC=G?pqR^HZN{fJyWl)cnlsKNFx DPukVd diff --git a/src/ui.c b/src/ui.c index f368dff..a437294 100644 --- a/src/ui.c +++ b/src/ui.c @@ -538,7 +538,7 @@ static void draw_footer_legend(SDL_Renderer *renderer, draw_pill_button(renderer, theme, &chip, theme->panel_fill, theme->panel_border); draw_text_clipped(renderer, fonts->medium, "A", &footer, chip.x + 11, chip.y + 1, footer_text); - draw_text_clipped(renderer, fonts->small, "TIME", &footer, chip.x + 42, chip.y - 1, footer_text); + draw_text_clipped(renderer, fonts->small, "ABOUT", &footer, chip.x + 42, chip.y - 1, footer_text); chip.x += 144; draw_pill_button(renderer, theme, &chip, theme->block_mid, theme->panel_border); @@ -558,6 +558,79 @@ static void draw_scanline_overlay(SDL_Renderer *renderer, int width, int height, (void) theme; } +void ui_render_about_modal(SDL_Renderer *renderer, + const UiFonts *fonts, + int window_width, + int window_height, + const GuideTheme *active_theme) { + SDL_Rect overlay = {0, 0, window_width, window_height}; + SDL_Rect modal = {window_width / 2 - 280, window_height / 2 - 160, 560, 320}; + SDL_Rect title_bar = {modal.x, modal.y, modal.w, 40}; + SDL_Rect body = {modal.x + 18, modal.y + 56, modal.w - 36, modal.h - 88}; + SDL_Color body_bg = blend_color(active_theme->footer_mid, active_theme->panel_fill, 70); + SDL_Color title_text = readable_text_color(active_theme->ribbon_mid); + SDL_Color body_text = readable_text_color(body_bg); + SDL_Color sub_text = ensure_contrast(active_theme->row_subtext, body_bg); + + fill_rect_alpha(renderer, &overlay, (SDL_Color){0, 0, 0, 120}); + draw_panel_shadow(renderer, &modal); + draw_rounded_top_panel(renderer, + &modal, + body_bg, + active_theme->panel_border, + active_theme->rounded_radius > 0 ? active_theme->rounded_radius : 8); + fill_rect(renderer, &(SDL_Rect){modal.x, modal.y + 40, modal.w, modal.h - 40}, body_bg); + draw_beveled_bar(renderer, + &title_bar, + active_theme->ribbon_top, + active_theme->ribbon_mid, + active_theme->ribbon_bottom, + color_with_alpha(active_theme->gloss, 32), + active_theme->panel_border); + draw_text_shadowed(renderer, fonts->medium, "ABOUT", &modal, modal.x + 16, modal.y + 10, title_text, color_with_alpha(COLOR_BLACK, 255)); + draw_text_shadowed(renderer, fonts->large, "FreePassport-C 0.1", &body, body.x, body.y, body_text, color_with_alpha(COLOR_BLACK, 255)); + draw_text_shadowed(renderer, + fonts->small, + "by markmental (Mark Robillard Jr)", + &body, + body.x, + body.y + 42, + sub_text, + color_with_alpha(COLOR_BLACK, 255)); + draw_text_shadowed(renderer, + fonts->small, + "Your media library turned into", + &body, + body.x, + body.y + 86, + body_text, + color_with_alpha(COLOR_BLACK, 255)); + draw_text_shadowed(renderer, + fonts->small, + "an early 2000s Passport cable box", + &body, + body.x, + body.y + 112, + body_text, + color_with_alpha(COLOR_BLACK, 255)); + draw_text_shadowed(renderer, + fonts->small, + "inspired virtual TV guide", + &body, + body.x, + body.y + 138, + body_text, + color_with_alpha(COLOR_BLACK, 255)); + draw_text_shadowed(renderer, + fonts->small, + "A CLOSE ESC CLOSE", + &body, + body.x, + modal.y + modal.h - 28, + sub_text, + color_with_alpha(COLOR_BLACK, 255)); +} + void ui_render_no_media(SDL_Renderer *renderer, const UiCache *cache, int window_width, int window_height) { SDL_Rect full = {0, 0, window_width, window_height}; fill_rect(renderer, &full, COLOR_NAVY_DARK); diff --git a/src/ui.h b/src/ui.h index c26f57f..c716f65 100644 --- a/src/ui.h +++ b/src/ui.h @@ -74,6 +74,11 @@ void ui_render_theme_picker(SDL_Renderer *renderer, const GuideTheme *active_theme, int current_theme_index, int selected_theme_index); +void ui_render_about_modal(SDL_Renderer *renderer, + const UiFonts *fonts, + int window_width, + int window_height, + const GuideTheme *active_theme); void ui_render_no_media(SDL_Renderer *renderer, const UiCache *cache, int window_width, int window_height); int ui_load_fonts(UiFonts *fonts); void ui_destroy_fonts(UiFonts *fonts); diff --git a/src/ui.o b/src/ui.o index ca7fc814a21c3e3a6cdc6b7821c63e5464502cee..1fd93d960803f339ad79c18f294cba3eaef6d89f 100644 GIT binary patch delta 11692 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 VTho)*`x2seKB%j2@}u_;_$T>*_lp1k delta 8557 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