#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Kind {
Root,
Box,
Text,
VirtualText,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub enum Dim {
Points(f32),
Percent(f32),
#[default]
Auto,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Lp {
Points(f32),
Percent(f32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum FlexDir {
#[default]
Row,
Column,
RowReverse,
ColumnReverse,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum FlexWrap {
#[default]
NoWrap,
Wrap,
WrapReverse,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Align {
Stretch,
FlexStart,
Center,
FlexEnd,
Baseline,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ContentAlign {
FlexStart,
Center,
FlexEnd,
SpaceBetween,
SpaceAround,
SpaceEvenly,
Stretch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Display {
#[default]
Flex,
None,
}
#[derive(Debug, Clone, PartialEq)]
pub enum BorderStyle {
Named(String),
Custom {
top_left: String,
top: String,
top_right: String,
right: String,
bottom_right: String,
bottom: String,
bottom_left: String,
left: String,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Position {
#[default]
Relative,
Absolute,
Static,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TextWrap {
#[default]
Wrap,
Hard,
TruncateEnd,
TruncateMiddle,
TruncateStart,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Overflow {
#[default]
Visible,
Hidden,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct Style {
pub position: Option<Position>,
pub top: Option<Dim>,
pub right: Option<Dim>,
pub bottom: Option<Dim>,
pub left: Option<Dim>,
pub margin: Option<Lp>,
pub margin_x: Option<Lp>,
pub margin_y: Option<Lp>,
pub margin_top: Option<Lp>,
pub margin_right: Option<Lp>,
pub margin_bottom: Option<Lp>,
pub margin_left: Option<Lp>,
pub padding: Option<Lp>,
pub padding_x: Option<Lp>,
pub padding_y: Option<Lp>,
pub padding_top: Option<Lp>,
pub padding_right: Option<Lp>,
pub padding_bottom: Option<Lp>,
pub padding_left: Option<Lp>,
pub flex_direction: Option<FlexDir>,
pub flex_wrap: Option<FlexWrap>,
pub flex_grow: Option<f32>,
pub flex_shrink: Option<f32>,
pub flex_basis: Option<Dim>,
pub align_items: Option<Align>,
pub align_self: Option<Align>,
pub align_content: Option<ContentAlign>,
pub justify_content: Option<ContentAlign>,
pub width: Option<Dim>,
pub height: Option<Dim>,
pub min_width: Option<Dim>,
pub min_height: Option<Dim>,
pub max_width: Option<Dim>,
pub max_height: Option<Dim>,
pub aspect_ratio: Option<f32>,
pub display: Option<Display>,
pub border_style: Option<BorderStyle>,
pub border_top: Option<bool>,
pub border_right: Option<bool>,
pub border_bottom: Option<bool>,
pub border_left: Option<bool>,
pub gap: Option<f32>,
pub column_gap: Option<f32>,
pub row_gap: Option<f32>,
pub text_wrap: Option<TextWrap>,
pub overflow_x: Option<Overflow>,
pub overflow_y: Option<Overflow>,
pub background_color: Option<String>,
pub border_color: Option<String>,
pub border_top_color: Option<String>,
pub border_right_color: Option<String>,
pub border_bottom_color: Option<String>,
pub border_left_color: Option<String>,
pub border_background_color: Option<String>,
pub border_top_background_color: Option<String>,
pub border_right_background_color: Option<String>,
pub border_bottom_background_color: Option<String>,
pub border_left_background_color: Option<String>,
pub border_dim_color: Option<bool>,
pub border_top_dim_color: Option<bool>,
pub border_right_dim_color: Option<bool>,
pub border_bottom_dim_color: Option<bool>,
pub border_left_dim_color: Option<bool>,
}
impl Style {
pub(crate) fn border_edges(&self) -> [u16; 4] {
let on = self.border_style.is_some();
let edge = |f: Option<bool>| if on && f != Some(false) { 1u16 } else { 0u16 };
[
edge(self.border_top),
edge(self.border_right),
edge(self.border_bottom),
edge(self.border_left),
]
}
}
#[derive(Debug, Default, Clone, PartialEq)]
pub struct TextStyle {
pub color: Option<String>,
pub background_color: Option<String>,
pub bold: bool,
pub italic: bool,
pub underline: bool,
pub strikethrough: bool,
pub inverse: bool,
pub dim_color: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum AttrValue {
Bool(bool),
Str(String),
Number(f64),
}
#[derive(Debug, Clone)]
pub struct Node {
pub kind: Kind,
pub parent: Option<u32>,
pub children: Vec<u32>,
pub text: Option<String>,
pub style: Style,
pub attributes: Vec<(String, AttrValue)>,
pub is_static: bool,
pub is_hidden: bool,
pub has_transform: bool,
pub text_styling: Option<TextStyle>,
}
impl Node {
pub fn new(kind: Kind) -> Self {
Self {
kind,
parent: None,
children: Vec::new(),
text: None,
style: Style::default(),
attributes: Vec::new(),
is_static: false,
is_hidden: false,
has_transform: false,
text_styling: None,
}
}
}