dioxus_swdir_tree/lib.rs
1//! # dioxus-swdir-tree
2//!
3//! A lazy-loading directory-tree explorer widget for
4//! [Dioxus](https://dioxuslabs.com) GUI apps, built on
5//! [`swdir`](https://crates.io/crates/swdir).
6//!
7//! ## Architecture
8//!
9//! ```text
10//! ┌─────────────────────────────┐
11//! Signal │ DirectoryTreeView │ renders
12//! ─────────────►│ (this crate) │──────────► HTML rows
13//! │ │
14//! on_event ◄────│ EventHandler │ user gestures
15//! └──────────────┬──────────────┘
16//! │ Toggled / Selected / Drag
17//! ▼
18//! ┌─────────────────────────────┐
19//! Signal.write │ DirectoryTree │ pure state machine
20//! ─────────────►│ (dioxus-swdir-tree-core) │
21//! └──────────────┬──────────────┘
22//! │ ScanRequest (data)
23//! ▼
24//! ┌─────────────────────────────┐
25//! │ use_scan_driver │ coroutine
26//! │ ScanExecutor / Thread │ executes scan
27//! └─────────────────────────────┘
28//! ```
29//!
30//! ## Quick start
31//!
32//! ```no_run
33//! # use dioxus::prelude::*;
34//! use dioxus_swdir_tree::{DirectoryTreeView, DirectoryTreeEvent, use_scan_driver};
35//! use dioxus_swdir_tree_core::{DirectoryTree, SelectionMode, ThreadExecutor};
36//! use dioxus_swdir_tree_core::drag::DragOutcome;
37//! use std::sync::Arc;
38//!
39//! fn app() -> Element {
40//! let mut tree = use_signal(|| DirectoryTree::new("/home"));
41//! let scans = use_scan_driver(tree, Arc::new(ThreadExecutor));
42//!
43//! let on_event = move |ev: DirectoryTreeEvent| match ev {
44//! DirectoryTreeEvent::Toggled(path) => {
45//! if let Some(req) = tree.write().on_toggled(&path) {
46//! scans.send(req);
47//! }
48//! }
49//! DirectoryTreeEvent::Selected { path, is_dir, mode } => {
50//! tree.write().on_selected(&path, is_dir, mode);
51//! }
52//! DirectoryTreeEvent::Drag(msg) => {
53//! let outcome = tree.write().on_drag_msg(msg);
54//! if let DragOutcome::Clicked { path, is_dir } = outcome {
55//! tree.write().on_selected(&path, is_dir, SelectionMode::Replace);
56//! }
57//! // DragOutcome::Completed { sources, destination } → app handles it
58//! }
59//! };
60//!
61//! rsx! { DirectoryTreeView { tree, on_event } }
62//! }
63//! ```
64//!
65//! The `default-style` feature (on by default) injects a minimal
66//! `dx-swdir-*` stylesheet; disable it to theme from scratch.
67
68pub mod driver;
69pub mod event;
70pub mod style;
71
72mod item_row;
73mod item_view;
74mod row;
75mod view;
76
77pub use driver::use_scan_driver;
78pub use event::DirectoryTreeEvent;
79pub use item_view::ItemTreeView;
80pub use row::{ArcTheme, default_theme};
81pub use view::DirectoryTreeView;
82
83// Re-export everything from core so application code can depend on this
84// crate alone.
85pub use dioxus_swdir_tree_core::*;