Skip to main content

basic/
basic.rs

1use ferrum_flow::*;
2use gpui::{AppContext as _, Application, Size, WindowOptions, px};
3use serde_json::json;
4
5fn main() {
6    Application::new().run(|cx| {
7        let mut graph = Graph::new();
8
9        graph
10            .create_node("")
11            .position(100.0, 100.0)
12            .output()
13            .output()
14            .output_with(PortPosition::Bottom, Size::new(px(20.0), px(20.0)))
15            .output_at(PortPosition::Bottom)
16            .data(json!({ "label": "Node 1" }))
17            .build(&mut graph);
18
19        graph
20            .create_node("")
21            .position(300.0, 400.0)
22            .input()
23            .input_at(PortPosition::Top)
24            .input_at(PortPosition::Top)
25            .output()
26            .output_at(PortPosition::Bottom)
27            .output_at(PortPosition::Bottom)
28            .data(json!({ "label": "Node 2" }))
29            .build(&mut graph);
30
31        graph
32            .create_node("")
33            .position(500.0, 500.0)
34            .input()
35            .output()
36            .data(json!({ "label": "Node 3" }))
37            .build(&mut graph);
38
39        cx.open_window(WindowOptions::default(), |window, cx| {
40            cx.new(|ctx| {
41                FlowCanvas::builder(graph, ctx, window)
42                    .plugins_core()
43                    .plugin(MinimapPlugin::new())
44                    .plugin(SnapGuidesPlugin::new())
45                    .plugin(ZoomControlsPlugin::new())
46                    .plugin(ClipboardPlugin::new())
47                    .plugin(ContextMenuPlugin::new())
48                    .plugin(SelectAllViewportPlugin::new())
49                    .plugin(AlignPlugin::new())
50                    .plugin(FocusSelectionPlugin::new())
51                    .plugin(FitAllGraphPlugin::new())
52                    .build()
53            })
54        })
55        .unwrap();
56    });
57}