diff --git a/applications/examples/example_date_time_input/scenes/example_date_time_input_scene_show_date_time.c b/applications/examples/example_date_time_input/scenes/example_date_time_input_scene_show_date_time.c index 666db14a6..15e4cce08 100644 --- a/applications/examples/example_date_time_input/scenes/example_date_time_input_scene_show_date_time.c +++ b/applications/examples/example_date_time_input/scenes/example_date_time_input_scene_show_date_time.c @@ -13,17 +13,30 @@ static void example_date_time_input_scene_update_view(void* context) { dialog_ex_set_header(dialog_ex, "The date and time are", 64, 0, AlignCenter, AlignTop); - char buffer[26] = {}; + uint8_t hour = app->date_time.hour; + char label_hour[4] = ""; + if(furi_hal_rtc_get_locale_timeformat() == FuriHalRtcLocaleTimeFormat12h) { + if(hour < 12) { + snprintf(label_hour, sizeof(label_hour), " AM"); + } else { + snprintf(label_hour, sizeof(label_hour), " PM"); + } + hour %= 12; + if(hour == 0) hour = 12; + } + + char buffer[29] = {}; snprintf( buffer, sizeof(buffer), - "%04d-%02d-%02d\n%02d:%02d:%02d", + "%04d-%02d-%02d\n%02d:%02d:%02d%s", app->date_time.year, app->date_time.month, app->date_time.day, - app->date_time.hour, + hour, app->date_time.minute, - app->date_time.second); + app->date_time.second, + label_hour); dialog_ex_set_text(dialog_ex, buffer, 64, 29, AlignCenter, AlignCenter); dialog_ex_set_left_button_text(dialog_ex, "Date"); diff --git a/applications/services/gui/modules/date_time_input.c b/applications/services/gui/modules/date_time_input.c index eb703cda2..a80634823 100644 --- a/applications/services/gui/modules/date_time_input.c +++ b/applications/services/gui/modules/date_time_input.c @@ -1,4 +1,5 @@ #include "date_time_input.h" +#include "furi_hal_rtc.h" #include #include @@ -88,9 +89,31 @@ static inline void date_time_input_draw_block( } } -static void date_time_input_draw_time_callback(Canvas* canvas, DateTimeInputModel* model) { - furi_check(model->datetime); +static inline void date_time_input_draw_text( + Canvas* canvas, + int32_t x, + int32_t y, + size_t w, + size_t h, + Font font, + EditState state, + const char* text) { + furi_assert(canvas); + furi_assert(text); + canvas_set_color(canvas, ColorBlack); + if(state != EditStateDisabled && state != EditStateNone) { + canvas_set_color(canvas, ColorWhite); + } + + canvas_set_font(canvas, font); + canvas_draw_str_aligned(canvas, x + w / 2, y + h / 2, AlignCenter, AlignCenter, text); + if(state != EditStateNone) { + canvas_set_color(canvas, ColorBlack); + } +} + +static void date_time_input_draw_hour_24hr_callback(Canvas* canvas, DateTimeInputModel* model) { char buffer[64]; canvas_set_font(canvas, FontSecondary); @@ -102,6 +125,46 @@ static void date_time_input_draw_time_callback(Canvas* canvas, DateTimeInputMode canvas, 30, ROW_1_Y, 28, ROW_1_H, FontBigNumbers, get_state(model, 1, 0, hour), buffer); canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7, 2, 2); canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7 - 6, 2, 2); +} + +static void date_time_input_draw_hour_12hr_callback(Canvas* canvas, DateTimeInputModel* model) { + char buffer[64]; + + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 0, ROW_1_Y - 2, " H H M M S S"); + canvas_set_font(canvas, FontPrimary); + + uint8_t hour = model->datetime->hour % 12; + // Show 12:00 instead of 00:00 for 12-hour time + if(hour == 0) hour = 12; + + // Placeholder XX since FontBigNumbers can't draw letters + snprintf(buffer, sizeof(buffer), "%02u XX", hour); + date_time_input_draw_block( + canvas, 2, ROW_1_Y, 56, ROW_1_H, FontBigNumbers, get_state(model, 1, 0, hour), buffer); + canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7, 2, 2); + canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7 - 6, 2, 2); + + if(model->datetime->hour < 12) { + snprintf(buffer, sizeof(buffer), "AM"); + } else { + snprintf(buffer, sizeof(buffer), "PM"); + } + date_time_input_draw_text( + canvas, 28, ROW_1_Y + 3, 28, ROW_1_H, FontPrimary, get_state(model, 1, 0, hour), buffer); +} + +static void date_time_input_draw_time_callback(Canvas* canvas, DateTimeInputModel* model) { + furi_check(model->datetime); + + char buffer[64]; + + // Draw hour depending on RTC time format + if(furi_hal_rtc_get_locale_timeformat() == FuriHalRtcLocaleTimeFormat24h) { + date_time_input_draw_hour_24hr_callback(canvas, model); + } else { + date_time_input_draw_hour_12hr_callback(canvas, model); + } snprintf(buffer, sizeof(buffer), "%02u", model->datetime->minute); date_time_input_draw_block(