bernardo-tui 0.2.7

A keyboard-only, distraction-free TUI widget library
Documentation
/*
This is a piece of specialized code for TreeView of DirTreeNode
 */

use log::{debug, error, warn};
use streaming_iterator::StreamingIterator;

use crate::fs::path::SPath;
use crate::widgets::spath_tree_view_node::DirTreeNode;
use crate::widgets::tree_view::tree_view::TreeViewWidget;

impl TreeViewWidget<SPath, DirTreeNode> {
    pub fn expand_path(&mut self, path: &SPath) -> bool {
        debug!("setting path to {:?}", path);

        if path.is_file() {
            warn!("setting DirTreeView to file {}", path);
        }

        let root_node = self.get_root_node();

        if !root_node.spath().is_parent_of(path) {
            error!("attempted to set path {}, but root is {}, ignoring.", path, root_node.spath());
            return false;
        }

        let exp_mut = self.expanded_mut();

        let mut parent_ref_iter = path.ancestors_and_self_ref();
        while let Some(anc) = parent_ref_iter.next() {
            debug!("setting expanded {}", anc);
            exp_mut.insert(anc.clone());
        }

        true
    }
}

#[cfg(test)]
mod tests {
    use crate::fs::filesystem_front::FilesystemFront;
    use crate::fs::mock_fs::MockFS;
    use crate::fs::path::SPath;
    use crate::spath;
    use crate::widgets::spath_tree_view_node::DirTreeNode;
    use crate::widgets::tree_view::tree_view::TreeViewWidget;

    #[test]
    fn test_set_path() {
        let mockfs = MockFS::new("/tmp")
            .with_file("folder1/folder2/file1.txt", "some text")
            .with_file("folder1/folder3/moulder.txt", "truth is out there")
            .to_fsf();

        let mut widget = TreeViewWidget::<SPath, DirTreeNode>::new(DirTreeNode::new(spath!(mockfs, "folder1").unwrap()));

        assert!(!widget.is_expanded(&spath!(mockfs, "folder1", "folder2").unwrap()));

        assert!(widget.expand_path(&spath!(mockfs, "folder1", "folder2").unwrap()));
        assert!(widget.is_expanded(&spath!(mockfs, "folder1").unwrap()));
        assert!(widget.is_expanded(&spath!(mockfs, "folder1", "folder2").unwrap()));
        assert!(!widget.is_expanded(&spath!(mockfs, "folder1", "folder3").unwrap()));
    }
}