use dioxus::prelude::*;
use dioxus_swdir_tree_core::DirectoryTree;
use dioxus_swdir_tree_core::keyboard::{self, Modifiers as CoreMods, TreeKey};
use crate::event::DirectoryTreeEvent;
use crate::row::TreeRow;
use crate::style as s;
#[component]
pub fn DirectoryTreeView(
tree: Signal<DirectoryTree>,
on_event: EventHandler<DirectoryTreeEvent>,
) -> Element {
let rows: Vec<(dioxus_swdir_tree_core::TreeNode, u32)> = tree
.read()
.visible_rows()
.into_iter()
.map(|(node, depth)| (node.clone(), depth))
.collect();
#[cfg(feature = "default-style")]
let default_style_css = Some(s::DEFAULT_CSS);
#[cfg(not(feature = "default-style"))]
let default_style_css: Option<&str> = None;
let on_keydown = move |evt: KeyboardEvent| {
let tree_key = match evt.key() {
Key::ArrowUp => TreeKey::Up,
Key::ArrowDown => TreeKey::Down,
Key::Home => TreeKey::Home,
Key::End => TreeKey::End,
Key::Enter => TreeKey::Enter,
Key::ArrowLeft => TreeKey::Left,
Key::ArrowRight => TreeKey::Right,
Key::Escape => TreeKey::Escape,
Key::Character(ref s) if s == " " => TreeKey::Space,
_ => return, };
let mods = CoreMods {
shift: evt.modifiers().shift(),
ctrl: evt.modifiers().ctrl(),
};
if let Some(event) = keyboard::handle_key(&tree.read(), tree_key, mods) {
evt.prevent_default();
on_event.call(event);
}
};
rsx! {
if let Some(css) = default_style_css {
style { "{css}" }
}
div {
class: s::CLASS_TREE,
tabindex: "0",
onkeydown: on_keydown,
for (node, depth) in rows {
TreeRow {
key: "{node.path.display()}",
node,
depth,
on_event,
}
}
}
}
}