155 lines
4.5 KiB
C
155 lines
4.5 KiB
C
#include "ui_Settings.h"
|
|
|
|
#include "board_config.h"
|
|
#include "settings/settings_store.h"
|
|
#include "settings/settings_tabs.h"
|
|
#include "ui_handlers.h"
|
|
|
|
#include <stddef.h>
|
|
|
|
lv_obj_t *ui_Settings;
|
|
lv_obj_t *ui_Settings_sidebar;
|
|
lv_obj_t *ui_Settings_content;
|
|
|
|
static settings_tab_t s_active_tab = SETTINGS_TAB_SYSTEM;
|
|
static lv_obj_t *s_nav_buttons[4];
|
|
|
|
static lv_style_t s_style_sidebar_btn_active;
|
|
static lv_style_t s_style_content_bg;
|
|
static bool s_styles_inited;
|
|
|
|
static const char *s_tab_labels[] = {
|
|
"System",
|
|
"Display",
|
|
"Audio",
|
|
"Network",
|
|
};
|
|
|
|
static void init_styles(void)
|
|
{
|
|
if (s_styles_inited) {
|
|
return;
|
|
}
|
|
|
|
lv_style_init(&s_style_sidebar_btn_active);
|
|
lv_style_set_bg_color(&s_style_sidebar_btn_active,
|
|
lv_palette_main(LV_PALETTE_BLUE));
|
|
lv_style_set_bg_opa(&s_style_sidebar_btn_active, LV_OPA_COVER);
|
|
|
|
lv_style_init(&s_style_content_bg);
|
|
lv_style_set_bg_color(&s_style_content_bg,
|
|
lv_palette_lighten(LV_PALETTE_GREY, 2));
|
|
lv_style_set_bg_opa(&s_style_content_bg, LV_OPA_COVER);
|
|
|
|
s_styles_inited = true;
|
|
}
|
|
|
|
static void sidebar_update_highlight(settings_tab_t tab)
|
|
{
|
|
for (size_t i = 0; i < 4; i++) {
|
|
if (s_nav_buttons[i] == NULL) {
|
|
continue;
|
|
}
|
|
if ((settings_tab_t)i == tab) {
|
|
lv_obj_add_style(s_nav_buttons[i], &s_style_sidebar_btn_active, 0);
|
|
} else {
|
|
lv_obj_remove_style(s_nav_buttons[i], &s_style_sidebar_btn_active, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
settings_tab_t ui_Settings_get_active_tab(void)
|
|
{
|
|
return s_active_tab;
|
|
}
|
|
|
|
void ui_Settings_switch_tab(settings_tab_t tab)
|
|
{
|
|
settings_data_t buf = *settings_store_get();
|
|
settings_tabs_collect(s_active_tab, &buf);
|
|
settings_store_update(&buf);
|
|
|
|
s_active_tab = tab;
|
|
sidebar_update_highlight(tab);
|
|
|
|
lv_obj_clean(ui_Settings_content);
|
|
switch (tab) {
|
|
case SETTINGS_TAB_SYSTEM:
|
|
load_system_settings(ui_Settings_content, settings_store_get());
|
|
break;
|
|
case SETTINGS_TAB_DISPLAY:
|
|
load_display_settings(ui_Settings_content, settings_store_get());
|
|
break;
|
|
case SETTINGS_TAB_AUDIO:
|
|
load_audio_settings(ui_Settings_content, settings_store_get());
|
|
break;
|
|
case SETTINGS_TAB_NETWORK:
|
|
load_network_settings(ui_Settings_content, settings_store_get());
|
|
break;
|
|
default:
|
|
LV_ASSERT_MSG(false, "unexpected settings_tab_t");
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ui_Settings_screen_init(void)
|
|
{
|
|
init_styles();
|
|
|
|
ui_Settings = lv_obj_create(NULL);
|
|
lv_obj_set_size(ui_Settings, BOARD_LCD_LOGIC_H_RES, BOARD_LCD_LOGIC_V_RES);
|
|
lv_obj_set_style_pad_all(ui_Settings, 2, 0);
|
|
lv_obj_remove_flag(ui_Settings, LV_OBJ_FLAG_SCROLLABLE);
|
|
|
|
ui_Settings_sidebar = lv_list_create(ui_Settings);
|
|
lv_obj_set_size(ui_Settings_sidebar, 90, 170);
|
|
lv_obj_set_pos(ui_Settings_sidebar, 0, 0);
|
|
lv_obj_set_style_pad_all(ui_Settings_sidebar, 2, 0);
|
|
lv_obj_set_style_pad_row(ui_Settings_sidebar, 2, 0);
|
|
lv_obj_remove_flag(ui_Settings_sidebar, LV_OBJ_FLAG_SCROLLABLE);
|
|
|
|
for (size_t i = 0; i < 4; i++) {
|
|
s_nav_buttons[i] =
|
|
lv_list_add_button(ui_Settings_sidebar, NULL, s_tab_labels[i]);
|
|
lv_obj_set_size(s_nav_buttons[i], 86, 28);
|
|
lv_obj_add_event_cb(s_nav_buttons[i], settings_on_tab_clicked,
|
|
LV_EVENT_CLICKED, (void *)(intptr_t)i);
|
|
}
|
|
|
|
lv_obj_t *save_btn = lv_button_create(ui_Settings);
|
|
lv_obj_set_size(save_btn, 86, 28);
|
|
lv_obj_set_pos(save_btn, 2, 138);
|
|
lv_obj_t *save_label = lv_label_create(save_btn);
|
|
lv_label_set_text(save_label, "Save");
|
|
lv_obj_center(save_label);
|
|
lv_obj_add_event_cb(save_btn, settings_on_save_clicked, LV_EVENT_CLICKED,
|
|
NULL);
|
|
|
|
ui_Settings_content = lv_obj_create(ui_Settings);
|
|
lv_obj_set_size(ui_Settings_content, 230, 170);
|
|
lv_obj_set_pos(ui_Settings_content, 90, 0);
|
|
lv_obj_set_style_pad_all(ui_Settings_content, 2, 0);
|
|
lv_obj_add_style(ui_Settings_content, &s_style_content_bg, 0);
|
|
lv_obj_remove_flag(ui_Settings_content, LV_OBJ_FLAG_SCROLLABLE);
|
|
|
|
settings_store_load();
|
|
settings_store_apply();
|
|
|
|
s_active_tab = SETTINGS_TAB_SYSTEM;
|
|
sidebar_update_highlight(s_active_tab);
|
|
load_system_settings(ui_Settings_content, settings_store_get());
|
|
}
|
|
|
|
void ui_Settings_screen_destroy(void)
|
|
{
|
|
if (ui_Settings != NULL) {
|
|
lv_obj_del(ui_Settings);
|
|
ui_Settings = NULL;
|
|
ui_Settings_sidebar = NULL;
|
|
ui_Settings_content = NULL;
|
|
}
|
|
for (size_t i = 0; i < 4; i++) {
|
|
s_nav_buttons[i] = NULL;
|
|
}
|
|
}
|