From 8d322b63a8a9aa5cf89f6c08c1b31aabcbe64dea Mon Sep 17 00:00:00 2001 From: Olivier FAURE Date: Mon, 17 Mar 2025 15:22:46 +0100 Subject: [PATCH] Change how some widgets are rendered (#886) Update the code for Button, Textbox and ProgressBar. Make the border and background disjoint. Correctly interpret the border width. --- ...rid_masonry__tests__initial_screenshot.png | Bin 35461 -> 35769 bytes .../to_do_list__tests__initial_screenshot.png | Bin 6839 -> 6758 bytes masonry/src/util.rs | 15 ++++---- masonry/src/widgets/button.rs | 13 +++++-- masonry/src/widgets/progress_bar.rs | 36 +++++++++--------- ...masonry__widgets__button__tests__hello.png | 4 +- ...s__grid__tests__2x2_with_overlapping_b.png | 4 +- ...s__grid__tests__2x2_with_overlapping_c.png | 4 +- ...__grid__tests__2x2_with_removed_widget.png | 4 +- ...ry__widgets__grid__tests__expanded_4x1.png | 4 +- ...ry__widgets__grid__tests__expanded_4x4.png | 4 +- ...nry__widgets__grid__tests__initial_1x1.png | 4 +- ...nry__widgets__grid__tests__initial_2x2.png | 4 +- ...nry__widgets__grid__tests__moved_2x2_1.png | 4 +- ...nry__widgets__grid__tests__moved_2x2_2.png | 4 +- ..._widgets__grid__tests__with_2x2_widget.png | 4 +- ...ets__grid__tests__with_changed_spacing.png | 4 +- ...s__grid__tests__with_horizontal_widget.png | 4 +- ...ts__grid__tests__with_negative_spacing.png | 4 +- ...ets__grid__tests__with_vertical_widget.png | 4 +- ...ress_bar__tests__0_percent_progressbar.png | 4 +- ...ss_bar__tests__100_percent_progressbar.png | 4 +- ...ess_bar__tests__25_percent_progressbar.png | 4 +- ...ess_bar__tests__50_percent_progressbar.png | 4 +- ...ess_bar__tests__75_percent_progressbar.png | 4 +- ..._bar__tests__indeterminate_progressbar.png | 4 +- ...dgets__textbox__tests__textbox_outline.png | 4 +- ...ets__textbox__tests__textbox_selection.png | 4 +- ..._transforms__transforms_pointer_events.png | 4 +- masonry/src/widgets/textbox.rs | 20 ++++------ 30 files changed, 92 insertions(+), 88 deletions(-) diff --git a/masonry/examples/screenshots/grid_masonry__tests__initial_screenshot.png b/masonry/examples/screenshots/grid_masonry__tests__initial_screenshot.png index ad51e2ed023cda29416f704ac5c89ecde4d1d90e..d322a040fcfb0f91109dcb8113beef0d02eec1f4 100644 GIT binary patch literal 35769 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 E08}r0>i_@% literal 35461 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 diff --git a/masonry/examples/screenshots/to_do_list__tests__initial_screenshot.png b/masonry/examples/screenshots/to_do_list__tests__initial_screenshot.png index 58997dbbda84e7327d17dd0ef9424af535ca258f..c92ee678fa15242ca474a56e7a73faba9ed7e7ee 100644 GIT binary patch literal 6758 zcmeHMjZ;%s7JncsDq_l_)fNPc4veCW0)h%Ox~r2#Kx%Ew?g~UjVW`PQq?mvqkJ`ah z`La+&41znY(#lB09YHW8D1{I{%ywBM8cYzfiSm_%5RyQWxA!ICL%aP0b|y10FZbP( zbMHOpcYf!0;o_$U@b1e#Tn0gqd(@xyeg;8Km(kxPi@}>5erOj2eYhoR@1D=;PGilB zZf^L?)iw=68!u?@syY*$R6~)}*?&^=E3WS6R0IY4jT_I_f01>Y6@IFh^NC_x(YEFx zAN`J+#^F2F77l$h$+we${Pbf)bCU1OpKWjJ&-D-a2nfiVALBE63B-hbcdzhNZyF1~ z8MveTt}K73ee3d=9+%z!xl;}7kp`aXd4IqB&g#v6*SeFtl7m-ZFdtm_ssns6qZdhf za5yw942+{oKi(GWNsNRa94=fN-lkCamqpn<)bdnL59u1eo{+R&x6tK_R$~+8FHUi8 zsm^UeeGrhMj0D%_9fk2ate3zer)I>qFEj3a59owHQpphM8Ln}e9fu5D(TtyEi{JSH z>(({}m2_<#!bMjXhcnyr`VPT7}W$XNRiuB5n(mv#3vn62@O4x!ojfyNT9PKX7 z?{z7v+oHz6ERnfibi7s!t+PQwo`jqF-k`-H>mlCEBYuIe;Vacg!A^9U zKAXxMS2Bxn<{p_ckT)2enMjli zEaTLq^z=M^whSX*kDEx!M9~3}lh`z-k|uA#nf_?BsE|EqrY^w-mOxXCH4fSVz#Hx4 z6_;j~5uFDjWm+>`Nn_H;TApeqk@1?ve6Lcwlhh1C%hpU*;cfutw=z%IO{#NzL zDN@B<6kCL6BirK`gC+DQo)zs9ZugOI0hTzHVNS=_zNVu*wHyB$-;l?b3*(r}&`m-) zpqBIu5p77%ROyY+sOA;pk5rpwh#A*jX%bdCUq-QLg9LOI1tv}#j1ze^{leDZ;YmSx zIIWOsxIk6>`=>+PXQ!GLmkCdC+p5z}pKeCOep=O}*PJ9x5g2{6Y;4NYa{pkbMT)i3 zS7Y=dJ)J0>X_8e|MUK6hTf@H89A+2RU4v1HQ?N#DOwtoR6% zxde}owoFkGFn9aG;v9u}%VPL^4>x|&zUzu_|GiPiJRF>C)@*R(7cq-S4rz+D5 zZdWHaW4-JD^1&t8B(x)+q%PW`7%&_gB01+ zU11DU8wTfrwR~p80u)ch(7o7GfINT!fch0Hv;FX$^&HmoMJ3x{C#>dAS5F+m>4Hr^ z$C*NC(#+Kl4*NNWg9vIPWd+u?UX5bvkcnTY>zroSx=?r5jycBF;js)kbXg*_Te5uG3 zwR6Z9ajBU6A;2DwiD>?0AjEAw!rfRVWHH+Dr$Gf{ECYHFRrPigD4`Gtg&9b7AfuJY zSf$c_qG|=if}OY~h`2;TbTXG1TjN5>0^Q0gmBvTafp!oumegklfMoL90Nc_uWtGNM z2BJsS)k~+B`%K+q0gIln>_C$73aO=v(Gj3_h1C-7b9U2GU*osFooi|RQOTeYpYU(l zI&sifSBp}OKe~mvUSrCJp#dy1fo&Mxr@fDzxetAA zZP+zWLW$<;Pa9DEFb!`GzPKc)q&o4-c_o$RT?RCmGQF^{@ZoT-L@b7mdgEtRlzU4v zIdo_bChNU=X;vT}kB`@xC}gr4l;Dz_V{2wrRcNdyi^Uop9aV!?QVc{_ctpgB>;85x zBKMZv$^X(vCiHoD#Oum~O47W6x=Xzd*~MaONNh~c&jf7HCXD)_AhOV=G-|RuZlZ@) zScMr-o*8!Yj9$La6}!!J-}h&%A^=FfEc<~Qhe<^?DM=ujM-Ey~4x|elY1s{lDK$P3y^#$c4oRH}3%dKZ2t69oSp*hok5J3jyk7WdHyG literal 6839 zcmeHMjaO1>8i%3PtXy{2JT+-LV`V2j1!`&^CfiP}W2x*;W9*bclc~*!U&A(vC^&V> z%GAthT!xf(8*L{>u{?e&*!Wc`x;rkZVW6T=G75+Y$k)CXB+X|3fIWwE;N1J(``q_^ z-sgFKzvp-1>Yt**oY!nx1B1bw!#_Oq5ex>u0ex3HfGauNpk5ek6E*zM!H+ZG(`|@5 zTR-`xOKDD@$$#8??~9|cRY`)n#m{Hg%f30nF7prYn$dk(|9NIb?*2qRJ5=IVsLahC z%2hr~F+MZQVa>a7r_S@E&4O0-Np2vR-FGH~^Y#VRJ;+ZY#<~fHx-6$#l?<-V7uu}z@;l^? zEgpRsLpwovB`n0MYcx;dj@e@#>7#@?*~Pa^z_ z-#p+l%W)HPua31Wu(&?kqi(;q!UkR)8Gn<0)|(y<4mt2*+bJbXyq>n`5i~NA`FUiFb;^f!*D296>2m7;|0=PtdZ>l1Eaz^Pp;4 zWQsI&5)6JA4GHr^#+gY(oOTnyTFiPblB;8IfAlo|TRux>YKDnKA`ILDMd7JQ^W+f> zot_BA3z2c!Fp8w2>WVt_ps1iFjv0oTMmRxti_qoE8SjA#Nm40V*r}_MFB~_$ETop8 zj6b0!;t2C`)%i(P=sLJ|7G*v|1+lx7Sk>rYD>qx!Qpn<9>IcVJu3Qa; z)@Iq;-?~G-4LdMZ1pF&s&(Sw?^Lf0TLQOX2Mxo(x;Uu46jD~~dgt}5u5z?$cPU^X4 zM{-Rt#n&|E>Ct_ZGm*Dg^16p8{Smw*4)2ts$?DgLOGUaD4|sZxoTB`@=fc6PK4}&l z#5ARAfNAsZUV_rF4R*u^-~uWRcyf_e_fAJ!M zD%Y5DDDu`ql>Q-myqP1T>?KKd)15Y=<%(aYbW>Won`eb`qbX$iGwk*iAb1i1yRgWI zZx!@J1tWRF6+bqq1)l5$wu}xoZ4;f3@QC?kB6B$1X z*t}*WTl2yIruAoZVYC~irJIR})bS1{3m(#`(sUd8UY8%JM1;-xk`>f5 zB$*b@RO$doeUdr4Pe-y;?F~9fZkmdR1TYlWX9()E6a9-t2A=2)g~I3#o%aK=xw;ib z95`V$;N!C6EScW1Z8<%|EFqi)*|=}`57xL2qjbUWO4EghD{ozCi}Ei9@Jkn4)&>b8 zh3acCg-{EYZX?Wgl8uA3Q~oY!E@(JCazme7sV0~svtA5lyYAn=j8+$!)X4^~+e?tk zPr{G6;tNhDH(p|zbp&h2qRvREUj=7e9E?p!$R$bpR2yhYT$Ut(x(Q;f&UQ}|IuuZ) z3k+0&NdBh+w38SgWC>Q$$Wi1Yo*@$Ti($rY=N80?) zdpU+4?keEG5-0v5Pf7r}Cy@W zHfsUTp67t4^7;+ESg|8@G`B(hEJ0D7dtjX)OBGCWBdDVZJ@>MnZdW+c6oQsvMyr#j zuE?_or2SG75f;lxyRCg$Xxf99)#8gapz-{;Tu8t&dt*JsNPRUDG3v${bF*p|(M)^j z&+RbnAr}Th?P<>VN%(!)5*8r_K zS=6guua8kP9S#6p>t_?G><_H_1Oi5F4GR#3To0>i1fp{Au2sYW*_&zI7T6o1aM2%} zQTAtx_yh`wcEIQLq+#|+ttDWODb)S!C1ppHMcvs6#m=WzKCrhFdpCuCU9yV_yOy%b yM!S@>D`|^Ju)j#y-=i!)e6s)FUn9+{(YHRm_UvS-Gx$Ra7JfMDP}Lt!U-&PMD5-`3 diff --git a/masonry/src/util.rs b/masonry/src/util.rs index 7b25b70d..6ef7d595 100644 --- a/masonry/src/util.rs +++ b/masonry/src/util.rs @@ -7,6 +7,7 @@ use std::any::Any; use std::hash::Hash; use vello::Scene; +use vello::kurbo::Join; use vello::kurbo::{ Affine, Rect, Shape, Stroke, {self}, }; @@ -102,13 +103,13 @@ pub fn stroke<'b>( brush: impl Into>, stroke_width: f64, ) { - scene.stroke( - &Stroke::new(stroke_width), - Affine::IDENTITY, - brush, - None, - path, - ); + // Using Join::Miter avoids rounding corners when a widget has a wide border. + let style = Stroke { + width: stroke_width, + join: Join::Miter, + ..Default::default() + }; + scene.stroke(&style, Affine::IDENTITY, brush, None, path); } #[allow(unused)] diff --git a/masonry/src/widgets/button.rs b/masonry/src/widgets/button.rs index 86220a83..549543db 100644 --- a/masonry/src/widgets/button.rs +++ b/masonry/src/widgets/button.rs @@ -184,11 +184,16 @@ impl Widget for Button { let is_hovered = ctx.is_hovered(); let size = ctx.size(); let stroke_width = theme::BUTTON_BORDER_WIDTH; + let border_radius = theme::BUTTON_BORDER_RADIUS; - let rounded_rect = size + let bg_rect = size + .to_rect() + .inset(-stroke_width) + .to_rounded_rect(border_radius - stroke_width); + let border_rect = size .to_rect() .inset(-stroke_width / 2.0) - .to_rounded_rect(theme::BUTTON_BORDER_RADIUS); + .to_rounded_rect(border_radius); let bg_gradient = if ctx.is_disabled() { [theme::DISABLED_BUTTON_LIGHT, theme::DISABLED_BUTTON_DARK] @@ -204,10 +209,10 @@ impl Widget for Button { theme::BORDER_DARK }; - stroke(scene, &rounded_rect, border_color, stroke_width); + stroke(scene, &border_rect, border_color, stroke_width); fill_lin_gradient( scene, - &rounded_rect, + &bg_rect, bg_gradient, UnitPoint::TOP, UnitPoint::BOTTOM, diff --git a/masonry/src/widgets/progress_bar.rs b/masonry/src/widgets/progress_bar.rs index b3d9cc2a..1b8cb703 100644 --- a/masonry/src/widgets/progress_bar.rs +++ b/masonry/src/widgets/progress_bar.rs @@ -147,22 +147,17 @@ impl Widget for ProgressBar { fn paint(&mut self, ctx: &mut PaintCtx, _props: &PropertiesRef<'_>, scene: &mut Scene) { let border_width = 1.; + let size = ctx.size(); + let border_radius = 2.; - let rect = ctx - .size() + let bg_rect = size .to_rect() - .inset(-border_width / 2.) - .to_rounded_rect(2.); - - fill_lin_gradient( - scene, - &rect, - [theme::BACKGROUND_LIGHT, theme::BACKGROUND_DARK], - UnitPoint::TOP, - UnitPoint::BOTTOM, - ); - - stroke(scene, &rect, theme::BORDER_DARK, border_width); + .inset(-border_width) + .to_rounded_rect(border_radius - border_width); + let border_rect = size + .to_rect() + .inset(-border_width / 2.0) + .to_rounded_rect(border_radius); let progress_rect_size = Size::new( ctx.size().width * self.progress.unwrap_or(1.), @@ -170,9 +165,16 @@ impl Widget for ProgressBar { ); let progress_rect = progress_rect_size .to_rect() - .inset(-border_width / 2.) - .to_rounded_rect(2.); + .inset(-border_width) + .to_rounded_rect(border_radius - border_width); + fill_lin_gradient( + scene, + &bg_rect, + [theme::BACKGROUND_LIGHT, theme::BACKGROUND_DARK], + UnitPoint::TOP, + UnitPoint::BOTTOM, + ); fill_lin_gradient( scene, &progress_rect, @@ -180,7 +182,7 @@ impl Widget for ProgressBar { UnitPoint::TOP, UnitPoint::BOTTOM, ); - stroke(scene, &progress_rect, theme::BORDER_DARK, border_width); + stroke(scene, &border_rect, theme::BORDER_DARK, border_width); } fn accessibility_role(&self) -> Role { diff --git a/masonry/src/widgets/screenshots/masonry__widgets__button__tests__hello.png b/masonry/src/widgets/screenshots/masonry__widgets__button__tests__hello.png index f6279bf0..bc6610bd 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__button__tests__hello.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__button__tests__hello.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1cb022806d289f4bce2657980b376af42b332d838edfecb0dfc807d059d2975f -size 5187 +oid sha256:4994346249ff234eb4e52db303053f5f88c1720216dd99475e2529af3828bf33 +size 1757 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_b.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_b.png index 646ec41f..6784db12 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_b.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_b.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4aef605773c92b01166520d3ca8065116d46540bc3880978b5f248c95c61fd8d -size 5001 +oid sha256:9c26cf7fed97582eb10b41c5e2d4ef699c9ac4d33d9b67a6abf092d839636224 +size 1071 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_c.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_c.png index ee7ba265..effc1370 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_c.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_overlapping_c.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec7a39d12493409ed242cc1f41e3d4dce46a96c481d2cdc38d4da185269465e0 -size 5321 +oid sha256:9e30df511b6268bed530eb673ea66bfcb0fb2ad3cb0ca1f1a4614fb2a53214ae +size 1234 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_removed_widget.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_removed_widget.png index 793dd9c8..8a920d13 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_removed_widget.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__2x2_with_removed_widget.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c1515c193d2b494e792f05b5d088d1566774285e0df448ea9bf364ce03ab712 -size 4472 +oid sha256:5801fd4aef3cb50ca2156eeece36616a84a1070db5d79921f072b6df48d840a2 +size 114 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x1.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x1.png index 3d3b16bc..ed06f1ca 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x1.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f7ce584ad5a911bb7bb8c35f3066ac3031c7ade64692896f7586e20c391b624 -size 5052 +oid sha256:0b4a63bd2f56b4b91b9bf720eb52a9c1ced2b3bbcc5c23b18b09f6b363ac9759 +size 1482 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x4.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x4.png index 2eee9b13..02b97756 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x4.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__expanded_4x4.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:58796a0ff44c059d90b9a2e424d390721b5e0052eccbd3b6f003d1739d771440 -size 5186 +oid sha256:d9fea62fdb9c55190e5c1b5387ca80c390b2657e9623c1ed51525c2588dc93b0 +size 1002 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_1x1.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_1x1.png index 4d7517fc..a28a32d2 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_1x1.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_1x1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5d77599d5f7c9fce3c46a651e2bcdb3bfc4172c465efc7db009c91b42e957ab -size 4927 +oid sha256:7dfc95e8479b1e9922b5ce6d6bad79bc49f5e24f4c0ce3438d023718531cbd03 +size 1502 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_2x2.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_2x2.png index f5246597..6b7adcff 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_2x2.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__initial_2x2.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33aabab29c8651a7efaf88d7609cb50b93e8864367ddeff54a77dc435bb746b0 -size 5312 +oid sha256:d5cc355e23054f84e11d17aec021b3f8b6712298cddf087256fbec2341243f22 +size 1129 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_1.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_1.png index 881db94d..01aa2cfa 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_1.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:47b741e1bcdc9ad915c2f17f3fededa3435bc089a3fea2309235c913cfce331a -size 5321 +oid sha256:e9f224a92e663eafe76ea00ccc654e44981f61950cc3f4b4183771ffb3087b5e +size 1123 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_2.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_2.png index 4d7517fc..a28a32d2 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_2.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__moved_2x2_2.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5d77599d5f7c9fce3c46a651e2bcdb3bfc4172c465efc7db009c91b42e957ab -size 4927 +oid sha256:7dfc95e8479b1e9922b5ce6d6bad79bc49f5e24f4c0ce3438d023718531cbd03 +size 1502 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_2x2_widget.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_2x2_widget.png index dd05c30c..46629036 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_2x2_widget.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_2x2_widget.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dde5ee4144c465a2dfc2e7407bcece68abf37fa03da97da4e5335a765c82662f -size 6623 +oid sha256:926bc1453a414f8ce8d18621456e250d3f3a3a57a4b103c11b760f862805c2df +size 2461 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_changed_spacing.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_changed_spacing.png index 78e7acc9..5f132e84 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_changed_spacing.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_changed_spacing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d69e1dc3b6b4e4135aacfa2e11f48e195784a3b8e1561f4e2bbf9ba3ec295cbf -size 6984 +oid sha256:dad06ac70e8a047984113061535290c8a5dc342538c12af8a6bc7744b998b5de +size 2817 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_horizontal_widget.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_horizontal_widget.png index 0930eb87..8ca3462c 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_horizontal_widget.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_horizontal_widget.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3602efdabe62bdb4592090afcb80256bfe9ba339d5b87f1271f36cbca7c35e0a -size 5609 +oid sha256:1212a72ce86de68cd52ad81de9ca17e4f1fa1e03b7c0d9bc1e64f6f6a537e43e +size 1197 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_negative_spacing.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_negative_spacing.png index 13d041ba..209ef998 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_negative_spacing.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_negative_spacing.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf744b668ff527dfcbd9d23dca2d0d927e39f309cdc515ece463eed3fc0c2ddd -size 6561 +oid sha256:2c00e6afd8c37f1fef788b15ac93a38d73cdbd341f9c10f42cd2c711ee89b697 +size 2485 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_vertical_widget.png b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_vertical_widget.png index a527d1e3..ed9fb6bb 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_vertical_widget.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__grid__tests__with_vertical_widget.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:871275dca581cd2201a4d88e7bf50a2497f31f87afc953446d1f80293703deee -size 6173 +oid sha256:9bec5ac6e170ac1dcc3eeb5bcae104329090b4e7d7a428168fb92674298ecf94 +size 2117 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__0_percent_progressbar.png b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__0_percent_progressbar.png index 2fc003d1..c7d27893 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__0_percent_progressbar.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__0_percent_progressbar.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0746bee1ea93550a8388661fac6a70e5b1e278e583ac2b9e1b982b3b208646a6 -size 5064 +oid sha256:ca6dc6a80922171cdbaa5cdc269ac2667900c10c5ea40b2c5545042d080b7d3a +size 1577 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__100_percent_progressbar.png b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__100_percent_progressbar.png index 6b2cf8b2..e1244b03 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__100_percent_progressbar.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__100_percent_progressbar.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c224de22f3a435a92853bf7eb1fc6fc34d7a89ea7fdb617eb1a4698143671e76 -size 5458 +oid sha256:25314c6f293e7c8f6a312bdf7f632f445a10ab1d665115768727632069347d1c +size 2608 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__25_percent_progressbar.png b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__25_percent_progressbar.png index b24c1855..064ffe4f 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__25_percent_progressbar.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__25_percent_progressbar.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef17088123c59d18f2d37bd1c591d75f30d878ba7af17f05db45f489460de320 -size 5788 +oid sha256:0e5f05b1e759dbe978d4b5c0032e3be5fc7b355a38ca2ac49c27bbe887e0c304 +size 2653 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__50_percent_progressbar.png b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__50_percent_progressbar.png index 6469a987..ab29d6a4 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__50_percent_progressbar.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__50_percent_progressbar.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:649a0fad748a9c025c1862b47d91493ca87f3b92aabad9ab6ac287de64774863 -size 5781 +oid sha256:d45764af408101a57d7780d6d98ada40154bbe61e2a2bd9830e62e1004969efe +size 2646 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__75_percent_progressbar.png b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__75_percent_progressbar.png index 6d902e6d..70bb827b 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__75_percent_progressbar.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__75_percent_progressbar.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:132dcf01f585c2a58b86c4fb6d518059dbeb858e8143ef133acb69f513027749 -size 5399 +oid sha256:cba822bc27c453f48c9f931bf5703127f2632bcd0d40e8a556efce4f173bfbe2 +size 2541 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__indeterminate_progressbar.png b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__indeterminate_progressbar.png index 6a4173d8..361d52b9 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__indeterminate_progressbar.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__progress_bar__tests__indeterminate_progressbar.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:70415497ab4fa856a15c12f40afc3c65715cbe5c4a42228af4baf553f385efad -size 4727 +oid sha256:c94c6fe1007afbcb400998e826a59fc37d3c8be1b9e6551823d3c07b7eccfbfb +size 1628 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_outline.png b/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_outline.png index 3990b381..27016e83 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_outline.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_outline.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ce079b70da1efa2e4870a3f8a789d6ff5e748e8d6604125357cca55f1a0bc8f -size 1664 +oid sha256:ce5821257e16110acddbaff0fd3041d30ba2c11b0b5532406f1b6d6ba9d4a8a2 +size 1015 diff --git a/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_selection.png b/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_selection.png index ccbabc18..ed92bcb8 100644 --- a/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_selection.png +++ b/masonry/src/widgets/screenshots/masonry__widgets__textbox__tests__textbox_selection.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:669c9ebca19fcb7091991f593105289d686eace34e428a9656781f12cdb967cc -size 1709 +oid sha256:acc5caca94063ae376cbd88afa57865a318a6f352f946ffd05284e3f2606b750 +size 1130 diff --git a/masonry/src/widgets/tests/screenshots/masonry__widgets__tests__transforms__transforms_pointer_events.png b/masonry/src/widgets/tests/screenshots/masonry__widgets__tests__transforms__transforms_pointer_events.png index 4c9379f9..7ae5e038 100644 --- a/masonry/src/widgets/tests/screenshots/masonry__widgets__tests__transforms__transforms_pointer_events.png +++ b/masonry/src/widgets/tests/screenshots/masonry__widgets__tests__transforms__transforms_pointer_events.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e5aa3920a321bcd64db228eff1ebe5b8e9186893ef00ad1a10f30ab8c6d1f35 -size 21630 +oid sha256:b7ba1af0b3ae1c29bc9f53052ec819e4abb1712d9526574ac523bdeb4ee5872b +size 21982 diff --git a/masonry/src/widgets/textbox.rs b/masonry/src/widgets/textbox.rs index 1ee801bb..3cd8a635 100644 --- a/masonry/src/widgets/textbox.rs +++ b/masonry/src/widgets/textbox.rs @@ -7,7 +7,7 @@ use accesskit::{Node, Role}; use smallvec::{SmallVec, smallvec}; use tracing::{Span, trace_span}; use vello::Scene; -use vello::kurbo::{Affine, Insets, Point, Rect, Size, Stroke}; +use vello::kurbo::{Insets, Point, Rect, Size}; use crate::core::{ AccessCtx, AccessEvent, BoxConstraints, EventCtx, LayoutCtx, PaintCtx, PointerEvent, @@ -15,6 +15,7 @@ use crate::core::{ WidgetId, WidgetMut, WidgetPod, }; use crate::peniko::Color; +use crate::util::stroke; use crate::widgets::{Padding, TextArea}; /// Added padding between each horizontal edge of the widget @@ -163,19 +164,14 @@ impl Widget for Textbox { fn paint(&mut self, ctx: &mut PaintCtx, _props: &PropertiesRef<'_>, scene: &mut Scene) { let size = ctx.size(); + let border_width = 1.0; let outline_rect = size.to_rect().inset(Insets::new( - -TEXTBOX_MARGIN.leading, - -TEXTBOX_MARGIN.top, - -TEXTBOX_MARGIN.trailing, - -TEXTBOX_MARGIN.bottom, + -TEXTBOX_MARGIN.leading - border_width / 2., + -TEXTBOX_MARGIN.top - border_width / 2., + -TEXTBOX_MARGIN.trailing - border_width / 2., + -TEXTBOX_MARGIN.bottom - border_width / 2., )); - scene.stroke( - &Stroke::new(1.0), - Affine::IDENTITY, - Color::WHITE, - None, - &outline_rect, - ); + stroke(scene, &outline_rect, Color::WHITE, border_width); } fn accessibility_role(&self) -> Role {