diff options
Diffstat (limited to 'src/library')
| -rw-r--r-- | src/library/grid.rs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/library/grid.rs b/src/library/grid.rs index 192dee9d..81bd655c 100644 --- a/src/library/grid.rs +++ b/src/library/grid.rs @@ -1,4 +1,4 @@ -use crate::layout::{GridNode, TrackSizing, Tracks}; +use crate::layout::{GridNode, TrackSizing}; use super::*; @@ -10,10 +10,11 @@ use super::*; /// # Named parameters /// - Column sizing: `columns`, of type `tracks`. /// - Row sizing: `rows`, of type `tracks`. -/// - Column direction: `column-dir`, of type `direction`. -/// - Gutter: `gutter`, shorthand for equal column and row gutter, of type `tracks`. +/// - Gutter: `gutter`, shorthand for equal gutter everywhere, of type `length`. /// - Gutter for rows: `gutter-rows`, of type `tracks`. /// - Gutter for columns: `gutter-columns`, of type `tracks`. +/// - Column direction: `column-dir`, of type `direction`. +/// - Row direction: `row-dir`, of type `direction`. /// /// # Return value /// A template that arranges its children along the specified grid cells. @@ -35,12 +36,14 @@ use super::*; pub fn grid(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { let columns = args.eat_named::<Tracks>(ctx, "columns").unwrap_or_default(); let rows = args.eat_named::<Tracks>(ctx, "rows").unwrap_or_default(); - let column_dir = args.eat_named(ctx, "column-dir"); - let gutter = args.eat_named::<Linear>(ctx, "gutter") - .map(|v| Tracks(vec![TrackSizing::Linear(v)])) + let gutter = args + .eat_named::<Linear>(ctx, "gutter") + .map(|v| vec![TrackSizing::Linear(v)]) .unwrap_or_default(); let gutter_columns = args.eat_named::<Tracks>(ctx, "gutter-columns"); let gutter_rows = args.eat_named::<Tracks>(ctx, "gutter-rows"); + let column_dir = args.eat_named(ctx, "column-dir"); + let row_dir = args.eat_named(ctx, "row-dir"); let children = args.eat_all::<TemplateValue>(ctx); Value::template("grid", move |ctx| { @@ -49,26 +52,31 @@ pub fn grid(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value { .map(|child| ctx.exec_template_stack(child).into()) .collect(); + let cross_dir = column_dir.unwrap_or(ctx.state.lang.dir); + let main_dir = row_dir.unwrap_or(cross_dir.axis().other().dir(true)); + ctx.push_into_stack(GridNode { - column_dir: column_dir.unwrap_or(ctx.state.lang.dir), - children, + dirs: Gen::new(cross_dir, main_dir), tracks: Gen::new(columns.clone(), rows.clone()), gutter: Gen::new( gutter_columns.as_ref().unwrap_or(&gutter).clone(), gutter_rows.as_ref().unwrap_or(&gutter).clone(), ), + children, }) }) } +/// Defines size of rows and columns in a grid. +type Tracks = Vec<TrackSizing>; + value! { Tracks: "array of `auto`s, linears, and fractionals", - Value::Int(count) => Self(vec![TrackSizing::Auto; count.max(0) as usize]), - Value::Array(values) => Self(values + Value::Int(count) => vec![TrackSizing::Auto; count.max(0) as usize], + Value::Array(values) => values .into_iter() .filter_map(|v| v.cast().ok()) - .collect() - ), + .collect(), } value! { |
