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

This commit is contained in:
anschrammh 2023-10-19 08:17:51 +02:00
parent bf9816457b
commit b19c7defc7
4 changed files with 161 additions and 72 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);