move person labels to outside bottom

This commit is contained in:
Gavin Nishizawa 2023-03-02 14:52:30 -08:00
parent e2c1f313ce
commit 609b3e5eb3
No known key found for this signature in database
GPG key ID: AE3B177777CE55CD
5 changed files with 25 additions and 9 deletions

View file

@ -447,6 +447,18 @@ func (obj *Object) IsContainer() bool {
return len(obj.Children) > 0
}
func (obj *Object) HasOutsideBottomLabel() bool {
if obj == nil || obj.Attributes == nil {
return false
}
switch obj.Attributes.Shape.Value {
case d2target.ShapeImage, d2target.ShapePerson:
return true
default:
return false
}
}
func (obj *Object) AbsID() string {
if obj.Parent != nil && obj.Parent.ID != "" {
return obj.Parent.AbsID() + "." + obj.ID
@ -1326,7 +1338,13 @@ func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler
}
}
fitWidth, fitHeight := s.GetDimensionsToFit(contentBox.Width, contentBox.Height, paddingX, paddingY)
var fitWidth, fitHeight float64
if shapeType == shape.PERSON_TYPE {
fitWidth = contentBox.Width + paddingX
fitHeight = contentBox.Height + paddingY
} else {
fitWidth, fitHeight = s.GetDimensionsToFit(contentBox.Width, contentBox.Height, paddingX, paddingY)
}
obj.Width = math.Max(float64(desiredWidth), fitWidth)
obj.Height = math.Max(float64(desiredHeight), fitHeight)
if s.AspectRatio1() {

View file

@ -149,7 +149,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
height := obj.Height
if obj.LabelWidth != nil && obj.LabelHeight != nil {
if obj.Attributes.Shape.Value == d2target.ShapeImage || obj.Attributes.Icon != nil {
if obj.HasOutsideBottomLabel() || obj.Attributes.Icon != nil {
height += float64(*obj.LabelHeight) + label.PADDING
}
if len(obj.ChildrenArray) > 0 {
@ -217,7 +217,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
if obj.LabelWidth != nil && obj.LabelHeight != nil {
if len(obj.ChildrenArray) > 0 {
obj.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
} else if obj.Attributes.Shape.Value == d2target.ShapeImage {
} else if obj.HasOutsideBottomLabel() {
obj.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
// remove the extra height we added to the node when passing to dagre
obj.Height -= float64(*obj.LabelHeight) + label.PADDING

View file

@ -179,7 +179,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
height := obj.Height
width := obj.Width
if obj.LabelWidth != nil && obj.LabelHeight != nil {
if obj.Attributes.Shape.Value == d2target.ShapeImage || obj.Attributes.Icon != nil {
if obj.HasOutsideBottomLabel() || obj.Attributes.Icon != nil {
height += float64(*obj.LabelHeight) + label.PADDING
}
width = go2.Max(width, float64(*obj.LabelWidth))
@ -332,7 +332,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
if obj.LabelWidth != nil && obj.LabelHeight != nil {
if len(obj.ChildrenArray) > 0 {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
} else if obj.Attributes.Shape.Value == d2target.ShapeImage {
} else if obj.HasOutsideBottomLabel() {
obj.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
obj.Height -= float64(*obj.LabelHeight) + label.PADDING
} else if obj.Attributes.Icon != nil {

View file

@ -8,7 +8,6 @@ import (
"strings"
"oss.terrastruct.com/d2/d2graph"
"oss.terrastruct.com/d2/d2target"
"oss.terrastruct.com/d2/lib/geo"
"oss.terrastruct.com/d2/lib/label"
"oss.terrastruct.com/util-go/go2"
@ -43,7 +42,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, constantNears []*d2graph.Obje
// These shapes skipped core layout, which means they also skipped label placements
for _, obj := range constantNears {
if obj.Attributes.Shape.Value == d2target.ShapeImage {
if obj.HasOutsideBottomLabel() {
obj.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
} else if obj.Attributes.Icon != nil {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))

View file

@ -335,9 +335,8 @@ func (sd *sequenceDiagram) adjustGroupLabel(group *d2graph.Object) {
func (sd *sequenceDiagram) placeActors() {
centerX := sd.actors[0].Width / 2.
for rank, actor := range sd.actors {
shape := actor.Attributes.Shape.Value
var yOffset float64
if shape == d2target.ShapeImage || shape == d2target.ShapePerson {
if actor.HasOutsideBottomLabel() {
actor.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
yOffset = sd.maxActorHeight - actor.Height
if actor.LabelHeight != nil {