From 9c437d107320369584e06d85367f72086f056616 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 25 Sep 2023 20:56:09 +0200 Subject: [PATCH] feat(grid): add a basic subgrid implementation --- docs/layouts/grid.rst | 20 ++++++- src/layouts/grid/lv_grid.c | 62 +++++++++++++++++++-- tests/ref_imgs/subgrid_col.png | Bin 0 -> 13285 bytes tests/ref_imgs/subgrid_row.png | Bin 0 -> 11162 bytes tests/src/test_cases/test_grid.c | 93 +++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 tests/ref_imgs/subgrid_col.png create mode 100644 tests/ref_imgs/subgrid_row.png create mode 100644 tests/src/test_cases/test_grid.c diff --git a/docs/layouts/grid.rst b/docs/layouts/grid.rst index b1c7b4916..da53338a9 100644 --- a/docs/layouts/grid.rst +++ b/docs/layouts/grid.rst @@ -5,7 +5,7 @@ Grid Overview ******** -The Grid layout is a subset of `CSS Flexbox `__. +The Grid layout is a subset of `CSS Grid `__. It can arrange items into a 2D "table" that has rows or columns (tracks). The item can span through multiple columns or rows. The @@ -99,6 +99,24 @@ If there are some empty space the track can be aligned several ways: To set the track's alignment use :c:expr:`lv_obj_set_grid_align(obj, column_align, row_align)`. + +Sub grid +-------- + +If you set the column and/or row grid descriptors of a widget to ``NULL`` it will use the grid descriptor(s) from it's parent. +For example if you create a grid item on 2..6 columns and 1..3 rows of the parent, +the grid item will see 5 columns and 4 rows with the corresponding track size from the parent. + +This way even if a wrapper item is used on the grid and can be made "transparent" from the grid's point of view. + +Limitations: + +- The sub grid is resolved only in one level depth. That is a grid can have a sub grid children, but a sub grid can't have an other sub grid. +- ``LV_GRID_CONTENT`` tracks on the are not handled in the sub grid, only in the its own grid. + +The sub grid feature works the same as in CSS. For further reference see `this description `__. + + Style interface *************** diff --git a/src/layouts/grid/lv_grid.c b/src/layouts/grid/lv_grid.c index 63bfb92e8..16578920f 100644 --- a/src/layouts/grid/lv_grid.c +++ b/src/layouts/grid/lv_grid.c @@ -180,9 +180,9 @@ static void grid_update(lv_obj_t * cont, void * user_data) LV_LOG_INFO("update %p container", (void *)cont); LV_UNUSED(user_data); - const lv_coord_t * col_templ = get_col_dsc(cont); - const lv_coord_t * row_templ = get_row_dsc(cont); - if(col_templ == NULL || row_templ == NULL) return; + // const lv_coord_t * col_templ = get_col_dsc(cont); + // const lv_coord_t * row_templ = get_row_dsc(cont); + // if(col_templ == NULL || row_templ == NULL) return; _lv_grid_calc_t c; calc(cont, &c); @@ -265,7 +265,28 @@ static void calc_free(_lv_grid_calc_t * calc) static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) { - const lv_coord_t * col_templ = get_col_dsc(cont); + + const lv_coord_t * col_templ; + col_templ = get_col_dsc(cont); + bool subgrid = false; + if(col_templ == NULL) { + lv_obj_t * parent = lv_obj_get_parent(cont); + col_templ = get_col_dsc(parent); + if(col_templ == NULL) { + LV_LOG_WARN("No col descriptor found even on the parent"); + return; + } + + lv_coord_t pos = get_col_pos(cont); + lv_coord_t span = get_col_span(cont); + + lv_coord_t * col_templ_sub = lv_malloc(sizeof(lv_coord_t) * (span + 1)); + lv_memcpy(col_templ_sub, &col_templ[pos], sizeof(lv_coord_t) * span); + col_templ_sub[span] = LV_GRID_TEMPLATE_LAST; + col_templ = col_templ_sub; + subgrid = true; + } + lv_coord_t cont_w = lv_obj_get_content_width(cont); c->col_num = count_tracks(col_templ); @@ -333,16 +354,41 @@ static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * c) if(last_fr_i >= 0) { c->w[last_fr_i] = free_w - ((free_w * (col_fr_cnt - last_fr_x)) / col_fr_cnt); } + + + if(subgrid) { + lv_free((void *)col_templ); + } } static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) { - uint32_t i; - const lv_coord_t * row_templ = get_row_dsc(cont); + const lv_coord_t * row_templ; + row_templ = get_row_dsc(cont); + bool subgrid = false; + if(row_templ == NULL) { + lv_obj_t * parent = lv_obj_get_parent(cont); + row_templ = get_row_dsc(parent); + if(row_templ == NULL) { + LV_LOG_WARN("No row descriptor found even on the parent"); + return; + } + + lv_coord_t pos = get_row_pos(cont); + lv_coord_t span = get_row_span(cont); + + lv_coord_t * row_templ_sub = lv_malloc(sizeof(lv_coord_t) * (span + 1)); + lv_memcpy(row_templ_sub, &row_templ[pos], sizeof(lv_coord_t) * span); + row_templ_sub[span] = LV_GRID_TEMPLATE_LAST; + row_templ = row_templ_sub; + subgrid = true; + } + c->row_num = count_tracks(row_templ); c->y = lv_malloc(sizeof(lv_coord_t) * c->row_num); c->h = lv_malloc(sizeof(lv_coord_t) * c->row_num); /*Set sizes for CONTENT cells*/ + uint32_t i; for(i = 0; i < c->row_num; i++) { lv_coord_t size = LV_COORD_MIN; if(IS_CONTENT(row_templ[i])) { @@ -403,6 +449,10 @@ static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * c) if(last_fr_i >= 0) { c->h[last_fr_i] = free_h - ((free_h * (row_fr_cnt - last_fr_x)) / row_fr_cnt); } + + if(subgrid) { + lv_free((void *)row_templ); + } } /** diff --git a/tests/ref_imgs/subgrid_col.png b/tests/ref_imgs/subgrid_col.png new file mode 100644 index 0000000000000000000000000000000000000000..fce269b28158f05d71a07181e9b01673bec7bb2a GIT binary patch literal 13285 zcmeHucRbbY|NpV~h!7c3lo1)(qYkO;%H|+MnQ`o0NOsv<60*sNV=H8D#}=|z!Z8lV z?>g@8`+I*spU-c6e&es-*P}-8M3r(g}WyA-5Mq!0*%;{H8_hY$$fB?tuP zJ25WUGVmnrJp^(Ia$n)Lrd!I!l&?(;GIeWPIC3eTs5k7s4bnm=4gadGydnO&?ZL3Y zs2mMGL6TO8ITJ5pGFGYYrPFCuBaivMqSb57UsUhI^{p#H=sEFopV_Z|xOC}rlc(9G z5dsb?li|YDu(spZ8?9-Ky^)qa((qF^CbO_6)bsTvqOJH}L1yWRhg`-9OY`ual(x4@ zS@_`Aemn@{2j3d)h;_lYsBc|2p9Rm$#In$Z!KTW}~e&>?Lc=6B||pW<(cv(3e@qYH8L;JR&M6b)qB2U+hh{cai{;)8xySFTo1X1X;60*XWwOJP$-( ze*R?`n567qj}Ld&R#yY46IB$ov@$!Zd3Oj4%!RlEi1Be_V`CMOU=DY^|MW?Sn)r2b z=1Yl05tAonV-IsbTqA|+Kp-YB4|kS$Lmu+Pei|$2uTbgvfTNtgJGjFQu8Qw*@5TmC z#(g|(*>nb|?m_`r0yo-r-@GFtq!oJBIG|oPr$7icam!puKqaU|6JnRe8pr?ntVkSO z#$D9sGm<{MGdr}@!Ykj>U;Aa*@lpV_R?)!wq!3Hid^gksOL5)D*tat&aF-`m2=VGZ zIVB}2JICACUzcj7bq}6d7OlPF+LmCS8l>ouD|C_5LO0&=g*2+%$$Y@BU~600AE+{S zTaQC}G|SFIKp7#_P;_xTd;b$rjbenHY!hV4!T_?Za?Ms%UXy-{*BE2^kqE%RfmK0Bl_WSzN$pNd|W zu^a(T6i-B^sDlG(>>8CYIVl&mbRv1c-wOsk<64WZ4& z5;dPDM3i@*D#Wj1RMaGO`SE`2U!PznWNZGY+hRD75z`63Se{Xo+y;&U_G7d2zg@06 znJDddkB=E6`?Wxgd&X|k{dTGo#!z`^ag-_OptZ}{Q4Qjr+bJhcrH)`k1((3!OYc16v!U@R8%*lt5M56 zLV5>BQJcy~myPFp(R6ODX_&R&H?lir>b+We9LkmlC1wwq@*huLF+WbNC+wV%bKhPCA$3T6s|A<9l@N_teIW+A1Y zKhD3ndzf)zE!|N2j%&yOe#f}?3JJS{q1MdwIxVzr$6fK$_~G=YC%$t%6?jWSt$v@pgWpat2HgKG zcVb;aagT}vwA_;Gl;G{G-ix-dA2d)Aq&SyXV+lE0a%d|M79{4OpH?thH@UZn=(rpY zFa7Ye$iWM>kBPg=yD139EhgOWNf<1LOG20ZExf!k$AG@t!&UR-SZ}MJS6KGI>ZLHU zd<5mxIPd0dyD)O6C_S~i{@0cSyMi(FV!PEoD;@;Wv3M`*p(64|a8uK5c7-c6+-OF6 zjH9NJgs9WwWcv-NT(t4)6yZ9lyfA(ohzWoHQ%&Lr1_stn?9nEKYq!s%LhA!8GMos& z!lN!>RVe-7wkalj@R|bxNjUd!(|`#=zVwGT5cv1xe=pX(W$EE%noAT@_z>MtTfC89 zK?92MkY~$WkVbv5>PKFQWGefKIMG5(u2)j%&RG2v_>~h@giFKsE2n<=yBGrSEQ>}^ zGcJ(Zg_1ME2(FCMGm;YepVby}P$=A`(^~d6ud@rqRoIeHTrYCQMK%JrS zkyHA3YV|{Z;5(I>Lbb|(Ao+|p{efTt2)j_~%BC0B*ZWuw#+&o;9@#lNf}i&G_GHt0 zm-WHpGv@RYbQQgN^-6_nC$cE{uGwmF@$dy0Wwy2QQ*c^la>9#DOjwZgV=QxT1Vb+> zirU+&cs-l5lrtSNVtBtt7{M{w$>D2dVE**67XJluQBhGQ7$vrP`ZhXBrjjx6*E-C< zs&e1SQHPxh8T9XIX(4~s3Or0Jw>UlZQvS&ucy}pRy;oi4q;FZQ_71y(x3>%y&DK0L zXcXn;T-AbQSGhb?)zJNRII~s!{=$RL<0{G@5L<>%<-XOJYg5< zKR{=HV54d4fYv4IgUA@){WiU#inx+@O10acr(+{y4tZzBFt~Mi3nEBg;^(CN9^}yIj%zGoJtKC`(ZA5lt?6_xkHifZBrl&t^1%NtW z%`537JA=9l=+o=s(?wiS`No&3fODx1p1*S#8I#UiRCFy zyr6Ub&Y%d~P8(;F2!~Acty)eXxPl3Iv`p)_i$4{6d(*csz*-EGeTX)Otf%}(wx`%E z_wMtZYzdfL^$MXDecNpjNX_sn1$kFl5h?Vb5jI}dT$a(Ux1sfZ+jRe(%l8x}WhI|j zE%qn9r2BJ{OZT*`YZ9!{Hc{^HR>A})_Z~RB7n569B30jARIS;vs+971oLoGfPs}bG zykLC%eC~Z7C!(N6mWQ8QfE~*;w(6f@ zT?8@!0DsKbY6r%A7DLlmtt<>Cx)%QcwYnbV?aFATGB>pJ$nqt)bccM3)bNDE7W#P) zxBYX3Td(x&E(Ipc5i8N6^u>r+km(X}*9f+B)yg&Eoh^@cYFNb(#3u9!+Z!a;Cc4X4 zF!$Pq0j%#`rdyCXCW@>P6_MC?{#dxN5}_^p^iyV*Nj$q)DK2TvHe zvfCd}H`0B(ZL3uuHj-Ew+30ObNR|K#PMHU<1&P$Qd+O+dVgL`*<{A1(Zr%E_-bTyJ_$Qz1|UxKHN5tI&dZO#d&z&c1=d7pZm{z zyc=r~M%Vcdk>&se`{qX*THydgPMTMGt~sF?_N)sx-PD`9%FgxmJ3#RHMwP;)0JDo$ z{=s~=nBFz@VSHVz?8qZG_*5Z<;_XPYf#MwX^wK^{fmRX1n9ZiSu-1e&r=zFiMr#%o z^R8xv{A()Hci-7yPXuoa+n*#x+oO>^nD^8i-}ygU(1(A5Mfxn2~` zIhD$`w7!B7i(;@yKe!f(>5;Ra zmd+$g#7~}l%-buwcpRTLsnMfAbm~MEt3NR)aNT*scs>`!17?7(`fQ_w7BQFuZuZ+? zo@^*jNyWMIQ=CURf1F1~1yJARUz)SJ@4KG$qB)>PzEiM0 z>6X)|dReHcqa%>dZAU`E2z#v;aPnRtLvI;T!zof;kS(4%%;6!^>IfTA zZ9w|bohvaBdwcH#r*xOI4uf*Yl8;$pO)X#p6#+pxa?!Vookvzb*=5%e@&&cnkA}}| z6&DxVpA$uuFyFL1>&mV zAmcv6Q}BGWb%)$?))tGPG}X+zu4MzT8uUEbAkAEZSm5B0RXVQ1cZ$TBr!~heXaLQC zrpapcGn0>ogMUy6LOmba0i;Lz*IxqZJpp(f)3MXfFYR|UEVUA@ODEDn*Y#%O4&Ijm zksrv77nkT+n7k1&Q<$v1@@W%nvX`@SI@ic|$)rgeKuUM@PZm^Yi*wHiYB$k330uJ( zcC8%NbGGERHr55|x1aggJilu_yl9+*2vRaLa}jU_!XppG6HiE5?DTQoSHuEH#j5+E z0JTv-b!6)NGV|ZliR4te4HvkTy3$MbKq6ewV!gtSQqt$Moqkp)Lipqm28!@o_n9<5 zp-GkG-AE_H>m=+z{4MH#qhfWned@TmreQEKNK!EbL>)ZbtT~~?Sm7mI1H#REaDRJx z?w&R;`VNIis%%mv5+Si%C6iDad21}833n07vE&9s@m@vj#iSIV&4Ahk`wvl}$3cmi z^;}WtVaFn}_o;guDr*y#V>e+$OL-0YS{Hip6ewz}UDTmna;JivpLHeH`;I!`t)pp{P+7EcCdM0DKKqwvjsoe{7_^zEm-P&n zY-+^Yw@&`2qVsxL>+eCTUO5QRDc6p7=GwZfAu3w^MLW&A>rg1wB{G^JZehzuVDB(bA+*sf^WwV*bQqMZN;1<>_Eu33`b!`0c#>j zUt)tVCXI}zO_w#F9F2FpEkKo(>75K^)dz@14R12rtNn#0fDD|WN&as%`Ddaogr(jb z7sxApUFL`LA7^$7rjku~S>2CE z5Kyy{?_C+7VO>N>fdNfJhZDFUZ2kjN+RBvTorO1Unn>{Ze6c(B@%8rh4y`)WytEUV zW}n~^N!gn3u;e1@eVA%eSzkZBwXc2xVaKnl%>Ly;p-TxE`cPjV@cHH}CO$3a_-;E> z=r~{HsXj{52$w=Kf0LH+bvpd=46FA}kafxY9=3G*;I8z+UF87rke8SDR0MH6TaI}} zDGaYR1mIVDNdC8Sd%a<1W^z(mNQfq~ExO%YHa-1FFu{O79$*cTe-nCgMWwh~UAq`3 zAJm*hV6nQ(``+rahAcMa5CgCE%D>STaOk^cv#DT@0c8x13`O1z=O=L0)!@|T`{=eP zxP%Dg*Xv~rWl;BdAin3m-J#(ivh`-Kyo&9g{mn*0a4(fTCK7nwW+2dZvO=@jEAgA2c+bjc0s zf!7$XNjS+Gw>pcZ4f{CqskRj^^c^0nM`X?G;R@P>0z{ISF#fJ@jn!PeCDBU3Pad?u}&k6Y@=ucoEF_f)x za^r5cb(b@q{wcejq!l0dx4{4kfhq|sHR$yU`$VLnupmv~2?tHV!ElSg+7qCkF6-Gg zhfXJEsU#GA-92*qMHbzo{hmDCYbDKt+JxJpmI+5R`kRE2Z0cBP*Uok%uQ9sb^Q1YE zvk(-yFZ%=F43i;S*@vI& z+jHf-YIPqf%(ukHP3v3!WtE22y}`6>`TS7+$SIt|`*=PA1Kg}(JABF7_JTK1E29D9 zNT>XCAaWkz%WJKgdI~X70@R?REK=e$>#A6cF!E{?AX7k$$HyVS1OzVs+X9z@oaf(D zcmm{!9cn)x{95S({Dh@b8qh2-fwuF5ps#_U>rnAQ4mEJ=aWe^}S&!i$kYHfV8XFq` zy6NL0n$IRO9^a?(E_=X*(_%$Nk4QRf1x;Q z>zt!hY;rnl-Q2ifbGqJ|uk%GQ-i#mgAx7$>g_eTJT|M^NM;AFMhKGmuSu20WXG@o{ zEv!yGc;ZA-!g`Y0@Y|ze1Xe2>* zV2JGkv;CR1*)?<%a?vCcZ@qPEABjYMex0mNAk?sY_-YJg_V^*d?w)Lc2HLI>Bocjs z$z_8;78U!_2xj6|EDiV-Jo8Q2<;jsOR6O8tTa>@~jxmmMM zsafJ(x$t$?j)a;4_(YA)uPOg(!1U1%_h(gO=j8@(EI=S-0l*R!+JLQi?<+YT^YvqH zrfuT^qe_N%GITA4Han(O;2i5TL#+nrw9~%BW&xI0lw$&@LFpMbT8P&5F%I%rN<;(W z$-XAxqGw^1zK6H%lSUX5x+ew?(nS;T3<7xuIuAgXV{T5DZUG>eA*+cntamoVfNn&a zCn=by-Yiz|!e615b2iuP}!A*jGhg`}xAV0vZMpM=Z^Qa!2osiI?1ad1IcC`#J zOj`!{5lc9j;>W*UCTZADO)a-j*DAAb3> zfODj};}deoC1A`#%tJU^-gZ_aN8HlTs+9}vA@AC@TXPOKl8f(F2|O}*JMq{GCzW+TkQ zv#hwR;Q&-o!0tArCHzkoZ}^L&Xnm2$NJYMOClsXM?gsa>y&Y^*TpXZ;)Z^}R#3qZft&kJCY@9ENUkrdZQ1W_pT zbz!I>^fj=60;n$Z#IUA;a#5p0nhy=ZsE-PO>Xd#`*8rZeh5~Y9V$`1iQf4{;FQk#U zYwhU)G!{^KPix%(IBj)=d@}xXg=5{X-V3bNDN@hXh9jpC6A%|uoU(2Z!w4&SOylqG z4}E>_im4NON!U{n9xk*n{Jog(>P~a@TFY9dVoac?{@>VBQKGENtiZ~0o#E)B0a~pC zdR1t5^P>;~UpErdWBg|mhpf`MvY`Y$&sW{?ucUhI<@R%bHhD&=JWEW}iE4%zWG}(= zS^>#wCK~gHO)lw1=tfbI;}QaU`ZpJ{w#0HF^;TRHDo`rBfg`@sfdI@ReM3M+h7!^h zex}b$3$+!``l*TNqbm&yqXqsDRuvoWz`~T}?qv9k*1zzPJ+{ytv9}wDI{(8(Ua!o3 z2bQ3xj#_PT35i^&tG6aNK7P9z3b{cAJd%Z>B`z3DvNrdV;5%mV92BQgI8Ga>>hT z#3}s`lNf6>%chbL#ehjM+i2Uy!m`GF>~N#dmt|KRu!v{lXiOUD6ExzQJj2%hL`*FS zL;V+@(yE@Z@ibYuDlIgnnk&Mn&KVuEpS}-N-pqlBoM=^Mh1E{+qoWgV=YMGoFGcHO zTB!C^=UO&zZ*)7y-Yx#oM%Wf*x~|;>iWqR)R6NIjfNN35K8nPHlnG5`5m&K^4O$#u zX3+s~Ivg3}ZnFO`G6XdIv1I*c0hjJKS7T_CZ3LlH&RVF2Fx49I8@9olzo>D@t?R!%Rxo$o~qi(?0icU2a`a3`R>Tot-l;& zGXe7qf~J*SheP=liI4bjvqayo%QTSogY)b*&}m${T|b#Sf-~ZwFlZZ^5X{m5+4cRkMB@8Fk;`Ms$1Q(lVqLHkAlO%An)z+i(J0dS}Uf}!E{ zmB=~~jfCefza*SBmv__XHbD;oBoRP!d3DKVkF)%30aw7NyHJf~V9t}byfg(D+O2?f zJ&}8SW2Elx%r@Ctb7Ea(F&_TQnH+?Z) znPe~a6#gU6@=`{(Bp9?5xkEStbf@0|UCs!L2>!z)=7eDz!TH>3iA4d_tdW)ub;(8s zQ`tf2hLbm!U`;+iokb=kF|h|A*Su%@@sU%4XD#oMD(_!$eHzMcZby%hzuU%EWBX2D z4fTY!@|Uday>^mkL=e=sWC3x>Jj)pov%hTm?(501vl=ZZoIdWi4Qync^e|vMudS_} zU{>tfK$8{plckdDubAoeN4XoH?7!-j&*+n?&oFW7*x1SMiH#gytGqD$$(Lw z>L!z?^F8>KC-vZ2W$G3+bm$+slbDD|*D@m$6O&M4mmI>5H9WVWURzk|3AA37YF|#r zbAC36&EkmEr3LgTHMpX|o&zGnthXR5AuV&?zne&=Mp*DfQi@=>X>VYA(_*}|*PXp1 zk3NChjFiJv4YqF`UQ16DtEL5ig#`utmYR3cO`(@Ujo_k<2W>P$84-a zrTyjto*)qq%VCLFS-F*)p2>$M9mi_J@bGZq)I$7Cg~lX7TzbDm&<#cw!7j3}05&(N ztfi%O?fkDpJ})+vgrGz`dUzSc20Xva_E*}xyw>?`H|aFB96c^kk~6J&csB4W{;jwoQ8-8;@zD#U9lw9Rx-%D>G52&D#H$YS zd32sVPz7COEot;eVdjDx2xh$J0#Jw_CybTvxLg?N?0=CX@vn>(udiBL*FJ}NFg3(P z2H>gc)|2}>aedD66T3#hYOr!*hlc=~QWE8+jcza9#kP6Ln!1=J(@)z=outw4%uPYI zqEX4^lpXzG_jdKYiLSd3Z1>qd0gwAGHgMS~jty7wZDf8#`4!O7fVAewbN78TbrJz2$8&=|mtWvH!o7|GY5& zr}sf%5eQ;#5J*WLh*=phRL9lDru9d*e%0!aPZ+z7O;>HgR#Ja<2R1OLVjx`<*v!d7 zK8j}|UVK89H|*2`8@AdBGtVJb2kxz~cQw$8a+H{xW{$uE8t5NA19j6wz^M5o zwku5UpHs%%{LC`FTrHyEwlD)1X7a0UVg;GM4u)_B0nk1xuCCw#C-xFpXOgqu9e9WY zSO^%QanQJ7{_)&cu(BJ1O>V)CT-+tC3-cvdMf@G;8@NXz|AyT%kg^a)aLUcjqUf=R zk-W;#>dg$$9R{pYK;R=ug^1|){~<4j(EB{nHsWlYqQ8;=I#lXVPxRP|oNXT* znV17m1z7C@K5v5Yd9?$%s*}_uz~i3Ig9u}>LXX4u6ohNmXMqfst?Ln|53o(>_rQ#b zJHOwc$pE7H51-Q=?AugCtkQrEhE>f9G# zxaOa{U-ux6ES!7$7JHX8`J{ z{5tH3JMhUv*QT(w82ZOADgK_W^7>o4s!I}EbeKT-2L3g$3fgt)_oh~VfS&*`ddsHw zS9D2&Y!xUjFbWEaM3qH0m{?@%kg;*TAcDE8@eGE=L0U>g>QOPl_pYAbf=y9&?+l)Z1YS3>U9ewH~0mo|d5}KUB>gTh~7sc#eCyV(W z4ebe((ZP(hoGE(I91HiY4Trj#bI!A-=E#DR?aF7){G<=01_(&?Z8A1OE)?Xeo;`g^ zOz00#i`LX>@Z~`^fkP&5GYmjiAT)#M@yxIr_N{RqdevV|bAxIPyJ5psgDd6PW5>^* zlRY@!vb00s58_o%(X@WQRzS}{XnuPt>r{T{alQs5QZ`;jxS9oQ35~AJl;=uD26r6{Wlat?w1S1VWi?#|0g>Rq}IvU<`_!Eb;c5h)2JR0U}wB~)n&NJpee7imff0i+m8 zkRl*W386RXgkB;Y-WB)R=j=1?eaE=_jQi={Hy>b(r>-^ETyy@O|C}KY?km%sU^@YU zK z98(1!VC+4-i#H)Oe zkIvyjzNP>0i6G`oE6;W2M!cWPN}b590lAbn{gF$~`?K43o}Gs>1z+%4Ta)y`UOc{M zwYN8YMKXQgXEusA^*${aSxY7y0si^n7}4P06)saU2t-Ax4h;HrxZiOw=5u7=GC3h~ z7I4v{V|?JER%$r-`{vaD-0=U2l{^Y=zI%v4oezrcnpMw!gD(TFkmU5)$hZimtBW0T zK=Pk)%*I*g+rE8ecJ`xAs1fiRqnj|E(+_p=1n7*`3Yo2wlTdQU3C`1sG_M+bu-L;R zO)`j|QIOdjChgu;4cuwyF>?Qz8O!`IOge@hu04N)oxY;H+yFrjfuQ@hx7~#jPb1Td z30s%k8U(-1=hf7tx`3AiFcuaTE-fuVgYCp@&j#VAhqVtV3v_O92T;Fi@RzG27y#F; zp*}|b^BMg4`7;FVR7yTXADF^>o^}Knz&Qg$!!wH4Dc@I{40WV`{SmTd+&~*mz$BIGKKsN3x;6!D=Q#Pl5~YPrrUpk>&X^$cZba+ZQ zp2q+IOsV_Ku1;#>%z|3ym)>KL{xA!Q-dBARyWb@HlOPZ;N4q-AuIR$cf1cFCjQ97l zF&Z*MOa&Gz{&px^{MqkHglXpK!9e`G0jxm8E40=QR8PPryyna}E zxUiQ5jxQr7^;geAAP*$T^_D(u#|^A;voY=UcF2knyOqB#q{F-$COb||r&_&G&D>ni z9dIj}Vz6Jw{^A-V{|X!_PY|J{{Yq?Stmci{jFEN}`=}EPGsvz*|8%qP>DIlunSt|7 zqjzegxBFd1&4Lr|2z@hQ;8uqQ+qcQ^`%IU@Yb&~fvuCy|8w`88%y(Gt2nH}hPYX16 zRHV_TRKCGV>*d)1-~4bw7+xm)mdBWlpM7*9-Sd&N!j4&w*Yiu_#FjAIn%tr@uIcTY zzs}_k#+t}Zr!S;7Zt!{|%=!+6cV)fbMg+xK+$Jw=R*-*h=zKKPbbG@%w}|zc%SMRu zuxgxSe8>28aVznA z$H(a6EFUK;ZILUM_skU=LK!c+Zbci)t2*l@8wNwCEx=YSqlSx~Q4g7<_}o|iLH3}g zc7f`t2D0YR!)MoDf10}Xf<}I$cP3wH ztrRa2P#l#E(#zfp^L1MVFQ1qQ=PuE!Oc-Kgnn(sVr(0(p1iZ-=-@I{4jeQzXsnph6n(yk^RRY>gm1w;Wsf zRY;vN`+4+5UmlCUo-RCvBQRZ}`@NaL%~8l8PpEZ%zTYvKj7^JF&is5Zj1%BQQqI!+ z#Zt@(6?CrGJ)FotkLTr~mRFa;Ul%XhTRpNvzS7jy&8H>%;~r?R%9RpcsoGlZ$4E~2 zJ0kx_#E&(VE9OYfKLQi)*^{m=E{i5UVd0OJ7YrZnC5#c~=BO!O>h+OBbc0-c1L} z1S3^ZeZ;Bd+-tF;IGOSS$y{p#7%YJl$I*vRxY9Vjy*&rV?w#FLBc;UhYQYKr>*J4t#vdYb|ZfIzL-do;& zYToR|tOpDDEGjOpeEC#l6*;8eAoCa>r-I;Fqhj+wv$G)zm!nl437x}D?T#bwYQ>rg zey~o;u{Me(gN#GyPNTo+=-NAweiax-2xJ_7zxE#Ra6j(90e^IE8CoKdE>fwjk6aM5 zZw};AADnJl*`j*+B`4=p@*RL(Qay7R!gkxGC2_+6yI0)#MTw$b! zBTk{=)bM9XYinzdgsulXIL*yYzjxrHt7{Q5kyvzse$Yu6BX&~0kN8N)I%#HZ?ui8ZQ+xX|jFPEVW%v9iyl6Y;#VA@% zOjT9k&0}K1ai|<0M}|h)qO=ZTRKKa1?Vq{x%Km_SA2JeUb@YLpR`4%dg%Lf@K41s@ zMTh#w=%}%=r+em@`$kwb9;rK+pbM>cZUMO}6TV0a>(M89~zYvzM1wA}L|}Cjyx;J6%>KE5`f=2p#+#j$2d{fgFk>KAL!185es2 zx>2Na9qdNj$%Yoo(xe=H1gqWkXccNs!bS?sO&sKvN-i$P`bOwO!lp%?EZfTU>>3ir$b+_(?e5{pB!%sBhM1)U6?Os|*6jg`#ZbY6j zv`-8_j!5veY?HYbbukW(Pbj|m&5mCFoyu45cUmvn-oTgv2%tPMucfyJu90i|KZ}&Yd zjJOR!P|(ZQy~s@2$?Hb4RDHr`1&e(@tzm0gxjy3k3`j1Bya&lJ;(&E@%6&xd806Sg9zD|G!OPkK=P ziqpjy$UCL_+U_qAg!1V$7OW6Rr;*9Zo#%^Vr!)utlCgh;ea4gMoNTS^=5`6z0LZHQR6IhT^@Z4hduITB9CUxApms0A4(S zOMYtQpqn+`aYhZ^>gIP{+3T8v2ERP-U7B8!Wm3G&&*472XB4$H!n@P9W(4amb1Piw zkF3-5Ez;!B-Wz4DTF~x0adfUL7Tc@SXQ)XP$2dsJZ@pum+v`$6n;KhGWQ`wpN_1!aNHXgrT zjBhI2jCt{kZ`#VP7uq;uSDP2Zn+pfQJ1(1Ma9(jnCCGLx8|EH1Z}|85Ozo|e5PU{7 z=VmlV+fr(crN!-PSN$EWKcU^0+NaS^;HRLCZ)P^BUcH&g6LZtG$jZOFvSqG{tq+ag zLJ>RQeEHrhq6?mQrapjLG?|~=3I!IcY>mH>Ow9>QO){97G7n&AfTh61m49fQbi3Vupy=n-z!4ZMkmtzt$S)G9e4p&Rx1z^aofwB98 zu>%+p@P1UVr!mu0Ru9%SC#_qjFU16g+J|}V2y9 z>1O|Jw5%3vt@R|89fkvnsO0I#(F3p20Eo-(^SMtwzfZkp6lI01nvJX7T-2Oj5(Znv z-L6UkS;$DoyVv`%naZhHX9t&Tawy_8VY6mzu{gR{p!uo5L@Oq~ZC*_qp^Q46lk?16 zRa={Xp@tH1w0qrGqyV6`fC;5JEXqw#3oN`rZIi#0LLF3|heLFI!eHemzfG7409`Of z5FenG0gQl`!5gaF3LVCzh}};zD!Sg*qAv$X+~kvd zJmH%~Hv-z$NlpZllIh~ej1O*}ga$7!Kh3B0w?9cwe}ePyXHSD3t55~-C_~@mG;ecX zZq$lx?UCO=LU;M_%S}VeW>g!Syjq=C!m)X_(ygzHY?ZR)Ea*A&kCL52&S<3tH_X??np;(r%Ta$vJbICN>`d-R zZ027B{A24FGbGI$-R@I}+Y|^2QeMfFK78<%z;xx`g8l&8t-_mkOVp&^+giP|ty2ZO z5Zf#zFO%^Jud9M%R+H^Lm*jT#UkT<(QhBadJK;vw08S>yda$}-ZjcP*l(QhGDC*+z z7iv>aU0d{bRr;#uwymR^>UIS&bOAxp333w-5EEcUBLDS#T8~Qr4XfTyMyq7iuesQp zfPBM5Mth(6B;{=>sb2!v$73?zcjJ2wrz@nSq+Wb64HU>&P%N}x`(6grldz_dp&?r& zopZ}0A!u-XJPT=&t}xN8Ep6T7IemjIk(g1Wp4}Z6+u`$aB|N;Q@_E4$XJLMRejaPL zC}OC75tVziO0Ij|cSA%J@MH@+m@@#;O!8SR9M;d zEqiMX90r3qolT&z#N;e^x)z~m;Bd4jJsjnNx!AQG@$dc;sy`+SI8@wW^fYw1d*q-Z zd9OLSRxSS=&O#%^ndU}dw#HY0v_Y?~VkZSoaDqt!CgzxunNLDZ>+s2QBf54PXm#H2 zci?(^Es>ngmrTEKE)#D{#k8JeV9>mO-#|+TnUtK&6&)O#`EU-?`Ge?kjE@g4LscNP zD^CSK`Ni~EQ|Or>vnxy_PHla3uQU?HUdW>+c(zAG11AzPn~xJk^o1xA*gp6k;}bci zt2^}jS9mikXAa{iV%aArGbu#(Hvj-!+FJRYhYiZ7CB32hGZTBJDE!Q|jhp#xpECyx z3HlR0>t4&b@t*IK440E}NCa}Eg#{T#K@9OaRnNJMyj|+={u5vN`7l}vcyX z7U1wWIY8EHjty!1i)Ge00GPX$l~X<7SqT8F3oG-k1Czg^-rgR?jm?Q)T=kw~Bi`!; zS)ZMZwlnrG;!EByKw3bGxw08}>^LR}A>G14W#{jA+)C;<;vsz9e5IdU+*UBDqn&3H zD;ejf?)?K%leSs$xeF+tu3yJ|6bZpiv6^f*tk!VlHiXkygcVg<)hGZ#9;Dv{;$ zs?JS95&%>poo4dYU}jWSomaAG+$u8E1>6AqmM6 z-|$7L<(4`C*XXLM;-_lupRs{G$c=b5SmDBb;fLtrO$(=&PzgG0#@|qLAyH`&ztVN#V^Bjv-m2^b}FQ=8*Piw9TyoBiv_T;IM#)Z&-YXhx(x zZ@F!@RV^pEnQ5Y%il{m7giV`l*S+2!*edU@8Os;Q-z`hE7{Ui|8t(=lU9O{{hCktJ zc0Gov{{{qu2PHjcTNX=5dYAdbjOaYR@k~w7ab~Q(!O_q99!eADXCJg zHF7Pl-^3amZGQksa&bwRNol^RY&7O}vZVqer-H~8jHsK#SgOqQ{6Z7W$n%L)Thq4^ zHy+{h?ym6M{?vN39M`j{|GvR+IW!&zd!4I!UBl!u0KW@r@d1p}+#?|6kJd`|I-49x z`)-;)C6t24Cm2$gnOGB|J*Xh?E9_H|lyBNU8-uLtkh;s!MPmuh5_~oC=G}foU08pYu8UNtfwWCZjaEvnm6UhkY9kj*b55R!(@NQ9 z_qhWO4kF56y~DQ;pz{!G_tkG5`v%y>Jet8t2-sfTw^wwJ!eZK38Mt ztSrCrd=oIyyy{aj3P=mI4%(nPV{{G0VzS!;-%4)(Xd76ORx5n#-A9xp7G>liYmnBQ z)O|+pW^>qSbrUB!@-=d=9Y>t zKktf#Sy(+c=~(?up-Dbcie(fK6@Wq(iN)7=R~qVT-!NW|=R*dr919x|7SWWRxEaN_ zx8~Hfi7?gY;|9iM?Hf&u*gg|zT9uZY&|Z*qa0!g7v6Ti`gJWo6 zh6Z?NyQR^j)oAUvdL;tkDnYZj;Csyrhklsnkv^7j!dSVe>o&yCg|ze~HX#dBojI}x zqP_$JPP5oUl*T|+@0LEFiSho8t~qx1VZI{YjyqpJG!^atwEDs|>kJK^^_0#Zk}2BE zw(?bTNM8eTp~X-Wu-6m#K*fETJFmmCzon1vgO9BF+!g#id(U)YNIcQD@KGmns(KCR zZ@^D*eJeKD=OUvORB7sOubo=?R;8sSCw$s zGl0g8_{ARCgc=!1BC*HhNH{Y0b6;+|aadv!?+st`C4qiK@@VdENwrB^$AFX2?4Y-h zvwN85lNet>$d25;PjK~`tnR4hp~BCBj5vxl;9$`kN|Ga^wh(1=vakrh<2@=OSAyPH zPNr~`cy0P(Qt?y_7&fQmA8YcpC+jdn-c`f!YP|eEA zqw6ngm|0>Q*rI4{mYPW~J+=tm{|acA&|skSg($cxHuqIz6`A)jdAmX3Z%esY@rCU?mc z$&b!fxXc*<##jRCSR@h7xTr$s#<`&A`?(}3%REr3xc0G=#6raEb3K?iHtoUg_?Gfv zEq@_NZ-wok5Ap(_oDG6(xwb`pyaDb#-nJ48+!h0!NjXDDr5g@oVLn^Y$`^|tdC5z zN=k6q;ZygJ9--o3l2vokR|)w1Lez0Fv40mH<$&;LXV)$w8G+?I9oFP7o!0t@ zvechB6LBPdz8rITxC^)eVo6^8rKhrTb7s^X!dj2k=Bp(}be>XO{Y&*+98e(pkZ<(3 zD!uo9H8ut?UQXLEzE@_PViz&*Z`W#zL@+{w{dhTuR()boMYNhOlkJ^|EPghRg%W@M{Mp*7nos-XK!hYVM}O;jeSA4Hje^Cw6vBS_>`4^7xLz=vBsX6X zN<0~pfQ0^2ZH_ZiWO)Xj15wt}EdxbeS{ON+g_RAI|Nc(*!Ph_~GKd(9`suFcy4!OO zO}rLOt<`M=r_~5chmTevd#x*<(+vnAHc#{0iXmHG)`CjF{VabKSs8#AmP z`LuVDqx+YSHnbB1MtKt7f}n$rp-7+OU=aIuf6(mCMG=PQ?+p=(5v1md@--#wT}(+C z&{rw-d9Q#*i$$|b#-@+IlYvLbG77*EP47wV7mMICf>au1k3e6i0i71-gSkUfgy+s4 za9Q$cfiJqI--D=2EK0$C=y|}7z5Dy3?Nv5q6Uop?aURgGVM+nRT6%xi`tzg;Yrh%k z+=qrCpy7Xz`Hz}8dL_yc2l$vgysoL1d%;ZrBr zFY}-Xo(METAa3MQz7r$W8KhqWa9%N1<#tAWRHk?MZ2Qx}SwXV$M+Ig?_)h_KeVhd4 zYZ~oR|G-2bf*I_8vnqb>kbX+NW4{2d*7$I2svKNJBH+W6d>e?(OAD|d@X9X=Yu!(N zuEyWacLHAm44I?z8%m(ImsYFS?=6HIvMR9A_BrTj=dLc9h3x|I6;uy>cLmSW@dEB& z-uPT}&{C1taZt}uN_){yvFRjekztt17WM?_4a7K*?V-Uy!mAKCtC}eyIv&Wd%y<0i z$w^QXhPD?=NMs~yb6Kb!09<*Z(w^4H1T8R_@bt-c5Y!q5Yz^pkcS=8y0^R@i3pr%m zzwzP3w%l?Ve;%WGAH#4G!Si5af0GQ18ZbYoM+2hd(=<_(cdqUNrQ?r9ZTkFdX4zAYKD$tkRDRZbz!$UF-pQ7zQ7x`s(~Fb8yJ5Z&3&E)NJB7xI4W%VPJP? z^HA7x+9ChrR*HudK!Qqx=Rczco_5qo3N?>DA0>n9>_<_6?t_1;mwGzxYUd9QLxaKe zi(}navoYu*m!sTeVMtlyEwG*{B%%mWURUnylCC5;Rr3S@Ht+(;K93u9?%G+sg+9%l zOtb06xc%SXQ%i(3`m3R!*7=A2huyb!9dhbQp}06DUkoA5V(RS%Mz1x+cB{1=uresx zf&~RPXJ{-R_iY4KY#`eI@dbsMd&!8($kMM}?5&~XtLEhk{`czW5CIB-ApLElyB6xx z#(T$d>|N@|iQXLy+w?DAg6vsdE_QBO0*yt#RyIT0!2DJ};TT^Tk%T<=g8qc0g3?q43fWGqO6lFk!QlfNb!kGSNAtN zw7|A(y8gN?b_h}$xfm8xS ztroag**|H(RPYIsKdjRN33>u_@=8mElRFN>wq`=!u2ucy)=PMKV=+7&z=my7@4$dH zlD|yucMyfa`o4eve)CpshUh`^7jD=?4N$K10CE*Tpm@<)5sd``p#+n{#z_i^jgxD9 zhUIpT9w`i0?-0HnVX~|C9K^Sx#J%J6gsqn^ z1$#0;6B1~(qRv>rfcHWCJay=4rt2QO0_{p4^KJyFT#eCV1)XRFEy*jf6!I7HaDLNU zdx)C})=86-lcZWSgwVFVU1^mQ9yG@Q_k*Nm4F?^%}WgHkL6LcE;Z5uaQ1 zO)KLL-l6WHt|%ilHK&rYa$+-h05lksV1NA3;#9cA_+f~6mowmx{c~{d{{46>^q*~A zX-DE@kUDe0KTEDTjF%ay0TdV_dJcNL>PRz-R?AicEo5LGkg(52s0TbcN2UBA*gyV9 zf0-(1*%Dz(XqzT_>gpB_We!@QHAo1L4%?M!xd4IG<@|Tn`=55j|0u2hztq%uC|i$x WeRsEyryaN#L{;&=0t#yS;=cfaVZMO? literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/test_grid.c b/tests/src/test_cases/test_grid.c new file mode 100644 index 000000000..16954b7e9 --- /dev/null +++ b/tests/src/test_cases/test_grid.c @@ -0,0 +1,93 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" + +#include "unity/unity.h" + +void setUp(void) +{ + /* Function run before every test */ + lv_obj_clean(lv_scr_act()); +} + +void tearDown(void) +{ + /* Function run after every test */ +} + +static void button_create(lv_obj_t * parent, const char * text, lv_coord_t x, lv_coord_t y) +{ + lv_obj_t * btn = lv_button_create(parent); + lv_obj_set_grid_cell(btn, LV_GRID_ALIGN_STRETCH, x, 1, LV_GRID_ALIGN_STRETCH, y, 1); + + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text(label, text); + lv_obj_center(label); + +} + +void test_subgrid_row(void) +{ + + const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; + const lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; + + lv_obj_t * cont_main = lv_obj_create(lv_scr_act()); + lv_obj_set_size(cont_main, 700, 300); + lv_obj_center(cont_main); + lv_obj_set_grid_dsc_array(cont_main, col_dsc, row_dsc); + + const lv_coord_t col_dsc2[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; + lv_obj_t * cont_sub = lv_obj_create(cont_main); + lv_obj_set_grid_cell(cont_sub, LV_GRID_ALIGN_STRETCH, 1, 2, LV_GRID_ALIGN_STRETCH, 1, 2); + lv_obj_set_grid_dsc_array(cont_sub, col_dsc2, NULL); + lv_obj_set_style_pad_all(cont_sub, 0, 0); + + + button_create(cont_main, "Main 0,0", 0, 0); + button_create(cont_main, "Main 3,3", 3, 3); + button_create(cont_main, "Main 2,2", 2, 2); + button_create(cont_sub, "Sub 0,0", 0, 0); + button_create(cont_sub, "Sub 1,0", 1, 0); + button_create(cont_sub, "Sub 2,0", 2, 0); + button_create(cont_sub, "Sub 3,0", 3, 0); + button_create(cont_sub, "Sub 1,1", 1, 1); + button_create(cont_sub, "Sub 0,1", 0, 1); + + + TEST_ASSERT_EQUAL_SCREENSHOT("subgrid_row.png"); +} + + +void test_subgrid_col(void) +{ + + const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; + const lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; + + lv_obj_t * cont_main = lv_obj_create(lv_scr_act()); + lv_obj_set_size(cont_main, 700, 300); + lv_obj_center(cont_main); + lv_obj_set_grid_dsc_array(cont_main, col_dsc, row_dsc); + + const lv_coord_t row_dsc2[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; + lv_obj_t * cont_sub = lv_obj_create(cont_main); + lv_obj_set_grid_cell(cont_sub, LV_GRID_ALIGN_STRETCH, 1, 2, LV_GRID_ALIGN_STRETCH, 1, 2); + lv_obj_set_grid_dsc_array(cont_sub, NULL, row_dsc2); + lv_obj_set_style_pad_all(cont_sub, 0, 0); + + + button_create(cont_main, "Main 0,0", 0, 0); + button_create(cont_main, "Main 3,3", 3, 3); + button_create(cont_main, "Main 2,2", 2, 2); + button_create(cont_sub, "Sub 0,0", 0, 0); + button_create(cont_sub, "Sub 0,1", 0, 1); + button_create(cont_sub, "Sub 0,2", 0, 2); + button_create(cont_sub, "Sub 0,3", 0, 3); + button_create(cont_sub, "Sub 1,0", 1, 0); + button_create(cont_sub, "Sub 1,1", 1, 1); + + TEST_ASSERT_EQUAL_SCREENSHOT("subgrid_col.png"); +} + + +#endif