use more efficient label position type

This commit is contained in:
Gavin Nishizawa 2023-07-17 14:21:36 -07:00
parent 8782f4e906
commit eb755db91c
No known key found for this signature in database
GPG key ID: AE3B177777CE55CD
13 changed files with 222 additions and 95 deletions

View file

@ -1410,12 +1410,12 @@ func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler
if obj.HasLabel() && obj.Attributes.LabelPosition != nil {
scalar := *obj.Attributes.LabelPosition
position := LabelPositionsMapping[scalar.Value]
obj.LabelPosition = go2.Pointer(string(position))
obj.LabelPosition = go2.Pointer(position.String())
}
if obj.Icon != nil && obj.Attributes.IconPosition != nil {
scalar := *obj.Attributes.IconPosition
position := LabelPositionsMapping[scalar.Value]
obj.IconPosition = go2.Pointer(string(position))
obj.IconPosition = go2.Pointer(position.String())
}
var desiredWidth int

View file

@ -290,7 +290,7 @@ func (obj *Object) GetMargin() geo.Spacing {
margin := geo.Spacing{}
if obj.HasLabel() && obj.LabelPosition != nil {
position := label.Position(*obj.LabelPosition)
position := label.FromString(*obj.LabelPosition)
labelWidth := float64(obj.LabelDimensions.Width + label.PADDING)
labelHeight := float64(obj.LabelDimensions.Height + label.PADDING)
@ -335,7 +335,7 @@ func (obj *Object) GetMargin() geo.Spacing {
}
if obj.Icon != nil && obj.IconPosition != nil && obj.Shape.Value != d2target.ShapeImage {
position := label.Position(*obj.IconPosition)
position := label.FromString(*obj.IconPosition)
iconSize := float64(d2target.MAX_ICON_SIZE + label.PADDING)
switch position {
@ -373,7 +373,7 @@ func (obj *Object) GetLabelTopLeft() *geo.Point {
}
s := obj.ToShape()
labelPosition := label.Position(*obj.LabelPosition)
labelPosition := label.FromString(*obj.LabelPosition)
var box *geo.Box
if labelPosition.IsOutside() {
@ -395,7 +395,7 @@ func (obj *Object) GetIconTopLeft() *geo.Point {
}
s := obj.ToShape()
iconPosition := label.Position(*obj.IconPosition)
iconPosition := label.FromString(*obj.IconPosition)
var box *geo.Box
if iconPosition.IsOutside() {
@ -416,7 +416,7 @@ func (edge *Edge) TraceToShape(points []*geo.Point, startIndex, endIndex int) (n
overlapsOutsideLabel := false
if edge.Src.HasLabel() {
// assumes LabelPosition, LabelWidth, LabelHeight are all set if there is a label
labelPosition := label.Position(*edge.Src.LabelPosition)
labelPosition := label.FromString(*edge.Src.LabelPosition)
if labelPosition.IsOutside() {
labelWidth := float64(edge.Src.LabelDimensions.Width)
labelHeight := float64(edge.Src.LabelDimensions.Height)
@ -467,7 +467,7 @@ func (edge *Edge) TraceToShape(points []*geo.Point, startIndex, endIndex int) (n
overlapsOutsideLabel = false
if edge.Dst.HasLabel() {
// assumes LabelPosition, LabelWidth, LabelHeight are all set if there is a label
labelPosition := label.Position(*edge.Dst.LabelPosition)
labelPosition := label.FromString(*edge.Dst.LabelPosition)
if labelPosition.IsOutside() {
labelWidth := float64(edge.Dst.LabelDimensions.Width)
labelHeight := float64(edge.Dst.LabelDimensions.Height)

View file

@ -361,7 +361,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
edge.Route = path
// compile needs to assign edge label positions
if edge.Label.Value != "" {
edge.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
edge.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
// undo 3d/multiple offset
@ -554,7 +554,7 @@ func getSpacing(obj *d2graph.Object) (margin, padding spacing) {
if obj.HasLabel() {
var position label.Position
if obj.LabelPosition != nil {
position = label.Position(*obj.LabelPosition)
position = label.FromString(*obj.LabelPosition)
} else if len(obj.ChildrenArray) == 0 && obj.HasOutsideBottomLabel() {
position = label.OutsideBottomCenter
}
@ -585,7 +585,7 @@ func getSpacing(obj *d2graph.Object) (margin, padding spacing) {
if obj.Icon != nil && obj.Shape.Value != d2target.ShapeImage {
var position label.Position
if obj.IconPosition != nil {
position = label.Position(*obj.IconPosition)
position = label.FromString(*obj.IconPosition)
}
iconSize := float64(d2target.MAX_ICON_SIZE + 2*label.PADDING)
@ -619,24 +619,24 @@ func getSpacing(obj *d2graph.Object) (margin, padding spacing) {
func positionLabelsIcons(obj *d2graph.Object) {
if obj.Icon != nil && obj.IconPosition == nil {
if len(obj.ChildrenArray) > 0 {
obj.IconPosition = go2.Pointer(string(label.OutsideTopLeft))
obj.IconPosition = go2.Pointer(label.OutsideTopLeft.String())
if obj.LabelPosition == nil {
obj.LabelPosition = go2.Pointer(string(label.OutsideTopRight))
obj.LabelPosition = go2.Pointer(label.OutsideTopRight.String())
return
}
} else {
obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
obj.IconPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
if obj.HasLabel() && obj.LabelPosition == nil {
if len(obj.ChildrenArray) > 0 {
obj.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
obj.LabelPosition = go2.Pointer(label.OutsideTopCenter.String())
} else if obj.HasOutsideBottomLabel() {
obj.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
obj.LabelPosition = go2.Pointer(label.OutsideBottomCenter.String())
} else if obj.Icon != nil {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
obj.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
} else {
obj.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
obj.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
}
@ -1408,7 +1408,7 @@ func fitPadding(obj *d2graph.Object) {
var labelPosition, iconPosition label.Position
var labelBox, iconBox *geo.Box
if obj.HasLabel() && obj.LabelPosition != nil {
labelPosition = label.Position(*obj.LabelPosition)
labelPosition = label.FromString(*obj.LabelPosition)
switch labelPosition {
case label.InsideTopLeft, label.InsideTopCenter, label.InsideTopRight,
label.InsideBottomLeft, label.InsideBottomCenter, label.InsideBottomRight,
@ -1420,7 +1420,7 @@ func fitPadding(obj *d2graph.Object) {
}
}
if obj.Icon != nil && shapeType != shape.IMAGE_TYPE && obj.IconPosition != nil {
iconPosition = label.Position(*obj.IconPosition)
iconPosition = label.FromString(*obj.IconPosition)
switch iconPosition {
case label.InsideTopLeft, label.InsideTopCenter, label.InsideTopRight,
label.InsideBottomLeft, label.InsideBottomCenter, label.InsideBottomRight,
@ -1442,7 +1442,7 @@ func fitPadding(obj *d2graph.Object) {
var childLabelBox *geo.Box
var childLabelPosition, childIconPosition label.Position
if child.HasLabel() && child.LabelPosition != nil {
childLabelPosition = label.Position(*child.LabelPosition)
childLabelPosition = label.FromString(*child.LabelPosition)
if childLabelPosition.IsOutside() {
childLabelTL := child.GetLabelTopLeft()
@ -1455,7 +1455,7 @@ func fitPadding(obj *d2graph.Object) {
}
}
if child.Icon != nil && child.Shape.Value != d2target.ShapeImage && child.IconPosition != nil {
childIconPosition = label.Position(*child.IconPosition)
childIconPosition = label.FromString(*child.IconPosition)
if childIconPosition.IsOutside() {
childIconTL := child.GetIconTopLeft()
@ -1480,7 +1480,7 @@ func fitPadding(obj *d2graph.Object) {
if edge.Label.Value != "" {
labelPosition := label.InsideMiddleCenter
if edge.LabelPosition != nil {
labelPosition = label.Position(*edge.LabelPosition)
labelPosition = label.FromString(*edge.LabelPosition)
}
labelWidth := float64(edge.LabelDimensions.Width)
labelHeight := float64(edge.LabelDimensions.Height)

View file

@ -360,7 +360,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
continue
}
switch label.Position(*child.IconPosition) {
switch label.FromString(*child.IconPosition) {
case label.OutsideTopLeft, label.OutsideTopCenter, label.OutsideTopRight:
hasTop = true
case label.OutsideBottomLeft, label.OutsideBottomCenter, label.OutsideBottomRight:
@ -605,7 +605,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
points = points[startIndex : endIndex+1]
if edge.Label.Value != "" {
edge.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
edge.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
edge.Route = points
@ -1003,7 +1003,7 @@ func adjustPadding(obj *d2graph.Object, width, height float64, padding shapePadd
if obj.HasLabel() && obj.LabelPosition != nil {
labelHeight := obj.LabelDimensions.Height + 2*label.PADDING
labelWidth := obj.LabelDimensions.Width + 2*label.PADDING
switch label.Position(*obj.LabelPosition) {
switch label.FromString(*obj.LabelPosition) {
case label.InsideTopLeft, label.InsideTopCenter, label.InsideTopRight:
// Note: for corners we only add height
extraTop = labelHeight
@ -1017,7 +1017,7 @@ func adjustPadding(obj *d2graph.Object, width, height float64, padding shapePadd
}
if obj.Icon != nil && obj.Shape.Value != d2target.ShapeImage && obj.IconPosition != nil {
iconSize := d2target.MAX_ICON_SIZE + 2*label.PADDING
switch label.Position(*obj.IconPosition) {
switch label.FromString(*obj.IconPosition) {
case label.InsideTopLeft, label.InsideTopCenter, label.InsideTopRight:
extraTop = go2.Max(extraTop, iconSize)
case label.InsideBottomLeft, label.InsideBottomCenter, label.InsideBottomRight:
@ -1093,7 +1093,7 @@ func adjustDimensions(obj *d2graph.Object) (width, height float64) {
if obj.HasLabel() {
var position label.Position
if obj.LabelPosition != nil {
position = label.Position(*obj.LabelPosition)
position = label.FromString(*obj.LabelPosition)
} else if len(obj.ChildrenArray) == 0 && obj.HasOutsideBottomLabel() {
position = label.OutsideBottomCenter
}
@ -1118,7 +1118,7 @@ func adjustDimensions(obj *d2graph.Object) (width, height float64) {
if obj.Icon != nil && obj.Shape.Value != d2target.ShapeImage {
var position label.Position
if obj.IconPosition != nil {
position = label.Position(*obj.IconPosition)
position = label.FromString(*obj.IconPosition)
}
if position.IsShapePosition() {
@ -1143,7 +1143,7 @@ func adjustDimensions(obj *d2graph.Object) (width, height float64) {
func cleanupAdjustment(obj *d2graph.Object) {
// adjust size and position to account for space reserved for labels
if obj.HasLabel() {
position := label.Position(*obj.LabelPosition)
position := label.FromString(*obj.LabelPosition)
if position.IsShapePosition() {
var labelWidth float64
switch position {
@ -1162,7 +1162,7 @@ func cleanupAdjustment(obj *d2graph.Object) {
}
}
if obj.Icon != nil && obj.Shape.Value != d2target.ShapeImage {
position := label.Position(*obj.IconPosition)
position := label.FromString(*obj.IconPosition)
if position.IsShapePosition() {
var iconWidth float64
switch position {
@ -1202,24 +1202,24 @@ func cleanupAdjustment(obj *d2graph.Object) {
func positionLabelsIcons(obj *d2graph.Object) {
if obj.Icon != nil && obj.IconPosition == nil {
if len(obj.ChildrenArray) > 0 {
obj.IconPosition = go2.Pointer(string(label.InsideTopLeft))
obj.IconPosition = go2.Pointer(label.InsideTopLeft.String())
if obj.LabelPosition == nil {
obj.LabelPosition = go2.Pointer(string(label.InsideTopRight))
obj.LabelPosition = go2.Pointer(label.InsideTopRight.String())
return
}
} else {
obj.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
obj.IconPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
if obj.HasLabel() && obj.LabelPosition == nil {
if len(obj.ChildrenArray) > 0 {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
obj.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
} else if obj.HasOutsideBottomLabel() {
obj.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
obj.LabelPosition = go2.Pointer(label.OutsideBottomCenter.String())
} else if obj.Icon != nil {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
obj.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
} else {
obj.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
obj.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
}

View file

@ -90,10 +90,10 @@ func Layout(ctx context.Context, g *d2graph.Graph) error {
}
if obj.HasLabel() {
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
obj.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
}
if obj.Icon != nil {
obj.IconPosition = go2.Pointer(string(label.InsideTopLeft))
obj.IconPosition = go2.Pointer(label.InsideTopLeft.String())
}
// simple straight line edge routing between grid objects
@ -111,7 +111,7 @@ func Layout(ctx context.Context, g *d2graph.Graph) error {
e.Route = []*geo.Point{e.Src.Center(), e.Dst.Center()}
e.TraceToShape(e.Route, 0, 1)
if e.Label.Value != "" {
e.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
e.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
@ -119,7 +119,7 @@ func Layout(ctx context.Context, g *d2graph.Graph) error {
g.Root.TopLeft = geo.NewPoint(0, 0)
}
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
obj.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
if g.RootLevel > 0 {
horizontalPadding, verticalPadding := CONTAINER_PADDING, CONTAINER_PADDING
@ -147,25 +147,25 @@ func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*gridDiagram, error) {
positionedLabel := false
if o.Icon != nil && o.IconPosition == nil {
if len(o.ChildrenArray) > 0 {
o.IconPosition = go2.Pointer(string(label.OutsideTopLeft))
o.IconPosition = go2.Pointer(label.OutsideTopLeft.String())
// don't overwrite position if nested graph layout positioned label/icon
if o.LabelPosition == nil {
o.LabelPosition = go2.Pointer(string(label.OutsideTopRight))
o.LabelPosition = go2.Pointer(label.OutsideTopRight.String())
positionedLabel = true
}
} else {
o.IconPosition = go2.Pointer(string(label.InsideMiddleCenter))
o.IconPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
if !positionedLabel && o.HasLabel() && o.LabelPosition == nil {
if len(o.ChildrenArray) > 0 {
o.LabelPosition = go2.Pointer(string(label.OutsideTopCenter))
o.LabelPosition = go2.Pointer(label.OutsideTopCenter.String())
} else if o.HasOutsideBottomLabel() {
o.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
o.LabelPosition = go2.Pointer(label.OutsideBottomCenter.String())
} else if o.Icon != nil {
o.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
o.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
} else {
o.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
o.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
}

View file

@ -275,7 +275,7 @@ func LayoutNested(ctx context.Context, g *d2graph.Graph, graphInfo GraphInfo, co
e.Route = []*geo.Point{e.Src.Center(), e.Dst.Center()}
e.TraceToShape(e.Route, 0, 1)
if e.Label.Value != "" {
e.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
e.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}

View file

@ -178,7 +178,7 @@ func boundingBox(g *d2graph.Graph) (tl, br *geo.Point) {
x2 = math.Max(x2, obj.TopLeft.X+obj.Width)
y2 = math.Max(y2, obj.TopLeft.Y+obj.Height)
if obj.Label.Value != "" && obj.LabelPosition != nil {
labelPosition := label.Position(*obj.LabelPosition)
labelPosition := label.FromString(*obj.LabelPosition)
if labelPosition.IsOutside() {
labelTL := labelPosition.GetPointOnBox(obj.Box, label.PADDING, float64(obj.LabelDimensions.Width), float64(obj.LabelDimensions.Height))
x1 = math.Min(x1, labelTL.X)

View file

@ -32,7 +32,7 @@ func Layout(ctx context.Context, g *d2graph.Graph, layout d2graph.LayoutGraph) e
obj := g.Root
obj.LabelPosition = go2.Pointer(string(label.InsideTopCenter))
obj.LabelPosition = go2.Pointer(label.InsideTopCenter.String())
// shift the sequence diagrams as they are always placed at (0, 0) with some padding
sd.shift(

View file

@ -141,12 +141,12 @@ n2 -> n1
}
// check label positions
if *g.Edges[0].LabelPosition != string(label.InsideMiddleCenter) {
t.Fatalf("expected edge label to be placed on %s, got %s", string(label.InsideMiddleCenter), *g.Edges[0].LabelPosition)
if *g.Edges[0].LabelPosition != label.InsideMiddleCenter.String() {
t.Fatalf("expected edge label to be placed on %s, got %s", label.InsideMiddleCenter, *g.Edges[0].LabelPosition)
}
if *g.Edges[1].LabelPosition != string(label.InsideMiddleCenter) {
t.Fatalf("expected edge label to be placed on %s, got %s", string(label.InsideMiddleCenter), *g.Edges[0].LabelPosition)
if *g.Edges[1].LabelPosition != label.InsideMiddleCenter.String() {
t.Fatalf("expected edge label to be placed on %s, got %s", label.InsideMiddleCenter, *g.Edges[0].LabelPosition)
}
}

View file

@ -76,7 +76,7 @@ func newSequenceDiagram(objects []*d2graph.Object, messages []*d2graph.Edge) (*s
// Groups may have more nested groups
for len(queue) > 0 {
curr := queue[0]
curr.LabelPosition = go2.Pointer(string(label.InsideTopLeft))
curr.LabelPosition = go2.Pointer(label.InsideTopLeft.String())
groups = append(groups, curr)
queue = queue[1:]
queue = append(queue, curr.ChildrenArray...)
@ -135,7 +135,7 @@ func newSequenceDiagram(objects []*d2graph.Object, messages []*d2graph.Edge) (*s
child.Shape = d2graph.Scalar{Value: shape.PAGE_TYPE}
sd.notes = append(sd.notes, child)
sd.objectRank[child] = rank
child.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
child.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
maxNoteWidth = math.Max(maxNoteWidth, child.Width)
} else {
// spans have no labels
@ -338,13 +338,13 @@ func (sd *sequenceDiagram) placeActors() {
for rank, actor := range sd.actors {
var yOffset float64
if actor.HasOutsideBottomLabel() {
actor.LabelPosition = go2.Pointer(string(label.OutsideBottomCenter))
actor.LabelPosition = go2.Pointer(label.OutsideBottomCenter.String())
yOffset = sd.maxActorHeight - actor.Height
if actor.HasLabel() {
yOffset -= float64(actor.LabelDimensions.Height)
}
} else {
actor.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
actor.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
yOffset = sd.maxActorHeight - actor.Height
}
halfWidth := actor.Width / 2.
@ -382,7 +382,7 @@ func (sd *sequenceDiagram) addLifelineEdges() {
for _, actor := range sd.actors {
actorBottom := actor.Center()
actorBottom.Y = actor.TopLeft.Y + actor.Height
if *actor.LabelPosition == string(label.OutsideBottomCenter) && actor.HasLabel() {
if *actor.LabelPosition == label.OutsideBottomCenter.String() && actor.HasLabel() {
actorBottom.Y += float64(actor.LabelDimensions.Height) + LIFELINE_LABEL_PAD
}
actorLifelineEnd := actor.Center()
@ -602,7 +602,7 @@ func (sd *sequenceDiagram) routeMessages() error {
messageOffset += sd.yStep
if message.Label.Value != "" {
message.LabelPosition = go2.Pointer(string(label.InsideMiddleCenter))
message.LabelPosition = go2.Pointer(label.InsideMiddleCenter.String())
}
}
return nil

View file

@ -514,7 +514,7 @@ func drawConnection(writer io.Writer, labelMaskID string, connection d2target.Co
labelTL.X = math.Round(labelTL.X)
labelTL.Y = math.Round(labelTL.Y)
if label.Position(connection.LabelPosition).IsOnEdge() {
if label.FromString(connection.LabelPosition).IsOnEdge() {
labelMask = makeLabelMask(labelTL, connection.LabelWidth, connection.LabelHeight, 1)
} else {
labelMask = makeLabelMask(labelTL, connection.LabelWidth, connection.LabelHeight, 0.75)
@ -1178,7 +1178,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
fmt.Fprint(writer, `</g>`)
if targetShape.Icon != nil && targetShape.Type != d2target.ShapeImage {
iconPosition := label.Position(targetShape.IconPosition)
iconPosition := label.FromString(targetShape.IconPosition)
var box *geo.Box
if iconPosition.IsOutside() {
box = s.GetBox()
@ -1199,7 +1199,7 @@ func drawShape(writer, appendixWriter io.Writer, diagramHash string, targetShape
}
if targetShape.Label != "" {
labelPosition := label.Position(targetShape.LabelPosition)
labelPosition := label.FromString(targetShape.LabelPosition)
var box *geo.Box
if labelPosition.IsOutside() {
box = s.GetBox().Copy()

View file

@ -291,7 +291,7 @@ func (diagram Diagram) BoundingBox() (topLeft, bottomRight Point) {
x2 = go2.Max(x2, targetShape.Pos.X+MULTIPLE_OFFSET+targetShape.Width+targetShape.StrokeWidth)
}
if targetShape.Icon != nil && label.Position(targetShape.IconPosition).IsOutside() {
if targetShape.Icon != nil && label.FromString(targetShape.IconPosition).IsOutside() {
contentBox := geo.NewBox(geo.NewPoint(0, 0), float64(targetShape.Width), float64(targetShape.Height))
s := shape.NewShape(targetShape.Type, contentBox)
size := GetIconSize(s.GetInnerBox(), targetShape.IconPosition)
@ -308,7 +308,7 @@ func (diagram Diagram) BoundingBox() (topLeft, bottomRight Point) {
}
if targetShape.Label != "" {
labelPosition := label.Position(targetShape.LabelPosition)
labelPosition := label.FromString(targetShape.LabelPosition)
if !labelPosition.IsOutside() {
continue
}
@ -637,7 +637,7 @@ func (c Connection) CSSStyle() string {
}
func (c *Connection) GetLabelTopLeft() *geo.Point {
point, _ := label.Position(c.LabelPosition).GetPointOnRoute(
point, _ := label.FromString(c.LabelPosition).GetPointOnRoute(
c.Route,
float64(c.StrokeWidth),
c.LabelPercentage,
@ -968,7 +968,7 @@ func init() {
}
func GetIconSize(box *geo.Box, position string) int {
iconPosition := label.Position(position)
iconPosition := label.FromString(position)
minDimension := int(math.Min(box.Width, box.Height))
halfMinDimension := int(math.Ceil(0.5 * float64(minDimension)))

View file

@ -14,42 +14,169 @@ const RIGHT_LABEL_POSITION = 3.0 / 4.0
// This is the space between a node border and its outside label
const PADDING = 5
type Position string
type Position int8
const (
OutsideTopLeft Position = "OUTSIDE_TOP_LEFT"
OutsideTopCenter Position = "OUTSIDE_TOP_CENTER"
OutsideTopRight Position = "OUTSIDE_TOP_RIGHT"
Unset Position = iota
OutsideLeftTop Position = "OUTSIDE_LEFT_TOP"
OutsideLeftMiddle Position = "OUTSIDE_LEFT_MIDDLE"
OutsideLeftBottom Position = "OUTSIDE_LEFT_BOTTOM"
OutsideTopLeft
OutsideTopCenter
OutsideTopRight
OutsideRightTop Position = "OUTSIDE_RIGHT_TOP"
OutsideRightMiddle Position = "OUTSIDE_RIGHT_MIDDLE"
OutsideRightBottom Position = "OUTSIDE_RIGHT_BOTTOM"
OutsideLeftTop
OutsideLeftMiddle
OutsideLeftBottom
OutsideBottomLeft Position = "OUTSIDE_BOTTOM_LEFT"
OutsideBottomCenter Position = "OUTSIDE_BOTTOM_CENTER"
OutsideBottomRight Position = "OUTSIDE_BOTTOM_RIGHT"
OutsideRightTop
OutsideRightMiddle
OutsideRightBottom
InsideTopLeft Position = "INSIDE_TOP_LEFT"
InsideTopCenter Position = "INSIDE_TOP_CENTER"
InsideTopRight Position = "INSIDE_TOP_RIGHT"
OutsideBottomLeft
OutsideBottomCenter
OutsideBottomRight
InsideMiddleLeft Position = "INSIDE_MIDDLE_LEFT"
InsideMiddleCenter Position = "INSIDE_MIDDLE_CENTER"
InsideMiddleRight Position = "INSIDE_MIDDLE_RIGHT"
InsideTopLeft
InsideTopCenter
InsideTopRight
InsideBottomLeft Position = "INSIDE_BOTTOM_LEFT"
InsideBottomCenter Position = "INSIDE_BOTTOM_CENTER"
InsideBottomRight Position = "INSIDE_BOTTOM_RIGHT"
InsideMiddleLeft
InsideMiddleCenter
InsideMiddleRight
UnlockedTop Position = "UNLOCKED_TOP"
UnlockedMiddle Position = "UNLOCKED_MIDDLE"
UnlockedBottom Position = "UNLOCKED_BOTTOM"
InsideBottomLeft
InsideBottomCenter
InsideBottomRight
UnlockedTop
UnlockedMiddle
UnlockedBottom
)
func FromString(s string) Position {
switch s {
case "OUTSIDE_TOP_LEFT":
return OutsideTopLeft
case "OUTSIDE_TOP_CENTER":
return OutsideTopCenter
case "OUTSIDE_TOP_RIGHT":
return OutsideTopRight
case "OUTSIDE_LEFT_TOP":
return OutsideLeftTop
case "OUTSIDE_LEFT_MIDDLE":
return OutsideLeftMiddle
case "OUTSIDE_LEFT_BOTTOM":
return OutsideLeftBottom
case "OUTSIDE_RIGHT_TOP":
return OutsideRightTop
case "OUTSIDE_RIGHT_MIDDLE":
return OutsideRightMiddle
case "OUTSIDE_RIGHT_BOTTOM":
return OutsideRightBottom
case "OUTSIDE_BOTTOM_LEFT":
return OutsideBottomLeft
case "OUTSIDE_BOTTOM_CENTER":
return OutsideBottomCenter
case "OUTSIDE_BOTTOM_RIGHT":
return OutsideBottomRight
case "INSIDE_TOP_LEFT":
return InsideTopLeft
case "INSIDE_TOP_CENTER":
return InsideTopCenter
case "INSIDE_TOP_RIGHT":
return InsideTopRight
case "INSIDE_MIDDLE_LEFT":
return InsideMiddleLeft
case "INSIDE_MIDDLE_CENTER":
return InsideMiddleCenter
case "INSIDE_MIDDLE_RIGHT":
return InsideMiddleRight
case "INSIDE_BOTTOM_LEFT":
return InsideBottomLeft
case "INSIDE_BOTTOM_CENTER":
return InsideBottomCenter
case "INSIDE_BOTTOM_RIGHT":
return InsideBottomRight
case "UNLOCKED_TOP":
return UnlockedTop
case "UNLOCKED_MIDDLE":
return UnlockedMiddle
case "UNLOCKED_BOTTOM":
return UnlockedBottom
default:
return Unset
}
}
func (position Position) String() string {
switch position {
case OutsideTopLeft:
return "OUTSIDE_TOP_LEFT"
case OutsideTopCenter:
return "OUTSIDE_TOP_CENTER"
case OutsideTopRight:
return "OUTSIDE_TOP_RIGHT"
case OutsideLeftTop:
return "OUTSIDE_LEFT_TOP"
case OutsideLeftMiddle:
return "OUTSIDE_LEFT_MIDDLE"
case OutsideLeftBottom:
return "OUTSIDE_LEFT_BOTTOM"
case OutsideRightTop:
return "OUTSIDE_RIGHT_TOP"
case OutsideRightMiddle:
return "OUTSIDE_RIGHT_MIDDLE"
case OutsideRightBottom:
return "OUTSIDE_RIGHT_BOTTOM"
case OutsideBottomLeft:
return "OUTSIDE_BOTTOM_LEFT"
case OutsideBottomCenter:
return "OUTSIDE_BOTTOM_CENTER"
case OutsideBottomRight:
return "OUTSIDE_BOTTOM_RIGHT"
case InsideTopLeft:
return "INSIDE_TOP_LEFT"
case InsideTopCenter:
return "INSIDE_TOP_CENTER"
case InsideTopRight:
return "INSIDE_TOP_RIGHT"
case InsideMiddleLeft:
return "INSIDE_MIDDLE_LEFT"
case InsideMiddleCenter:
return "INSIDE_MIDDLE_CENTER"
case InsideMiddleRight:
return "INSIDE_MIDDLE_RIGHT"
case InsideBottomLeft:
return "INSIDE_BOTTOM_LEFT"
case InsideBottomCenter:
return "INSIDE_BOTTOM_CENTER"
case InsideBottomRight:
return "INSIDE_BOTTOM_RIGHT"
case UnlockedTop:
return "UNLOCKED_TOP"
case UnlockedMiddle:
return "UNLOCKED_MIDDLE"
case UnlockedBottom:
return "UNLOCKED_BOTTOM"
default:
return ""
}
}
func (position Position) IsShapePosition() bool {
switch position {
case OutsideTopLeft, OutsideTopCenter, OutsideTopRight,
@ -167,7 +294,7 @@ func (position Position) Mirrored() Position {
return UnlockedMiddle
default:
return ""
return Unset
}
}