From d59938d7f744970865fe5b229d7f43b773fbbece Mon Sep 17 00:00:00 2001 From: Carlos Diaz Date: Sat, 24 Aug 2024 23:48:13 -0600 Subject: [PATCH] feat(scale): add custom labels example (#6699) Co-authored-by: Liu Yi Co-authored-by: Gabor Kiss-Vamosi --- examples/widgets/lv_example_widgets.h | 1 + examples/widgets/scale/index.rst | 6 ++ examples/widgets/scale/lv_example_scale_7.c | 72 +++++++++++++++++ src/widgets/scale/lv_scale.c | 3 + tests/ref_imgs/{ => widgets}/scale_1.png | Bin tests/ref_imgs/{ => widgets}/scale_2.png | Bin tests/ref_imgs/{ => widgets}/scale_3.png | Bin tests/ref_imgs/{ => widgets}/scale_4.png | Bin tests/ref_imgs/widgets/scale_5.png | Bin 0 -> 5840 bytes .../{ => widgets}/scale_1.png | Bin .../{ => widgets}/scale_2.png | Bin .../{ => widgets}/scale_3.png | Bin .../{ => widgets}/scale_4.png | Bin tests/ref_imgs_vg_lite/widgets/scale_5.png | Bin 0 -> 5817 bytes tests/src/test_cases/widgets/test_scale.c | 73 +++++++++++++++++- 15 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 examples/widgets/scale/lv_example_scale_7.c rename tests/ref_imgs/{ => widgets}/scale_1.png (100%) rename tests/ref_imgs/{ => widgets}/scale_2.png (100%) rename tests/ref_imgs/{ => widgets}/scale_3.png (100%) rename tests/ref_imgs/{ => widgets}/scale_4.png (100%) create mode 100644 tests/ref_imgs/widgets/scale_5.png rename tests/ref_imgs_vg_lite/{ => widgets}/scale_1.png (100%) rename tests/ref_imgs_vg_lite/{ => widgets}/scale_2.png (100%) rename tests/ref_imgs_vg_lite/{ => widgets}/scale_3.png (100%) rename tests/ref_imgs_vg_lite/{ => widgets}/scale_4.png (100%) create mode 100644 tests/ref_imgs_vg_lite/widgets/scale_5.png diff --git a/examples/widgets/lv_example_widgets.h b/examples/widgets/lv_example_widgets.h index e397b637fb..8b4848d172 100644 --- a/examples/widgets/lv_example_widgets.h +++ b/examples/widgets/lv_example_widgets.h @@ -122,6 +122,7 @@ void lv_example_scale_3(void); void lv_example_scale_4(void); void lv_example_scale_5(void); void lv_example_scale_6(void); +void lv_example_scale_7(void); void lv_example_slider_1(void); void lv_example_slider_2(void); diff --git a/examples/widgets/scale/index.rst b/examples/widgets/scale/index.rst index e9bfa5a5a4..69c573303b 100644 --- a/examples/widgets/scale/index.rst +++ b/examples/widgets/scale/index.rst @@ -34,3 +34,9 @@ A round scale with multiple needles, resembling a clock .. lv_example:: widgets/scale/lv_example_scale_6 :language: c +Customizing scale major tick label color with `LV_EVENT_DRAW_TASK_ADDED` event +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +.. lv_example:: widgets/scale/lv_example_scale_7 + :language: c + diff --git a/examples/widgets/scale/lv_example_scale_7.c b/examples/widgets/scale/lv_example_scale_7.c new file mode 100644 index 0000000000..7891164aa5 --- /dev/null +++ b/examples/widgets/scale/lv_example_scale_7.c @@ -0,0 +1,72 @@ +#include "../../lv_examples.h" +#if LV_USE_SCALE && LV_BUILD_EXAMPLES + +#include "../../../src/lvgl_private.h" //To expose the fields of lv_draw_task_t + +static void draw_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_target(e); + lv_draw_task_t * draw_task = lv_event_get_draw_task(e); + lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task); + lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task); + if(base_dsc->part == LV_PART_INDICATOR) { + if(label_draw_dsc) { + const lv_color_t color_idx[7] = { + lv_palette_main(LV_PALETTE_RED), + lv_palette_main(LV_PALETTE_ORANGE), + lv_palette_main(LV_PALETTE_YELLOW), + lv_palette_main(LV_PALETTE_GREEN), + lv_palette_main(LV_PALETTE_CYAN), + lv_palette_main(LV_PALETTE_BLUE), + lv_palette_main(LV_PALETTE_PURPLE), + }; + uint8_t major_tick = lv_scale_get_major_tick_every(obj); + label_draw_dsc->color = color_idx[base_dsc->id1 / major_tick]; + + /*Free the previously allocated text if needed*/ + if(label_draw_dsc->text_local) lv_free((void *)label_draw_dsc->text); + + /*Malloc the text and set text_local as 1 to make LVGL automatically free the text. + * (Local texts are malloc'd internally by LVGL. Mimic this behavior here too)*/ + char tmp_buffer[20] = {0}; /* Big enough buffer */ + lv_snprintf(tmp_buffer, sizeof(tmp_buffer), "%.1f", base_dsc->id2 * 1.0f); + label_draw_dsc->text = lv_strdup(tmp_buffer); + label_draw_dsc->text_local = 1; + + lv_point_t size; + lv_text_get_size(&size, label_draw_dsc->text, label_draw_dsc->font, 0, 0, 1000, LV_TEXT_FLAG_NONE); + int32_t new_w = size.x; + int32_t old_w = lv_area_get_width(&draw_task->area); + + /* Distribute the new size equally on both sides */ + draw_task->area.x1 -= (new_w - old_w) / 2; + draw_task->area.x2 += ((new_w - old_w) + 1) / 2; /* +1 for rounding */ + + } + } +} + +/** + * Customizing scale major tick label color with `LV_EVENT_DRAW_TASK_ADDED` event + */ +void lv_example_scale_7(void) +{ + lv_obj_t * scale = lv_scale_create(lv_screen_active()); + lv_obj_set_size(scale, lv_pct(80), 100); + lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_BOTTOM); + lv_obj_center(scale); + + lv_scale_set_label_show(scale, true); + + lv_scale_set_total_tick_count(scale, 31); + lv_scale_set_major_tick_every(scale, 5); + + lv_obj_set_style_length(scale, 5, LV_PART_ITEMS); + lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR); + lv_scale_set_range(scale, 10, 40); + + lv_obj_add_event_cb(scale, draw_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); + lv_obj_add_flag(scale, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); +} + +#endif diff --git a/src/widgets/scale/lv_scale.c b/src/widgets/scale/lv_scale.c index 9663e4f546..fbab460180 100644 --- a/src/widgets/scale/lv_scale.c +++ b/src/widgets/scale/lv_scale.c @@ -568,6 +568,9 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event) const int32_t tick_value = lv_map(tick_idx, 0U, total_tick_count - 1, scale->range_min, scale->range_max); + label_dsc.base.id1 = tick_idx; + label_dsc.base.id2 = tick_value; + /* Overwrite label and tick properties if tick value is within section range */ lv_scale_section_t * section; LV_LL_READ_BACK(&scale->section_ll, section) { diff --git a/tests/ref_imgs/scale_1.png b/tests/ref_imgs/widgets/scale_1.png similarity index 100% rename from tests/ref_imgs/scale_1.png rename to tests/ref_imgs/widgets/scale_1.png diff --git a/tests/ref_imgs/scale_2.png b/tests/ref_imgs/widgets/scale_2.png similarity index 100% rename from tests/ref_imgs/scale_2.png rename to tests/ref_imgs/widgets/scale_2.png diff --git a/tests/ref_imgs/scale_3.png b/tests/ref_imgs/widgets/scale_3.png similarity index 100% rename from tests/ref_imgs/scale_3.png rename to tests/ref_imgs/widgets/scale_3.png diff --git a/tests/ref_imgs/scale_4.png b/tests/ref_imgs/widgets/scale_4.png similarity index 100% rename from tests/ref_imgs/scale_4.png rename to tests/ref_imgs/widgets/scale_4.png diff --git a/tests/ref_imgs/widgets/scale_5.png b/tests/ref_imgs/widgets/scale_5.png new file mode 100644 index 0000000000000000000000000000000000000000..13d2b61304bc230767b47cfc72b3400b69c5e6fc GIT binary patch literal 5840 zcmeHL`BM|fx{Y$LjH1I#F~TSU&h@Gj5mDJjwz!Qb2yudd5+I`p0a>E5lY~5Ql(~bz zogsiM3D+fTfgnpD1d=!+ph+OIC4?mb6k=Es2xKS8i&O8H_Yb@uURl-EReidv`>U_} ze0BQ#>q>ynt{r=K004kpmoA=%001WY0e~$tUu-oZ!%_IB0DxubrSoU5rdO^^qp@Rh z^vs%68X?)qwz&UvXAZMy`_?~BhyB=Em-nqjMGQA)U@y33Y`n77_PuMYEBUTpVC%w- zirN$59e&vO*ie7h6V@BIEG+8BNOP`RcB3xt-@0|{fvqQ<*gd#ThVFeitG4%%++rI% zqR9!v)(wjK)q`F=rx0`o3)es-+HV1TRdamG8UXk<_HUMe)5o*_4*2Tw&szY0v$zHT z{P`LBoQcnG;{SpQeLI!gz9eR>FYHoU0)8I7&dAc;LCoGs%K1BBGd2H}Nx@J`PLSMD z@^O*Ve<$2~+4==WYuCrhMVlxPhMsiw3&j2pvZ221|BJ&cDwX;WX`aimW|(=GXD9^w z!86t$wxbSsA`$;Syqf@Yn^zdW*Ua^05Qw#zh z$mm!IW^#_6CM<#+@j|7{Gq5M|=eqzv zG|^+do#n`&ufX|A*t-y=UF%stx!-jIXNlQiwVq$xT^B~Z^&g3lrjb2iKT0=f%ZiEZ zIy92AzN`0PU;$ofn&iz5<6$A8iq{FmcA;CkY*M6Ou_vKXN-AUWj;Oj|z_`-q}^;@dL$kL2d{X&*x-8=+J4_**$TFC(-&3;q|2+0W6OSDY45jp zYeLV@X)v&hK(ypZwlwig1kHQ=+@ukITQybWQYtGPV38_8nc!o=c*D#uMNokpCJcu1 zn=_S>9r07zWS_dubeR-ffmA;Vfw^GI+@5{C`XEgd167 zherl&_`e~prh11^G$Z#N_cGZr@3bEF5Z{!z65FuFNuIEs;;AgkrT!C{I7SJw+URhQ zc&(H)Bn9f8`LS>nO!(&fjq#PQqb^GmA~l$C&_WvPK~W3Jr*0G1OyemEx?BiYxd9a> ztlEH^W%}`M731VO7E4`lPshR!e@Zb%o9B^5U6FFiG8G#o;+5$Y(0HDf#lH&2ZEg#TDBQDIA&5r^kN7ZGJyqt$r5@ir0`#Rk^({+)Ex_f7`{og>4Q&tMu9 z2Bz6C5ziILN^KR@KPISmueY2F*S=FQ`!VH~WC9^?xV<2GeWI-~X(kD7Y2MRb=xm;~ z&`ezzwqIP-6S)EI39ss^aMPVM?OKzeJ_)K6W8BkLgU*#@6z%;fJLuY-+rD+O_ee-c zzn@=+K-DtRP=hXBhn;{q`sx$f0%9|rm{_=UKjHz#U2jMBn`uH!`Xn z+O4(#pBg0#(`AYbiv_)yp^2Bz8m|WiRmu+ra`30Je%bU;kq5pFaf=KKm#-^9Yg3cf zzGP48LfN!2)6z0zn0z*;T2q*quK(@QfLTTV|D1c)Z}u0MK~9tPn+CYaovc}{ErQxoQ>Pp9s%^dCn@i=!T)zcvDYltx4fhx}b!=?>MnL`n5${{rm=W&u zESTGQs>x$xAVkxS+Qc zJ526NF6@koPOcprvky+Si9sB7v0bdkg?CLL@pdSB%EE^qjigU;d_;mVe}_;r->=7Y zX(afOV6^ITns9-h4YuWlT2o?f2F9J}lJ-g_m{+1N6mz_sS6`dO^1ICOAqguN9a3^V z>6xjRC@9=jg<7JGm<{4AlW~Qe{=Ff+gfQ8BD(DeRyhWuw#_2;TI;Ku z_4u@CPUGIqF(aFOfrxVN^b?5k;Blu#=FILsEF!|IQ zQPJOoc8Vnj11&>9pyPLDj0Dubqm`mR3RonxirSynWbMfpOyeQ$sZ-7Otq!~F)3Wvc zxd|OUIW9I{LKMA~e2sEfn}=lTfCPUpV<(P;rB>Vw)jcMMqsh7F%Jz71r6g3^Iaj*3 z1FTBARCm?NgUKI=8|h|{*xDuL!8CKvHrh$m9|^|ToXP4a%;4I9_^p+!r%im|bU&A* zZ3;y$!r|Zu=M#iv-W+E9o^%ik5h)~C$O!iC{oIOb=jDw0XNo)DJ0T(tELwioOywYt z6R;XZG+OJsgxJ@ym}6phtu*vPZ$c@iStB7rxXu$1XLc`5T*wmp>Q*RY4Yy zq@|Q}1t-$A#-gN|@Ib`JRXR5yJ?Dr&&&fZco27Ij_p+C0 zyy%#B7DajQ^`0Tn!Lg*e#XUg-gEp~TXoQd*Qw$D!Y;1NN&rhyA6(|itEaWarX`V%n z&D6+G1^aV5JMWF=^mKC$oR8qcgy7VEmdetN( z318OJOzTCEF{k?S0h-Qi@6v7a+>=iAm8S@I-a^e-0$jopyFNE){gCB?|4}2lDiA-A zR>Cd=r@PcMDEad3NfsE|p8EWhkDZJ(_eJX(DIt6k*{*BT6+8gdWj)7!qPmS41|pGw z8Q#z8#Zy@`wMFK5RS<_1fm|4f`=@E}4H*_S{2`fVLoR0CS4M^7#5g#OR5k>Z^4F~o zg+}jm4zTyS8<_Cqg&Jv;5!n`wn=6v#U$G&I!j(>U@Bo?W3na|lHK}X7st-tbaz&qe zmV4^TCXVOksefkJZExWlyd?R}T}3%nLgD}MQ2tX&V0p-3y1+;PGFWcfzr>d z`cxdTnO~lY&F=DeI-r>uO=6@>%oJjWH^FRACA0?jg3@@GIbNd|EljMIAk#`bwgvnk znpsO)U(09QT^JyyPp9y9DQ$D+4e6L8$|yMFFac|axtS{ZZS!qP1`MGuRKhz99h+0i z-6h=}EwkcewRAoZ%nqo`sx6z7trbuh#S0~6e8%S zk9@wCwEF=X?1DmYU#j>SOO;F&U%o_tOa@hIy7HisdV|`o6doQ?mcqY-vB-szNiE&2 zVVa9f*qb9BEzAOJ&D9vvt;3_{DElQ?6$H_2$kyl?N31wR?BKw*tf6=7v)RdKBPvrr zh132e@pib8W5@6rLjnQK_~xYU@9-kA4@a-6?oX@}*r76oj`Xz;D_V_0H@g|vo|33F zHxKh7++eN^1lG6)s0Gzh5KUx-E~bxp*j-;^AsotDR1Lsqgew@S80Qv0JsDWH{Lxwk zLQ=h3Gr)1ptHpaP0)1Qii|G_yZ>};eE#yeribV6?0qF>;7Pnk-h;z@3ZsfZo!(s!@ zO+Sf#sGW3gAVmaq%A31uKxDf&QeinpT_r1_ZXB+$LZI7Zb=q|uO`S)J^+)PO<{^0L zApKtO1jP}g#mqbPiCPcca_Xxw=+oPyLkRHwy7Z)Z7KnAs8)$ghFeG!`71?KLU9iVP z6{$0%M=zMx1j7o)PCi@vS5yTa*44p)&+x03L$zbDLCPv+j|iMG`_>AxiZ_K;yR{F- zyN|N(VBlLWsN!DiFbinhRKuR{X0<>OOzR3+q5e-l#6KoRE8ScP)eF4xJ<}TD8Vusw z>mY1G%Bug8*OGNxcAssra)pQuU8i!fkgTacBnR!6xJMfe7~WOiMjC>Vl}sOskvm)n zEa@vTx20k8M8$bk?Eda&9_VHg3W-*i_zFg$)Tf$5Pcv?lKKN%Cw=u?53qj`%VTXBK zG_9R-i#fMw-yAH>yft5fg!rx>V(VUss}Q6(W07_F#=6`$A4o82lFr0gGNxm8a1tLX zxDroE=H^})v(6`_vzq-nmc!}9$Ry$ExD!y%tSJYlh)i(JL5sb?gZMV1;O50ojD)gD zAUfF?Mq}iT#@+_ni12T`J{i4jF47_Qt;Y;N`3UQ}2@)#M*?ELR~C!&k>0 ztTBoQHGTuV>Z-@r(H2A0g%gB@o8hd-yvKXCY_`BZ{d?3dMjNE(>}Nydvo-YD5&P^7 h{=c?FmklPJ*1zYUvHYso=u`tP{TOhbboS?*{|5fBZukHI literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/scale_1.png b/tests/ref_imgs_vg_lite/widgets/scale_1.png similarity index 100% rename from tests/ref_imgs_vg_lite/scale_1.png rename to tests/ref_imgs_vg_lite/widgets/scale_1.png diff --git a/tests/ref_imgs_vg_lite/scale_2.png b/tests/ref_imgs_vg_lite/widgets/scale_2.png similarity index 100% rename from tests/ref_imgs_vg_lite/scale_2.png rename to tests/ref_imgs_vg_lite/widgets/scale_2.png diff --git a/tests/ref_imgs_vg_lite/scale_3.png b/tests/ref_imgs_vg_lite/widgets/scale_3.png similarity index 100% rename from tests/ref_imgs_vg_lite/scale_3.png rename to tests/ref_imgs_vg_lite/widgets/scale_3.png diff --git a/tests/ref_imgs_vg_lite/scale_4.png b/tests/ref_imgs_vg_lite/widgets/scale_4.png similarity index 100% rename from tests/ref_imgs_vg_lite/scale_4.png rename to tests/ref_imgs_vg_lite/widgets/scale_4.png diff --git a/tests/ref_imgs_vg_lite/widgets/scale_5.png b/tests/ref_imgs_vg_lite/widgets/scale_5.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd465b6256792d225ebc5f26c334a3d47bb0cf5 GIT binary patch literal 5817 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 == LV_PART_INDICATOR) { + if(label_draw_dsc) { + const lv_color_t color_idx[7] = { + lv_palette_main(LV_PALETTE_RED), + lv_palette_main(LV_PALETTE_ORANGE), + lv_palette_main(LV_PALETTE_YELLOW), + lv_palette_main(LV_PALETTE_GREEN), + lv_palette_main(LV_PALETTE_CYAN), + lv_palette_main(LV_PALETTE_BLUE), + lv_palette_main(LV_PALETTE_PURPLE), + }; + uint8_t major_tick = lv_scale_get_major_tick_every(obj); + label_draw_dsc->color = color_idx[base_dsc->id1 / major_tick]; + + /*Free the previously allocated text if needed*/ + if(label_draw_dsc->text_local) lv_free((void *)label_draw_dsc->text); + + /*Malloc the text and set text_local as 1 to make LVGL automatically free the text. + * (Local texts are malloc'd internally by LVGL. Mimic this behavior here too)*/ + char tmp_buffer[20] = {0}; /* Big enough buffer */ + lv_snprintf(tmp_buffer, sizeof(tmp_buffer), "%.1f", base_dsc->id2 * 1.0f); + label_draw_dsc->text = lv_strdup(tmp_buffer); + label_draw_dsc->text_local = 1; + + lv_point_t size; + lv_text_get_size(&size, label_draw_dsc->text, label_draw_dsc->font, 0, 0, 1000, LV_TEXT_FLAG_NONE); + int32_t new_w = size.x; + int32_t old_w = lv_area_get_width(&draw_task->area); + + /* Distribute the new size equally on both sides */ + draw_task->area.x1 -= (new_w - old_w) / 2; + draw_task->area.x2 += ((new_w - old_w) + 1) / 2; /* +1 for rounding */ + + } + } +} + +void test_scale_render_example_7(void) +{ + lv_obj_t * scale = lv_scale_create(lv_screen_active()); + lv_obj_set_size(scale, lv_pct(80), 100); + lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_BOTTOM); + lv_obj_center(scale); + + lv_scale_set_label_show(scale, true); + + lv_scale_set_total_tick_count(scale, 31); + lv_scale_set_major_tick_every(scale, 5); + + lv_obj_set_style_length(scale, 5, LV_PART_ITEMS); + lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR); + lv_scale_set_range(scale, 10, 40); + + lv_obj_add_event_cb(scale, draw_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); + lv_obj_add_flag(scale, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/scale_5.png"); } void test_scale_set_style(void)