1use ferrum_flow::*;
2use gpui::{AppContext as _, Application, WindowOptions};
3use serde_json::json;
4
5fn main() {
6 Application::new().run(|cx| {
7 let mut graph = Graph::new();
8
9 for j in 0..100 {
10 for i in 0..100 {
11 graph
12 .create_node("")
13 .position(200.0 * i as f32, 200.0 * j as f32)
14 .input()
15 .output()
16 .data(json!({ "label": format!("Node {}", i * 100 + j) }))
17 .build(&mut graph);
18 }
19 }
20
21 let node_ids = graph.nodes().iter().map(|(id, _)| *id).collect::<Vec<_>>();
22
23 generate_chain_edges(&mut graph, node_ids);
24
25 cx.open_window(WindowOptions::default(), |window, cx| {
26 cx.new(|ctx| {
27 FlowCanvas::builder(graph, ctx, window)
28 .plugins_core()
29 .plugin(MinimapPlugin::new())
30 .plugin(ClipboardPlugin::new())
31 .plugin(ContextMenuPlugin::new())
32 .plugin(SelectAllViewportPlugin::new())
33 .plugin(AlignPlugin::new())
34 .plugin(FocusSelectionPlugin::new())
35 .plugin(FitAllGraphPlugin::new())
36 .plugin(SnapGuidesPlugin::new())
37 .plugin(ZoomControlsPlugin::new())
38 .build()
39 })
40 })
41 .unwrap();
42 });
43}
44
45pub fn generate_chain_edges(graph: &mut Graph, node_ids: Vec<NodeId>) {
46 for window in node_ids.windows(2) {
47 let from = window[0];
48 let to = window[1];
49
50 let from_node = graph.get_node(&from).unwrap();
51 let to_node = graph.get_node(&to).unwrap();
52
53 let source_port = from_node.outputs[0];
54 let target_port = to_node.inputs[0];
55
56 EdgeBuilder::new()
57 .source(source_port)
58 .target(target_port)
59 .build(graph);
60 }
61}