Skip to main content

jellyflow_layout/
lib.rs

1//! Optional headless layout adapters for Jellyflow.
2//!
3//! This crate keeps automatic layout outside the core document model. Layout engines receive a
4//! projection of a Jellyflow graph and return normal [`GraphTransaction`] values that hosts can
5//! apply explicitly.
6
7#![deny(unsafe_code)]
8
9mod dugong;
10mod engine;
11mod family;
12mod freeform;
13mod mind_map;
14mod preset;
15mod projection;
16mod tidy_tree;
17
18pub use dugong::{
19    DugongLayoutEngine, layout_graph_to_transaction_with_dugong, layout_graph_with_dugong,
20};
21pub use engine::{
22    DUGONG_LAYOUT_ENGINE_ID, LayoutContext, LayoutDirection, LayoutEdgeRoute, LayoutEngine,
23    LayoutEngineId, LayoutEngineRegistry, LayoutEngineRequest, LayoutError, LayoutNodePosition,
24    LayoutOptions, LayoutRequest, LayoutResult, LayoutScope, LayoutSpacing,
25    MIND_MAP_FREEFORM_LAYOUT_ENGINE_ID, MIND_MAP_RADIAL_LAYOUT_ENGINE_ID,
26    TIDY_TREE_LAYOUT_ENGINE_ID, layout_graph_to_transaction_with_engine, layout_graph_with_engine,
27};
28pub use family::{
29    LAYERED_DAG_LAYOUT_FAMILY_ID, LayoutEngineCapability, LayoutEngineMetadata, LayoutFamilyId,
30    LayoutFamilyMetadata, MIND_MAP_LAYOUT_FAMILY_ID,
31};
32pub use freeform::{
33    MindMapFreeformLayoutEngine, layout_graph_to_transaction_with_mind_map_freeform,
34    layout_graph_with_mind_map_freeform,
35};
36pub use mind_map::{
37    MindMapRadialLayoutEngine, layout_graph_to_transaction_with_mind_map_radial,
38    layout_graph_with_mind_map_radial,
39};
40pub use preset::LayoutPresetBuilder;
41pub use tidy_tree::{
42    TidyTreeLayoutEngine, layout_graph_to_transaction_with_tidy_tree, layout_graph_with_tidy_tree,
43};
44
45/// Returns a registry containing Jellyflow's built-in layout engines.
46pub fn builtin_layout_engine_registry() -> LayoutEngineRegistry {
47    let mut registry = LayoutEngineRegistry::new();
48    let inserted_layered_family = registry.insert_family(LayoutFamilyMetadata::layered_dag());
49    debug_assert!(
50        inserted_layered_family.is_ok(),
51        "built-in layered DAG layout family should be unique"
52    );
53    let inserted_mind_map_family = registry.insert_family(LayoutFamilyMetadata::mind_map());
54    debug_assert!(
55        inserted_mind_map_family.is_ok(),
56        "built-in mind-map layout family should be unique"
57    );
58    let inserted_dugong = registry.insert(DugongLayoutEngine);
59    debug_assert!(
60        inserted_dugong.is_ok(),
61        "built-in dugong engine should be unique"
62    );
63    let inserted_dugong_metadata = registry.insert_metadata(LayoutEngineMetadata::dugong());
64    debug_assert!(
65        inserted_dugong_metadata.is_ok(),
66        "built-in dugong metadata should be unique"
67    );
68    let inserted_tidy_tree = registry.insert(TidyTreeLayoutEngine);
69    debug_assert!(
70        inserted_tidy_tree.is_ok(),
71        "built-in tidy tree engine should be unique"
72    );
73    let inserted_tidy_tree_metadata = registry.insert_metadata(LayoutEngineMetadata::tidy_tree());
74    debug_assert!(
75        inserted_tidy_tree_metadata.is_ok(),
76        "built-in tidy tree metadata should be unique"
77    );
78    let inserted_mind_map = registry.insert(MindMapRadialLayoutEngine);
79    debug_assert!(
80        inserted_mind_map.is_ok(),
81        "built-in mind-map engine should be unique"
82    );
83    let inserted_mind_map_metadata =
84        registry.insert_metadata(LayoutEngineMetadata::mind_map_radial());
85    debug_assert!(
86        inserted_mind_map_metadata.is_ok(),
87        "built-in radial mind-map metadata should be unique"
88    );
89    let inserted_freeform = registry.insert(MindMapFreeformLayoutEngine);
90    debug_assert!(
91        inserted_freeform.is_ok(),
92        "built-in freeform engine should be unique"
93    );
94    let inserted_freeform_metadata =
95        registry.insert_metadata(LayoutEngineMetadata::mind_map_freeform());
96    debug_assert!(
97        inserted_freeform_metadata.is_ok(),
98        "built-in freeform mind-map metadata should be unique"
99    );
100    registry
101}
102
103#[cfg(test)]
104mod tests;