]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/connection/RouteGraphNode.java
Take zoom level into account when picking connections
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / connection / RouteGraphNode.java
index 0a2583fc6dd734552999376241b15b509f235086..048514f3a0eaae298b58bdf98149542a8a8fe13b 100644 (file)
@@ -23,7 +23,6 @@ import java.awt.geom.Path2D;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.lang.reflect.Constructor;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +46,7 @@ import org.simantics.scenegraph.INode;
 import org.simantics.scenegraph.ISelectionPainterNode;
 import org.simantics.scenegraph.g2d.G2DNode;
 import org.simantics.scenegraph.g2d.G2DParentNode;
+import org.simantics.scenegraph.g2d.G2DSceneGraph;
 import org.simantics.scenegraph.g2d.IG2DNode;
 import org.simantics.scenegraph.g2d.events.EventTypes;
 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
@@ -61,6 +61,7 @@ import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.events.command.Commands;
 import org.simantics.scenegraph.g2d.nodes.GridNode;
 import org.simantics.scenegraph.g2d.nodes.LinkNode;
+import org.simantics.scenegraph.g2d.nodes.NavigationNode;
 import org.simantics.scenegraph.g2d.nodes.SVGNodeAssignment;
 import org.simantics.scenegraph.g2d.nodes.connection.HighlightActionPointsAction.Action;
 import org.simantics.scenegraph.g2d.nodes.connection.HighlightActionPointsAction.Pick;
@@ -69,8 +70,8 @@ import org.simantics.scenegraph.utils.ColorUtil;
 import org.simantics.scenegraph.utils.GeometryUtils;
 import org.simantics.scenegraph.utils.InitValueSupport;
 import org.simantics.scenegraph.utils.NodeUtil;
-import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import gnu.trove.map.hash.THashMap;
 
@@ -486,7 +487,7 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
         return null;
     }
 
-    private double getSelectionStrokeWidth() {
+    public double getSelectionStrokeWidth() {
         if (selectionStroke instanceof BasicStroke) {
             BasicStroke bs = (BasicStroke) selectionStroke;
             return bs.getLineWidth();
@@ -530,6 +531,12 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
 
     @Override
     protected boolean mouseDragged(MouseDragBegin e) {
+        // Consume event if drag is possible. 
+        // PointerInteractor will call handleDrag with the MouseDragBegin event for the route line that is closest to the cursor.
+        return currentAction != null;
+    }
+
+    public boolean handleDrag(MouseDragBegin e) {
         if (dragAction != null && !e.hasAnyModifier(MouseEvent.ALL_MODIFIERS_MASK) && e.button == MouseEvent.LEFT_BUTTON) {
             currentAction = dragAction;
             dragAction = null;
@@ -549,7 +556,7 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
             }
         }
         if (newBranchPointPosition != null) {
-            RouteLine line = rg.pickLine(mouseX, mouseY, pickTolerance);
+            RouteLine line = rg.pickLine(mouseX, mouseY, scaledPickTolerance());
             if (line != null) {
                 newBranchPointPosition.setLocation(mouseX, mouseY);
                 SplittedRouteGraph.snapToLine(newBranchPointPosition, line);
@@ -660,7 +667,7 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
                     return false;
                 }
                 //System.out.println("move action");
-                dragAction = SnappingMoveAction.create(rg, mouseX, mouseY, pickTolerance, moveFilter, getSnapAdvisor());
+                dragAction = SnappingMoveAction.create(rg, mouseX, mouseY, scaledPickTolerance(), moveFilter, getSnapAdvisor());
                 //System.out.println("DRAG ACTION: " + dragAction);
             }
 
@@ -671,6 +678,20 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
         return false;
     }
 
+    private double scaledPickTolerance() {
+        NavigationNode nn = NodeUtil.findNearestParentNode(this, NavigationNode.class);
+        double scale = 1.0;
+        if (nn != null) {
+            scale = GeometryUtils.getScale(nn.getTransform());
+        }
+        double pickDistance = 0;
+        G2DSceneGraph sg = NodeUtil.getRootNode(nn != null ? nn : this);
+        if (sg != null) {
+            pickDistance = sg.getGlobalProperty(G2DSceneGraph.PICK_DISTANCE, pickDistance);
+        }
+        return Math.max(getSelectionStrokeWidth() / 2.0, pickDistance / scale);
+    }
+    
     /**
      * Checks the selections data node in the scene graph for any links 
      * @return
@@ -755,11 +776,11 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
             return false;
 
         if (!e.hasAnyModifier(MouseEvent.ALL_MODIFIERS_MASK) && e.keyCode == KeyEvent.VK_S) {
-            Object target = rg.pick(mouseX, mouseY, pickTolerance, RouteGraph.PICK_PERSISTENT_LINES | RouteGraph.PICK_TRANSIENT_LINES);
+            Object target = rg.pick(mouseX, mouseY, scaledPickTolerance(), RouteGraph.PICK_PERSISTENT_LINES | RouteGraph.PICK_TRANSIENT_LINES);
             return splitTarget(target);
         }
         else if (!e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK | MouseEvent.CTRL_MASK) && (e.keyCode == KeyEvent.VK_R || e.keyCode == KeyEvent.VK_D)) {
-            Object target = rg.pick(mouseX, mouseY, pickTolerance, RouteGraph.PICK_PERSISTENT_LINES);
+            Object target = rg.pick(mouseX, mouseY, scaledPickTolerance(), RouteGraph.PICK_PERSISTENT_LINES);
             return deleteTarget(target);
         }
         else if (e.keyCode == KeyEvent.VK_ESCAPE) {
@@ -783,7 +804,7 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
         }
         else if (e.keyCode == KeyEvent.VK_ALT) {
             // Begin connection branching visualization.
-            RouteLine line = rg.pickLine(mouseX, mouseY, pickTolerance);
+            RouteLine line = rg.pickLine(mouseX, mouseY, scaledPickTolerance());
             if (branchable && line != null) {
                 newBranchPointPosition = new Point2D.Double(mouseX, mouseY);
                 SplittedRouteGraph.snapToLine(newBranchPointPosition, line);