]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
expo: Support simple themes
authorSimon Glass <sjg@chromium.org>
Thu, 1 Jun 2023 16:22:53 +0000 (10:22 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 14 Jul 2023 16:54:51 +0000 (12:54 -0400)
It is a pain to manually set the fonts of all objects to be consistent.
Some spacing settings are also better set globally than by manually
positioning each object.

Add a 'theme' to the expo, to hold this information. For now it includes
only the font size.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/expo.c
boot/scene.c
boot/scene_internal.h
doc/develop/expo.rst
include/expo.h
test/boot/expo.c

index 67cae3c7e28da3a6c8fa9382f13f358b2ccaa8a8..d5e935966bfd1c03e056b08b1fe5e7370d28f173 100644 (file)
@@ -231,3 +231,23 @@ int expo_action_get(struct expo *exp, struct expo_action *act)
 
        return act->type == EXPOACT_NONE ? -EAGAIN : 0;
 }
+
+int expo_apply_theme(struct expo *exp, ofnode node)
+{
+       struct scene *scn;
+       struct expo_theme *theme = &exp->theme;
+       int ret;
+
+       log_debug("Applying theme %s\n", ofnode_get_name(node));
+
+       memset(theme, '\0', sizeof(struct expo_theme));
+       ofnode_read_u32(node, "font-size", &theme->font_size);
+
+       list_for_each_entry(scn, &exp->scene_head, sibling) {
+               ret = scene_apply_theme(scn, theme);
+               if (ret)
+                       return log_msg_ret("app", ret);
+       }
+
+       return 0;
+}
index 6d5e3c1f03dd7afd55fb7b7164994f12014a54c3..4dbe12a2b740e8258eb6f6e486d61885586b529b 100644 (file)
@@ -466,3 +466,31 @@ int scene_calc_dims(struct scene *scn, bool do_menus)
 
        return 0;
 }
+
+int scene_apply_theme(struct scene *scn, struct expo_theme *theme)
+{
+       struct scene_obj *obj;
+       int ret;
+
+       /* Avoid error-checking optional items */
+       scene_txt_set_font(scn, scn->title_id, NULL, theme->font_size);
+
+       list_for_each_entry(obj, &scn->obj_head, sibling) {
+               switch (obj->type) {
+               case SCENEOBJT_NONE:
+               case SCENEOBJT_IMAGE:
+               case SCENEOBJT_MENU:
+                       break;
+               case SCENEOBJT_TEXT:
+                       scene_txt_set_font(scn, obj->id, NULL,
+                                          theme->font_size);
+                       break;
+               }
+       }
+
+       ret = scene_arrange(scn);
+       if (ret)
+               return log_msg_ret("arr", ret);
+
+       return 0;
+}
index 00085a2f55d31149c69b74e5757f12d0712a483b..3387a90761ab3e539115ceb5a011578a7968e260 100644 (file)
@@ -89,6 +89,15 @@ int scene_calc_dims(struct scene *scn, bool do_menus);
  */
 int scene_menu_arrange(struct scene *scn, struct scene_obj_menu *menu);
 
+/**
+ * scene_apply_theme() - Apply a theme to a scene
+ *
+ * @scn: Scene to update
+ * @theme: Theme to apply
+ * Returns: 0 if OK, -ve on error
+ */
+int scene_apply_theme(struct scene *scn, struct expo_theme *theme);
+
 /**
  * scene_menu_send_key() - Send a key to a menu for processing
  *
index 54861b93acf842ee394537e66a03b2d491a7bf14..2f4882899b6d7769c4447b89af0696b8c67d40c5 100644 (file)
@@ -155,8 +155,13 @@ such as scanning devices for more bootflows.
 Themes
 ------
 
-Expo does not itself support themes. The bootflow_menu implement supposed a
-basic theme, applying font sizes to the various text objects in the expo.
+Expo supports simple themes, for setting the font size, for example. Use the
+expo_apply_theme() function to load a theme, passing a node with the required
+properties:
+
+font-size
+    Font size to use for all text (type: u32)
+
 
 API documentation
 -----------------
index 6c45c403cf79410ecd4132db77e125d235bbb878..ea8f38913d8e6feeb896bbeac87ba8efd56274b4 100644 (file)
@@ -7,6 +7,7 @@
 #ifndef __SCENE_H
 #define __SCENE_H
 
+#include <dm/ofnode_decl.h>
 #include <linux/list.h>
 
 struct udevice;
@@ -42,6 +43,19 @@ struct expo_action {
        };
 };
 
+/**
+ * struct expo_theme - theme for the expo
+ *
+ * @font_size: Default font size for all text
+ * @menu_inset: Inset width (on each side and top/bottom) for menu items
+ * @menuitem_gap_y: Gap between menu items in pixels
+ */
+struct expo_theme {
+       u32 font_size;
+       u32 menu_inset;
+       u32 menuitem_gap_y;
+};
+
 /**
  * struct expo - information about an expo
  *
@@ -57,6 +71,7 @@ struct expo_action {
  * type set to EXPOACT_NONE if there is no action
  * @text_mode: true to use text mode for the menu (no vidconsole)
  * @priv: Private data for the controller
+ * @theme: Information about fonts styles, etc.
  * @scene_head: List of scenes
  * @str_head: list of strings
  */
@@ -69,6 +84,7 @@ struct expo {
        struct expo_action action;
        bool text_mode;
        void *priv;
+       struct expo_theme theme;
        struct list_head scene_head;
        struct list_head str_head;
 };
@@ -583,4 +599,12 @@ int expo_send_key(struct expo *exp, int key);
  */
 int expo_action_get(struct expo *exp, struct expo_action *act);
 
+/**
+ * expo_apply_theme() - Apply a theme to an expo
+ *
+ * @exp: Expo to update
+ * @node: Node containing the theme
+ */
+int expo_apply_theme(struct expo *exp, ofnode node);
+
 #endif /*__SCENE_H */
index 493d050baf872780cb7b62a1eaf8226d509c1f9b..c0ef03b591122de81d8399d31df1f42ce667d6f7 100644 (file)
@@ -226,7 +226,7 @@ static int expo_object(struct unit_test_state *uts)
 }
 BOOTSTD_TEST(expo_object, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
 
-/* Check setting object attributes */
+/* Check setting object attributes and using themes */
 static int expo_object_attr(struct unit_test_state *uts)
 {
        struct scene_obj_menu *menu;
@@ -236,6 +236,7 @@ static int expo_object_attr(struct unit_test_state *uts)
        struct expo *exp;
        ulong start_mem;
        char name[100];
+       ofnode node;
        char *data;
        int id;
 
@@ -273,6 +274,11 @@ static int expo_object_attr(struct unit_test_state *uts)
        ut_asserteq(-ENOENT, scene_menu_set_title(scn, OBJ_TEXT2, OBJ_TEXT));
        ut_asserteq(-EINVAL, scene_menu_set_title(scn, OBJ_MENU, OBJ_TEXT2));
 
+       node = ofnode_path("/bootstd/theme");
+       ut_assert(ofnode_valid(node));
+       ut_assertok(expo_apply_theme(exp, node));
+       ut_asserteq(30, txt->font_size);
+
        expo_destroy(exp);
 
        ut_assertok(ut_check_delta(start_mem));