use crate::element::{Component, Element};
use crate::layout::LayoutStyle;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct SpacerProps {
pub lines: u16,
}
impl SpacerProps {
pub fn lines(count: u16) -> Self {
Self { lines: count }
}
pub fn flex() -> Self {
Self { lines: 0 }
}
}
pub struct Spacer;
impl Spacer {
pub fn layout_style(props: &SpacerProps) -> LayoutStyle {
if props.lines > 0 {
LayoutStyle {
height: Some(props.lines as f32),
..Default::default()
}
} else {
LayoutStyle {
flex_grow: 1.0,
..Default::default()
}
}
}
}
impl Component for Spacer {
type Props = SpacerProps;
fn render(props: &Self::Props) -> Element {
if props.lines > 0 {
let empty_lines: Vec<Element> = (0..props.lines)
.map(|_| Element::Text {
content: String::new(),
style: Default::default(),
})
.collect();
Element::Fragment(empty_lines)
} else {
Element::empty()
}
}
}
pub fn spacer(lines: u16) -> Element {
Element::node::<Spacer>(SpacerProps::lines(lines), vec![])
}
pub fn flex_spacer() -> Element {
Element::node::<Spacer>(SpacerProps::flex(), vec![])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_spacer_props_default() {
let props = SpacerProps::default();
assert_eq!(props.lines, 0);
}
#[test]
fn test_spacer_props_lines() {
let props = SpacerProps::lines(3);
assert_eq!(props.lines, 3);
}
#[test]
fn test_spacer_layout_style_flex() {
let props = SpacerProps::default();
let layout = Spacer::layout_style(&props);
assert_eq!(layout.flex_grow, 1.0);
assert!(layout.height.is_none());
}
#[test]
fn test_spacer_layout_style_lines() {
let props = SpacerProps::lines(2);
let layout = Spacer::layout_style(&props);
assert_eq!(layout.height, Some(2.0));
assert_eq!(layout.flex_grow, 0.0);
}
#[test]
fn test_spacer_render_flex() {
let elem = Spacer::render(&SpacerProps::default());
assert!(elem.is_empty());
}
#[test]
fn test_spacer_render_lines() {
let elem = Spacer::render(&SpacerProps::lines(2));
if let Element::Fragment(children) = elem {
assert_eq!(children.len(), 2);
} else {
panic!("Expected Fragment");
}
}
#[test]
fn test_spacer_helper() {
let elem = spacer(1);
assert!(elem.is_node());
}
#[test]
fn test_flex_spacer_helper() {
let elem = flex_spacer();
assert!(elem.is_node());
}
}