feat: 实现设置页面及其功能

This commit is contained in:
2026-07-05 20:52:04 +08:00
parent 9a355e540c
commit 6a6ee41a07
15 changed files with 676 additions and 11 deletions
+154
View File
@@ -0,0 +1,154 @@
#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;
}
}
+14
View File
@@ -0,0 +1,14 @@
#pragma once
#include "lvgl.h"
#include "settings_types.h"
extern lv_obj_t *ui_Settings;
extern lv_obj_t *ui_Settings_sidebar;
extern lv_obj_t *ui_Settings_content;
void ui_Settings_screen_init(void);
void ui_Settings_screen_destroy(void);
void ui_Settings_switch_tab(settings_tab_t tab);
settings_tab_t ui_Settings_get_active_tab(void);