#include "ui_settings.h" #include #include "bsp/esp-bsp.h" #include "esp_log.h" #include "lvgl.h" #include "settings.h" #include "ui_main.h" static const char *TAG = "ui_settings"; static tarot_settings_t s_edit_settings; static void back_cb(lv_event_t *event); static void reversed_cb(lv_event_t *event); static void save_readings_cb(lv_event_t *event); static void brightness_cb(lv_event_t *event); static void theme_cb(lv_event_t *event); static void spread_cb(lv_event_t *event); static void board_set_brightness(uint8_t brightness) { esp_err_t err = bsp_display_brightness_set(brightness); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to set brightness: %s", esp_err_to_name(err)); } } static lv_obj_t *add_row(lv_obj_t *parent, const char *label_text) { lv_obj_t *row = lv_obj_create(parent); lv_obj_set_width(row, LV_PCT(100)); lv_obj_set_height(row, LV_SIZE_CONTENT); lv_obj_set_style_bg_opa(row, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(row, 0, 0); lv_obj_set_flex_flow(row, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(row, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_t *label = lv_label_create(row); lv_label_set_text(label, label_text); return row; } static void save_current_settings(void) { esp_err_t err = settings_save(&s_edit_settings); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to save settings: %s", esp_err_to_name(err)); } } void ui_show_settings(void) { s_edit_settings = settings_get(); ui_apply_current_theme(); lv_obj_t *screen = lv_obj_create(NULL); lv_obj_set_style_pad_all(screen, 18, 0); lv_obj_set_flex_flow(screen, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(screen, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_t *title = lv_label_create(screen); lv_label_set_text(title, "Settings"); lv_obj_t *row = add_row(screen, "Reversed cards"); lv_obj_t *sw = lv_switch_create(row); if (s_edit_settings.reversed_cards_enabled) { lv_obj_add_state(sw, LV_STATE_CHECKED); } lv_obj_add_event_cb(sw, reversed_cb, LV_EVENT_VALUE_CHANGED, NULL); row = add_row(screen, "Save readings"); sw = lv_switch_create(row); if (s_edit_settings.save_readings_enabled) { lv_obj_add_state(sw, LV_STATE_CHECKED); } lv_obj_add_event_cb(sw, save_readings_cb, LV_EVENT_VALUE_CHANGED, NULL); row = add_row(screen, "Brightness"); lv_obj_t *slider = lv_slider_create(row); lv_obj_set_width(slider, 190); lv_slider_set_range(slider, 10, 100); lv_slider_set_value(slider, s_edit_settings.brightness, LV_ANIM_OFF); lv_obj_add_event_cb(slider, brightness_cb, LV_EVENT_VALUE_CHANGED, NULL); row = add_row(screen, "Theme"); lv_obj_t *theme = lv_dropdown_create(row); lv_dropdown_set_options(theme, "Dark\nLight\nMystic"); lv_dropdown_set_selected(theme, s_edit_settings.theme); lv_obj_set_width(theme, 170); lv_obj_add_event_cb(theme, theme_cb, LV_EVENT_VALUE_CHANGED, NULL); row = add_row(screen, "Spread"); lv_obj_t *spread = lv_dropdown_create(row); lv_dropdown_set_options(spread, "3-card\n8-card"); lv_dropdown_set_selected(spread, s_edit_settings.selected_spread == TAROT_SPREAD_3_CARD ? 0 : 1); lv_obj_set_width(spread, 170); lv_obj_add_event_cb(spread, spread_cb, LV_EVENT_VALUE_CHANGED, NULL); lv_obj_t *back = lv_btn_create(screen); lv_obj_set_size(back, 190, 52); lv_obj_add_event_cb(back, back_cb, LV_EVENT_CLICKED, NULL); lv_obj_t *back_label = lv_label_create(back); lv_label_set_text(back_label, "Back"); lv_obj_center(back_label); lv_scr_load(screen); } static void reversed_cb(lv_event_t *event) { lv_obj_t *target = lv_event_get_target(event); s_edit_settings.reversed_cards_enabled = lv_obj_has_state(target, LV_STATE_CHECKED); save_current_settings(); } static void save_readings_cb(lv_event_t *event) { lv_obj_t *target = lv_event_get_target(event); s_edit_settings.save_readings_enabled = lv_obj_has_state(target, LV_STATE_CHECKED); save_current_settings(); } static void brightness_cb(lv_event_t *event) { lv_obj_t *target = lv_event_get_target(event); s_edit_settings.brightness = (uint8_t)lv_slider_get_value(target); board_set_brightness(s_edit_settings.brightness); save_current_settings(); } static void theme_cb(lv_event_t *event) { lv_obj_t *target = lv_event_get_target(event); s_edit_settings.theme = (tarot_theme_t)lv_dropdown_get_selected(target); save_current_settings(); } static void spread_cb(lv_event_t *event) { lv_obj_t *target = lv_event_get_target(event); s_edit_settings.selected_spread = lv_dropdown_get_selected(target) == 0 ? TAROT_SPREAD_3_CARD : TAROT_SPREAD_8_CARD; save_current_settings(); } static void back_cb(lv_event_t *event) { (void)event; ui_show_home(); }