Skip to main content

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::*;