From b19c7defc7aa85ea26b21ccba1bf50d06d01bced Mon Sep 17 00:00:00 2001 From: anschrammh Date: Thu, 19 Oct 2023 08:17:51 +0200 Subject: [PATCH] Added an event callback to know what setting category is opened and closed, reworked the way the side screen is cleaned (refactoring), added a background color on the selected item of the list --- .../app/gfx/settings_screen.c | 90 +++++++++++-------- .../app/gfx/settings_screen.h | 29 ++++++ .../lv_port_win_codeblocks/settings_screen.c | 85 ++++++++++-------- .../lv_port_win_codeblocks/settings_screen.h | 29 ++++++ 4 files changed, 161 insertions(+), 72 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c index 7249a7e..6fddd32 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c +++ b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c @@ -20,7 +20,7 @@ static const char* vibration_force = "1\n2\n3\n4\n5\n6\n7\n8"; static const char* language_options = "Francais\nDeutsch\nEnglish"; -static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data); +static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data, SettingsScreenCategory_e category); static void update_menu_list_item_text(lv_obj_t *menu_list_item, const char *text); static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsScreen, lv_obj_t *item); @@ -261,6 +261,8 @@ static void factory_reset_cb(lv_event_t *e) static void about_refresh_timer_cb(lv_timer_t *timer) { SettingsScreen_t *settingsScreen = timer->user_data; + + if(!settingsScreen->about_refresh_timer) return; static uint8_t timer_divider = 6; if(timer_divider++ == 6) @@ -275,9 +277,6 @@ static void about_refresh_timer_cb(lv_timer_t *timer) static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - uint8_t hour = 0, minute = 0, second = 0, day = 0, month = 0, year = 0; if(settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb) settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&hour, &minute, &second, &day, &month, &year, SETTING_MODE_GET); @@ -393,9 +392,6 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) static void load_display_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Brightness :"); @@ -483,9 +479,6 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Vibrate on\nnotifications :"); @@ -512,9 +505,6 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Connectivity :"); @@ -588,9 +578,6 @@ static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) static void load_language_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Language :"); @@ -605,9 +592,6 @@ static void load_language_side_screen(SettingsScreen_t *settingsScreen) static void load_about_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "System Info :"); @@ -723,6 +707,17 @@ void settings_screen_init(SettingsScreen_t * const settingsScreen) memset(settingsScreen, 0, sizeof(SettingsScreen_t)); } +void settings_screen_register_on_state_change_cb(SettingsScreen_t * const settingsScreen, SettingsScreenOnStateChangeCb_t settingsScreenOnStateChangeCb) +{ + if(!settingsScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + settingsScreen->settingsScreenOnStateChangeCb = settingsScreenOnStateChangeCb; +} + void settings_screen_register_API_interface(SettingsScreen_t * const settingsScreen, SettingsScreenAPIInterface_t * const settingsScreenAPIInterface) { if(!settingsScreen) @@ -745,7 +740,7 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) return; } - //We create our parent screen : + // We create our parent screen : if(settingsScreen->display) { LV_LOG_ERROR("display should be NULL here !"); @@ -754,10 +749,10 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) } settingsScreen->display = lv_obj_create(NULL); - //We add the screen header + // We add the screen header common_screen_header_component(settingsScreen->display, translation_get_word(TRANSLATION_SETTINGS), 50); - //We create the menu list on the left hand side + // We create the menu list on the left hand side lv_obj_t *menu_list = lv_list_create(settingsScreen->display); lv_obj_set_size(menu_list, 75,190); lv_obj_set_pos(menu_list, 0, 50); @@ -767,7 +762,7 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) lv_obj_set_style_pad_left(menu_list, 0, LV_PART_MAIN); lv_obj_set_style_pad_bottom(menu_list, 50, LV_PART_MAIN); - //We add the side screen containing the settings + // We add the side screen containing the settings settingsScreen->side_screen = lv_obj_create(settingsScreen->display); lv_obj_set_size(settingsScreen->side_screen, 165,190); lv_obj_set_pos(settingsScreen->side_screen, 75, 50); @@ -777,20 +772,20 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) lv_obj_set_style_pad_bottom(settingsScreen->side_screen, 70, LV_PART_MAIN); lv_obj_set_scroll_dir(settingsScreen->side_screen, LV_DIR_VER); - //We add all the menu list items - settingsScreen->time_and_date_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_TIME_AND_DATE), &(menu_list_item_event_handler), settingsScreen); - settingsScreen->display_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_DISPLAY), &(menu_list_item_event_handler), settingsScreen); - settingsScreen->notifications_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_NOTIFICATIONS), &(menu_list_item_event_handler), settingsScreen); - settingsScreen->connectivity_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_CONNECTIVITY), &(menu_list_item_event_handler), settingsScreen); - settingsScreen->language_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_LANGUAGE), &(menu_list_item_event_handler), settingsScreen); - settingsScreen->about_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_ABOUT), &(menu_list_item_event_handler), settingsScreen); + // We add all the menu list items + settingsScreen->time_and_date_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_TIME_AND_DATE), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_TIME_AND_DATE); + settingsScreen->display_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_DISPLAY), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_DISPLAY); + settingsScreen->notifications_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_NOTIFICATIONS), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_NOTIFICATION); + settingsScreen->connectivity_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_CONNECTIVITY), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_CONNECTIVITY); + settingsScreen->language_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_LANGUAGE), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_LANGUAGE); + settingsScreen->about_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_ABOUT), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_ABOUT); - //We register the event callback to handle gesture + // We register the event callback to handle gesture lv_obj_add_event_cb(settingsScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, settingsScreen); - //We register the event callback to handle the cleanup + // We register the event callback to handle the cleanup lv_obj_add_event_cb(settingsScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, settingsScreen); - //We load the default side screen content (time and date) + // We load the default side screen content (time and date) _simulate_side_screen_item_click(settingsScreen, settingsScreen->time_and_date_item); } @@ -802,6 +797,12 @@ void settings_screen_destroy(SettingsScreen_t * const settingsScreen) return; } + if (settingsScreen->last_selected_item) + { + if (settingsScreen->settingsScreenOnStateChangeCb) + settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_CLOSED, (SettingsScreenCategory_e)lv_obj_get_user_data(settingsScreen->last_selected_item)); + } + settingsScreen->hour_roller = NULL; settingsScreen->minute_roller = NULL; settingsScreen->second_roller = NULL; @@ -823,13 +824,26 @@ static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsSc settingsScreen->about_refresh_timer = NULL; } - //Updating the background of the selected category + // Updating the background of the selected category lv_obj_set_style_bg_color(item, lv_color_make(178, 223, 219), LV_PART_MAIN); if(settingsScreen->last_selected_item) lv_obj_set_style_bg_color(settingsScreen->last_selected_item, lv_color_white(), LV_PART_MAIN); + // Let's call the settings screen on state change callback if registered + if(settingsScreen->settingsScreenOnStateChangeCb) + settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_OPENED, (SettingsScreenCategory_e)lv_obj_get_user_data(item)); + + if(settingsScreen->last_selected_item) + { + if(settingsScreen->settingsScreenOnStateChangeCb) + settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_CLOSED, (SettingsScreenCategory_e)lv_obj_get_user_data(settingsScreen->last_selected_item)); + } + settingsScreen->last_selected_item = item; + lv_obj_clean(settingsScreen->side_screen); + _reset_switch_pointers(settingsScreen); + if(item == settingsScreen->time_and_date_item) { load_time_and_date_side_screen(settingsScreen); @@ -861,7 +875,10 @@ static void _set_rtc_time_to_label(SettingsScreen_t * const settingsScreen) uint8_t hour = 0, minute = 0, second = 0, day = 0, month = 0, year = 0; if(settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb) settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&hour, &minute, &second, &day, &month, &year, SETTING_MODE_GET); - sprintf(settingsScreen->currentTime.current_time_text, "%u:%u:%u %s%u/%s%u/%u", hour, minute, second, + sprintf(settingsScreen->currentTime.current_time_text, "%s%u:%s%u:%s%u %s%u/%s%u/%u", + hour < 10 ? "0":"", hour, + minute < 10 ? "0":"", minute, + second < 10 ? "0":"", second, day < 10 ? "0":"", day, month + 1 < 10 ? "0":"", month + 1, year+1900); @@ -951,7 +968,7 @@ static void _enable_time_and_date_rollers(bool enabled, SettingsScreen_t * const } } -static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data) +static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data, SettingsScreenCategory_e category) { lv_obj_t *btn = lv_list_add_btn(list, NULL, text); lv_obj_t *label = lv_obj_get_child(btn, 0); @@ -962,6 +979,7 @@ static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_c lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); } + lv_obj_set_user_data(btn, (void *)category); lv_obj_add_event_cb(btn, event_cb, LV_EVENT_CLICKED, user_data); return btn; } diff --git a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h index 026d90d..a1fc13f 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h +++ b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h @@ -33,6 +33,24 @@ typedef struct SettingsScreenAPIInterface void (*factoryResetCb)(void); } SettingsScreenAPIInterface_t; +typedef enum SettingsScreenState +{ + SETTINGS_SCREEN_STATE_OPENED = 0, + SETTINGS_SCREEN_STATE_CLOSED +} SettingsScreenState_e; + +typedef enum SettingsScreenCategory +{ + SETTINGS_SCREEN_CATEGORY_TIME_AND_DATE = 0, + SETTINGS_SCREEN_CATEGORY_DISPLAY, + SETTINGS_SCREEN_CATEGORY_NOTIFICATION, + SETTINGS_SCREEN_CATEGORY_CONNECTIVITY, + SETTINGS_SCREEN_CATEGORY_LANGUAGE, + SETTINGS_SCREEN_CATEGORY_ABOUT, +} SettingsScreenCategory_e; + +typedef void (*SettingsScreenOnStateChangeCb_t)(SettingsScreenState_e settingsScreenState, SettingsScreenCategory_e settingsScreenCategory); + typedef struct SettingsScreen { SettingsScreenAPIInterface_t settingsScreenAPIInterface; @@ -108,10 +126,21 @@ typedef struct SettingsScreen /* Other */ lv_timer_t *about_refresh_timer; + SettingsScreenOnStateChangeCb_t settingsScreenOnStateChangeCb; } SettingsScreen_t; void settings_screen_init(SettingsScreen_t * const settingsScreen); +/** + * @brief Registers a callback function which will be called every time the state of the application changes ie : is opened or closed. + * This callback should be used to initialize and deinitialize needed devices drivers like the magnetometer or the temperature sensor. + * @note The state of the application is passed as a parameter or the callback function. + * + * @param settingsScreen a pointer to the settings screen object structure. + * @param SettingsScreenOnStateChangeCb the callback of type @ref SettingsScreenOnStateChangeCb_t to register. + */ +void settings_screen_register_on_state_change_cb(SettingsScreen_t * const settingsScreen, SettingsScreenOnStateChangeCb_t SettingsScreenOnStateChangeCb); + void settings_screen_register_API_interface(SettingsScreen_t * const settingsScreen, SettingsScreenAPIInterface_t * const settingsScreenAPIInterface); void settings_screen_create(SettingsScreen_t * const settingsScreen); diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c b/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c index b0bf766..8b8c223 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c @@ -26,7 +26,7 @@ static void _reset_switch_pointers(SettingsScreen_t * const settingsScreen) settingsScreen->ble_switch = NULL; settingsScreen->auto_set_time_switch = NULL; } -static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data); +static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data, SettingsScreenCategory_e category); static void update_menu_list_item_text(lv_obj_t *menu_list_item, const char *text); static void gesture_event_cb(lv_event_t *e) @@ -164,9 +164,6 @@ static void about_refresh_timer_cb(lv_timer_t *timer) static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Set Time & Date :"); @@ -254,9 +251,6 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) static void load_display_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Brightness :"); @@ -323,9 +317,6 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Vibrate on\nnotifications :"); @@ -352,9 +343,6 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Connectivity :"); @@ -407,9 +395,6 @@ static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) static void load_language_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Language :"); @@ -421,9 +406,6 @@ static void load_language_side_screen(SettingsScreen_t *settingsScreen) static void load_about_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_clean(settingsScreen->side_screen); - _reset_switch_pointers(settingsScreen); - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "System Info :"); @@ -521,7 +503,7 @@ static void load_about_side_screen(SettingsScreen_t *settingsScreen) lv_timer_del(settingsScreen->about_refresh_timer); settingsScreen->about_refresh_timer = NULL; } - settingsScreen->about_refresh_timer = lv_timer_create(&(about_refresh_timer_cb), 1000, settingsScreen); + settingsScreen->about_refresh_timer = lv_timer_create(&(about_refresh_timer_cb), 150, settingsScreen); } static void menu_list_item_event_handler(lv_event_t * e) @@ -541,6 +523,17 @@ void settings_screen_init(SettingsScreen_t * const settingsScreen) memset(settingsScreen, 0, sizeof(SettingsScreen_t)); } +void settings_screen_register_on_state_change_cb(SettingsScreen_t * const settingsScreen, SettingsScreenOnStateChangeCb_t settingsScreenOnStateChangeCb) +{ + if(!settingsScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + settingsScreen->settingsScreenOnStateChangeCb = settingsScreenOnStateChangeCb; +} + void settings_screen_register_API_interface(SettingsScreen_t * const settingsScreen, SettingsScreenAPIInterface_t * const settingsScreenAPIInterface) { if(!settingsScreen) @@ -563,7 +556,7 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) return; } - //We create our parent screen : + // We create our parent screen : if(settingsScreen->display) { LV_LOG_ERROR("display should be NULL here !"); @@ -572,10 +565,10 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) } settingsScreen->display = lv_obj_create(NULL); - //We add the screen header + // We add the screen header common_screen_header_component(settingsScreen->display, "Settings", 50); - //We create the menu list on the left hand side + // We create the menu list on the left hand side lv_obj_t *menu_list = lv_list_create(settingsScreen->display); lv_obj_set_size(menu_list, 75,190); lv_obj_set_pos(menu_list, 0, 50); @@ -585,7 +578,7 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) lv_obj_set_style_pad_left(menu_list, 0, LV_PART_MAIN); lv_obj_set_style_pad_bottom(menu_list, 50, LV_PART_MAIN); - //We add the side screen containing the settings + // We add the side screen containing the settings settingsScreen->side_screen = lv_obj_create(settingsScreen->display); lv_obj_set_size(settingsScreen->side_screen, 165,190); lv_obj_set_pos(settingsScreen->side_screen, 75, 50); @@ -595,20 +588,20 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) lv_obj_set_style_pad_bottom(settingsScreen->side_screen, 70, LV_PART_MAIN); lv_obj_set_scroll_dir(settingsScreen->side_screen, LV_DIR_VER); - //We add all the menu list items - settingsScreen->time_and_date_item = add_menu_list_item(menu_list, "Time & Date", &(menu_list_item_event_handler), settingsScreen); - settingsScreen->display_item = add_menu_list_item(menu_list, "Display", &(menu_list_item_event_handler), settingsScreen); - settingsScreen->notifications_item = add_menu_list_item(menu_list, "Notifications", &(menu_list_item_event_handler), settingsScreen); - settingsScreen->connectivity_item = add_menu_list_item(menu_list, "Connectivity", &(menu_list_item_event_handler), settingsScreen); - settingsScreen->language_item = add_menu_list_item(menu_list, "Language", &(menu_list_item_event_handler), settingsScreen); - settingsScreen->about_item = add_menu_list_item(menu_list, "About", &(menu_list_item_event_handler), settingsScreen); + // We add all the menu list items + settingsScreen->time_and_date_item = add_menu_list_item(menu_list, "Time & Date", &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_TIME_AND_DATE); + settingsScreen->display_item = add_menu_list_item(menu_list, "Display", &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_DISPLAY); + settingsScreen->notifications_item = add_menu_list_item(menu_list, "Notifications", &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_NOTIFICATION); + settingsScreen->connectivity_item = add_menu_list_item(menu_list, "Connectivity", &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_CONNECTIVITY); + settingsScreen->language_item = add_menu_list_item(menu_list, "Language", &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_LANGUAGE); + settingsScreen->about_item = add_menu_list_item(menu_list, "About", &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_ABOUT); - //We register the event callback to handle gesture + // We register the event callback to handle gesture lv_obj_add_event_cb(settingsScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, settingsScreen); - //We register the event callback to handle the cleanup + // We register the event callback to handle the cleanup lv_obj_add_event_cb(settingsScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, settingsScreen); - //We load the default side screen content (time and date) + // We load the default side screen content (time and date) _simulate_side_screen_item_click(settingsScreen, settingsScreen->time_and_date_item); } @@ -620,6 +613,12 @@ void settings_screen_destroy(SettingsScreen_t * const settingsScreen) return; } + if (settingsScreen->last_selected_item) + { + if (settingsScreen->settingsScreenOnStateChangeCb) + settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_CLOSED, (SettingsScreenCategory_e)lv_obj_get_user_data(settingsScreen->last_selected_item)); + } + settingsScreen->hour_roller = NULL; settingsScreen->minute_roller = NULL; settingsScreen->second_roller = NULL; @@ -641,13 +640,26 @@ static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsSc settingsScreen->about_refresh_timer = NULL; } - //Updating the background of the selected category + // Updating the background of the selected category lv_obj_set_style_bg_color(item, lv_color_make(178, 223, 219), LV_PART_MAIN); if(settingsScreen->last_selected_item) lv_obj_set_style_bg_color(settingsScreen->last_selected_item, lv_color_white(), LV_PART_MAIN); + // Let's call the settings screen on state change callback if registered + if(settingsScreen->settingsScreenOnStateChangeCb) + settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_OPENED, (SettingsScreenCategory_e)lv_obj_get_user_data(item)); + + if(settingsScreen->last_selected_item) + { + if(settingsScreen->settingsScreenOnStateChangeCb) + settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_CLOSED, (SettingsScreenCategory_e)lv_obj_get_user_data(settingsScreen->last_selected_item)); + } + settingsScreen->last_selected_item = item; + lv_obj_clean(settingsScreen->side_screen); + _reset_switch_pointers(settingsScreen); + if(item == settingsScreen->time_and_date_item) { load_time_and_date_side_screen(settingsScreen); @@ -710,7 +722,7 @@ static void _enable_time_and_date_rollers(bool enabled, SettingsScreen_t * const } } -static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data) +static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data, SettingsScreenCategory_e category) { lv_obj_t *btn = lv_list_add_btn(list, NULL, text); lv_obj_t *label = lv_obj_get_child(btn, 0); @@ -721,6 +733,7 @@ static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_c lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); } + lv_obj_set_user_data(btn, (void *)category); lv_obj_add_event_cb(btn, event_cb, LV_EVENT_CLICKED, user_data); return btn; } diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.h b/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.h index 6d4dd79..7c50969 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.h +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.h @@ -8,6 +8,24 @@ typedef struct SettingsScreenAPIInterface } SettingsScreenAPIInterface_t; +typedef enum SettingsScreenState +{ + SETTINGS_SCREEN_STATE_OPENED = 0, + SETTINGS_SCREEN_STATE_CLOSED +} SettingsScreenState_e; + +typedef enum SettingsScreenCategory +{ + SETTINGS_SCREEN_CATEGORY_TIME_AND_DATE = 0, + SETTINGS_SCREEN_CATEGORY_DISPLAY, + SETTINGS_SCREEN_CATEGORY_NOTIFICATION, + SETTINGS_SCREEN_CATEGORY_CONNECTIVITY, + SETTINGS_SCREEN_CATEGORY_LANGUAGE, + SETTINGS_SCREEN_CATEGORY_ABOUT, +} SettingsScreenCategory_e; + +typedef void (*SettingsScreenOnStateChangeCb_t)(SettingsScreenState_e settingsScreenState, SettingsScreenCategory_e settingsScreenCategory); + typedef struct SettingsScreen { SettingsScreenAPIInterface_t settingsScreenAPIInterface; @@ -64,10 +82,21 @@ typedef struct SettingsScreen /* Other */ lv_timer_t *about_refresh_timer; + SettingsScreenOnStateChangeCb_t settingsScreenOnStateChangeCb; } SettingsScreen_t; void settings_screen_init(SettingsScreen_t * const settingsScreen); +/** + * @brief Registers a callback function which will be called every time the state of the application changes ie : is opened or closed. + * This callback should be used to initialize and deinitialize needed devices drivers like the magnetometer or the temperature sensor. + * @note The state of the application is passed as a parameter or the callback function. + * + * @param settingsScreen a pointer to the settings screen object structure. + * @param SettingsScreenOnStateChangeCb the callback of type @ref SettingsScreenOnStateChangeCb_t to register. + */ +void settings_screen_register_on_state_change_cb(SettingsScreen_t * const settingsScreen, SettingsScreenOnStateChangeCb_t SettingsScreenOnStateChangeCb); + void settings_screen_register_API_interface(SettingsScreen_t * const settingsScreen, SettingsScreenAPIInterface_t * const settingsScreenAPIInterface); void settings_screen_create(SettingsScreen_t * const settingsScreen);