From 0c899bb62bbeb6cbe003aa904d55116703dcdec8 Mon Sep 17 00:00:00 2001 From: Andy Everitt <38423143+AndyEveritt@users.noreply.github.com> Date: Tue, 24 Feb 2026 07:44:33 +0000 Subject: [PATCH] feat(dropdown): Support `LV_SIZE_CONTENT` and fix layout nested invalidation (#9307) Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- src/core/lv_obj.c | 4 +- src/core/lv_obj_pos.c | 35 ++++- src/core/lv_obj_pos.h | 16 +++ src/widgets/dropdown/lv_dropdown.c | 120 +++++++++++++++--- src/widgets/label/lv_label.c | 11 +- .../widgets/dropdown_content_size_1.png | Bin 0 -> 2011 bytes .../widgets/dropdown_content_size_1_open.png | Bin 0 -> 2950 bytes .../widgets/dropdown_content_size_2.png | Bin 0 -> 3231 bytes .../widgets/dropdown_content_size_3.png | Bin 0 -> 3317 bytes ...j_pos_chained_layout_invalidation_post.png | Bin 0 -> 3296 bytes ...bj_pos_chained_layout_invalidation_pre.png | Bin 0 -> 2812 bytes .../widgets/dropdown_content_size_1.png | Bin 0 -> 2021 bytes .../widgets/dropdown_content_size_1_open.png | Bin 0 -> 3039 bytes .../widgets/dropdown_content_size_2.png | Bin 0 -> 3329 bytes .../widgets/dropdown_content_size_3.png | Bin 0 -> 3410 bytes ...j_pos_chained_layout_invalidation_post.png | Bin 0 -> 3766 bytes ...bj_pos_chained_layout_invalidation_pre.png | Bin 0 -> 3291 bytes tests/src/test_cases/widgets/test_dropdown.c | 17 +++ tests/src/test_cases/widgets/test_obj_pos.c | 43 +++++-- 19 files changed, 213 insertions(+), 33 deletions(-) create mode 100644 tests/ref_imgs/widgets/dropdown_content_size_1.png create mode 100644 tests/ref_imgs/widgets/dropdown_content_size_1_open.png create mode 100644 tests/ref_imgs/widgets/dropdown_content_size_2.png create mode 100644 tests/ref_imgs/widgets/dropdown_content_size_3.png create mode 100644 tests/ref_imgs/widgets/obj_pos_chained_layout_invalidation_post.png create mode 100644 tests/ref_imgs/widgets/obj_pos_chained_layout_invalidation_pre.png create mode 100644 tests/ref_imgs_vg_lite/widgets/dropdown_content_size_1.png create mode 100644 tests/ref_imgs_vg_lite/widgets/dropdown_content_size_1_open.png create mode 100644 tests/ref_imgs_vg_lite/widgets/dropdown_content_size_2.png create mode 100644 tests/ref_imgs_vg_lite/widgets/dropdown_content_size_3.png create mode 100644 tests/ref_imgs_vg_lite/widgets/obj_pos_chained_layout_invalidation_post.png create mode 100644 tests/ref_imgs_vg_lite/widgets/obj_pos_chained_layout_invalidation_pre.png diff --git a/src/core/lv_obj.c b/src/core/lv_obj.c index 3ba67b92f3..115c7f6844 100644 --- a/src/core/lv_obj.c +++ b/src/core/lv_obj.c @@ -1035,11 +1035,9 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) } } else if(code == LV_EVENT_CHILD_CHANGED) { - int32_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); - int32_t h = lv_obj_get_style_height(obj, LV_PART_MAIN); int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); - if(layout || align || w == LV_SIZE_CONTENT || h == LV_SIZE_CONTENT) { + if(layout || align || lv_obj_is_style_any_width_content(obj) || lv_obj_is_style_any_height_content(obj)) { lv_obj_mark_layout_as_dirty(obj); } } diff --git a/src/core/lv_obj_pos.c b/src/core/lv_obj_pos.c index 177b0fb5ba..4f3847e45d 100644 --- a/src/core/lv_obj_pos.c +++ b/src/core/lv_obj_pos.c @@ -728,6 +728,26 @@ int32_t lv_obj_get_style_clamped_height(lv_obj_t * obj) return h; } +bool lv_obj_is_style_any_width_content(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); + int32_t minw = lv_obj_get_style_min_width(obj, LV_PART_MAIN); + int32_t maxw = lv_obj_get_style_max_width(obj, LV_PART_MAIN); + return (w == LV_SIZE_CONTENT || minw == LV_SIZE_CONTENT || maxw == LV_SIZE_CONTENT); +} + +bool lv_obj_is_style_any_height_content(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t h = lv_obj_get_style_height(obj, LV_PART_MAIN); + int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_MAIN); + int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_MAIN); + return (h == LV_SIZE_CONTENT || minh == LV_SIZE_CONTENT || maxh == LV_SIZE_CONTENT); +} + bool lv_obj_is_width_min(lv_obj_t * obj) { LV_ASSERT_OBJ(obj, MY_CLASS); @@ -766,10 +786,19 @@ bool lv_obj_is_height_max(lv_obj_t * obj) bool lv_obj_refresh_self_size(lv_obj_t * obj) { - int32_t w_set = lv_obj_get_style_width(obj, LV_PART_MAIN); - int32_t h_set = lv_obj_get_style_height(obj, LV_PART_MAIN); - if(w_set != LV_SIZE_CONTENT && h_set != LV_SIZE_CONTENT) return false; + if(!lv_obj_is_style_any_width_content(obj) && !lv_obj_is_style_any_height_content(obj)) + return false; + /** + * Refresh the parent's layout, because the childs size is in some way dependent on its contents we need to force a + * recalculation of the parents layout + */ + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent != NULL) { + parent->w_layout = 0; + parent->h_layout = 0; + lv_obj_mark_layout_as_dirty(parent); + } lv_obj_mark_layout_as_dirty(obj); return true; } diff --git a/src/core/lv_obj_pos.h b/src/core/lv_obj_pos.h index c3913e10c4..9b9f3fe92e 100644 --- a/src/core/lv_obj_pos.h +++ b/src/core/lv_obj_pos.h @@ -362,6 +362,22 @@ int32_t lv_obj_get_style_clamped_width(lv_obj_t * obj); */ int32_t lv_obj_get_style_clamped_height(lv_obj_t * obj); +/** + * Determine if any of the object's width style properties are set to `LV_SIZE_CONTENT`. + * @param obj Pointer to a valid object. + * @return `true` At least one of the following width style properties is `LV_SIZE_CONTENT`: `LV_STYLE_WIDTH`, `LV_STYLE_MIN_WIDTH`, `LV_STYLE_MAX_WIDTH`. + * @return `false` No width style properties are `LV_SIZE_CONTENT`. + */ +bool lv_obj_is_style_any_width_content(lv_obj_t * obj); + +/** + * Determine if any of the object's height style properties are set to `LV_SIZE_CONTENT`. + * @param obj Pointer to a valid object. + * @return `true` At least one of the following height style properties is `LV_SIZE_CONTENT`: `LV_STYLE_HEIGHT`, `LV_STYLE_MIN_HEIGHT`, `LV_STYLE_MAX_HEIGHT`. + * @return `false` No height style properties are `LV_SIZE_CONTENT`. + */ +bool lv_obj_is_style_any_height_content(lv_obj_t * obj); + /** * @brief Determine if the object's resolved width was limited by its minimum width constraint. * diff --git a/src/widgets/dropdown/lv_dropdown.c b/src/widgets/dropdown/lv_dropdown.c index 2c7ddb09b5..d08e1f46d9 100644 --- a/src/widgets/dropdown/lv_dropdown.c +++ b/src/widgets/dropdown/lv_dropdown.c @@ -45,6 +45,7 @@ static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * o static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e); static void draw_main(lv_event_t * e); +static void refresh_size(lv_obj_t * obj); static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj); @@ -165,6 +166,9 @@ void lv_dropdown_set_text(lv_obj_t * obj, const char * text) { LV_ASSERT_OBJ(obj, MY_CLASS); lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(!dropdown->static_text && dropdown->text && text && lv_strcmp(dropdown->text, text) == 0) { + return; + } char * copied_text = NULL; if(text) { @@ -184,11 +188,16 @@ void lv_dropdown_set_text_static(lv_obj_t * obj, const char * text) LV_ASSERT_OBJ(obj, MY_CLASS); lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - if(!dropdown->static_text) lv_free(dropdown->text); + if(dropdown->static_text && dropdown->text && text && lv_strcmp(dropdown->text, text) == 0) { + return; + } + + if(!dropdown->static_text) + lv_free(dropdown->text); dropdown->static_text = 1; dropdown->text = (char *)text; - lv_obj_invalidate(obj); + refresh_size(obj); } void lv_dropdown_set_options(lv_obj_t * obj, const char * options) @@ -234,8 +243,9 @@ void lv_dropdown_set_options(lv_obj_t * obj, const char * options) /*Now the text is dynamically allocated*/ dropdown->static_options = 0; - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); + refresh_size(obj); + if(dropdown->list) + lv_obj_invalidate(dropdown->list); } void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options) @@ -263,8 +273,9 @@ void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options) dropdown->static_options = 1; dropdown->options = (char *)options; - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); + refresh_size(obj); + if(dropdown->list) + lv_obj_invalidate(dropdown->list); } void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) @@ -335,8 +346,9 @@ void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) dropdown->option_cnt++; - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); + refresh_size(obj); + if(dropdown->list) + lv_obj_invalidate(dropdown->list); } void lv_dropdown_clear_options(lv_obj_t * obj) @@ -352,8 +364,9 @@ void lv_dropdown_clear_options(lv_obj_t * obj) dropdown->static_options = 1; dropdown->option_cnt = 0; - lv_obj_invalidate(obj); - if(dropdown->list) lv_obj_invalidate(dropdown->list); + refresh_size(obj); + if(dropdown->list) + lv_obj_invalidate(dropdown->list); } void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt) @@ -370,7 +383,7 @@ void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt) position_to_selected(obj, LV_ANIM_OFF); } - lv_obj_invalidate(obj); + refresh_size(obj); } void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir) @@ -391,7 +404,7 @@ void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol) lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; dropdown->symbol = symbol; - lv_obj_invalidate(obj); + refresh_size(obj); } void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en) @@ -795,7 +808,11 @@ static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) } else if(code == LV_EVENT_RELEASED) { res = btn_release_handler(obj); - if(res != LV_RESULT_OK) return; + if(res != LV_RESULT_OK) + return; + } + else if(code == LV_EVENT_VALUE_CHANGED) { + refresh_size(obj); } else if(code == LV_EVENT_STYLE_CHANGED) { lv_obj_refresh_self_size(obj); @@ -804,9 +821,73 @@ static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_obj_refresh_self_size(obj); } else if(code == LV_EVENT_GET_SELF_SIZE) { - lv_point_t * p = lv_event_get_param(e); const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); - p->y = lv_font_get_line_height(font); + + lv_point_t size; + size.x = 0; + size.y = 0; + + /* Calculate the symbol width */ + int32_t symbol_w = 0; + if(dropdown->symbol) { + lv_draw_label_dsc_t symbol_dsc; + lv_draw_label_dsc_init(&symbol_dsc); + + lv_image_src_t symbol_type = lv_image_src_get_type(dropdown->symbol); + if(symbol_type == LV_IMAGE_SRC_SYMBOL) { + lv_point_t text_size; + + lv_text_get_size(&text_size, + dropdown->symbol, + symbol_dsc.font, + symbol_dsc.letter_space, + symbol_dsc.line_space, + LV_COORD_MAX, + symbol_dsc.flag); + symbol_w = text_size.x; + } + else { + lv_image_header_t header; + lv_result_t decoder_res = lv_image_decoder_get_info(dropdown->symbol, &header); + if(decoder_res == LV_RESULT_OK) { + symbol_w = header.w; + } + else { + symbol_w = 0; + } + } + size.x += symbol_w; + size.x += lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + } + + /* Calculate the text width */ + const char * opt_txt; + char buf[128]; + if(dropdown->text) + opt_txt = dropdown->text; + else { + lv_dropdown_get_selected_str(obj, buf, 128); + opt_txt = buf; + } + + if(opt_txt == NULL) { + size.y = LV_MAX(size.y, lv_font_get_line_height(font)); + } + else { + lv_draw_label_dsc_t dsc; + lv_draw_label_dsc_init(&dsc); + + lv_point_t text_size; + int32_t max_width = lv_obj_calc_dynamic_width(obj, LV_STYLE_MAX_WIDTH) - size.x; + lv_text_get_size(&text_size, opt_txt, font, dsc.letter_space, dsc.line_space, max_width, dsc.flag); + + size.x += text_size.x; + size.y = LV_MAX(size.y, text_size.y); + } + + lv_point_t * p = lv_event_get_param(e); + p->x = LV_MAX(p->x, size.x); + p->y = LV_MAX(p->y, size.y); } else if(code == LV_EVENT_KEY) { uint32_t c = lv_event_get_key(e); @@ -839,7 +920,8 @@ static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) lv_obj_t * indev_obj = lv_indev_get_active_obj(); if(indev_obj != obj) { res = btn_release_handler(obj); - if(res != LV_RESULT_OK) return; + if(res != LV_RESULT_OK) + return; } } } @@ -1032,6 +1114,12 @@ static void draw_main(lv_event_t * e) lv_draw_label(layer, &label_dsc, &txt_area); } +static void refresh_size(lv_obj_t * obj) +{ + lv_obj_invalidate(obj); + lv_obj_refresh_self_size(obj); +} + static void draw_list(lv_event_t * e) { lv_obj_t * list_obj = lv_event_get_current_target(e); diff --git a/src/widgets/label/lv_label.c b/src/widgets/label/lv_label.c index d550043c5e..0a25fc86ad 100644 --- a/src/widgets/label/lv_label.c +++ b/src/widgets/label/lv_label.c @@ -1063,7 +1063,16 @@ static void lv_label_mark_need_refr_text(lv_obj_t * obj) label->invalid_size_cache = true; lv_obj_invalidate(obj); - lv_obj_refresh_self_size(obj); + + /** + * Ideally we would use `lv_obj_refresh_self_size(obj);` here but it can cause an infinite loop due to the way label + * self size is implemented. + * The implementation should be revisited in the future since it currently doesn't handle fixed height, content + * width in all scenarios properly. + * Once that is fixed we should be able to use `lv_obj_refresh_self_size(obj);` here. + */ + if(lv_obj_is_style_any_height_content(obj) || lv_obj_is_style_any_width_content(obj)) + lv_obj_mark_layout_as_dirty(obj); if(!label->need_refr_text) { label->need_refr_text = true; diff --git a/tests/ref_imgs/widgets/dropdown_content_size_1.png b/tests/ref_imgs/widgets/dropdown_content_size_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a0835d40466728bd79bc904ae7a11a0b80f9e099 GIT binary patch literal 2011 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U|;0v;uuoF_~xo%hIF{Z zfsgOy49lB-l*mmwYx&~MtTPi8OV;ofx?P{KW*JNW*$F9IxYr)vvLw#bL~gaym5s8m z`j#%4=Pi;SDKlTVr2XJ4Yx7mA4{HMctn=^q&!2OD?#1J^3+(kP)R*qDc-bj@FhpYK zOqL(zVjhKWR`h*0UhaH9n=x-n;Cpx^_DsOVV|JMJ+1MACwS+1>pUoClH z>w~3Bo|n({pT+$@X6@B{o6~u@Q~y`*sy5iYFH8RJ3j5#BUf2G9vc8cqd;ih3n>owB zvCl7mGVA@-hSSn^j;}Ud-~T5wKl}58d3!5%?7b9I^XE$3+ilmM&s%fm--pi++_yc- z*=ggPBkz0vG{d@B$z9%N^4q0*mwqz(7nt%cPyOv1yU0nc6~BvrubAo)H2vqo{v~Ul z=Ioq0tybqp99u!|50;5n?_ckiyIYgDUg}$V9A8TOsW`jI;@hS_S;U!ndY-6f%``rwo5_~E9e%@WI6IWyK z$NpHv$k zU{t<5sZ^H#Z5k*=^t6~(zWv5yS);r4!uO;G?t|77x5pY5K6#-X`{d@zE9-vU<1Sdl z=g7|xNN?{AL5>9qXikHt8k$KQ zl=wNj)@m6eLqns&ll!HzckVnn$o!v!$x(o#$w7dnNkM?6QGtWSQDJBaO-MX$Co9Cj zaKJ&})%_~oymz7{4fBVnUl1`d)AHNP1;FBzr77V5HM1N0%`Y(82@Tmeg81uD&V=Oo ze4M~4LW1pU{$IA>=@%F)hHk=xdP?)et>w&$Ku@tb{kvvd(GY9NGJj}fB#9LU+kfw| SyZH&|cm_{bKbLh*2~7YB7<>o- literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/dropdown_content_size_1_open.png b/tests/ref_imgs/widgets/dropdown_content_size_1_open.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b040e08f57740f0fb6b2b54d39f46120d0317f GIT binary patch literal 2950 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 P-Z~d+jk97L_ND#`2eajH literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/dropdown_content_size_2.png b/tests/ref_imgs/widgets/dropdown_content_size_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c41e151cc54712861c35d559d66b32432e271673 GIT binary patch literal 3231 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/dropdown_content_size_3.png b/tests/ref_imgs/widgets/dropdown_content_size_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3860154f5aad30ad9c66c31808d97a04dce78ad0 GIT binary patch literal 3317 zcmbtWdpK0<8XwcLO>QlA8Y(sRX4)#3E}{uFZkcu_p^-g|OC}{zp%@ItrLj{cDuuBN zBN+`fB$w2=n^?hMn@}*ASRY~&G~(X5SOvWTEKl2*&dtqDOiT<95BK-?_x1G&g~HL% z(Sd=1si~=jg@yI?_4)aEB9Z9s?yjPuLZ{OW4Gqi6$}B7_SS*&mzrU82)}u#{a&vPh zCnrCB`lRw`rfgs-w`<8Tb>>n1Lf_O1@zorwW%1MK@}y{$UMcc_Kkxo_UMp$ZB6AkK zqc<1^lh(nRU~T-w#vg{preHu*+skH7PjMmO!usx@s1&%7kLYgK+ivTK3RNa!vxwn{ zl&zxAoB8Ok!284pRyz;q$^YtQumCHe<8cWScMl(x3&MFBcIY?6oX2Dtm1_g~Wf1}* zCc`DLC?;%H3f6_@Pb~IFsmD^qoSJujQB}4&i}ztr#hvPQs^4$O_+_&)%TcW3pd717 zNkNTezN8SMVXUfr)|sBRF$@B<5ZGUtI-0aEQUDfSwE=`MC6z6y?(B}O4nr}i&f`Ikvq!leU+fdT{kqeJ zj=1{zu2BN#S&1?ZZlMqi0qC!7s|}_}k(XoV3}`a>g@U$r0iWb zP#*^$&T0zct>$@?8;Ao{8tp1y+1~Ag+}pfi7y68`F*xs%0Ako=gi-fW zOu)@MC?=ObotA!6H*c9qU=QzV`lLO$%yxM&A92+2M}f1iar^AQzfTZ_vMXb8?v|X) z=_kY+J|0XU?a1)Oa>|LyW%a1*p0Crw%;Z&bS3)=p)%7s!PkC(_|OQ{ z{8o{^GblAEEYnRVa-RVwy)w$z?x;v0|A77QzUmBO`V&+^I1Mte{}@z? z4JIWeZ7c3QJcoSmfw`N_gYbJz*)WeMo0w^b_SQzpZa4{amr;hKytV2o{KK25s1nwN zy_LFW_d{OgVoFc4ig0jB?cJ)=jGi$bw^zCCJw73+Pr@%kFC|F6qKUZ0Fs$r)@I8~N zu-P|ZXPn(=A7rMEl^4Cfa832mXWuFHKsjdY;V!w$H-1`*{d{XmN$p_5B@2+&jC3>vOcl+%&mJc=97>}Po7E(+iPlcap4xQj zdIg3X=s9dyHzQ38VdkLe&-)WmH^J~?lsF(3;B3n9W)BH95e56|_=$%=U_6wJrD$e( zS{P!m-TqBuv0Yc<$XAYy(jgUIB;Y~jjw2Sj+f=V8urWnPjyj*#Qoatw`}jMm2u2He zegcHS|J!nu*DhpxJZKR-(_YC-oDilfV#NVdOX}=e_SCNncTdUk3+wqMjnenfdu~V1 z7}g*G8teoN3qwH#2O$^)3IPK^00u|EVPb$-2<-2t`_R~=&bj=rj_+%X6S3fw;z!#4 z@+C|W_vnbXi1);EduAI51RjW{nUu;@nl7kf*YrW)w9D3VJB?Lrc!Acov#I4q=7+Ix z+qZQTUM&*eqseGZ&i-T2WMn2m2$Fe@?+vcnq0& zfUatAFHHe?5K$%N;H&geV2KKsUiv7LS}-*x%PS40<{}6Ba zcJ3{bi>{b4%s+*EwqLSE=BZ|qIi*!P!U`lm$#V2jcK;T+#JSvjtr*fK;Q-<_pdgqpem@-aF>>&(%k<9 zR#QxJpl_k#a+k#c0izGnb?;#TyoyzrToE4YKv6qCaB87lX0Ub2m$rFwhP`I zsgzcUtIg@pUO=I?DIo=7CN3%5;b=7!;<4ZmV5j%1*XXgG5XVLi0Z|uAu8lzb5vcFK z4O;Mb#JTY8xD+53_doCn4Rm@;Dy?bIlhf5*Zsm`Iv=CgSc)vzXD$vP_i|b;(>Z4@Z z8I9wKE`gAe~gs(8V#iNxKgk&`fKa ztyViGixP}l1uTLCOTTy5mNATbyKJ3Jz52Z_oOR>8uiMY7@`J(_?^RC(TsNj-h1?mdn5X z+#^3D6#NT?e2QUDP4bi9Gkt$#_F0Tm=|10q8SZu+8yt3N?6pDBEr+%_@=0H$M^VkU zWaEKGGrn47&x?_<9uVlRe}Fo8<@)}Z;onE(8ZM=nS>?va-pGh1xI zVE5!%k4!>W6HiYC)z32ygyBw*XQ1_(DVa{Pb`@`D*BL)izp$5d&VqWItp76eu6}

WQ(x2+y1|5d4!TB=@ zlzWmX8cMy)!Wd4k4E6(4QGAh%*DrX%!R1?QaPb*!=MgetI8l)n@;>6W>bj^;X@R#^am*xH>bS@H zOy5yPWbwP;4*d8Zg27c8>WZj$eY}~s8Fl~x!?tkOA7w}A!{w9Iot=-i%)PWWaA4jx z;ZV{Jrr+7Pq<{a@E#gW@9NgF+w(|0QfX(+K{kb!zBW#lr)C<9`we=e8{XfypPw+xF jAVN^VUlo4H_)atq%(K9L*Rw4|; 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 TTh{{Ktk31-u;0F7k3aoi+G&SQ literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/dropdown_content_size_1.png b/tests/ref_imgs_vg_lite/widgets/dropdown_content_size_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac062205b39fe29f3867e14b106071d905b8051 GIT binary patch literal 2021 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U|-|u;uuoF_~xp8hIG0_ z!^iJ-ulrq7WKCMiCNj;{J(1^Vm0b{)ePNwrG1Iv<4z|@B!b=0LWnH-AWV>D9yy{M$ zNSUDFRl_&Z&n%_t^uU7ul%5fh^b3zG&1 zOF)h8gtXgVXESOiXim6%H{ISYpZyejUERB1QycTsH77iK5W2n8>W4h@zZ?5bue@2j zmnUKN_qcig%EkX&S$j9m^lwrAj;kwOrnB$ue;TG-74oh6clGg$llMPoGwJvG`(uB~ z?}~pv*()DanLcSaFc-M`)*(I;n^DkPxy*aG3e)*r*`Jd%qPH8hw z_qgJI{i{(!?#x!}{hzBggswh5ed)dv&$<@~?YX<&`|SPfqy04>Ygg*kEV*=FF7LZ` zp}gt!(+t~m=P6wJvDx%aty#yqNBPyEOqSDjOmExMo%i>*TF9@9l1}m-%a=MF$$#@d zH2;6K^`B3_zdXzT-rvE!kblYLAO*)ii_2~wUhCU=ezIf9teVgej#`DeM%?A^yyR1LKv38UgSmmLKe7&urK{#%>7p+0{BbB)T-jU%wXT5c*F zx04kDRu%?4ukQciU8c8?`NI%Sco0toPuS|u?gaD{Ps^XR=^q$&7jf8e4vCCpu!n#D V*0W));XubTc)I$ztaD0e0svSQZeRca literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/dropdown_content_size_1_open.png b/tests/ref_imgs_vg_lite/widgets/dropdown_content_size_1_open.png new file mode 100644 index 0000000000000000000000000000000000000000..b408cd4a7660d12e8e57f08db148c9f8b73063ea GIT binary patch literal 3039 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 S18?%z1kn3jP_=gcxPJgQIlH$2 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/dropdown_content_size_3.png b/tests/ref_imgs_vg_lite/widgets/dropdown_content_size_3.png new file mode 100644 index 0000000000000000000000000000000000000000..44e4e291819fd491c00789e2c280caa6e001ee31 GIT binary patch literal 3410 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/obj_pos_chained_layout_invalidation_post.png b/tests/ref_imgs_vg_lite/widgets/obj_pos_chained_layout_invalidation_post.png new file mode 100644 index 0000000000000000000000000000000000000000..0a56e7ba72c13e7d06bc35032fc4176145131156 GIT binary patch literal 3766 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 jt3Bk29G}27@s?JUlTmF*`duIXTH} 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 hf-zI#(Es