text/plain
•
2.47 KB
•
65 lines
#include "home_screen.h"
#include <stdlib.h>
static void list_event_cb(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
lv_obj_t *btn = lv_event_get_target(e);
screen_type_t screen = (screen_type_t)(uintptr_t)lv_obj_get_user_data(btn);
navigate_to(screen);
}
}
ui_state_t setup_home_screen(void) {
home_screen_state_t *state = calloc(1, sizeof(home_screen_state_t));
// Create a list that fills the screen
state->list = lv_list_create(lv_screen_active());
lv_obj_set_size(state->list, LV_PCT(100), LV_PCT(100));
lv_obj_center(state->list);
// Add list header with styled background
lv_obj_t *header = lv_list_add_text(state->list, "Main Menu");
lv_obj_set_style_bg_color(header, lv_color_hex(0x0288D1), 0);
lv_obj_set_style_bg_opa(header, LV_OPA_COVER, 0);
lv_obj_set_style_text_color(header, lv_color_hex(0xFFFFFF), 0);
// Add menu entries
lv_obj_t *music_btn = lv_list_add_button(state->list, LV_SYMBOL_AUDIO, "Music");
lv_obj_t *podcasts_btn = lv_list_add_button(state->list, LV_SYMBOL_LIST, "Podcasts");
lv_obj_t *audiobooks_btn = lv_list_add_button(state->list, LV_SYMBOL_FILE, "Audiobooks");
lv_obj_t *games_btn = lv_list_add_button(state->list, LV_SYMBOL_IMAGE, "Games");
lv_obj_set_user_data(games_btn, (void *)(uintptr_t)SCREEN_GAMES);
lv_obj_add_event_cb(games_btn, list_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_t *settings_btn = lv_list_add_button(state->list, LV_SYMBOL_SETTINGS, "Settings");
// Add all buttons to group for keyboard navigation
lv_group_add_obj(lv_group_get_default(), music_btn);
lv_group_add_obj(lv_group_get_default(), podcasts_btn);
lv_group_add_obj(lv_group_get_default(), audiobooks_btn);
lv_group_add_obj(lv_group_get_default(), games_btn);
lv_group_add_obj(lv_group_get_default(), settings_btn);
lv_group_focus_obj(music_btn);
return (ui_state_t){.type = SCREEN_HOME, .home = state};
}
void free_home_screen(home_screen_state_t *state) {
if (!state) return;
// Get all buttons from list and remove from group
uint32_t child_count = lv_obj_get_child_count(state->list);
for (uint32_t i = 0; i < child_count; i++) {
lv_obj_t *child = lv_obj_get_child(state->list, i);
lv_group_remove_obj(child);
}
lv_obj_delete(state->list);
free(state);
}
void update_home_screen(home_screen_state_t *state) {
(void)state; // LVGL handles updates via timer
}