From a1cf7564a572ac24ea1ca11504729c0c2b19378b Mon Sep 17 00:00:00 2001 From: philmoz Date: Sat, 2 Aug 2025 11:42:27 +1000 Subject: [PATCH] fix(color): trims and sliders UI creation slows down model switch (#6492) --- .../320x240/default_theme/mask_trim.png | Bin 0 -> 1802 bytes .../default_theme/mask_trim_shadow.png | Bin 0 -> 1871 bytes .../480x272/default_theme/mask_trim.png | Bin 0 -> 1797 bytes .../default_theme/mask_trim_shadow.png | Bin 0 -> 1872 bytes .../800x480/default_theme/mask_trim.png | Bin 0 -> 1803 bytes .../default_theme/mask_trim_shadow.png | Bin 0 -> 1890 bytes radio/src/gui/colorlcd/bitmaps.cpp | 10 ++ radio/src/gui/colorlcd/bitmaps.h | 3 + radio/src/gui/colorlcd/mainview/sliders.cpp | 154 ++++++++++-------- radio/src/gui/colorlcd/mainview/sliders.h | 13 +- radio/src/gui/colorlcd/mainview/trims.cpp | 6 +- 11 files changed, 111 insertions(+), 75 deletions(-) create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_trim.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_trim_shadow.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_trim.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_trim_shadow.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_trim.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_trim_shadow.png diff --git a/radio/src/bitmaps/320x240/default_theme/mask_trim.png b/radio/src/bitmaps/320x240/default_theme/mask_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..f4cef34aadefe049ff64cc8291224c033dec071d GIT binary patch literal 1802 zcmb_dO>f*p7+z=vG*ZQh3qr_sFF|GO@%Urcqnaqqreq}?qI4y~jq%KQ*JSN6_9VNB zIJKu9+bjQpGZF_>ssDik0_7jTkqauX_rq$Vv_vhIY>&s!`|-T*GcynOc0a$q_TgHm z)44v_>F+o1=6>&Oc>eRSz6Gyq<<8eN%>CNjZ{1n{Vb!diki+MbMBYIxS6(1V-C@Wk-6CfG!EiDV@p-i2rUP3j9sG}T44}k*6XJH zQ-fgQ+t{^nfC#2OrcPiiFB1Y*BBlHNyUTF!6`5nLOKRKG>C~FKma0a!6NaIUiA@Ls z1gcL8&1R^mZ>~J_WzDOs)R`)b#v@DAk&aAAcEKVqTen5MtQ6GDp0Uz)EZne~0|jq! zz2n^Y|^DN?+4vJc{g3CcaGJ&;~WrE_=VV)NzC=o;;FJTOY+;>o~ zOEBYp(36s_?E8uzHN9Qg3$Q1y6fBeuasuB+o{%02LzW_pJx5}XcqH&v_Fq;REH5^B zZ9mPTYeYeJvKrcTvRo7Qh$||`zf@)ntQ1;8xui5ddlgGFxT~1O&Lf=E4oA}Tx-6rn|v!k zLVcfNe4QGWRo_}skUoimQ1C$xeelT#=~D$kR1gG3eG)-Loa{$vk83>+14$;C-~Z$H z|Nmy@jn$RsjxRj8P$(3RHyibqeBYDZ$BxM7l`BUcman^_#!HEu|2n&GJ6*guE)?#( z;J4S(HTQW;MNlG4ba-hTL=s&noIEv-2<`J!>F}-}R@L7>{Y+JSR#jiLUEoGF-t!w< zF+a1l(xzK|ikN!pY31Y?O9uf@i82lbVS>k1b>bJxarRqRl?f#6SJkB~pt9z!Dm4*v z1(l#i0WcK@l~5T0QgJ-`lwttG)`6*mvSt8m0}RW`>{4aGn0dHWe|8p5epS_8nnqaH zN25_`WR^tS)geMi2ZnAKnnY;HW|)$(7AA{x4|Sf<*pE_Qgi7X-bi^>NsxsLriy+F~ zhRLi_vS#|2L^>>ijMW6lXpW19@n901QJoKXz{50=SeRp@o=8Q~6E|_4Pu~zgR@Zg& z82jcD1bK)gUEYv1W(C<7owPS2uD5t1hB4*K8#2wsj7@}VF(;{r+d>THy;_~8tQh4I zQi?92ewdMX{5lg}Cn>M0vTv3KkOsT&7x7VVzG65*vI67!|5tkwYprQa<5glyb8`3kB)139+Vv6-V; z%rP|7DVH^?!$_Gi+p3swPCidQ7odrOg)KA};Ng;=m6rBM*yVE1)YZe&IhY#v^dhIT zXFdI&bo6Yeoa#*9E5XU!b-Su;=H!>$s X*f{#j=Wm_Oj=bjbO8ukLXV3i$9fMGt literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_trim.png b/radio/src/bitmaps/480x272/default_theme/mask_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..a12a15c5577c4c7e909eab90710b7dba49ade60c GIT binary patch literal 1797 zcmb_dO>f*p7+z8dL92=j7m!db_YwqSkH;Uo9@UM~Y+x7R5Tz>-Zk?SO?^;=VTzisr zazb$GjaGsS5*O~AdgH)f;KqO8!U+k9LwUU)RvV=yin@~5cjYR%2j4D zp~ljxvjWha&Yi8gVEjmGV=O0W9+`jr`kQH_A~L`9V;mPda+(g#N_qcmZ^X}zcqq)R zyT+ZGf`d$IX4Kg%uV@{a3%?Y`&9rSA3y407%u>>AzB3WE@{ zUN_+%8w3;I#;%P6L@@O+bpm7cGa+Cp5_-`8WEBp+B6F&BL2Y|JpIdX+Qsu;U!Z5Tk zu?azdK-FokS&j1Q_S!>VR=i9LovPeuJhHJm){zOxE?Hzn>o%`em4cetH7jh#!VRkh zQ1BL49GA02aKUXklbOtQ1z4xW7E`5FHB~Qh-7dcn0ID0uZHxt5}zQ#MFog~n#gc$zmPK77tZ_L-KE z34QYr?jh`q972ghUFRbQQ;e6;Scx<_ZJ|EGUE~7PrP!mm`vMenBba9Y3l^Lvs>~Qr zPBS)2<6VgLr$P$FH=Sb`kj|AS@{);k& z?ZswS_S0;-Mig|AR?x1~)taK4tkt!kKBCSEqA1HJNe%swx{#oBYH zDl~I31xIx=Y_AFUXfGO>L#0Z%Mt=JJ-#J`C?+yFgqs_OV literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_trim_shadow.png b/radio/src/bitmaps/480x272/default_theme/mask_trim_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..e6310dfc4465155ee943b313e482e40f59c6f2ca GIT binary patch literal 1872 zcmb_dONbmr7;aZx;%bmR2#`Yj5)iDZs-9_Px~uK( z-I-m%gL;TJ^`K((;K@^jfTwscIVgCM2%E}OV44)k<&)%QQX z|NpA$&9&7h56?X~rzpzd#!7u%zUPbQ(2V^5?A|Nqk60Io5PYe@6dpuX$yc5PXZRhhZG&N*3?FH9|ezL^7;mUT( zPi?O@>2{AIrk!|9JwC+JLBw;S4x@gY;bBc1`NeWvOdFayg58X>SCIhA{!0YuVCgJ2)P3z`)f(>IZ z80Z6A7iq^Z5kdyE49fx%0kW+)CqoctN2VU?Jfmrt z&s?IY43Xu_o07()AbX;-=2pUub)Jchl=9_GndXs#O@fzFPI8eph3HRvwKh#zwLBfE z3qGM?T#z_+g9)#boYyqjHwQojpx1;5yCycxM@)zz97BDV}b={3n=E9Eda`l5!Z44mXmxqp4*f@sj9^R0fvW*`q9cA2;GGCo$!XdQFq8^)O@@ zG2{id#Q=3_0356808*(UfFQNpDz`Wdys3R%(2b(EQ+p=u1IKmD3bTP@y9hY69RNg8 zP^h~SK!=%@NvHPDrlH(kq<>&P#ilDnfmgyzwrgv$CrC-j&y(tE%aT}Xwg{C zw8?b1M+NrBVC;6#<fQaCv4L+QI4UPmQ~JQPSD9 zpZ-reMsZS(b!P0A;AriJQ&l!|G$oJfVpv`i@}s03&zog#t__tRdn)!MrY0VPz`Su+TKdrp}*4%9O+F#Gre>{5jqWRSW`uyUHJ@7{I z+hwzNUi|#WxvR?i=#xKR-TC|CnWrv%Kl9$%@6Nok^TFMyb4fXN^p_8Rzi|Igw|}&` WdgrfK-pz|Uud%#Z|McWbul)mWCs4%z literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_trim.png b/radio/src/bitmaps/800x480/default_theme/mask_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..c64b9bbd57189bfb4184e62c634c0d8073c0bc1e GIT binary patch literal 1803 zcmb_dO>f*p7&cTODD4R(DkN0Py#&E{#^38vO_c7Y>>?bZbS1*ALjsR|G=p4Fq?@0r4yN8JrN@%Ip2G+9)ki#7bU|XP)=tdEaMdzTDsY;O6zWu4|fh zb2J(;V z0j+6ww-+VjN3ziqImwF1`19A_3_TN(@rf6cxa`YmHax53gR{LcKRe=~Ft*>RWUkc-P8XNi&(i}y`P8(1^jQ91vs-zy87UG0BdJvkS9}?CJQvRN9 z6WhbY!Nf;4p&p@@udjaw1gu0#4+i(w;ovJWrcF~)jOX*YId@D|O|TV)AtpAqZ3GBZ zpB4>UprXFB@i34zud=eqRH3&XS)z`c$be*5Eb_8*Th!}HLCx@jmDn;#%W4S}yu+2p z)odADa4cssmqk+p*6Oh3R5hxes%N+xwR z@qw(>amD5C38Z$Y!(`c}+%RCmLfu2OA^<1ZNIbsxXNIAvDuaV zw41IK1s!HJwCi-eCmzVp)}vXbFLgi}Z}lA+ylt!$#(FxtpaPd;uyQ+}N^ts|cCTQy zN}D;W~ji7x_AbmY6_I|16% z^C(cTmD<%@oOl(}8&gIm2t`{AhbNlK4q=Va&a-}nTUV_WDCr(vp=5h*- z>UP*&6Y$YpG_rt7Rd9_w`u2w(;R?Dv8tjaFU-5q)Ki`QF1X{sr=}E!O}5 literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_trim_shadow.png b/radio/src/bitmaps/800x480/default_theme/mask_trim_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..9193c3daea7f62d0330a78334668c07710f98925 GIT binary patch literal 1890 zcmb_dO=ulO9DkKkG&Bdjh#%mx_0W>;+u84(A=@U+MibhNF@0jhgU*|oeQ(LzoppDU z_Yzb}>A|X16hx#~4vzH*N#UU#K)Pvv6$$MV^AWdGS-t+waQ zsIgou2geZMaUE0MWc6O03UsYDdAOHivcd|f$y!n3$=5G@CQA|ZcyQTM?FvO`$b}0POGxihZHNGJY5EqmV-rUhG$HI zbxk1v7?K0)(1rlJPDl<)I?yc@7%H$89Uu!J&6b8gSp>{zh?e|EhT+7QC%20tMXK8E zcI#cE&a;-PK?qf#tGccTgp#i(1@0+HzHj8gXF18Dw1{{jl^$`EuNIyxk{z&!)5>j< z4=W{VruJ~EYIRVu>H{gMaOrB+=?AAoWgQl?q{szUtFURC7d&tCTez;4Zwer)8w6F1 zEpv(EDnwq)t_d2$f^3P-8|x`kmsrkMGs0%qM4J0bHYu9P7%q6$;Jh>H)#4~+Nw@1z z+8=mCzN6Fi}U=>f4h^ z*;q#9;dHb`1-8dv;I`Xl!s%_=J%HsrEV?*j(=Ac0Z3s%eRr)zzyM6L5bTu71meRDS zqnOmu71*?G#cWb+Q)-#6p^eB_$yWk25D)@{BLVI#`C(~E8z(I$&P-L_Ii2mPaZ@iU zI-B;>|4BzJPs)ML)Xfs?uibE}ie~nw#8F)it7}4hR2L0PM5Quujr_SMni5yg+PpvA zaL-)(_T%v{rMof13c~O4j()mwLy|DZF3))xK zgTK9Y%|G?d_lI^*J#qTVUtfGWHu1qnpO0OAdg2>+^uT!@hT-e}b?=wGKd0ThAOGQ} ti{~z%edyff+QYT4kNG_Lr?K+)uINPc{_h8`{88S5^Ro;7hew`0`7hllT<`z@ literal 0 HcmV?d00001 diff --git a/radio/src/gui/colorlcd/bitmaps.cpp b/radio/src/gui/colorlcd/bitmaps.cpp index a2a0bb3da..effdfd3c7 100644 --- a/radio/src/gui/colorlcd/bitmaps.cpp +++ b/radio/src/gui/colorlcd/bitmaps.cpp @@ -360,6 +360,13 @@ static const uint8_t mask_model_list_two[] = { #include "mask_model_list_two.lbm" }; +static const uint8_t mask_trim[] = { +#include "mask_trim.lbm" +}; +static const uint8_t mask_trim_shadow[] = { +#include "mask_trim_shadow.lbm" +}; + struct _BuiltinIcon { const uint8_t* lz4_compressed_bitmap; }; @@ -478,6 +485,9 @@ static const _BuiltinIcon _builtinIcons[EDGETX_ICONS_COUNT] = { BI(ICON_MODEL_GRID_SMALL, mask_model_grid_small), BI(ICON_MODEL_LIST_TWO, mask_model_list_two), BI(ICON_MODEL_LIST_ONE, mask_model_list_one), + + BI(ICON_TRIM, mask_trim), + BI(ICON_TRIM_SHADOW, mask_trim_shadow), }; static MaskBitmap* _builtinIconsDecompressed[EDGETX_ICONS_COUNT] = {0}; diff --git a/radio/src/gui/colorlcd/bitmaps.h b/radio/src/gui/colorlcd/bitmaps.h index dc556bdd8..959596669 100644 --- a/radio/src/gui/colorlcd/bitmaps.h +++ b/radio/src/gui/colorlcd/bitmaps.h @@ -133,6 +133,9 @@ enum EdgeTxIcon { ICON_MODEL_LIST_TWO, ICON_MODEL_LIST_ONE, + ICON_TRIM, + ICON_TRIM_SHADOW, + EDGETX_ICONS_COUNT }; diff --git a/radio/src/gui/colorlcd/mainview/sliders.cpp b/radio/src/gui/colorlcd/mainview/sliders.cpp index 4359b333f..b8d36c24e 100644 --- a/radio/src/gui/colorlcd/mainview/sliders.cpp +++ b/radio/src/gui/colorlcd/mainview/sliders.cpp @@ -26,86 +26,41 @@ #include "edgetx.h" #include "switches.h" -static const lv_style_const_prop_t shadow1_props[] = { - // LV_STYLE_CONST_SHADOW_COLOR does not compile in GitHub ??? - {.prop = LV_STYLE_SHADOW_COLOR, .value = {.color = {.full = 0}}}, - LV_STYLE_CONST_SHADOW_OPA(LV_OPA_20), - LV_STYLE_CONST_SHADOW_OFS_X(1), - LV_STYLE_CONST_SHADOW_OFS_Y(1), - LV_STYLE_CONST_SHADOW_WIDTH(1), - LV_STYLE_PROP_INV, -}; -static LV_STYLE_CONST_MULTI_INIT(shadow1_style, shadow1_props); - -static const lv_style_const_prop_t shadow2_props[] = { - // LV_STYLE_CONST_SHADOW_COLOR does not compile in GitHub ??? - {.prop = LV_STYLE_SHADOW_COLOR, .value = {.color = {.full = 0}}}, - LV_STYLE_CONST_SHADOW_OPA(LV_OPA_40), - LV_STYLE_CONST_SHADOW_OFS_X(1), - LV_STYLE_CONST_SHADOW_OFS_Y(1), - LV_STYLE_CONST_SHADOW_WIDTH(1), - LV_STYLE_PROP_INV, -}; -static LV_STYLE_CONST_MULTI_INIT(shadow2_style, shadow2_props); - SliderIcon::SliderIcon(Window* parent) : - Window(parent, rect_t{0, 0, MainViewSlider::SLIDER_ICON_SIZE + 2, MainViewSlider::SLIDER_ICON_SIZE + 2}) + Window(parent, rect_t{0, 0, MainViewSlider::SLIDER_BAR_SIZE, MainViewSlider::SLIDER_BAR_SIZE}) { setWindowFlag(NO_FOCUS); - auto shad = lv_obj_create(lvobj); - etx_obj_add_style(shad, shadow1_style, LV_PART_MAIN); - lv_obj_set_pos(shad, 1, 1); - lv_obj_set_size(shad, MainViewSlider::SLIDER_ICON_SIZE, MainViewSlider::SLIDER_ICON_SIZE); + auto icon = getBuiltinIcon(ICON_TRIM_SHADOW); + shadow = lv_canvas_create(lvobj); + lv_canvas_set_buffer(shadow, (void*)icon->data, icon->width, icon->height, LV_IMG_CF_ALPHA_8BIT); + etx_img_color(shadow, COLOR_THEME_PRIMARY1_INDEX); - fill = lv_obj_create(lvobj); - etx_obj_add_style(fill, shadow2_style, LV_PART_MAIN); - lv_obj_set_pos(fill, 0, 0); - lv_obj_set_size(fill, MainViewSlider::SLIDER_ICON_SIZE, MainViewSlider::SLIDER_ICON_SIZE); - etx_solid_bg(fill, COLOR_THEME_FOCUS_INDEX); + icon = getBuiltinIcon(ICON_TRIM); + mask = lv_canvas_create(lvobj); + lv_canvas_set_buffer(mask, (void*)icon->data, icon->width, icon->height, LV_IMG_CF_ALPHA_8BIT); + etx_img_color(mask, COLOR_THEME_FOCUS_INDEX); } +std::vector MainViewSlider::tickMasks; + MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx, bool isVertical) : Window(parent, rect), isVertical(isVertical) { potIdx = adcGetInputOffset(ADC_INPUT_FLEX) + idx; - if (isVertical) { - int sliderTicksCount = (height() - SLIDER_BAR_SIZE) / SLIDER_TICK_SPACING; - tickPoints = new lv_point_t[(sliderTicksCount + 1) * 2]; + auto mask = getTicksMask(); - lv_coord_t y = SLIDER_BAR_SIZE / 2; - for (uint8_t i = 0; i <= sliderTicksCount; i++) { - if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) { - tickPoints[i * 2] = {PAD_TINY, y}; - tickPoints[i * 2 + 1] = {SLIDER_ICON_SIZE, y}; - } else { - tickPoints[i * 2] = {PAD_TINY + 2, y}; - tickPoints[i * 2 + 1] = {SLIDER_ICON_SIZE - 2, y}; - } - auto line = lv_line_create(lvobj); - etx_obj_add_style(line, styles->div_line, LV_PART_MAIN); - lv_line_set_points(line, &tickPoints[i * 2], 2); - y += SLIDER_TICK_SPACING; - } - } else { - int sliderTicksCount = (width() - SLIDER_BAR_SIZE) / SLIDER_TICK_SPACING; - tickPoints = new lv_point_t[(sliderTicksCount + 1) * 2]; + if (mask) { + maskCanvas = lv_canvas_create(lvobj); + etx_img_color(maskCanvas, COLOR_THEME_SECONDARY1_INDEX); + lv_canvas_set_buffer(maskCanvas, mask->data, mask->width, mask->height, LV_IMG_CF_ALPHA_8BIT); - lv_coord_t x = SLIDER_BAR_SIZE / 2; - for (uint8_t i = 0; i <= sliderTicksCount; i++) { - if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) { - tickPoints[i * 2] = {x, PAD_TINY}; - tickPoints[i * 2 + 1] = {x, SLIDER_ICON_SIZE}; - } else { - tickPoints[i * 2] = {x, PAD_TINY + 2}; - tickPoints[i * 2 + 1] = {x, SLIDER_ICON_SIZE - 2}; - } - auto line = lv_line_create(lvobj); - etx_obj_add_style(line, styles->div_line, LV_PART_MAIN); - lv_line_set_points(line, &tickPoints[i * 2], 2); - x += SLIDER_TICK_SPACING; + if (isVertical) { + lv_obj_set_pos(maskCanvas, PAD_TINY, SLIDER_BAR_SIZE / 2); + } else { + lv_obj_set_pos(maskCanvas, SLIDER_BAR_SIZE / 2, PAD_TINY); } } @@ -114,12 +69,73 @@ MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect, uint8_t idx, setPos(); } -void MainViewSlider::deleteLater(bool detach, bool trash) +MaskBitmap* MainViewSlider::getTicksMask() { - if (!deleted()) { - if (tickPoints) delete tickPoints; - Window::deleteLater(detach, trash); + coord_t l, x, y, w, h; + + // Mask size + if (isVertical) { + h = height() - SLIDER_BAR_SIZE + 1; + if ((h & 1) == 0) h += 1; + w = MASK_SHORT_DIM; + } else { + w = width() - SLIDER_BAR_SIZE + 1; + if ((w & 1) == 0) w += 1; + h = MASK_SHORT_DIM; } + + for (auto mask : tickMasks) { + // TRACE("Found Mask %d %d",w,h); + if (mask->width == w && mask->height == h) return mask; + } + + MaskBitmap* mask =(MaskBitmap*)malloc(w * h + sizeof(uint16_t) * 2); + if (!mask) { + TRACE("Could not create Slider mask"); + return nullptr; + } + + mask->width = w; + mask->height = h; + memset(mask->data, 0, w * h); + + if (isVertical) { + // Create vertical mask for tick lines + int sliderTicksCount = h / SLIDER_TICK_SPACING; + y = 0; + for (uint8_t i = 0; i <= sliderTicksCount; i++) { + if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) { + x = 0; + l = w; + } else { + x = PAD_TINY; + l = w - PAD_TINY * 2; + } + memset(&mask->data[y * w + x], 0xFF, l); + y += SLIDER_TICK_SPACING; + } + } else { + // Create horizontal mask for tick lines + int sliderTicksCount = w / SLIDER_TICK_SPACING; + x = 0; + for (uint8_t i = 0; i <= sliderTicksCount; i++) { + if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount) { + y = 0; + l = h; + } else { + y = PAD_TINY; + l = h - PAD_TINY * 2; + } + for (uint8_t n = y; n < y + l; n += 1) + mask->data[n * w + x] = 0xFF; + x += SLIDER_TICK_SPACING; + } + } + + // TRACE("Created Mask %d %d",w,h); + tickMasks.emplace_back(mask); + + return mask; } void MainViewSlider::setPos() diff --git a/radio/src/gui/colorlcd/mainview/sliders.h b/radio/src/gui/colorlcd/mainview/sliders.h index c80b339ac..4274a8c81 100644 --- a/radio/src/gui/colorlcd/mainview/sliders.h +++ b/radio/src/gui/colorlcd/mainview/sliders.h @@ -23,6 +23,9 @@ #include "dataconstants.h" #include "window.h" +#include + +class MaskBitmap; class SliderIcon : public Window { @@ -30,7 +33,8 @@ class SliderIcon : public Window SliderIcon(Window* parent); protected: - lv_obj_t* fill = nullptr; + lv_obj_t* mask = nullptr; + lv_obj_t* shadow = nullptr; }; class MainViewSlider : public Window @@ -49,19 +53,22 @@ class MainViewSlider : public Window static LAYOUT_VAL_SCALED(SLIDER_TICK_SPACING, 4) static constexpr coord_t HORIZONTAL_SLIDERS_WIDTH = SLIDER_SIZE + SLIDER_BAR_SIZE; static constexpr coord_t VERTICAL_SLIDERS_HEIGHT = SLIDER_SIZE + SLIDER_BAR_SIZE; + static constexpr coord_t MASK_SHORT_DIM = SLIDER_ICON_SIZE - PAD_TINY; + static constexpr coord_t MASK_LONG_DIM = SLIDER_SIZE + 1; protected: uint8_t potIdx; int16_t value = 0; bool isVertical; + lv_obj_t* maskCanvas = nullptr; SliderIcon* sliderIcon = nullptr; - lv_point_t* tickPoints = nullptr; + static std::vector tickMasks; void setPos(); void checkEvents() override; - void deleteLater(bool detach = true, bool trash = true) override; + MaskBitmap* getTicksMask(); }; class MainViewHorizontalSlider : public MainViewSlider diff --git a/radio/src/gui/colorlcd/mainview/trims.cpp b/radio/src/gui/colorlcd/mainview/trims.cpp index b2edde6e2..19854b6f4 100644 --- a/radio/src/gui/colorlcd/mainview/trims.cpp +++ b/radio/src/gui/colorlcd/mainview/trims.cpp @@ -60,17 +60,17 @@ class TrimIcon : public SliderIcon lv_obj_set_style_line_width(bar2, lw, LV_PART_MAIN); lv_line_set_points(bar2, &barPoints[2], 2); - etx_bg_color(fill, COLOR_THEME_ACTIVE_INDEX, LV_STATE_USER_1); + etx_img_color(mask, COLOR_THEME_ACTIVE_INDEX, LV_STATE_USER_1); } void setState(int value) { if (value < TRIM_MIN || value > TRIM_MAX) { - lv_obj_add_state(fill, LV_STATE_USER_1); + lv_obj_add_state(mask, LV_STATE_USER_1); lv_obj_add_state(bar1, LV_STATE_USER_1); lv_obj_add_state(bar2, LV_STATE_USER_1); } else { - lv_obj_clear_state(fill, LV_STATE_USER_1); + lv_obj_clear_state(mask, LV_STATE_USER_1); lv_obj_clear_state(bar1, LV_STATE_USER_1); lv_obj_clear_state(bar2, LV_STATE_USER_1); }