Mickey
March 15, 2019, 5:30pm
1
I think there is a bug in current GuideDraggingTool implementation. It seems when tool do snap it counts node bounds instead of locationObject bounds. What I am talking you can see in video I uploaded on this link Example . Guidelines are shown properly and they are using locationObject but snapping then compute something wrongly and places node with some offset.
p.s. I am using GoJS 2.0.4 and latest version of dragging tool from GitHub
jhardy
March 15, 2019, 6:10pm
2
I see what you mean, thanks for the report. This will be fixed with the next release.
If you want to resolve it before it is released, you can add some offsets in the show…Matches functions when they call part.move.
For instance in showHorizontalMatches:
if (bestPart !== null) {
var offsetX = objBounds.x - part.actualBounds.x;
var offsetY = objBounds.y - part.actualBounds.y;
var bestBounds = bestPart.locationObject.getDocumentBounds();
// line extends from x0 to x2
var x0 = Math.min(objBounds.x, bestBounds.x) - 10;
var x2 = Math.max(objBounds.x + objBounds.width, bestBounds.x + bestBounds.width) + 10;
// find bestPart's desired Y
var bestPoint = new go.Point().setRectSpot(bestBounds, bestOtherSpot);
if (bestSpot === go.Spot.Center) {
if (snap) {
// call Part.move in order to automatically move member Parts of Groups
part.move(new go.Point(objBounds.x - offsetX, bestPoint.y - objBounds.height / 2 - offsetY));
this.invalidateLinks(part);
}
if (guideline) {
this.guidelineHcenter.position = new go.Point(x0, bestPoint.y);
this.guidelineHcenter.elt(0).width = x2 - x0;
this.diagram.add(this.guidelineHcenter);
}
} else if (bestSpot === go.Spot.Top) {
if (snap) {
part.move(new go.Point(objBounds.x - offsetX, bestPoint.y - offsetY));
this.invalidateLinks(part);
}
if (guideline) {
this.guidelineHtop.position = new go.Point(x0, bestPoint.y);
this.guidelineHtop.elt(0).width = x2 - x0;
this.diagram.add(this.guidelineHtop);
}
} else if (bestSpot === go.Spot.Bottom) {
if (snap) {
part.move(new go.Point(objBounds.x - offsetX, bestPoint.y - objBounds.height - offsetY));
this.invalidateLinks(part);
}
if (guideline) {
this.guidelineHbottom.position = new go.Point(x0, bestPoint.y);
this.guidelineHbottom.elt(0).width = x2 - x0;
this.diagram.add(this.guidelineHbottom);
}
}
}
1 Like
Mickey
March 15, 2019, 7:56pm
3
Just to let you know the same is necessary for vertical matches.
jhardy
March 15, 2019, 8:02pm
4
Yes, I was just giving the example for horizontal.
1 Like
Mickey
March 15, 2019, 8:03pm
5
Cool now it works as expected.
jhardy
March 22, 2019, 4:46pm
6
We just released 2.0.5, which includes this fix.
1 Like