use std::panic::Location;
use super::text::text;
use crate::metrics::MetricsRole;
use crate::tokens;
use crate::tree::*;
#[track_caller]
pub fn table<I, E>(children: I) -> El
where
I: IntoIterator<Item = E>,
E: Into<El>,
{
El::new(Kind::Custom("table"))
.at_loc(Location::caller())
.children(children)
.axis(Axis::Column)
.width(Size::Fill(1.0))
.height(Size::Hug)
.align(Align::Stretch)
}
#[track_caller]
pub fn table_header<I, E>(rows: I) -> El
where
I: IntoIterator<Item = E>,
E: Into<El>,
{
let mut header = El::new(Kind::Custom("table_header"))
.at_loc(Location::caller())
.children(rows)
.axis(Axis::Column)
.width(Size::Fill(1.0))
.height(Size::Hug)
.align(Align::Stretch);
for row in &mut header.children {
if row.metrics_role == Some(MetricsRole::TableRow) {
row.metrics_role = Some(MetricsRole::TableHeader);
if !row.explicit_height {
row.height = Size::Fixed(36.0);
}
if !row.explicit_radius {
row.radius = 0.0;
}
}
}
header
}
#[track_caller]
pub fn table_body<I, E>(rows: I) -> El
where
I: IntoIterator<Item = E>,
E: Into<El>,
{
El::new(Kind::Custom("table_body"))
.at_loc(Location::caller())
.children(rows)
.axis(Axis::Column)
.width(Size::Fill(1.0))
.height(Size::Hug)
.align(Align::Stretch)
}
#[track_caller]
pub fn table_row<I, E>(cells: I) -> El
where
I: IntoIterator<Item = E>,
E: Into<El>,
{
row(cells)
.at_loc(Location::caller())
.metrics_role(MetricsRole::TableRow)
.width(Size::Fill(1.0))
.align(Align::Center)
.default_height(Size::Fixed(52.0))
.default_padding(Sides::xy(tokens::SPACE_3, 0.0))
.default_gap(tokens::SPACE_3)
.default_radius(tokens::RADIUS_MD)
}
#[track_caller]
pub fn table_head(label: impl Into<String>) -> El {
text(label)
.at_loc(Location::caller())
.caption()
.font_weight(FontWeight::Medium)
.muted()
.ellipsis()
.width(Size::Fill(1.0))
}
#[track_caller]
pub fn table_cell(content: impl Into<El>) -> El {
content
.into()
.at_loc(Location::caller())
.ellipsis()
.width(Size::Fill(1.0))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn table_header_promotes_direct_table_rows() {
let header = table_header([table_row([table_head("Name")])]);
assert_eq!(header.children.len(), 1);
assert_eq!(
header.children[0].metrics_role,
Some(MetricsRole::TableHeader)
);
assert_eq!(header.children[0].align, Align::Center);
}
}