/// <summary> /// Get contact points defined for given item /// <remarks>Note that because of simple getting contact points we store them as first four</remarks>. /// </summary> /// <param name="item">Item which points are generated.</param> /// <returns>Generated points.</returns> private IEnumerable <GraphPoint> generatePoints(DiagramItem item) { var span = SceneNavigator.GetSpan(item, item.GlobalPosition); var topLeft = new GraphPoint(span.TopLeft, TopLeftCorner, item); var topRight = new GraphPoint(span.TopRight, TopRightCorner, item); var bottomLeft = new GraphPoint(span.BottomLeft, BottomLeftCorner, item); var bottomRight = new GraphPoint(span.BottomRight, BottomRightCorner, item); topLeft.SetEdgeStatus(topRight); topLeft.SetEdgeStatus(bottomLeft); bottomRight.SetEdgeStatus(topRight); bottomRight.SetEdgeStatus(bottomLeft); var points = new List <GraphPoint>(); points.Add(topLeft); points.Add(topRight); points.Add(bottomLeft); points.Add(bottomRight); generateConnectorPoints(item.TopConnectorDrawings, ConnectorAlign.Top, item, points); generateConnectorPoints(item.LeftConnectorDrawings, ConnectorAlign.Left, item, points); generateConnectorPoints(item.BottomConnectorDrawings, ConnectorAlign.Bottom, item, points); generateConnectorPoints(item.RightConnectorDrawings, ConnectorAlign.Right, item, points); return(points); }
/// <summary> /// Compute possibilities of movedItem to move without overlapping any other item /// </summary> /// <param name="movedItem">Item which possibilities are created</param> /// <returns>Computed possibilities</returns> private ItemMoveability computePossibilities(DiagramItem movedItem) { if (movedItem.IsRootItem) { return(new ItemMoveability(double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity)); } var container = movedItem.ContainingDiagramCanvas; //we have to check possibilities relative to parent! //so using relative position is necessary var currentPosition = getPosition(movedItem); var currentLocalPosition = movedItem.AsLocalPosition(currentPosition); var span = SceneNavigator.GetSpan(movedItem, currentLocalPosition); var contMargin = container.Margin; var upPossib = span.Top; var downPossib = container.DesiredSize.Height - span.Bottom - contMargin.Bottom - contMargin.Top; var rightPossib = container.DesiredSize.Width - span.Right - contMargin.Right - contMargin.Left; var leftPossib = span.Left; return(new ItemMoveability( upPossib, downPossib, leftPossib, rightPossib )); }
internal void Arrange(IEnumerable <DiagramItem> arrangedItems) { //TODO use zGroups on container var sortedItems = arrangedItems.OrderBy((item) => DiagramCanvasBase.GetZIndex(item)); _navigator = new SceneNavigator(); foreach (var item in sortedItems) { var collidingItems = _navigator.GetItemsInCollision(item).ToArray(); foreach (var colidingItem in collidingItems) { //move colliding items moveCollidingItem(item, colidingItem); } _navigator.AddItem(item); } }
/// <summary> /// Initializes a new instance of the <see cref="JoinGraph"/> class. /// </summary> /// <param name="navigator">The navigator.</param> internal JoinGraph(SceneNavigator navigator) { _navigator = navigator; }
private Rect getLocalSpan(DiagramItem item) { return(SceneNavigator.GetSpan(item, item.LocalPosition)); }