Files
tarrot/main/ui_settings.c
2026-06-23 06:03:19 -07:00

152 lines
4.8 KiB
C

#include "ui_settings.h"
#include <stdint.h>
#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();
}