]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
expo: Plumb in textlines to a scene
authorSimon Glass <sjg@chromium.org>
Mon, 2 Oct 2023 01:13:34 +0000 (19:13 -0600)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 19:43:55 +0000 (15:43 -0400)
Provide an implementation for textlines in the scene code, so that they
are displayed correctly. Provide a way to have a border around the
textline, with the internal part being the same colour as the
background. This looks more natural.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/scene.c
boot/scene_internal.h

index 6c7c926f7c933d1f036507b21c03439aafd9b60c..d4dfb49ada157e8b0f499a0b15a72a4bbd4830e1 100644 (file)
@@ -280,6 +280,7 @@ int scene_obj_get_hw(struct scene *scn, uint id, int *widthp)
        switch (obj->type) {
        case SCENEOBJT_NONE:
        case SCENEOBJT_MENU:
+       case SCENEOBJT_TEXTLINE:
                break;
        case SCENEOBJT_IMAGE: {
                struct scene_obj_img *img = (struct scene_obj_img *)obj;
@@ -328,8 +329,10 @@ int scene_obj_get_hw(struct scene *scn, uint id, int *widthp)
  * scene_render_background() - Render the background for an object
  *
  * @obj: Object to render
+ * @box_only: true to show a box around the object, but keep the normal
+ * background colour inside
  */
-static void scene_render_background(struct scene_obj *obj)
+static void scene_render_background(struct scene_obj *obj, bool box_only)
 {
        struct expo *exp = obj->scene->expo;
        const struct expo_theme *theme = &exp->theme;
@@ -360,6 +363,11 @@ static void scene_render_background(struct scene_obj *obj)
                        label_bbox.x1 + inset, label_bbox.y1 + inset,
                        vid_priv->colour_fg);
        vidconsole_pop_colour(cons, &old);
+       if (box_only) {
+               video_fill_part(dev, label_bbox.x0, label_bbox.y0,
+                               label_bbox.x1, label_bbox.y1,
+                               vid_priv->colour_bg);
+       }
 }
 
 /**
@@ -445,7 +453,7 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
                                return -ENOTSUPP;
 
                        /* draw a background behind the menu items */
-                       scene_render_background(obj);
+                       scene_render_background(obj, false);
                }
                /*
                 * With a vidconsole, the text and item pointer are rendered as
@@ -461,6 +469,10 @@ static int scene_obj_render(struct scene_obj *obj, bool text_mode)
 
                break;
        }
+       case SCENEOBJT_TEXTLINE:
+               if (obj->flags & SCENEOF_OPEN)
+                       scene_render_background(obj, true);
+               break;
        }
 
        return 0;
@@ -486,6 +498,15 @@ int scene_arrange(struct scene *scn)
                                return log_msg_ret("arr", ret);
                        break;
                }
+               case SCENEOBJT_TEXTLINE: {
+                       struct scene_obj_textline *tline;
+
+                       tline = (struct scene_obj_textline *)obj,
+                       ret = scene_textline_arrange(scn, tline);
+                       if (ret)
+                               return log_msg_ret("arr", ret);
+                       break;
+               }
                }
        }
 
@@ -517,6 +538,10 @@ int scene_render_deps(struct scene *scn, uint id)
                        scene_menu_render_deps(scn,
                                               (struct scene_obj_menu *)obj);
                        break;
+               case SCENEOBJT_TEXTLINE:
+                       scene_textline_render_deps(scn,
+                                       (struct scene_obj_textline *)obj);
+                       break;
                }
        }
 
@@ -637,6 +662,15 @@ int scene_send_key(struct scene *scn, int key, struct expo_action *event)
                                return log_msg_ret("key", ret);
                        break;
                }
+               case SCENEOBJT_TEXTLINE: {
+                       struct scene_obj_textline *tline;
+
+                       tline = (struct scene_obj_textline *)obj,
+                       ret = scene_textline_send_key(scn, tline, key, event);
+                       if (ret)
+                               return log_msg_ret("key", ret);
+                       break;
+               }
                }
                return 0;
        }
@@ -670,6 +704,13 @@ int scene_obj_calc_bbox(struct scene_obj *obj, struct vidconsole_bbox *bbox,
                scene_menu_calc_bbox(menu, bbox, label_bbox);
                break;
        }
+       case SCENEOBJT_TEXTLINE: {
+               struct scene_obj_textline *tline;
+
+               tline = (struct scene_obj_textline *)obj;
+               scene_textline_calc_bbox(tline, bbox, label_bbox);
+               break;
+       }
        }
 
        return 0;
@@ -708,6 +749,16 @@ int scene_calc_dims(struct scene *scn, bool do_menus)
                        }
                        break;
                }
+               case SCENEOBJT_TEXTLINE: {
+                       struct scene_obj_textline *tline;
+
+                       tline = (struct scene_obj_textline *)obj;
+                       ret = scene_textline_calc_dims(tline);
+                       if (ret)
+                               return log_msg_ret("men", ret);
+
+                       break;
+               }
                }
        }
 
@@ -727,6 +778,7 @@ int scene_apply_theme(struct scene *scn, struct expo_theme *theme)
                case SCENEOBJT_NONE:
                case SCENEOBJT_IMAGE:
                case SCENEOBJT_MENU:
+               case SCENEOBJT_TEXTLINE:
                        break;
                case SCENEOBJT_TEXT:
                        scene_txt_set_font(scn, obj->id, NULL,
index 7a84977646a00a6fc9d94ef29e7805a8f3c675fa..e72202c98213f75555cf81ed1f4667f92b93448e 100644 (file)
@@ -101,6 +101,18 @@ int scene_calc_dims(struct scene *scn, bool do_menus);
  */
 int scene_menu_arrange(struct scene *scn, struct scene_obj_menu *menu);
 
