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" 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" 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 height += float64(obj.LabelDimensions.Height) + label.PADDING
} }
} }
if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" { // reserve extra space for 3d/multiple by padding dagre the larger dimensions
height += d2target.THREE_DEE_OFFSET 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 width += d2target.THREE_DEE_OFFSET
} else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" { } else if obj.IsMultiple() {
height += d2target.MULTIPLE_OFFSET height += d2target.MULTIPLE_OFFSET
width += 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 { for _, obj := range g.Objects {
var offset float64 var offsetX, offsetY float64
if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" { if obj.Is3d() {
offset = d2target.THREE_DEE_OFFSET offsetX = d2target.THREE_DEE_OFFSET
} else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" { offsetY = d2target.THREE_DEE_OFFSET
offset = d2target.MULTIPLE_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 if offsetY != 0 {
obj.ShiftDescendants(0, offset) obj.TopLeft.Y += offsetY
obj.ShiftDescendants(0, offsetY)
if !obj.IsContainer() { if !obj.IsContainer() {
obj.Width -= offset obj.Width -= offsetX
obj.Height -= offset obj.Height -= offsetY
} }
} }
} }
@ -481,9 +493,13 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
originalSrcTL := edge.Src.TopLeft.Copy() originalSrcTL := edge.Src.TopLeft.Copy()
originalDstTL := edge.Dst.TopLeft.Copy() originalDstTL := edge.Dst.TopLeft.Copy()
// if the edge passes through 3d/multiple, use the offset box for tracing to border // 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 && 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.X += d2target.THREE_DEE_OFFSET
edge.Src.TopLeft.Y -= 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 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 && 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.X += d2target.THREE_DEE_OFFSET
edge.Dst.TopLeft.Y -= 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) labelPosition := label.Position(targetShape.LabelPosition)
var box *geo.Box var box *geo.Box
if labelPosition.IsOutside() { if labelPosition.IsOutside() {
box = s.GetBox() box = s.GetBox().Copy()
// if it is 3d/multiple, place label using box around those
if targetShape.ThreeDee { 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 box.Width += d2target.THREE_DEE_OFFSET
} else if targetShape.Multiple { } else if targetShape.Multiple {
box.TopLeft.Y -= d2target.MULTIPLE_OFFSET box.TopLeft.Y -= d2target.MULTIPLE_OFFSET