]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/pointertool/PointerInteractor.java
Take zoom level into account when picking connections
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / pointertool / PointerInteractor.java
index 4f9df238f4b602ec6e95798570ad2cbbb154f04a..940579ebe82e17ad0f961d8622b57a666869a2a3 100644 (file)
@@ -45,12 +45,14 @@ import org.simantics.g2d.diagram.participant.pointertool.TerminalUtil.TerminalIn
 import org.simantics.g2d.element.ElementClassProviders;
 import org.simantics.g2d.element.IElement;
 import org.simantics.g2d.element.IElementClassProvider;
+import org.simantics.g2d.elementclass.RouteGraphConnectionClass;
 import org.simantics.g2d.participant.KeyUtil;
 import org.simantics.g2d.participant.MouseUtil;
 import org.simantics.g2d.participant.TransformUtil;
 import org.simantics.g2d.scenegraph.SceneGraphConstants;
 import org.simantics.g2d.utils.CanvasUtils;
 import org.simantics.g2d.utils.GeometryUtils;
+import org.simantics.scenegraph.g2d.G2DSceneGraph;
 import org.simantics.scenegraph.g2d.events.Event;
 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
 import org.simantics.scenegraph.g2d.events.KeyEvent;
@@ -60,12 +62,15 @@ import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
 import org.simantics.scenegraph.g2d.events.command.Commands;
+import org.simantics.scenegraph.g2d.nodes.connection.RouteGraphNode;
 import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;
 import org.simantics.utils.ObjectUtils;
 import org.simantics.utils.datastructures.context.IContext;
 import org.simantics.utils.datastructures.context.IContextListener;
+import org.simantics.utils.datastructures.hints.HintListenerAdapter;
 import org.simantics.utils.datastructures.hints.IHintContext.Key;
 import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;
