import org.simantics.scenegraph.g2d.events.MouseEvent;
import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonEvent;
import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
import org.simantics.scenegraph.g2d.events.command.CommandEvent;
import org.simantics.scenegraph.g2d.events.command.Commands;
if (me instanceof MouseButtonPressedEvent)
return processMouseButtonPress((MouseButtonPressedEvent) me);
+ // #7653: Support creating connections between terminals without lifting mouse button in between.
+ if (me instanceof MouseButtonReleasedEvent)
+ return processMouseButtonRelease((MouseButtonReleasedEvent) me);
+
return false;
}
}
} else {
RouteGraphTarget cp = RouteGraphConnectTool.pickRouteGraphConnection(
+ getContext(),
diagram,
pi.getCanvasPickShape(me.controlPosition),
pi.getPickDistance());
attachToConnectionJudgement = canConnect.first;
controlPoints.getLast().setPosition(ti.posDia).setAttachedToTerminal(ti);
endTerminal = ti;
+ startTerminal = canConnect.second;
cp.getNode().showBranchPoint(isectPos);
if (!endWithoutTerminal(lastMouseCanvasPos, shouldEndWithFlag(me)))
updateSG();
if (snapAdvisor != null)
snapAdvisor.snap(mouseCanvasPos);
- if (isEndTerminalDefined() && connectionJudgment != null) {
- // Clicked on an allowed end terminal. End connection & end mode.
- createConnection();
- remove();
- return true;
- } else if (lastRouteGraphTarget != null && attachToConnectionJudgement != null) {
- lastRouteGraphTarget.getNode().showBranchPoint(null);
- attachToConnection();
- remove();
+ if (tryEndConnection()) {
return true;
} else {
// Finish connection in thin air only if the
return false;
}
+ private int mouseLeftReleaseCount = 0;
+
+ protected boolean processMouseButtonRelease(MouseButtonReleasedEvent me) {
+ if (me.button == MouseEvent.LEFT_BUTTON
+ && ++mouseLeftReleaseCount == 1) {
+ return tryEndConnection();
+ }
+ return false;
+ }
+
+ /**
+ * @return <code>true</code> if connection was successfully ended
+ */
+ private boolean tryEndConnection() {
+ if (isEndTerminalDefined() && connectionJudgment != null) {
+ createConnection();
+ remove();
+ return true;
+ } else if (lastRouteGraphTarget != null && attachToConnectionJudgement != null) {
+ lastRouteGraphTarget.getNode().showBranchPoint(null);
+ attachToConnection();
+ remove();
+ return true;
+ }
+ return false;
+ }
+
private void attachToConnection() {
ConnectionJudgement judgment = this.attachToConnectionJudgement;
if (judgment == null) {