From 8531236d62ddb49c39a4d665ec379c77393b9081 Mon Sep 17 00:00:00 2001 From: Shaun Inman Date: Sat, 14 Jan 2023 15:29:02 -0500 Subject: [PATCH] first pass at 12 hour clock mode --- skeleton/.system/res/assets@2x.png | Bin 4594 -> 4712 bytes src/clock/main.c | 150 ++++++++++++++++++----------- src/common/api.c | 52 ++++++++++ src/common/api.h | 3 + src/common/defines.h | 5 +- 5 files changed, 150 insertions(+), 60 deletions(-) diff --git a/skeleton/.system/res/assets@2x.png b/skeleton/.system/res/assets@2x.png index 6132ba5ced7c9a77a94b6756fcc5300796b21176..b3147ef17102f99f4ca51ae70b539697b6b08d2c 100644 GIT binary patch delta 4683 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 K7*-p&#{Lh@Qt)N~ delta 4564 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 diff --git a/src/clock/main.c b/src/clock/main.c index 63909c1..07dbe29 100644 --- a/src/clock/main.c +++ b/src/clock/main.c @@ -13,9 +13,6 @@ int main(int argc , char* argv[]) { SDL_Surface* screen = GFX_init(); - // SDL_Surface* confirm = IMG_Load(RES_PATH "confirm.png"); - // SDL_Surface* digits = IMG_Load(RES_PATH "digits.png"); // 20x32 - // TODO: make use of SCALE1() SDL_Surface* digits = SDL_CreateRGBSurface(SDL_SWSURFACE, 240,32, 16, 0,0,0,0); SDL_FillRect(digits, NULL, RGB_BLACK); @@ -38,16 +35,17 @@ int main(int argc , char* argv[]) { int quit = 0; int save_changes = 0; int select_cursor = 0; + int show_24hour = 0; // TODO: exists(USERDATA_PATH "/show_24hour"); time_t t = time(NULL); struct tm tm = *localtime(&t); - uint32_t day_selected = tm.tm_mday; - uint32_t month_selected = tm.tm_mon + 1; + int32_t day_selected = tm.tm_mday; + int32_t month_selected = tm.tm_mon + 1; uint32_t year_selected = tm.tm_year + 1900; - uint32_t hour_selected = tm.tm_hour; - uint32_t minute_selected = tm.tm_min; - uint32_t seconds_selected = tm.tm_sec; + int32_t hour_selected = tm.tm_hour; + int32_t minute_selected = tm.tm_min; + int32_t seconds_selected = tm.tm_sec; #define kSlash 10 #define kColon 11 @@ -57,11 +55,7 @@ int main(int argc , char* argv[]) { return x + 20; } void blitBar(int x, int y, int len) { - // TODO: create an ASSET_UNDERLINE that is 2.5 (x2 = 5) for - - GFX_blitPill(ASSET_DOT, screen, &(SDL_Rect){ x,y,len * 20}); - - // GFX_blitAsset(ASSET_BAR, NULL, screen, &(SDL_Rect){ x + (len * 20 - SCALE1(4))/2, y }); + GFX_blitPill(ASSET_UNDERLINE, screen, &(SDL_Rect){ x,y,len * 20}); } int blitNumber(int num, int x, int y) { int n; @@ -89,9 +83,9 @@ int main(int argc , char* argv[]) { if ( ((year_selected % 4 == 0) && (year_selected % 100 != 0)) || (year_selected % 400 == 0)) february_days = 29; // day - if (day_selected < 1) day_selected = 1; - if (month_selected > 12) month_selected = 12; - else if (month_selected < 1) month_selected = 1; + // if (day_selected < 1) day_selected = 1; + if (month_selected > 12) month_selected -= 12; + else if (month_selected < 1) month_selected += 12; if (year_selected > 2100) year_selected = 2100; else if (year_selected < 1970) year_selected = 1970; @@ -99,31 +93,40 @@ int main(int argc , char* argv[]) { switch(month_selected) { case 2: - if (day_selected > february_days) day_selected = february_days; + if (day_selected > february_days) day_selected -= february_days; + else if (day_selected<1) day_selected += february_days; break; case 4: case 6: case 9: case 11: - if (day_selected > 30) day_selected = 30; + if (day_selected > 30) day_selected -= 30; + else if (day_selected < 1) day_selected += 30; + break; default: - if (day_selected > 31) day_selected = 31; + if (day_selected > 31) day_selected -= 31; + else if (day_selected < 1) day_selected += 31; break; } // time - if (hour_selected > 23) hour_selected = 0; - if (minute_selected > 59) minute_selected = 0; - if (seconds_selected > 59) seconds_selected = 0; + if (hour_selected > 23) hour_selected -= 24; + else if (hour_selected < 0) hour_selected += 24; + if (minute_selected > 59) minute_selected -= 60; + else if (minute_selected < 0) minute_selected += 60; + if (seconds_selected > 59) seconds_selected -= 60; + else if (seconds_selected < 0) seconds_selected += 60; } + int dirty = 1; while(!quit) { unsigned long frame_start = SDL_GetTicks(); PAD_poll(); if (PAD_justRepeated(BTN_UP)) { + dirty = 1; switch(select_cursor) { case 0: year_selected++; @@ -146,6 +149,7 @@ int main(int argc , char* argv[]) { } } else if (PAD_justRepeated(BTN_DOWN)) { + dirty = 1; switch(select_cursor) { case 0: year_selected--; @@ -168,10 +172,12 @@ int main(int argc , char* argv[]) { } } else if (PAD_justRepeated(BTN_LEFT)) { + dirty = 1; select_cursor--; if (select_cursor < 0) select_cursor += 6; } else if (PAD_justRepeated(BTN_RIGHT)) { + dirty = 1; select_cursor++; if (select_cursor > 5) select_cursor -= 6; } @@ -182,44 +188,72 @@ int main(int argc , char* argv[]) { else if (PAD_justPressed(BTN_B)) { quit = 1; } - - validate(); - - // render - GFX_clear(screen); - GFX_blitABButtons("OKAY", "CANCEL", screen); - - // datetime - int x = 130; - int y = 185; - - x = blitNumber(year_selected, x,y); - x = blit(kSlash, x,y); - x = blitNumber(month_selected, x,y); - x = blit(kSlash, x,y); - x = blitNumber(day_selected, x,y); - x += 20; // space - x = blitNumber(hour_selected, x,y); - x = blit(kColon, x,y); - x = blitNumber(minute_selected, x,y); - x = blit(kColon, x,y); - x = blitNumber(seconds_selected, x,y); - - // cursor - x = 130; - y = 222; - if (select_cursor>0) { - x += 100; // YYYY/ - x += (select_cursor - 1) * 60; + else if (PAD_justPressed(BTN_SELECT)) { + dirty = 1; + show_24hour = !show_24hour; } - blitBar(x,y, (select_cursor>0 ? 2 : 4)); - GFX_flip(screen); - - // // slow down to 60fps - // unsigned long frame_duration = SDL_GetTicks() - frame_start; - // #define kTargetFrameDuration 17 - // if (frame_duration12) hour -= 12; + x = blitNumber(hour, x,y); + } + x = blit(kColon, x,y); + x = blitNumber(minute_selected, x,y); + x = blit(kColon, x,y); + x = blitNumber(seconds_selected, x,y); + + if (!show_24hour) { + x += 20; // space + SDL_Surface* text = TTF_RenderUTF8_Blended(font.large, am ? "AM" : "PM", COLOR_WHITE); + SDL_BlitSurface(text, NULL, screen, &(SDL_Rect){x,y-6}); + SDL_FreeSurface(text); + } + + // cursor + x = show_24hour ? 130 : 90; + y = 222; + if (select_cursor>0) { + x += 100; // YYYY/ + x += (select_cursor - 1) * 60; + } + blitBar(x,y, (select_cursor>0 ? 2 : 4)); + + GFX_flip(screen); + } + else { + // slow down to 60fps + unsigned long frame_duration = SDL_GetTicks() - frame_start; + #define kTargetFrameDuration 17 + if (frame_durationformat, TRIAD_WHITE); RGB_BLACK = SDL_MapRGB(gfx.screen->format, TRIAD_BLACK); RGB_LIGHT_GRAY = SDL_MapRGB(gfx.screen->format, TRIAD_LIGHT_GRAY); + RGB_GRAY = SDL_MapRGB(gfx.screen->format, TRIAD_GRAY); RGB_DARK_GRAY = SDL_MapRGB(gfx.screen->format, TRIAD_DARK_GRAY); asset_rgbs[ASSET_WHITE_PILL] = RGB_WHITE; @@ -223,6 +225,7 @@ SDL_Surface* GFX_init(void) { asset_rgbs[ASSET_PAGE] = RGB_BLACK; asset_rgbs[ASSET_BAR] = RGB_WHITE; asset_rgbs[ASSET_BAR_BG] = RGB_BLACK; + asset_rgbs[ASSET_UNDERLINE] = RGB_GRAY; asset_rgbs[ASSET_DOT] = RGB_LIGHT_GRAY; char asset_path[MAX_PATH]; @@ -450,6 +453,55 @@ void GFX_blitABButtons(char* a, char* b, SDL_Surface* dst) { } } +int GFX_blitButtonGroup(char** pairs, SDL_Surface* dst, int align_right) { + int ox; + int oy; + int ow; + char* hint; + char* button; + + struct Hint { + char* hint; + char* button; + int ow; + } hints[2]; + int w = 0; // individual button dimension + int h = 0; // hints index + ow = 0; // full pill width + ox = align_right ? SCREEN_WIDTH - SCALE1(PADDING) : SCALE1(PADDING); + oy = SCREEN_HEIGHT - SCALE1(PADDING + PILL_SIZE); + + for (int i=0; i<2; i++) { + if (!pairs[i*2]) break; + + button = pairs[i * 2]; + hint = pairs[i * 2 + 1]; + w = GFX_getButtonWidth(hint, button); + hints[h].hint = hint; + hints[h].button = button; + hints[h].ow = w; + h += 1; + ow += SCALE1(BUTTON_MARGIN) + w; + } + + ow += SCALE1(BUTTON_MARGIN); + if (align_right) ox -= ow; + GFX_blitPill(ASSET_DARK_GRAY_PILL, dst, &(SDL_Rect){ + ox, + oy, + ow, + SCALE1(PILL_SIZE) + }); + + ox += SCALE1(BUTTON_MARGIN); + oy += SCALE1(BUTTON_MARGIN); + for (int i=0; i