Files
arcs/apps-ui/apps/llm/views/setting/setting_common_view.c
2026-08-13 16:50:52 +08:00

246 lines
9.1 KiB
C

/**
* @file setting_common_view.c
* @brief Common settings view implementation (Volume, Brightness)
*/
#define TAG "setting_common_view"
#include "setting_common_view.h"
#include "lisa_ui.h"
#include "lisa_ui_llm_base.h"
#include "lisa_ui_nav_scr.h"
#include "lisa_ui_nav_scr_ids.h"
#include "lisa_ui_assets.h"
#include "stdio.h"
#include "lisa_ui_fonts.h"
typedef struct {
lisa_ui_llm_base_t base;
lv_obj_t *back_btn;
lv_obj_t *volume_label;
lv_obj_t *brightness_label;
lv_obj_t *volume_slider;
lv_obj_t *brightness_slider;
lisa_ui_setting_common_back_cb_t back_cb;
void *back_user_data;
lisa_ui_setting_common_volume_changed_cb_t volume_changed_cb;
void *volume_user_data;
lisa_ui_setting_common_brightness_changed_cb_t brightness_changed_cb;
void *brightness_user_data;
} lisa_ui_setting_common_view_t;
static void lisa_ui_setting_common_view_class_constructor(const lv_obj_class_t *class_p, lv_obj_t *obj);
const lv_obj_class_t lisa_ui_setting_common_view_class = {
.base_class = &lisa_ui_llm_base_class,
.constructor_cb = lisa_ui_setting_common_view_class_constructor,
.instance_size = sizeof(lisa_ui_setting_common_view_t),
};
static void back_btn_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) {
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)lv_event_get_user_data(e);
LISA_UI_LOGD("Back button clicked");
if (view && view->back_cb) {
view->back_cb(view->back_user_data);
}
}
}
static void volume_slider_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_VALUE_CHANGED) {
lv_obj_t *slider = lv_event_get_target(e);
int32_t value = lv_slider_get_value(slider);
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)lv_event_get_user_data(e);
if (view && view->volume_label && lv_obj_is_valid(view->volume_label)) {
static char volume_text[32];
snprintf(volume_text, sizeof(volume_text), _("volume: %d%%"), (int)value);
lv_label_set_text(view->volume_label, volume_text);
}
LISA_UI_LOGD("Volume changed to: %d", (int)value);
/* 调用业务逻辑回调 */
if (view && view->volume_changed_cb) {
view->volume_changed_cb((uint8_t)value, view->volume_user_data);
}
}
}
static void brightness_slider_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_VALUE_CHANGED) {
lv_obj_t *slider = lv_event_get_target(e);
int32_t value = lv_slider_get_value(slider);
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)lv_event_get_user_data(e);
if (view && view->brightness_label && lv_obj_is_valid(view->brightness_label)) {
static char brightness_text[32];
snprintf(brightness_text, sizeof(brightness_text), _("brightness: %d%%"), (int)value);
lv_label_set_text(view->brightness_label, brightness_text);
}
LISA_UI_LOGD("Brightness changed to: %d", (int)value);
/* 调用业务逻辑回调 */
if (view && view->brightness_changed_cb) {
view->brightness_changed_cb((uint8_t)value, view->brightness_user_data);
}
}
}
static void lisa_ui_setting_common_view_class_constructor(const lv_obj_class_t *class_p, lv_obj_t *obj)
{
LV_UNUSED(class_p);
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
// Hide the bar to allow content to start from the very top
lv_obj_t *bar = lisa_ui_llm_base_bar_get(obj);
if (bar) {
lv_obj_add_flag(bar, LV_OBJ_FLAG_HIDDEN);
}
lv_obj_t *container = lisa_ui_llm_base_container_get(obj);
if (NULL == container) {
LISA_UI_LOGE("Failed to get base container");
return;
}
// Back button at the very top
view->back_btn = lv_btn_create(container);
lv_obj_set_size(view->back_btn, 30, 30);
lv_obj_align(view->back_btn, LV_ALIGN_TOP_LEFT, 5, 0);
lv_obj_set_style_bg_opa(view->back_btn, LV_OPA_TRANSP, LV_PART_MAIN);
lv_obj_set_style_border_width(view->back_btn, 0, LV_PART_MAIN);
lv_obj_t *back_icon = lv_img_create(view->back_btn);
lv_img_set_src(back_icon, &icons_icon_back_png);
lv_obj_center(back_icon);
lv_obj_add_event_cb(view->back_btn, back_btn_event_cb, LV_EVENT_CLICKED, view);
/* 在返回按钮旁边创建标题文本 */
lv_obj_t *title = lv_label_create(container);
lv_label_set_text(title, _("common setting"));
lv_obj_set_style_text_font(title, &lv_font_chinese_16, LV_PART_MAIN);
lv_obj_set_style_text_color(title, lv_color_white(), LV_PART_MAIN);
lv_obj_align(title, LV_ALIGN_TOP_LEFT, 45, 8); /* 紧贴返回按钮右侧 */
view->volume_label = lv_label_create(container);
lv_obj_set_style_text_color(view->volume_label, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(view->volume_label, &lv_font_chinese_16, LV_PART_MAIN);
lv_obj_align(view->volume_label, LV_ALIGN_TOP_LEFT, 20, 80);
view->volume_slider = lv_slider_create(container);
lv_obj_set_width(view->volume_slider, 280);
lv_obj_align_to(view->volume_slider, view->volume_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
lv_slider_set_range(view->volume_slider, 0, 100);
lv_slider_set_value(view->volume_slider, 50, LV_ANIM_OFF);
lv_obj_add_event_cb(view->volume_slider, volume_slider_event_cb, LV_EVENT_VALUE_CHANGED, view);
view->brightness_label = lv_label_create(container);
lv_obj_set_style_text_color(view->brightness_label, lv_color_white(), LV_PART_MAIN);
lv_obj_set_style_text_font(view->brightness_label, &lv_font_chinese_16, LV_PART_MAIN);
lv_obj_align_to(view->brightness_label, view->volume_slider, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 30);
view->brightness_slider = lv_slider_create(container);
lv_obj_set_width(view->brightness_slider, 280);
lv_obj_align_to(view->brightness_slider, view->brightness_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
lv_slider_set_range(view->brightness_slider, 0, 100);
lv_slider_set_value(view->brightness_slider, 50, LV_ANIM_OFF);
lv_obj_add_event_cb(view->brightness_slider, brightness_slider_event_cb, LV_EVENT_VALUE_CHANGED, view);
}
lv_obj_t *lisa_ui_setting_common_view_create(lv_obj_t *parent)
{
lv_obj_t *obj = lv_obj_class_create_obj(&lisa_ui_setting_common_view_class, parent);
lv_obj_class_init_obj(obj);
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
view->back_cb = NULL;
view->back_user_data = NULL;
view->volume_changed_cb = NULL;
view->volume_user_data = NULL;
view->brightness_changed_cb = NULL;
view->brightness_user_data = NULL;
return obj;
}
void lisa_ui_setting_common_view_set_volume(lv_obj_t *obj, uint8_t volume)
{
if (!obj || volume > 100) {
return;
}
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
if (view->volume_slider && lv_obj_is_valid(view->volume_slider)) {
lv_slider_set_value(view->volume_slider, volume, LV_ANIM_OFF);
}
if (view->volume_label && lv_obj_is_valid(view->volume_label)) {
static char volume_text[32];
snprintf(volume_text, sizeof(volume_text), _("volume: %d%%"), volume);
lv_label_set_text(view->volume_label, volume_text);
}
}
void lisa_ui_setting_common_view_set_brightness(lv_obj_t *obj, uint8_t brightness)
{
if (!obj || brightness > 100) {
return;
}
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
if (view->brightness_slider && lv_obj_is_valid(view->brightness_slider)) {
lv_slider_set_value(view->brightness_slider, brightness, LV_ANIM_OFF);
}
if (view->brightness_label && lv_obj_is_valid(view->brightness_label)) {
static char brightness_text[32];
snprintf(brightness_text, sizeof(brightness_text), _("brightness: %d%%"), brightness);
lv_label_set_text(view->brightness_label, brightness_text);
}
}
void lisa_ui_setting_common_view_set_back_cb(lv_obj_t *obj, lisa_ui_setting_common_back_cb_t cb, void *user_data)
{
if (!obj) {
return;
}
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
view->back_cb = cb;
view->back_user_data = user_data;
}
void lisa_ui_setting_common_view_set_volume_changed_cb(lv_obj_t *obj, lisa_ui_setting_common_volume_changed_cb_t cb, void *user_data)
{
if (!obj) {
return;
}
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
view->volume_changed_cb = cb;
view->volume_user_data = user_data;
}
void lisa_ui_setting_common_view_set_brightness_changed_cb(lv_obj_t *obj, lisa_ui_setting_common_brightness_changed_cb_t cb, void *user_data)
{
if (!obj) {
return;
}
lisa_ui_setting_common_view_t *view = (lisa_ui_setting_common_view_t *)obj;
view->brightness_changed_cb = cb;
view->brightness_user_data = user_data;
}