+/**
+ * scene_textline_arrange() - Set the position of things in a textline
+ *
+ * This updates any items associated with a textline to make sure they are
+ * positioned correctly relative to the textline.
+ *
+ * @scn: Scene to update
+ * @tline: textline to process
+ * Returns: 0 if OK, -ve on error
+ */
+int scene_textline_arrange(struct scene *scn, struct scene_obj_textline *tline);
+
 /**
  * scene_apply_theme() - Apply a theme to a scene
  *
@@ -123,6 +135,18 @@ int scene_apply_theme(struct scene *scn, struct expo_theme *theme);
 int scene_menu_send_key(struct scene *scn, struct scene_obj_menu *menu, int key,
                        struct expo_action *event);
 
+/**
+ * scene_textline_send_key() - Send a key to a textline for processing
+ *
+ * @scn: Scene to use
+ * @tline: textline to use
+ * @key: Key code to send (KEY_...)
+ * @event: Place to put any event which is generated by the key
+ * Returns: 0 if OK (always)
+ */
+int scene_textline_send_key(struct scene *scn, struct scene_obj_textline *tline,
+                           int key, struct expo_action *event);
+
 /**
  * scene_menu_destroy() - Destroy a menu in a scene
  *
@@ -185,6 +209,18 @@ int scene_render_deps(struct scene *scn, uint id);
  */
 int scene_menu_render_deps(struct scene *scn, struct scene_obj_menu *menu);
 
+/**
+ * scene_textline_render_deps() - Render a textline and its dependencies
+ *
+ * Renders the textline and all of its attached objects
+ *
+ * @scn: Scene to render
+ * @tline: textline to render
+ * Returns: 0 if OK, -ve on error
+ */
+int scene_textline_render_deps(struct scene *scn,
+                              struct scene_obj_textline *tline);
+
 /**
  * scene_menu_calc_dims() - Calculate the dimensions of a menu
  *
@@ -255,6 +291,16 @@ struct scene_menitem *scene_menuitem_find_seq(const struct scene_obj_menu *menu,
 int scene_bbox_union(struct scene *scn, uint id, int inset,
                     struct vidconsole_bbox *bbox);
 
+/**
+ * scene_textline_calc_dims() - Calculate the dimensions of a textline
+ *
+ * Updates the width and height of the textline based on its contents
+ *
+ * @tline: Textline to update
+ * Returns 0 if OK, -ENOTSUPP if there is no graphical console
+ */
+int scene_textline_calc_dims(struct scene_obj_textline *tline);
+
 /**
  * scene_menu_calc_bbox() - Calculate bounding boxes for the menu
  *
@@ -267,6 +313,18 @@ void scene_menu_calc_bbox(struct scene_obj_menu *menu,
                          struct vidconsole_bbox *bbox,
                          struct vidconsole_bbox *label_bbox);
 
+/**
+ * scene_textline_calc_bbox() - Calculate bounding box for the textline
+ *
+ * @textline: Menu to process
+ * @bbox: Returns bounding box of textline including prompt
+ * @edit_bbox: Returns bounding box of editable part
+ * Return: 0 if OK, -ve on error
+ */
+void scene_textline_calc_bbox(struct scene_obj_textline *menu,
+                             struct vidconsole_bbox *bbox,
+                             struct vidconsole_bbox *label_bbox);
+
 /**
  * scene_obj_calc_bbox() - Calculate bounding boxes for an object
  *