From 01a62a690b0f46b13a3190d8e1a20c00fb8b14fd Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 12 Feb 2023 12:57:40 +0100 Subject: [PATCH] Make grid RTL aware --- library/src/layout/columns.rs | 2 +- library/src/layout/grid.rs | 17 ++++++++++++++++- tests/ref/layout/grid-rtl.png | Bin 0 -> 1725 bytes tests/typ/layout/grid-rtl.typ | 9 +++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/ref/layout/grid-rtl.png create mode 100644 tests/typ/layout/grid-rtl.typ diff --git a/library/src/layout/columns.rs b/library/src/layout/columns.rs index 55cda5d8c..7da9c4a06 100644 --- a/library/src/layout/columns.rs +++ b/library/src/layout/columns.rs @@ -131,7 +131,7 @@ impl Layout for ColumnsNode { } let width = frame.width(); - let x = if dir.is_positive() { + let x = if dir == Dir::LTR { cursor } else { regions.first.x - cursor - width diff --git a/library/src/layout/grid.rs b/library/src/layout/grid.rs index 544b76ed8..818bf53d2 100644 --- a/library/src/layout/grid.rs +++ b/library/src/layout/grid.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::text::TextNode; use super::Spacing; @@ -218,6 +219,8 @@ struct GridLayouter<'a, 'v> { vt: &'a mut Vt<'v>, /// The grid cells. cells: &'a [Content], + /// Whether this is an RTL grid. + rtl: bool, /// The column tracks including gutter tracks. cols: Vec, /// The row tracks including gutter tracks. @@ -299,6 +302,12 @@ impl<'a, 'v> GridLayouter<'a, 'v> { cols.pop(); rows.pop(); + // Reverse for RTL. + let rtl = styles.get(TextNode::DIR) == Dir::RTL; + if rtl { + cols.reverse(); + } + let full = regions.first.y; let rcols = vec![Abs::zero(); cols.len()]; let lrows = vec![]; @@ -311,6 +320,7 @@ impl<'a, 'v> GridLayouter<'a, 'v> { Self { vt, cells, + rtl, cols, rows, regions, @@ -680,10 +690,15 @@ impl<'a, 'v> GridLayouter<'a, 'v> { /// /// Returns `None` if it's a gutter cell. #[track_caller] - fn cell(&self, x: usize, y: usize) -> Option<&'a Content> { + fn cell(&self, mut x: usize, y: usize) -> Option<&'a Content> { assert!(x < self.cols.len()); assert!(y < self.rows.len()); + // Columns are reorded, but the cell slice is not. + if self.rtl { + x = self.cols.len() - 1 - x; + } + // Even columns and rows are children, odd ones are gutter. if x % 2 == 0 && y % 2 == 0 { let c = 1 + self.cols.len() / 2; diff --git a/tests/ref/layout/grid-rtl.png b/tests/ref/layout/grid-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..8b838480193a69c0ac977d2c1ce98579f18515da GIT binary patch literal 1725 zcmZvddo{Pq0tJaCVtg1OU>IJ@zm$OfWqdfkV*%nK|KS9Lyae&Lvw25Xvb@iN?== zI7`G5a7eTYx|Mh$yX8^~W2gj0B=>##!DQh8m%JF%epvsoLlqHUSYY3=M+*}Ta^R}M zv!SyeZ*iA{fBVokyOPKp*tlF3`h7^``a7XssEv`_?^|MJ@uj}SAfiC5x+F5r8uqW1 zPe7)G*1J_$@E%u#=XF*FbX{{-tHYgQS(|x^*WI3|pN>1`b~26}r8AyH=5Cvzop|05vtl!Lk~CSUCWOVb zFBf;X$LoaV+rBube&VNiQgf4m3(u~|EBLdN&>z-lTt zQ3N5&BWhp$41OQ5Fr#uX8WL-#Na<_O`o0{fi-_Xy3A$b7k+(}y zkgFV?p&c)y7$vyeb@%;XWx9%PO|L;Ipt!iv*Jrs#pAKWL%e^`7OM?)6v&{X?^Gd)& z1zv%=bs#L}>Q;aKQfim{ z$exkv80)iu43pV)!%2GPErs{YEGo@x0kUg!hMhyd_~X|Fxz&|%P`!dZW8Z+nv^vUz~$Y{9C}+Z z3cLS$Nht@yY1hP1%IEVf5)Pj8Wb4^Fr=0|Ll*k?{Ef_r=nSM@bc#ll8W8rUitY{Qh zx`grd{8dkJi5N=J8lMrOC_&Wz@`MppVjX6O;)k6iO&e#ER%P?Jl$=%jU)H`7IA^UsT4$_&Yg}7}c7_~_okKy|R~4NN!0?~#to{KsIvy#iHv8B+ z@<;Fkgx2+-{g}2m7K>FKW?sUVhtPMjw2elR=Ne3N$JSm9N5)rpj`BF?y&!#`t14hY z#O|W{aHLCuDjAx0`R=VAJ5z~|M!Wg3D!g*+?#$|aW6IK3vK1%q)*Yy|z#iJ>?Ga1A z=%x0`54L#M2wN+v!LO%qnPW$~-$4xX9t7!{@(m7$qpp>qB%wzC4zsu*OX%s_EO$dj zV_1l;_NRi+Qpr?2L=MhGHt!P`m^MvVzP|)M!V?HP9q^Ln${LH8a*TE}b)R3u-D66m zzcSw7ywtpJZ6B&fC0GrYnY4cMw^`A3$kilijl=~FKQ%<5fvvp1N|bq6!DAp|L+GuEir$KGjvg7HKia`S0h8|X~B*~6i zE=ibO#K@f^L33BvQai`6Nsh4dyCKE`=Ep>+^&nbfAgRZJjT^UYt{^eATSh@QpI8kW zPW~pwKk#&!4s!WHg2{~WSO>Nyov0|N5l}$!#jz7A+P^0Zd^CNLjy!Ir4-$hNLM*00 zI2=wlF&JUHo8kJIOl*R4@vcQN^ss}bO8n5K_}>Q^s(S7Sv*I@UWz8P?f5E=>Y|Tw^ fkH3~cWQtJ2@sz)>es75MRxjDxI%3OhyrcgDNxv5& literal 0 HcmV?d00001 diff --git a/tests/typ/layout/grid-rtl.typ b/tests/typ/layout/grid-rtl.typ new file mode 100644 index 000000000..31015097e --- /dev/null +++ b/tests/typ/layout/grid-rtl.typ @@ -0,0 +1,9 @@ +// Test RTL grid. + +--- +#set text(dir: rtl) +- מימין לשמאל + +--- +#set text(dir: rtl) +#table(columns: 2, gutter: 5pt)[A][B][C][D]