fixes, cleanup

This commit is contained in:
Gavin Nishizawa 2023-05-24 19:39:39 -07:00
parent 6f9ad8d6dd
commit 6fc9ffa04d
No known key found for this signature in database
GPG key ID: AE3B177777CE55CD
3 changed files with 46 additions and 21 deletions

View file

@ -1968,6 +1968,6 @@ func (obj *Object) IsMultiple() bool {
return obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true"
}
func (obj *Object) IsThreeDee() bool {
func (obj *Object) Is3d() bool {
return obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true"
}

View file

@ -168,10 +168,15 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
height += float64(obj.LabelDimensions.Height) + label.PADDING
}
}
if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" {
height += d2target.THREE_DEE_OFFSET
// reserve extra space for 3d/multiple by padding dagre the larger dimensions
if obj.Is3d() {
if obj.Shape.Value == d2target.ShapeHexagon {
height += d2target.THREE_DEE_OFFSET / 2
} else {
height += d2target.THREE_DEE_OFFSET
}
width += d2target.THREE_DEE_OFFSET
} else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" {
} else if obj.IsMultiple() {
height += d2target.MULTIPLE_OFFSET
width += d2target.MULTIPLE_OFFSET
}
@ -414,20 +419,27 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
}
}
// separate loop so all descendants have initial placements
// remove the extra width/height we added for 3d/multiple after all objects have been placed
// and shift the shapes down accordingly
for _, obj := range g.Objects {
var offset float64
if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" {
offset = d2target.THREE_DEE_OFFSET
} else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" {
offset = d2target.MULTIPLE_OFFSET
var offsetX, offsetY float64
if obj.Is3d() {
offsetX = d2target.THREE_DEE_OFFSET
offsetY = d2target.THREE_DEE_OFFSET
if obj.Shape.Value == d2target.ShapeHexagon {
offsetY = d2target.THREE_DEE_OFFSET / 2
}
} else if obj.IsMultiple() {
offsetX = d2target.MULTIPLE_OFFSET
offsetY = d2target.MULTIPLE_OFFSET
}
if offset != 0 {
obj.TopLeft.Y += offset
obj.ShiftDescendants(0, offset)
if offsetY != 0 {
obj.TopLeft.Y += offsetY
obj.ShiftDescendants(0, offsetY)
if !obj.IsContainer() {
obj.Width -= offset
obj.Height -= offset
obj.Width -= offsetX
obj.Height -= offsetY
}
}
}
@ -481,9 +493,13 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
originalSrcTL := edge.Src.TopLeft.Copy()
originalDstTL := edge.Dst.TopLeft.Copy()
// if the edge passes through 3d/multiple, use the offset box for tracing to border
if edge.Src.IsThreeDee() {
if edge.Src.Is3d() {
offsetY := d2target.THREE_DEE_OFFSET
if edge.Src.Shape.Value == d2target.ShapeHexagon {
offsetY = d2target.THREE_DEE_OFFSET / 2
}
if start.X > edge.Src.TopLeft.X+d2target.THREE_DEE_OFFSET &&
start.Y < edge.Src.TopLeft.Y+edge.Src.Height-d2target.THREE_DEE_OFFSET {
start.Y < edge.Src.TopLeft.Y+edge.Src.Height-float64(offsetY) {
edge.Src.TopLeft.X += d2target.THREE_DEE_OFFSET
edge.Src.TopLeft.Y -= d2target.THREE_DEE_OFFSET
}
@ -495,9 +511,13 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
edge.Src.TopLeft.Y -= d2target.MULTIPLE_OFFSET
}
}
if edge.Dst.IsThreeDee() {
if edge.Dst.Is3d() {
offsetY := d2target.THREE_DEE_OFFSET
if edge.Src.Shape.Value == d2target.ShapeHexagon {
offsetY = d2target.THREE_DEE_OFFSET / 2
}
if end.X > edge.Dst.TopLeft.X+d2target.THREE_DEE_OFFSET &&
end.Y < edge.Dst.TopLeft.Y+edge.Dst.Height-d2target.THREE_DEE_OFFSET {
end.Y < edge.Dst.TopLeft.Y+edge.Dst.Height-float64(offsetY) {
edge.Dst.TopLeft.X += d2target.THREE_DEE_OFFSET
edge.Dst.TopLeft.Y -= d2target.THREE_DEE_OFFSET
}

View file

@ -1186,9 +1186,14 @@ func drawShape(writer io.Writer, diagramHash string, targetShape d2target.Shape,
labelPosition := label.Position(targetShape.LabelPosition)
var box *geo.Box
if labelPosition.IsOutside() {
box = s.GetBox()
box = s.GetBox().Copy()
// if it is 3d/multiple, place label using box around those
if targetShape.ThreeDee {
box.TopLeft.Y -= d2target.THREE_DEE_OFFSET
offsetY := d2target.THREE_DEE_OFFSET
if targetShape.Type == d2target.ShapeHexagon {
offsetY /= 2
}
box.TopLeft.Y -= float64(offsetY)
box.Width += d2target.THREE_DEE_OFFSET
} else if targetShape.Multiple {
box.TopLeft.Y -= d2target.MULTIPLE_OFFSET