From c00d50b8c955c38360b5deeb451ebd756b40dd59 Mon Sep 17 00:00:00 2001
From: "Thomas F. K. Jorna" <thomasfkjorna@gmail.com>
Date: Sun, 18 Jul 2021 14:36:31 +0200
Subject: graph updates when physics changes + doubleClick detection

---
 app/components/graph/graph.tsx | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

(limited to 'app/components/graph/graph.tsx')

diff --git a/app/components/graph/graph.tsx b/app/components/graph/graph.tsx
index 5925e42..1f4f4b2 100644
--- a/app/components/graph/graph.tsx
+++ b/app/components/graph/graph.tsx
@@ -130,8 +130,17 @@ export const Graph = observer(function Graph(props: GraphProps): JSX.Element {
     setHighlightLinks(highlightLinks);
   };
 
+    const handleBackgroundClick = (event) => {
+    highlightNodes.clear();
+    highlightLinks.clear();
+
+    setSelectedNode(null);
+    updateHighlight();
+    }
+
   const handleNodeHover = node => {
     console.log("hover");
+    if(!selectedNode){
     highlightNodes.clear();
     highlightLinks.clear();
     if (node) {
@@ -142,6 +151,7 @@ export const Graph = observer(function Graph(props: GraphProps): JSX.Element {
 
     setHoverNode(node || null);
     updateHighlight();
+    }
   };
 
   const handleLinkHover = link => {
@@ -157,6 +167,11 @@ export const Graph = observer(function Graph(props: GraphProps): JSX.Element {
     updateHighlight();
   };
 
+    // Normally the graph doesn't update when you just change the physics parameters
+    // This forces the graph to make a small update when you do
+    useEffect(()=>{
+        fgRef.current.d3ReheatSimulation();
+    }, [physics]);
   /* const paintRing = useCallback((node, ctx) => {
 *   // add ring just for highlighted nodes
 *   ctx.beginPath();
@@ -179,6 +194,29 @@ onLinkHover={handleLinkHover}
   //nodeColor={(node) =>
   //  !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
   //}
+
+  const [selectedNode, setSelectedNode] = useState({});
+
+    //shitty handler to check for doubleClicks
+    const [doubleClick, setDoubleClick] = useState(0)
+  const selectClick = (node, event) => {
+    highlightNodes.clear();
+    highlightLinks.clear();
+    if(event.timeStamp - doubleClick < 400){
+
+    }
+
+    if (node) {
+      highlightNodes.add(node);
+      node.neighbors.forEach(neighbor => highlightNodes.add(neighbor));
+      node.links.forEach(link => highlightLinks.add(link));
+    }
+
+    setSelectedNode(node || null);
+    updateHighlight();
+    setDoubleClick(event.timeStamp);
+  }
+
   return (
     <View>
       {!physics.threedim ? (
@@ -216,7 +254,7 @@ onLinkHover={handleLinkHover}
             //  !node.childLinks.length ? "green" : node.collapsed ? "red" : "yellow"
           }
           linkDirectionalParticles={physics.particles}
-          onNodeClick={!physics.collapse ? undefined : handleNodeClick}
+          onNodeClick={!physics.collapse ? selectClick : handleNodeClick}
           nodeLabel={(node) => node.title}
           //nodeVal ={(node)=> node.childLinks.length * 0.5 + 1}
           //d3VelocityDecay={visco}
@@ -256,6 +294,7 @@ onLinkHover={handleLinkHover}
           d3AlphaDecay={physics.alphaDecay}
           d3AlphaMin={physics.alphaTarget}
           d3VelocityDecay={physics.velocityDecay}
+        onBackgroundClick={handleBackgroundClick}
         />
       ) : (
         <ForceGraph3D
-- 
cgit v1.2.3

