expo: Tidy up insets and improve tests

Insets are handled inconsistently at present, since menus use them to
offset the label text, whereas textlines don't. This is done because
menus need the margin to be visible when opened. However this causes an
alignment issue when menus and textlines appear in the same cedit.

Remove the offsets from menus and compensate by adjusting the bounding
boxes used for highlighting and the opened menu.

Line up menu items and textlines vertically and add a style option for
textlines to control how much padding is added.

Add a test to check the positions of objects in a cedit, since this is
more direct than the rendering tests. Add style information so that the
impact can be seen.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2025-05-05 17:42:57 +02:00
parent 502aa8bc31
commit e27b36c015
10 changed files with 181 additions and 36 deletions

View File

@@ -243,6 +243,7 @@ static int cedit_render(struct unit_test_state *uts)
struct expo_action evt;
struct expo_action act;
struct udevice *dev, *con;
struct expo_theme *theme;
struct stdio_dev *sdev;
struct scene *scn;
struct expo *exp;
@@ -255,6 +256,12 @@ static int cedit_render(struct unit_test_state *uts)
ut_assertnonnull(sdev);
con = sdev->priv;
theme = &exp->theme;
theme->menuitem_gap_y = 2;
theme->menu_inset = 2;
/* theme->menu_title_margin_x is 0 so menu labels shouldn't line up */
theme->textline_label_margin_x = 10;
dev = dev_get_parent(con);
vid_priv = dev_get_uclass_priv(dev);
ut_asserteq(ID_SCENE1, cedit_prepare(exp, dev, &scn));
@@ -264,7 +271,7 @@ static int cedit_render(struct unit_test_state *uts)
ut_asserteq(ID_AC_OFF, menu->cur_item_id);
ut_assertok(expo_render(exp));
ut_asserteq(4929, video_compress_fb(uts, dev, false));
ut_asserteq(4888, video_compress_fb(uts, dev, false));
ut_assertok(video_check_copy_fb(uts, dev));
/* move to the second menu */
@@ -272,54 +279,54 @@ static int cedit_render(struct unit_test_state *uts)
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4986, video_compress_fb(uts, dev, false));
ut_asserteq(4967, video_compress_fb(uts, dev, false));
/* open the menu */
act.type = EXPOACT_OPEN;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5393, video_compress_fb(uts, dev, false));
ut_asserteq(5397, video_compress_fb(uts, dev, false));
/* close the menu */
act.type = EXPOACT_CLOSE;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4986, video_compress_fb(uts, dev, false));
ut_asserteq(4967, video_compress_fb(uts, dev, false));
/* open the menu again to check it looks the same */
act.type = EXPOACT_OPEN;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5393, video_compress_fb(uts, dev, false));
ut_asserteq(5397, video_compress_fb(uts, dev, false));
/* close the menu */
act.type = EXPOACT_CLOSE;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4986, video_compress_fb(uts, dev, false));
ut_asserteq(4967, video_compress_fb(uts, dev, false));
act.type = EXPOACT_OPEN;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5393, video_compress_fb(uts, dev, false));
ut_asserteq(5397, video_compress_fb(uts, dev, false));
act.type = EXPOACT_POINT_ITEM;
act.select.id = ID_AC_ON;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5365, video_compress_fb(uts, dev, false));
ut_asserteq(5341, video_compress_fb(uts, dev, false));
/* select it */
act.type = EXPOACT_SELECT;
act.select.id = ID_AC_ON;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4980, video_compress_fb(uts, dev, false));
ut_asserteq(4939, video_compress_fb(uts, dev, false));
ut_asserteq(ID_AC_ON, menu->cur_item_id);
@@ -328,14 +335,14 @@ static int cedit_render(struct unit_test_state *uts)
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4862, video_compress_fb(uts, dev, false));
ut_asserteq(4850, video_compress_fb(uts, dev, false));
/* open it */
act.type = EXPOACT_OPEN;
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4851, video_compress_fb(uts, dev, false));
ut_asserteq(4883, video_compress_fb(uts, dev, false));
/*
* Send some keypresses. Note that the console must be enabled so that
@@ -351,7 +358,7 @@ static int cedit_render(struct unit_test_state *uts)
ut_silence_console(uts);
ut_assertok(cedit_arange(exp, vid_priv, scn->id));
ut_assertok(expo_render(exp));
ut_asserteq(4996, video_compress_fb(uts, dev, false));
ut_asserteq(5033, video_compress_fb(uts, dev, false));
expo_destroy(exp);
cur_exp = NULL;
@@ -394,7 +401,7 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
ut_asserteq(20, tline->pos);
ut_assertok(expo_render(exp));
ut_asserteq(5336, video_compress_fb(uts, dev, false));
ut_asserteq(5315, video_compress_fb(uts, dev, false));
ut_assertok(video_check_copy_fb(uts, dev));
/* move to the line-edit field */
@@ -402,15 +409,14 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5363, video_compress_fb(uts, dev, false));
ut_asserteq(5372, video_compress_fb(uts, dev, false));
/* open it */
act.type = EXPOACT_OPEN;
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
// ut_asserteq(0, tline->pos);
ut_assertok(expo_render(exp));
ut_asserteq(5283, video_compress_fb(uts, dev, false));
ut_asserteq(5259, video_compress_fb(uts, dev, false));
/* delete some characters */
ut_unsilence_console(uts);
@@ -421,7 +427,7 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
ut_assertok(cedit_arange(exp, vid_priv, scn->id));
ut_assertok(expo_render(exp));
ut_asserteq(5170, video_compress_fb(uts, dev, false));
ut_asserteq(5126, video_compress_fb(uts, dev, false));
expo_destroy(exp);
cur_exp = NULL;
@@ -429,3 +435,115 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
return 0;
}
BOOTSTD_TEST(cedit_render_lineedit, UTF_DM | UTF_SCAN_FDT);
/* Check the cedit is arranged correctly */
static int cedit_position(struct unit_test_state *uts)
{
struct scene_obj_textline *tline;
struct scene_obj_menu *menu;
struct video_priv *vid_priv;
extern struct expo *cur_exp;
const uint label_width = 96;
struct scene_menitem *item;
struct udevice *dev, *con;
struct expo_theme *theme;
struct scene_obj *obj;
struct stdio_dev *sdev;
struct scene *scn;
struct expo *exp;
uint x_offset;
ut_assertok(run_command("cedit load hostfs - cedit.dtb", 0));
exp = cur_exp;
sdev = stdio_get_by_name("vidconsole");
ut_assertnonnull(sdev);
con = sdev->priv;
theme = &exp->theme;
theme->menuitem_gap_y = 2;
theme->menu_inset = 2;
theme->textline_label_margin_x = 10;
theme->menu_title_margin_x = 10;
dev = dev_get_parent(con);
vid_priv = dev_get_uclass_priv(dev);
ut_asserteq(ID_SCENE1, cedit_prepare(exp, dev, &scn));
// expo_dump(exp);
menu = scene_obj_find(scn, ID_CPU_SPEED, SCENEOBJT_MENU);
ut_assertnonnull(menu);
obj = &menu->obj;
ut_asserteq(50, obj->bbox.x0);
ut_asserteq(100, obj->bbox.y0);
ut_asserteq(50 + 160, obj->bbox.x1);
ut_asserteq(18 + 100, obj->bbox.y1);
obj = scene_obj_find(scn, menu->title_id, SCENEOBJT_TEXT);
ut_assertnonnull(obj);
ut_asserteq(50, obj->bbox.x0);
ut_asserteq(100, obj->bbox.y0);
ut_asserteq(50 + 75, obj->bbox.x1);
ut_asserteq(18 + 100, obj->bbox.y1);
item = scene_menuitem_find_seq(menu, 0);
ut_assertnonnull(item);
x_offset = label_width + theme->textline_label_margin_x;
obj = scene_obj_find(scn, item->label_id, SCENEOBJT_TEXT);
ut_assertnonnull(obj);
ut_asserteq(42, obj->dims.x);
ut_asserteq(18, obj->dims.y);
ut_asserteq(0, obj->ofs.xofs);
ut_asserteq(0, obj->ofs.yofs);
ut_asserteq(50 + x_offset, obj->bbox.x0);
ut_asserteq(100, obj->bbox.y0);
ut_asserteq(50 + x_offset + 54, obj->bbox.x1);
ut_asserteq(18 + 100, obj->bbox.y1);
/* all items should have the same, so check them */
item = scene_menuitem_find_seq(menu, 1);
ut_assertnonnull(item);
ut_asserteq(50 + x_offset + 54, obj->bbox.x1);
item = scene_menuitem_find_seq(menu, 2);
ut_assertnonnull(item);
ut_asserteq(50 + x_offset + 54, obj->bbox.x1);
menu = scene_obj_find(scn, ID_POWER_LOSS, SCENEOBJT_MENU);
ut_assertnonnull(menu);
ut_asserteq(ID_AC_OFF, menu->cur_item_id);
obj = &menu->obj;
ut_asserteq(50, obj->bbox.x0);
ut_asserteq(120, obj->bbox.y0);
ut_asserteq(50 + 160, obj->bbox.x1);
ut_asserteq(18 + 120, obj->bbox.y1);
tline = scene_obj_find(scn, ID_MACHINE_NAME, SCENEOBJT_TEXTLINE);
ut_assertnonnull(menu);
obj = &tline->obj;
ut_asserteq(381, obj->dims.x);
ut_asserteq(18, obj->dims.y);
ut_asserteq(50, obj->bbox.x0);
ut_asserteq(140, obj->bbox.y0);
ut_asserteq(50 + 381, obj->bbox.x1);
ut_asserteq(140 + 18, obj->bbox.y1);
obj = scene_obj_find(scn, ID_MACHINE_NAME_EDIT, SCENEOBJT_TEXT);
ut_assertnonnull(obj);
ut_asserteq(275, obj->dims.x);
ut_asserteq(18, obj->dims.y);
ut_asserteq(50 + x_offset, obj->bbox.x0);
ut_asserteq(140, obj->bbox.y0);
ut_asserteq(50 + x_offset + obj->dims.x, obj->bbox.x1);
ut_asserteq(140 + 18, obj->bbox.y1);
return 0;
}
BOOTSTD_TEST(cedit_position, UTF_DM | UTF_SCAN_FDT);