From 8f652d91b6cfbc52a04e970af7adf3bd6f8eb7e2 Mon Sep 17 00:00:00 2001 From: Max <m.giller.dev@gmail.com> Date: Fri, 9 Jul 2021 18:50:08 +0200 Subject: [PATCH] Added connect tool --- editor/editor.html | 1 + editor/images/tools/connect.png | Bin 0 -> 3244 bytes editor/js/graph.js | 35 +++++++++++++++++++++++- editor/js/state.js | 1 + editor/js/tools/connecttool.js | 46 ++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 editor/images/tools/connect.png create mode 100644 editor/js/tools/connecttool.js diff --git a/editor/editor.html b/editor/editor.html index 527abd4..65de428 100644 --- a/editor/editor.html +++ b/editor/editor.html @@ -30,6 +30,7 @@ <script src="%WWW%editor/js/tools/collecttool.js"></script> <script src="%WWW%editor/js/tools/deletetool.js"></script> <script src="%WWW%editor/js/tools/addnodetool.js"></script> + <script src="%WWW%editor/js/tools/connecttool.js"></script> <script src="%WWW%editor/js/display.js"></script> <script src="%WWW%editor/js/state.js"></script> <script src="%WWW%editor/js/editor.js"></script> diff --git a/editor/images/tools/connect.png b/editor/images/tools/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb1991878d15423eaa17ffaf0d4379a2bedc88d GIT binary patch literal 3244 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 literal 0 HcmV?d00001 diff --git a/editor/js/graph.js b/editor/js/graph.js index a8d3d40..6987a65 100644 --- a/editor/js/graph.js +++ b/editor/js/graph.js @@ -196,6 +196,40 @@ const graph = { return result; }, + addLink(sourceId, targetId, linkDetails = {}) { + // Copy params + var newLink = linkDetails; + + // Make sure the IDs exist + if ( + sourceId === undefined || + targetId === undefined || + graph.existsNodeId(sourceId) === false || + graph.existsNodeId(targetId) === false + ) { + return; + } + + + // Make sure the link is unique + if (graph.existsLink(sourceId, targetId)) { + return; + } + + newLink[LINK_SOURCE] = sourceId; + newLink[LINK_TARGET] = targetId; + + // Basic node properties + newLink.link = true; + newLink.node = false; + + // Add node + graph.data[GRAPH_LINKS].push(newLink); + graph.update(); + + return newLink; + }, + addNode(nodeDetails) { // Copy params var newNode = nodeDetails; @@ -210,7 +244,6 @@ const graph = { // Basic node properties newNode.node = true; newNode.link = false; - newNode.index = graph.data[GRAPH_NODES].length; // Add node graph.data[GRAPH_NODES].push(newNode); diff --git a/editor/js/state.js b/editor/js/state.js index a58d253..4d46c5e 100644 --- a/editor/js/state.js +++ b/editor/js/state.js @@ -3,6 +3,7 @@ const TOOLS = { collect: new CollectTool("collect"), delete: new DeleteTool("delete"), addnode: new AddNodeTool("addnode"), + connect: new ConnectTool("connect"), }; const CONTEXT = { diff --git a/editor/js/tools/connecttool.js b/editor/js/tools/connecttool.js new file mode 100644 index 0000000..cd47b50 --- /dev/null +++ b/editor/js/tools/connecttool.js @@ -0,0 +1,46 @@ +const KEEP_SOURCE_KEY_ID = 17; + +class ConnectTool extends Tool { + constructor(key) { + super("Connect two nodes", "connect", key); + this.keepSource = false; + } + + onNodeClick(node) { + // Is a first node selected? + if (state.selectedItem === undefined || state.selectedItem.node === false) { + state.setSelectedItem(node); + return; + } + + // Add new link + var link = graph.addLink(state.selectedItem[NODE_ID], node[NODE_ID]); + + if (link === undefined) { + console.error("Could not create new link"); + return; + } + + if (this.keepSource === false) { + // Deselect the current first node + // TODO: Returned object not yet converted to normal one + state.setSelectedItem(link); + } + } + + onBackgroundClick(event, positions) { + state.setSelectedItem(undefined); + } + + onKeyDown(key) { + if (key.keyCode === KEEP_SOURCE_KEY_ID) { + this.keepSource = true; + } + } + + onKeyUp(key) { + if (key.keyCode === KEEP_SOURCE_KEY_ID) { + this.keepSource = false; + } + } +} \ No newline at end of file -- GitLab