feat(xml): add lv_xml_set_default_asset_path (#8549)

This commit is contained in:
Gabor Kiss-Vamosi
2025-07-15 15:42:29 +00:00
committed by GitHub
parent db62f65c22
commit 07eaccfcfc
5 changed files with 53 additions and 6 deletions
+4
View File
@@ -259,6 +259,10 @@ typedef struct _lv_global_t {
lv_evdev_discovery_t * evdev_discovery;
#endif
#if LV_USE_XML
const char * xml_path_prefix;
#endif
void * user_data;
} lv_global_t;
+2 -2
View File
@@ -511,8 +511,8 @@ void lv_deinit(void)
lv_objid_builtin_destroy();
#endif
#if LV_USE_XML && LV_USE_TEST
lv_xml_test_unregister();
#if LV_USE_XML
lv_xml_deinit();
#endif
#if LV_USE_TRANSLATION
+25 -1
View File
@@ -42,10 +42,12 @@
#include "parsers/lv_xml_calendar_parser.h"
#include "../../libs/expat/expat.h"
#include "../../draw/lv_draw_image.h"
#include "../../core/lv_global.h"
/*********************
* DEFINES
*********************/
#define xml_path_prefix LV_GLOBAL_DEFAULT()->xml_path_prefix
/**********************
* TYPEDEFS
@@ -71,6 +73,8 @@ static void view_end_element_handler(void * user_data, const char * name);
void lv_xml_init(void)
{
xml_path_prefix = lv_strdup("");
lv_xml_component_init();
lv_xml_register_font(NULL, "lv_font_default", lv_font_get_default());
@@ -142,6 +146,15 @@ void lv_xml_init(void)
lv_xml_widget_register("lv_obj-bind_state_if_le", lv_obj_xml_bind_state_create, lv_obj_xml_bind_state_apply);
}
void lv_xml_deinit(void)
{
#if LV_USE_TEST
lv_xml_test_unregister();
#endif
lv_free((void *)xml_path_prefix);
}
void * lv_xml_create_in_scope(lv_obj_t * parent, lv_xml_component_scope_t * parent_scope,
lv_xml_component_scope_t * scope,
const char ** attrs)
@@ -264,6 +277,15 @@ void * lv_xml_create(lv_obj_t * parent, const char * name, const char ** attrs)
return NULL;
}
void lv_xml_set_default_asset_path(const char * path_prefix)
{
lv_free((void *)xml_path_prefix);
if(path_prefix == NULL) path_prefix = "";
xml_path_prefix = lv_strdup(path_prefix);
}
lv_result_t lv_xml_register_font(lv_xml_component_scope_t * scope, const char * name, const lv_font_t * font)
{
@@ -433,7 +455,9 @@ lv_result_t lv_xml_register_image(lv_xml_component_scope_t * scope, const char *
lv_memzero(img, sizeof(*img));
img->name = lv_strdup(name);
if(lv_image_src_get_type(src) == LV_IMAGE_SRC_FILE) {
img->src = lv_strdup(src);
char buf[LV_XML_MAX_PATH_LENGTH];
lv_snprintf(buf, sizeof(buf), "%s%s", xml_path_prefix, src);
img->src = lv_strdup(buf);
}
else {
img->src = src;
+15
View File
@@ -26,6 +26,8 @@ extern "C" {
* DEFINES
*********************/
#define LV_XML_MAX_PATH_LENGTH 256
/**********************
* TYPEDEFS
**********************/
@@ -36,12 +38,25 @@ extern "C" {
void lv_xml_init(void);
void lv_xml_deinit(void);
void * lv_xml_create(lv_obj_t * parent, const char * name, const char ** attrs);
void * lv_xml_create_in_scope(lv_obj_t * parent, lv_xml_component_scope_t * parent_ctx,
lv_xml_component_scope_t * scope,
const char ** attrs);
/**
* Set a path to prefix the image and font file source paths.
*
* In globals.xml usually the source path is like "images/logo.png".
* But on the actual device it can be located at e.g. "A:ui/assets/images/logo.png".
* By setting "A:ui/assets/" the path set in the XML files will be prefixed accordingly.
*
* @param path_prefix the path to be used as prefix
*/
void lv_xml_set_default_asset_path(const char * path_prefix);
lv_result_t lv_xml_register_font(lv_xml_component_scope_t * scope, const char * name, const lv_font_t * font);
const lv_font_t * lv_xml_get_font(lv_xml_component_scope_t * scope, const char * name);
+7 -3
View File
@@ -19,11 +19,13 @@
#include "parsers/lv_xml_obj_parser.h"
#include "../../libs/expat/expat.h"
#include "../../misc/lv_fs.h"
#include "../../core/lv_global.h"
#include <string.h>
/*********************
* DEFINES
*********************/
#define xml_path_prefix LV_GLOBAL_DEFAULT()->xml_path_prefix
/**********************
* TYPEDEFS
@@ -63,7 +65,6 @@ void lv_xml_component_init(void)
lv_xml_component_scope_init(global_scope);
global_scope->name = lv_strdup("globals");
}
void lv_xml_component_scope_init(lv_xml_component_scope_t * scope)
@@ -350,6 +351,9 @@ static void process_font_element(lv_xml_parser_state_t * state, const char * typ
return;
}
char src_path_full[LV_XML_MAX_PATH_LENGTH];
lv_snprintf(src_path_full, sizeof(src_path_full), "%s%s", xml_path_prefix, src_path);
lv_xml_font_t * f;
LV_LL_READ(&state->scope.font_ll, f) {
if(lv_streq(f->name, name)) {
@@ -366,7 +370,7 @@ static void process_font_element(lv_xml_parser_state_t * state, const char * typ
return;
}
#if LV_TINY_TTF_FILE_SUPPORT
lv_font_t * font = lv_tiny_ttf_create_file(src_path, lv_xml_atoi(size));
lv_font_t * font = lv_tiny_ttf_create_file(src_path_full, lv_xml_atoi(size));
if(font == NULL) {
LV_LOG_WARN("Couldn't load `%s` tiny_ttf font", name);
return;
@@ -393,7 +397,7 @@ static void process_font_element(lv_xml_parser_state_t * state, const char * typ
#endif
}
else if(lv_streq(type, "bin")) {
lv_font_t * font = lv_binfont_create(src_path);
lv_font_t * font = lv_binfont_create(src_path_full);
if(font == NULL) {
LV_LOG_WARN("Couldn't load `%s` bin font", name);
return;