summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
Diffstat (limited to 'src/library')
-rw-r--r--src/library/grid.rs32
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! {