+import org.simantics.utils.datastructures.hints.IHintObservable;
 import org.simantics.utils.threads.ThreadUtils;
 
 /**
@@ -203,6 +208,14 @@ public class PointerInteractor extends AbstractDiagramParticipant {
         super.addedToContext(ctx);
         hoverStrategy = new DefaultHoverStrategy((TerminalHoverStrategy) getHint(TerminalPainter.TERMINAL_HOVER_STRATEGY));
         setHint(TerminalPainter.TERMINAL_HOVER_STRATEGY, hoverStrategy);
+
+        getContext().getSceneGraph().setGlobalProperty(G2DSceneGraph.PICK_DISTANCE, getPickDistance());
+        getHintStack().addKeyHintListener(KEY_PICK_DISTANCE, new HintListenerAdapter() {
+            @Override
+            public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
+                getContext().getSceneGraph().setGlobalProperty(G2DSceneGraph.PICK_DISTANCE, getPickDistance());
+            }
+        });
     }
 
     @EventHandler(priority = 0)
@@ -297,7 +310,7 @@ public class PointerInteractor extends AbstractDiagramParticipant {
             return null;
 
         double      pd              = getPickDistance();
-        Rectangle2D controlPickRect = new Rectangle2D.Double(controlPos.getX()-pd, controlPos.getY()-pd, pd*2+1, pd*2+1);
+        Rectangle2D controlPickRect = new Rectangle2D.Double(controlPos.getX()-pd, controlPos.getY()-pd, pd*2, pd*2);
         Shape       canvasShape     = GeometryUtils.transformShape(controlPickRect, inverse);
         return canvasShape;
     }
@@ -415,15 +428,13 @@ public class PointerInteractor extends AbstractDiagramParticipant {
 
         assertDependencies();
 
-        // Pick Terminal
-        double pickDist = getPickDistance();
-        Rectangle2D controlPickRect = new Rectangle2D.Double(me.controlPosition.getX()-pickDist, me.controlPosition.getY()-pickDist, pickDist*2+1, pickDist*2+1);
-        Shape       canvasPickRect  = GeometryUtils.transformShape(controlPickRect, util.getInverseTransform());
+        Shape       canvasPickRect  = getCanvasPickShape(me.controlPosition);
         int selectionId = me.mouseId;
 
         PickRequest req = new PickRequest(canvasPickRect).context(getContext());
         req.pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS;
-        req.pickSorter = pickSorter;
+        req.pickSorter = PickRequest.PickSorter.connectionSorter(pickSorter, req.pickArea.getBounds2D().getCenterX(), req.pickArea.getBounds2D().getCenterY());
+
         //req.pickSorter = PickRequest.PickSorter.CONNECTIONS_LAST;
         List<IElement> pickables = new ArrayList<IElement>();
         pickContext.pick(diagram, req, pickables);
@@ -586,14 +597,13 @@ public class PointerInteractor extends AbstractDiagramParticipant {
         if (getToolMode() != Hints.POINTERTOOL) return false;
         if (me.clickCount < 2) return false;
 
-        // Pick Terminal
-        double pickDist = getPickDistance();
-        Rectangle2D controlPickRect = new Rectangle2D.Double(me.controlPosition.getX()-pickDist, me.controlPosition.getY()-pickDist, pickDist*2+1, pickDist*2+1);
-        Shape       canvasPickRect  = GeometryUtils.transformShape(controlPickRect, util.getInverseTransform());
+        Shape       canvasPickRect  = getCanvasPickShape(me.controlPosition);
         int         selectionId     = me.mouseId;
 
         PickRequest req             = new PickRequest(canvasPickRect).context(getContext());
         req.pickPolicy = PickPolicy.PICK_INTERSECTING_OBJECTS;
+
+        req.pickSorter = PickRequest.PickSorter.connectionSorter(pickSorter, req.pickArea.getBounds2D().getCenterX(), req.pickArea.getBounds2D().getCenterY());
         List<IElement> pick         = new ArrayList<IElement>();
         pickContext.pick(diagram, req, pick);
 
@@ -641,23 +651,13 @@ public class PointerInteractor extends AbstractDiagramParticipant {
         assertDependencies();
 
         Point2D         curCanvasPos    = util.controlToCanvas(me.controlPosition, curCanvasDragPos);
-        PickRequest     req             = new PickRequest(me.startCanvasPos).context(getContext());
+        Shape       canvasPickRect  = getCanvasPickShape(me.controlPosition);
+        PickRequest     req             = new PickRequest(canvasPickRect).context(getContext());
         req.pickPolicy = PickRequest.PickPolicy.PICK_INTERSECTING_OBJECTS;
+        req.pickSorter = PickRequest.PickSorter.connectionSorter(pickSorter, req.pickArea.getBounds2D().getCenterX(), req.pickArea.getBounds2D().getCenterY()); 
         List<IElement>  picks           = new ArrayList<IElement>();
         pickContext.pick(diagram, req, picks);
 
-        //System.out.println(picks);
-        if (picks.isEmpty()) {
-            // Widen the area of searching if nothing is found with point picking
-               double pickDist = getPickDistance();
-            Rectangle2D     controlPickRect     = new Rectangle2D.Double(me.controlPosition.getX()-pickDist, me.controlPosition.getY()-pickDist, pickDist*2+1, pickDist*2+1);
-            Shape           canvasPickRect      = GeometryUtils.transformShape(controlPickRect, util.getInverseTransform());
-            req = new PickRequest(canvasPickRect).context(getContext());
-            req.pickPolicy = PickRequest.PickPolicy.PICK_INTERSECTING_OBJECTS;
-            pickContext.pick(diagram, req, picks);
-            //System.out.println("2nd try: " + picks);
-        }
-
         Set<IElement> sel            = selection.getSelection(me.mouseId);
         IElement      topMostPick    = picks.isEmpty() ? null : picks.get(picks.size() - 1);
         Set<IElement> elementsToDrag = new HashSet<IElement>();
@@ -686,6 +686,15 @@ public class PointerInteractor extends AbstractDiagramParticipant {
                         getContext().add(tm);
                         return !onlyConnections;
                     }
+                } else {
+                    // forward MouseDragBegin to closest RouteGraphNode
+                    for (int i = picks.size() - 1; i >= 0; i--) {
+                        RouteGraphNode rgn = picks.get(i).getHint(RouteGraphConnectionClass.KEY_RG_NODE);
+                        if (rgn != null) {
+                            rgn.handleDrag(me);
+                            break;
+                        }
+                    }
                 }
             }
         }