user-specified label/icon positions
This commit is contained in:
parent
cffac6bfde
commit
af32907a8a
4 changed files with 83 additions and 4 deletions
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"oss.terrastruct.com/d2/d2themes/d2themescatalog"
|
"oss.terrastruct.com/d2/d2themes/d2themescatalog"
|
||||||
"oss.terrastruct.com/d2/lib/color"
|
"oss.terrastruct.com/d2/lib/color"
|
||||||
"oss.terrastruct.com/d2/lib/geo"
|
"oss.terrastruct.com/d2/lib/geo"
|
||||||
|
"oss.terrastruct.com/d2/lib/label"
|
||||||
"oss.terrastruct.com/d2/lib/shape"
|
"oss.terrastruct.com/d2/lib/shape"
|
||||||
"oss.terrastruct.com/d2/lib/textmeasure"
|
"oss.terrastruct.com/d2/lib/textmeasure"
|
||||||
)
|
)
|
||||||
|
|
@ -1381,6 +1382,18 @@ func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler
|
||||||
for _, obj := range g.Objects {
|
for _, obj := range g.Objects {
|
||||||
obj.Box = &geo.Box{}
|
obj.Box = &geo.Box{}
|
||||||
|
|
||||||
|
// user-specified label/icon positions
|
||||||
|
if obj.HasLabel() && obj.Attributes.LabelPosition != nil {
|
||||||
|
scalar := *obj.Attributes.LabelPosition
|
||||||
|
position := LabelPositionsMapping[scalar.Value]
|
||||||
|
obj.LabelPosition = go2.Pointer(string(position))
|
||||||
|
}
|
||||||
|
if obj.Icon != nil && obj.Attributes.IconPosition != nil {
|
||||||
|
scalar := *obj.Attributes.IconPosition
|
||||||
|
position := LabelPositionsMapping[scalar.Value]
|
||||||
|
obj.IconPosition = go2.Pointer(string(position))
|
||||||
|
}
|
||||||
|
|
||||||
var desiredWidth int
|
var desiredWidth int
|
||||||
var desiredHeight int
|
var desiredHeight int
|
||||||
if obj.WidthAttr != nil {
|
if obj.WidthAttr != nil {
|
||||||
|
|
@ -1734,6 +1747,37 @@ var LabelPositionsArray = []string{
|
||||||
}
|
}
|
||||||
var LabelPositions map[string]struct{}
|
var LabelPositions map[string]struct{}
|
||||||
|
|
||||||
|
// convert to label.Position
|
||||||
|
var LabelPositionsMapping = map[string]label.Position{
|
||||||
|
"top-left": label.InsideTopLeft,
|
||||||
|
"top-center": label.InsideTopCenter,
|
||||||
|
"top-right": label.InsideTopRight,
|
||||||
|
|
||||||
|
"center-left": label.InsideMiddleLeft,
|
||||||
|
"center-center": label.InsideMiddleCenter,
|
||||||
|
"center-right": label.InsideMiddleRight,
|
||||||
|
|
||||||
|
"bottom-left": label.InsideBottomLeft,
|
||||||
|
"bottom-center": label.InsideBottomCenter,
|
||||||
|
"bottom-right": label.InsideBottomRight,
|
||||||
|
|
||||||
|
"outside-top-left": label.OutsideTopLeft,
|
||||||
|
"outside-top-center": label.OutsideTopCenter,
|
||||||
|
"outside-top-right": label.OutsideTopRight,
|
||||||
|
|
||||||
|
"outside-left-top": label.OutsideLeftTop,
|
||||||
|
"outside-left-center": label.OutsideLeftMiddle,
|
||||||
|
"outside-left-bottom": label.OutsideLeftBottom,
|
||||||
|
|
||||||
|
"outside-right-top": label.OutsideRightTop,
|
||||||
|
"outside-right-center": label.OutsideRightMiddle,
|
||||||
|
"outside-right-bottom": label.OutsideRightBottom,
|
||||||
|
|
||||||
|
"outside-bottom-left": label.OutsideBottomLeft,
|
||||||
|
"outside-bottom-center": label.OutsideBottomCenter,
|
||||||
|
"outside-bottom-right": label.OutsideBottomRight,
|
||||||
|
}
|
||||||
|
|
||||||
var FillPatterns = []string{
|
var FillPatterns = []string{
|
||||||
"dots",
|
"dots",
|
||||||
"lines",
|
"lines",
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,8 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
|
||||||
obj.Width = math.Ceil(dn.Width)
|
obj.Width = math.Ceil(dn.Width)
|
||||||
obj.Height = math.Ceil(dn.Height)
|
obj.Height = math.Ceil(dn.Height)
|
||||||
|
|
||||||
if obj.HasLabel() && obj.LabelPosition == nil {
|
hasLabelPosition := obj.LabelPosition != nil
|
||||||
|
if obj.HasLabel() && !hasLabelPosition {
|
||||||
if len(obj.ChildrenArray) > 0 {
|
if len(obj.ChildrenArray) > 0 {
|
||||||
obj.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
|
obj.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
|
||||||
} else if obj.HasOutsideBottomLabel() {
|
} else if obj.HasOutsideBottomLabel() {
|
||||||
|
|
@ -252,7 +253,10 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
|
||||||
if obj.Icon != nil && obj.IconPosition == nil {
|
if obj.Icon != nil && obj.IconPosition == nil {
|
||||||
if len(obj.ChildrenArray) > 0 {
|
if len(obj.ChildrenArray) > 0 {
|
||||||
obj.IconPosition = go2.Pointer(string(label.OutsideTopLeft))
|
obj.IconPosition = go2.Pointer(string(label.OutsideTopLeft))
|
||||||
obj.LabelPosition = go2.Pointer(string(label.OutsideTopRight))
|
if !hasLabelPosition {
|
||||||
|
// overwrite LabelPosition if we just set it above
|
||||||
|
obj.LabelPosition = go2.Pointer(string(label.OutsideTopRight))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
|
obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -407,7 +407,8 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
|
||||||
obj.Width = math.Ceil(n.Width)
|
obj.Width = math.Ceil(n.Width)
|
||||||
obj.Height = math.Ceil(n.Height)
|
obj.Height = math.Ceil(n.Height)
|
||||||
|
|
||||||
if obj.HasLabel() && obj.LabelPosition == nil {
|
hasLabelPosition := obj.LabelPosition != nil
|
||||||
|
if obj.HasLabel() && !hasLabelPosition {
|
||||||
if len(obj.ChildrenArray) > 0 {
|
if len(obj.ChildrenArray) > 0 {
|
||||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
|
||||||
} else if obj.HasOutsideBottomLabel() {
|
} else if obj.HasOutsideBottomLabel() {
|
||||||
|
|
@ -422,7 +423,9 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
|
||||||
if obj.Icon != nil && obj.IconPosition == nil {
|
if obj.Icon != nil && obj.IconPosition == nil {
|
||||||
if len(obj.ChildrenArray) > 0 {
|
if len(obj.ChildrenArray) > 0 {
|
||||||
obj.IconPosition = go2.Pointer(string(label.InsideTopLeft))
|
obj.IconPosition = go2.Pointer(string(label.InsideTopLeft))
|
||||||
obj.LabelPosition = go2.Pointer(string(label.InsideTopRight))
|
if !hasLabelPosition {
|
||||||
|
obj.LabelPosition = go2.Pointer(string(label.InsideTopRight))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
|
obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,34 @@ const (
|
||||||
UnlockedBottom Position = "UNLOCKED_BOTTOM"
|
UnlockedBottom Position = "UNLOCKED_BOTTOM"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (position Position) IsShapePosition() bool {
|
||||||
|
switch position {
|
||||||
|
case OutsideTopLeft, OutsideTopCenter, OutsideTopRight,
|
||||||
|
OutsideBottomLeft, OutsideBottomCenter, OutsideBottomRight,
|
||||||
|
OutsideLeftTop, OutsideLeftMiddle, OutsideLeftBottom,
|
||||||
|
OutsideRightTop, OutsideRightMiddle, OutsideRightBottom,
|
||||||
|
|
||||||
|
InsideTopLeft, InsideTopCenter, InsideTopRight,
|
||||||
|
InsideMiddleLeft, InsideMiddleCenter, InsideMiddleRight,
|
||||||
|
InsideBottomLeft, InsideBottomCenter, InsideBottomRight:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (position Position) IsEdgePosition() bool {
|
||||||
|
switch position {
|
||||||
|
case OutsideTopLeft, OutsideTopCenter, OutsideTopRight,
|
||||||
|
InsideMiddleLeft, InsideMiddleCenter, InsideMiddleRight,
|
||||||
|
OutsideBottomLeft, OutsideBottomCenter, OutsideBottomRight,
|
||||||
|
UnlockedTop, UnlockedMiddle, UnlockedBottom:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (position Position) IsOutside() bool {
|
func (position Position) IsOutside() bool {
|
||||||
switch position {
|
switch position {
|
||||||
case OutsideTopLeft, OutsideTopCenter, OutsideTopRight,
|
case OutsideTopLeft, OutsideTopCenter, OutsideTopRight,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue