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;
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;
/**
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)
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;
}
Shape canvasPickRect = getCanvasPickShape(controlPos);
if (canvasPickRect == null)
return Collections.emptyList();
- return TerminalUtil.pickTerminals(diagram, canvasPickRect, true, true);
+ return TerminalUtil.pickTerminals(getContext(), diagram, canvasPickRect, true, true);
}
public TerminalInfo pickTerminal(Point2D controlPos)
Shape canvasPickRect = getCanvasPickShape(controlPos);
if (canvasPickRect == null)
return null;
- TerminalInfo ti = TerminalUtil.pickTerminal(diagram, canvasPickRect);
+ TerminalInfo ti = TerminalUtil.pickTerminal(getContext(), diagram, canvasPickRect);
return ti;
}
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);
+ 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);
}
return false;
}
+
+ boolean result = false;
// Click Select
{
if (!Collections.singleton(selectedPick).equals(currentSelection)
&& (isLeft || (isRight && !currentSelection.contains(selectedPick)))) {
selection.setSelection(selectionId, selectedPick);
+ // Stop propagation
+ result = true;
}
if (isRight && pickables.size() == 1 && noModifiers) {
}
}
- return false;
+ return result;
}
/**
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);
+ 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);
assertDependencies();
Point2D curCanvasPos = util.controlToCanvas(me.controlPosition, curCanvasDragPos);
- PickRequest req = new PickRequest(me.startCanvasPos);
+ 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);
- 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>();
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;
+ }
+ }
}
}
}