From 768824df33691487905fdbae446cb421ef42dc30 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Mon, 1 Dec 2025 14:19:03 +0200 Subject: [PATCH] nyx: options: add month/date checks for roller Now the roller will return back automatically if day can't be set for selected month. Additionally, fix the check when saving. --- nyx/nyx_gui/frontend/gui_options.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/nyx/nyx_gui/frontend/gui_options.c b/nyx/nyx_gui/frontend/gui_options.c index c49ab0cb..62077cf3 100644 --- a/nyx/nyx_gui/frontend/gui_options.c +++ b/nyx/nyx_gui/frontend/gui_options.c @@ -672,7 +672,7 @@ static lv_res_t _action_clock_edit(lv_obj_t *btns, const char * txt) max77620_rtc_get_time(&time); u32 epoch = max77620_rtc_date_to_epoch(&time); - u32 year = lv_roller_get_selected(clock_ctxt.year); + u32 year = lv_roller_get_selected(clock_ctxt.year) + CLOCK_MIN_YEAR; u32 month = lv_roller_get_selected(clock_ctxt.month) + 1; u32 day = lv_roller_get_selected(clock_ctxt.day) + 1; u32 hour = lv_roller_get_selected(clock_ctxt.hour); @@ -695,7 +695,7 @@ static lv_res_t _action_clock_edit(lv_obj_t *btns, const char * txt) break; } - time.year = year + CLOCK_MIN_YEAR; + time.year = year; time.month = month; time.day = day; time.hour = hour; @@ -753,6 +753,25 @@ static lv_res_t _action_auto_dst_toggle(lv_obj_t *btn) return LV_RES_OK; } +static const u32 month_days[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + +static lv_res_t _action_date_validation(lv_obj_t *roller) +{ + u32 year = lv_roller_get_selected(clock_ctxt.year) + CLOCK_MIN_YEAR; + u32 month = lv_roller_get_selected(clock_ctxt.month) + 1; + u32 day = lv_roller_get_selected(clock_ctxt.day) + 1; + + // Adjust max day based on year and month. + u32 max_mon_day = month_days[month - 1]; + u32 max_feb_day = !(year % 4) ? 29 : 28; + if (month == 2 && day > max_feb_day) + lv_roller_set_selected(clock_ctxt.day, max_feb_day - 1, false); + else if (day > max_mon_day) + lv_roller_set_selected(clock_ctxt.day, max_mon_day - 1, false); + + return LV_RES_OK; +} + static lv_res_t _create_mbox_clock_edit(lv_obj_t *btn) { static lv_style_t mbox_style; @@ -799,6 +818,7 @@ static lv_res_t _create_mbox_clock_edit(lv_obj_t *btn) lv_roller_set_options(roller_year, CLOCK_YEARLIST); lv_roller_set_selected(roller_year, time.year, false); lv_roller_set_visible_row_count(roller_year, 3); + lv_roller_set_action(roller_year, _action_date_validation); clock_ctxt.year = roller_year; // Create month roller. @@ -818,6 +838,7 @@ static lv_res_t _create_mbox_clock_edit(lv_obj_t *btn) "December"); lv_roller_set_selected(roller_month, time.month - 1, false); lv_obj_align(roller_month, roller_year, LV_ALIGN_OUT_RIGHT_MID, 0, 0); + lv_roller_set_action(roller_month, _action_date_validation); clock_ctxt.month = roller_month; // Create day roller. @@ -829,6 +850,7 @@ static lv_res_t _create_mbox_clock_edit(lv_obj_t *btn) lv_obj_t *roller_day = lv_roller_create(h1, roller_year); lv_roller_set_options(roller_day, days); lv_roller_set_selected(roller_day, time.day - 1, false); + lv_roller_set_action(roller_day, _action_date_validation); lv_obj_align(roller_day, roller_month, LV_ALIGN_OUT_RIGHT_MID, 0, 0); clock_ctxt.day = roller_day;