shift descendants
This commit is contained in:
parent
d6b8149073
commit
3ce0b1439e
2 changed files with 64 additions and 23 deletions
|
|
@ -1917,3 +1917,49 @@ func (obj *Object) IterDescendants(apply func(parent, child *Object)) {
|
||||||
c.IterDescendants(apply)
|
c.IterDescendants(apply)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (obj *Object) ShiftDescendants(dx, dy float64) {
|
||||||
|
// also need to shift edges of descendants that are shifted
|
||||||
|
movedEdges := make(map[*Edge]struct{})
|
||||||
|
for _, e := range obj.Graph.Edges {
|
||||||
|
isSrcDesc := e.Src.IsDescendantOf(obj)
|
||||||
|
isDstDesc := e.Dst.IsDescendantOf(obj)
|
||||||
|
|
||||||
|
if isSrcDesc && isDstDesc {
|
||||||
|
movedEdges[e] = struct{}{}
|
||||||
|
for _, p := range e.Route {
|
||||||
|
p.X += dx
|
||||||
|
p.Y += dy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.IterDescendants(func(_, curr *Object) {
|
||||||
|
curr.TopLeft.X += dx
|
||||||
|
curr.TopLeft.Y += dy
|
||||||
|
for _, e := range obj.Graph.Edges {
|
||||||
|
if _, ok := movedEdges[e]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
isSrc := e.Src == curr
|
||||||
|
isDst := e.Dst == curr
|
||||||
|
|
||||||
|
if isSrc && isDst {
|
||||||
|
for _, p := range e.Route {
|
||||||
|
p.X += dx
|
||||||
|
p.Y += dy
|
||||||
|
}
|
||||||
|
} else if isSrc {
|
||||||
|
e.Route[0].X += dx
|
||||||
|
e.Route[0].Y += dy
|
||||||
|
} else if isDst {
|
||||||
|
e.Route[len(e.Route)-1].X += dx
|
||||||
|
e.Route[len(e.Route)-1].Y += dy
|
||||||
|
}
|
||||||
|
|
||||||
|
if isSrc || isDst {
|
||||||
|
movedEdges[e] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -265,29 +265,6 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// separate loop so all descendants are placed
|
|
||||||
for _, obj := range g.Objects {
|
|
||||||
if obj.Style.ThreeDee != nil && obj.Style.ThreeDee.Value == "true" {
|
|
||||||
// obj.TopLeft.Y += d2target.THREE_DEE_OFFSET
|
|
||||||
obj.IterDescendants(func(_, child *d2graph.Object) {
|
|
||||||
child.TopLeft.Y += d2target.THREE_DEE_OFFSET
|
|
||||||
})
|
|
||||||
if !obj.IsContainer() {
|
|
||||||
obj.Height -= d2target.THREE_DEE_OFFSET
|
|
||||||
obj.Width -= d2target.THREE_DEE_OFFSET
|
|
||||||
}
|
|
||||||
} else if obj.Style.Multiple != nil && obj.Style.Multiple.Value == "true" {
|
|
||||||
// obj.TopLeft.Y += d2target.MULTIPLE_OFFSET
|
|
||||||
obj.IterDescendants(func(_, child *d2graph.Object) {
|
|
||||||
child.TopLeft.Y += d2target.MULTIPLE_OFFSET
|
|
||||||
})
|
|
||||||
if !obj.IsContainer() {
|
|
||||||
obj.Height -= d2target.MULTIPLE_OFFSET
|
|
||||||
obj.Width -= d2target.MULTIPLE_OFFSET
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, edge := range g.Edges {
|
for i, edge := range g.Edges {
|
||||||
val, err := vm.RunString(fmt.Sprintf("JSON.stringify(g.edge(g.edges()[%d]))", i))
|
val, err := vm.RunString(fmt.Sprintf("JSON.stringify(g.edge(g.edges()[%d]))", i))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -549,6 +526,24 @@ func Layout(ctx context.Context, g *d2graph.Graph, opts *ConfigurableOpts) (err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// separate loop so all descendants have initial placements
|
||||||
|
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
|
||||||
|
}
|
||||||
|
if offset != 0 {
|
||||||
|
obj.TopLeft.Y += offset
|
||||||
|
obj.ShiftDescendants(0, offset)
|
||||||
|
if !obj.IsContainer() {
|
||||||
|
obj.Height -= offset
|
||||||
|
obj.Width -= offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue