A menu's dimensions are currently only used for positioning the
component parts of the menu, i.e. the label, key, description and
preview.

Move the logic for this entirely into the scene_menu file and drop the
logic at the top level.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 boot/scene.c          | 12 +-------
 boot/scene_internal.h | 10 -------
 boot/scene_menu.c     | 65 ++++++++++++++++++++++++-------------------
 3 files changed, 38 insertions(+), 49 deletions(-)

diff --git a/boot/scene.c b/boot/scene.c
index 258161f27ce..9c1eae3d52b 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -1043,18 +1043,8 @@ int scene_calc_dims(struct scene *scn)
                                }
                                break;
                        }
-                       case SCENEOBJT_MENU: {
-                               struct scene_obj_menu *menu;
-
-                               if (do_menus) {
-                                       menu = (struct scene_obj_menu *)obj;
-
-                                       ret = scene_menu_calc_dims(menu);
-                                       if (ret)
-                                               return log_msg_ret("men", ret);
-                               }
+                       case SCENEOBJT_MENU:
                                break;
-                       }
                        case SCENEOBJT_TEXTLINE: {
                                struct scene_obj_textline *tline;
 
diff --git a/boot/scene_internal.h b/boot/scene_internal.h
index f9b30caa208..cca7c18e9f5 100644
--- a/boot/scene_internal.h
+++ b/boot/scene_internal.h
@@ -259,16 +259,6 @@ int scene_menu_render_deps(struct scene *scn, struct 
scene_obj_menu *menu);
 int scene_textline_render_deps(struct scene *scn,
                               struct scene_obj_textline *tline);
 
-/**
- * scene_menu_calc_dims() - Calculate the dimensions of a menu
- *
- * Updates the width and height of the menu based on its contents
- *
- * @menu: Menu to update
- * Returns 0 if OK, -ENOTSUPP if there is no graphical console
- */
-int scene_menu_calc_dims(struct scene_obj_menu *menu);
-
 /**
  * scene_iter_objs() - Iterate through all scene objects
  *
diff --git a/boot/scene_menu.c b/boot/scene_menu.c
index 3f988657e00..c2abf1e3926 100644
--- a/boot/scene_menu.c
+++ b/boot/scene_menu.c
@@ -192,45 +192,37 @@ void scene_menu_calc_bbox(struct scene_obj_menu *menu,
        bbox[SCENEBB_label].y1 -= theme->menuitem_gap_y;
 }
 
-int scene_menu_calc_dims(struct scene_obj_menu *menu)
+static void scene_menu_calc_dims(struct scene *scn, struct scene_obj_menu 
*menu,
+                                struct scene_obj_dims *dims)
 {
-       struct vidconsole_bbox bbox[SCENEBB_count], *cur;
        const struct scene_menitem *item;
 
-       scene_menu_calc_bbox(menu, bbox);
-
-       /* Make all field types the same width */
        list_for_each_entry(item, &menu->item_head, sibling) {
-               cur = &bbox[SCENEBB_label];
-               if (cur->valid)
-                       scene_obj_set_width(menu->obj.scene, item->label_id,
-                                           cur->x1 - cur->x0);
-               cur = &bbox[SCENEBB_key];
-               if (cur->valid)
-                       scene_obj_set_width(menu->obj.scene, item->key_id,
-                                           cur->x1 - cur->x0);
-               cur = &bbox[SCENEBB_desc];
-               if (cur->valid)
-                       scene_obj_set_width(menu->obj.scene, item->desc_id,
-                                           cur->x1 - cur->x0);
-       }
-
-       cur = &bbox[SCENEBB_all];
-       if (cur->valid) {
-               menu->obj.dims.x = cur->x1 - cur->x0;
-               menu->obj.dims.y = cur->y1 - cur->y0;
-
-               menu->obj.bbox.x1 = cur->x1;
-               menu->obj.bbox.y1 = cur->y1;
+               struct scene_obj_dims local;
+
+               local.x = 0;
+               local.y = 0;
+               scene_dims_union(menu->obj.scene, item->label_id, &local);
+               scene_dims_union(menu->obj.scene, item->key_id, &local);
+               scene_dims_union(menu->obj.scene, item->desc_id, &local);
+               scene_dims_union(menu->obj.scene, item->preview_id, &local);
+               scene_dims_join(&local, &dims[SCENEBB_all]);
+
+               /* Get the dimensions all individual fields */
+               scene_dims_union(menu->obj.scene, item->label_id,
+                                &dims[SCENEBB_label]);
+               scene_dims_union(menu->obj.scene, item->key_id,
+                                &dims[SCENEBB_key]);
+               scene_dims_union(menu->obj.scene, item->desc_id,
+                                &dims[SCENEBB_desc]);
        }
-
-       return 0;
 }
 
 int scene_menu_arrange(struct scene *scn, struct expo_arrange_info *arr,
                       struct scene_obj_menu *menu)
 {
        const bool open = menu->obj.flags & SCENEOF_OPEN;
+       struct scene_obj_dims dims[SCENEBB_count];
        struct expo *exp = scn->expo;
        const bool stack = exp->popup;
        const struct expo_theme *theme = &exp->theme;
@@ -239,6 +231,12 @@ int scene_menu_arrange(struct scene *scn, struct 
expo_arrange_info *arr,
        int x, y;
        int ret;
 
+       menu->obj.dims.x = 0;
+       menu->obj.dims.y = 0;
+
+       memset(dims, '\0', sizeof(dims));
+       scene_menu_calc_dims(scn, menu, dims);
+
        x = menu->obj.bbox.x0;
        y = menu->obj.bbox.y0;
        if (menu->title_id) {
@@ -327,12 +325,23 @@ int scene_menu_arrange(struct scene *scn, struct 
expo_arrange_info *arr,
                                return log_msg_ret("hid", ret);
                }
 
+               menu->obj.dims.x = 160;
                if (!stack || open)
                        y += height + theme->menuitem_gap_y;
        }
 
+       list_for_each_entry(item, &menu->item_head, sibling) {
+               scene_obj_set_width(menu->obj.scene, item->label_id,
+                                   dims[SCENEBB_label].x + theme->menu_inset);
+               scene_obj_set_width(menu->obj.scene, item->key_id,
+                                   dims[SCENEBB_key].x + theme->menu_inset);
+               scene_obj_set_width(menu->obj.scene, item->desc_id,
+                                   dims[SCENEBB_desc].x + theme->menu_inset);
+       }
+
        if (sel_id)
                menu_point_to_item(menu, sel_id);
+       menu->obj.dims.y = dims[SCENEBB_all].y;
        menu->obj.bbox.x1 = menu->obj.bbox.x0 + menu->obj.dims.x;
        menu->obj.bbox.y1 = menu->obj.bbox.y0 + menu->obj.dims.y;
        menu->obj.flags |= SCENEOF_SIZE_VALID;
-- 
2.43.0

Reply via email to