windjammer-ui 0.3.6

Cross-platform UI framework for Windjammer (Web, Desktop, Mobile)
Documentation
use super::traits::Renderable

pub struct TreeItem {
    label: string,
    children: Vec<TreeItem>,
    expanded: bool,
}

impl TreeItem {
    pub fn new(label: string) -> TreeItem {
        TreeItem {
            label,
            children: Vec::new(),
            expanded: false,
        }
    }

    pub fn child(self, item: TreeItem) -> TreeItem {
        self.children.push(item)
        self
    }

    pub fn expanded(self, expanded: bool) -> TreeItem {
        self.expanded = expanded
        self
    }

    pub fn render(self, depth: i32) -> string {
        let indent_px = depth * 20
        let icon = if self.children.len() > 0 {
            if self.expanded { "▼" } else { "▶" }
        } else {
            "•"
        }

        let mut html = format!("<div class='wj-tree-item' style='padding-left: {}px;'>
  <span class='wj-tree-icon'>{}</span>
  <span>{}</span>
</div>\n", indent_px, icon, self.label)

        if self.expanded {
            let mut i = 0
            while i < self.children.len() {
                let child = &self.children[i]
                html = format!("{}{}", html, child.render(depth + 1))
                i = i + 1
            }
        }

        html
    }
}

pub struct TreeView {
    items: Vec<TreeItem>,
}

impl TreeView {
    pub fn new() -> TreeView {
        TreeView {
            items: Vec::new(),
        }
    }

    pub fn item(self, item: TreeItem) -> TreeView {
        self.items.push(item)
        self
    }
}

impl Renderable for TreeView {
    fn render(self) -> string {
        let mut html = "<div class='wj-tree-view'>\n".to_string()

        let mut i = 0
        while i < self.items.len() {
            let item = &self.items[i]
            html = format!("{}{}", html, item.render(0))
            i = i + 1
        }

        format!("{}</div>", html)
    }
}

fn main() {
    let tree = TreeView::new()
        .item(TreeItem::new("Root 1".to_string())
            .expanded(true)
            .child(TreeItem::new("Child 1.1".to_string()))
            .child(TreeItem::new("Child 1.2".to_string())))
        .item(TreeItem::new("Root 2".to_string()))

    println!("{}", tree.render())
}