finish column logic

This commit is contained in:
Gavin Nishizawa 2023-04-04 11:38:33 -07:00
parent bb090becb8
commit a16924752d
No known key found for this signature in database
GPG key ID: AE3B177777CE55CD

View file

@ -135,15 +135,15 @@ func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*grid, error) {
} }
} else { } else {
targetHeight := totalHeight / float64(grid.columns) targetHeight := totalHeight / float64(grid.columns)
columnHeight := 0. colHeight := 0.
columnIndex := 0 colIndex := 0
for i, n := range grid.nodes { for i, n := range grid.nodes {
layout[columnIndex] = append(layout[columnIndex], i) layout[colIndex] = append(layout[colIndex], i)
columnHeight += n.Height + VERTICAL_PAD colHeight += n.Height + VERTICAL_PAD
if columnHeight > targetHeight && i < len(grid.nodes)-1 { if colHeight > targetHeight && i < len(grid.nodes)-1 {
layout = append(layout, []int{}) layout = append(layout, []int{})
columnIndex++ colIndex++
columnHeight = 0 colHeight = 0
} }
} }
} }
@ -260,24 +260,27 @@ func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*grid, error) {
// . └───┴──────────┘ │ │ // . └───┴──────────┘ │ │
// . │ ││ // . │ ││
// . └─────────┴┘ // . └─────────┴┘
colHeights := []float64{}
for _, column := range layout { for _, column := range layout {
columnWidth := 0. colWidth := 0.
for _, nodeIndex := range column { for _, nodeIndex := range column {
n := grid.nodes[nodeIndex] n := grid.nodes[nodeIndex]
n.TopLeft = cursor.Copy() n.TopLeft = cursor.Copy()
cursor.Y += n.Height + VERTICAL_PAD cursor.Y += n.Height + VERTICAL_PAD
columnWidth = math.Max(columnWidth, n.Width) colWidth = math.Max(colWidth, n.Width)
} }
maxY = math.Max(maxY, cursor.Y-VERTICAL_PAD) colHeight := cursor.Y - VERTICAL_PAD
colHeights = append(colHeights, colHeight)
maxY = math.Max(maxY, colHeight)
// set all nodes in column to the same width // set all nodes in column to the same width
for _, nodeIndex := range column { for _, nodeIndex := range column {
n := grid.nodes[nodeIndex] n := grid.nodes[nodeIndex]
n.Width = columnWidth n.Width = colWidth
} }
// new column // new column
cursor.Y = 0 cursor.Y = 0
cursor.X += columnWidth + HORIZONTAL_PAD cursor.X += colWidth + HORIZONTAL_PAD
} }
maxX = cursor.X - HORIZONTAL_PAD maxX = cursor.X - HORIZONTAL_PAD
// then expand shortest nodes to make each column the same height // then expand shortest nodes to make each column the same height
@ -291,7 +294,54 @@ func layoutGrid(g *d2graph.Graph, obj *d2graph.Object) (*grid, error) {
// . │ │ │ │ │ │ // . │ │ │ │ │ │
// . │ │ │ │ │ │ // . │ │ │ │ │ │
// . └──────────────┘ └──────────┘ └─────────────────┘ // . └──────────────┘ └──────────┘ └─────────────────┘
// TODO see rows for i, column := range layout {
colHeight := colHeights[i]
if colHeight == maxY {
continue
}
delta := maxY - colHeight
nodes := []*d2graph.Object{}
var tallest float64
for _, nodeIndex := range column {
n := grid.nodes[nodeIndex]
tallest = math.Max(tallest, n.Height)
nodes = append(nodes, n)
}
sort.Slice(nodes, func(i, j int) bool {
return nodes[i].Height < nodes[j].Height
})
// expand smaller nodes to fill remaining space
for _, n := range nodes {
if n.Height < tallest {
var index int
for i, nodeIndex := range column {
if n == grid.nodes[nodeIndex] {
index = i
break
}
}
grow := math.Min(tallest-n.Height, delta)
n.Height += grow
// shift following nodes
for i := index + 1; i < len(column); i++ {
grid.nodes[column[i]].TopLeft.Y += grow
}
delta -= grow
if delta <= 0 {
break
}
}
}
if delta > 0 {
grow := delta / float64(len(column))
for i := len(column) - 1; i >= 0; i-- {
n := grid.nodes[column[i]]
n.TopLeft.Y += grow * float64(i)
n.Height += grow
delta -= grow
}
}
}
} }
grid.width = maxX grid.width = maxX
grid.height = maxY grid.height = maxY