Update code for layouts, objects
This commit is contained in:
@@ -13,33 +13,33 @@ type Row []bool
|
||||
// value will expand, and others will contract.
|
||||
type Column []bool
|
||||
|
||||
func (column Column) MinimumSize (hints tomo.LayoutHints, boxes []tomo.Box) image.Point {
|
||||
func (column Column) MinimumSize (hints tomo.LayoutHints, boxes tomo.BoxQuerier) image.Point {
|
||||
dot := image.Point { }
|
||||
for _, box := range boxes {
|
||||
minimum := box.MinimumSize()
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
minimum := boxes.MinimumSize(index)
|
||||
dot.Y += minimum.Y
|
||||
if dot.X < minimum.X {
|
||||
dot.X = minimum.X
|
||||
}
|
||||
}
|
||||
dot.Y += hints.Gap.Y * (len(boxes) - 1)
|
||||
dot.Y += hints.Gap.Y * (boxes.Len() - 1)
|
||||
return dot
|
||||
}
|
||||
|
||||
func (row Row) MinimumSize (hints tomo.LayoutHints, boxes []tomo.Box) image.Point {
|
||||
func (row Row) MinimumSize (hints tomo.LayoutHints, boxes tomo.BoxQuerier) image.Point {
|
||||
dot := image.Point { }
|
||||
for _, box := range boxes {
|
||||
minimum := box.MinimumSize()
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
minimum := boxes.MinimumSize(index)
|
||||
dot.X += minimum.X
|
||||
if dot.Y < minimum.Y {
|
||||
dot.Y = minimum.Y
|
||||
}
|
||||
}
|
||||
dot.X += hints.Gap.X * (len(boxes) - 1)
|
||||
dot.X += hints.Gap.X * (boxes.Len() - 1)
|
||||
return dot
|
||||
}
|
||||
|
||||
func (column Column) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
func (column Column) Arrange (hints tomo.LayoutHints, boxes tomo.BoxArranger) {
|
||||
expands := func (index int) bool {
|
||||
if index >= len(column) { return false }
|
||||
return column[index]
|
||||
@@ -48,13 +48,14 @@ func (column Column) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
// determine expanding box size
|
||||
expandingSize := 0.0
|
||||
if !hints.OverflowY {
|
||||
gaps := len(boxes) - 1
|
||||
gaps := boxes.Len() - 1
|
||||
freeSpace := float64(hints.Bounds.Dy() - hints.Gap.Y * gaps)
|
||||
nExpanding := 0; for index, box := range boxes {
|
||||
nExpanding := 0;
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
if expands(index) {
|
||||
nExpanding ++
|
||||
} else {
|
||||
freeSpace -= float64(box.MinimumSize().Y)
|
||||
freeSpace -= float64(boxes.MinimumSize(index).Y)
|
||||
}
|
||||
}
|
||||
expandingSize = freeSpace / float64(nExpanding)
|
||||
@@ -63,8 +64,8 @@ func (column Column) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
// determine width
|
||||
width := 0
|
||||
if hints.OverflowX {
|
||||
for _, box := range boxes {
|
||||
minimum := box.MinimumSize()
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
minimum := boxes.MinimumSize(index)
|
||||
if width < minimum.X { width = minimum.X }
|
||||
}
|
||||
} else {
|
||||
@@ -73,44 +74,43 @@ func (column Column) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
|
||||
// arrange
|
||||
dot := hints.Bounds.Min
|
||||
for index, box := range boxes {
|
||||
bounds := make([]image.Rectangle, boxes.Len())
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
if index > 0 { dot.Y += hints.Gap.Y }
|
||||
|
||||
// determine height
|
||||
height := box.MinimumSize().Y
|
||||
height := boxes.MinimumSize(index).Y
|
||||
if hints.OverflowY {
|
||||
if box, ok := box.(tomo.ContentBox); ok {
|
||||
height = box.RecommendedHeight(width)
|
||||
}
|
||||
height = boxes.RecommendedHeight(index, width)
|
||||
} else {
|
||||
if expands(index) {
|
||||
height = int(expandingSize)
|
||||
}
|
||||
}
|
||||
|
||||
// set bounds
|
||||
box.SetBounds(image.Rectangle {
|
||||
// store bounds of this box
|
||||
bounds[index] = image.Rectangle {
|
||||
Min: dot,
|
||||
Max: dot.Add(image.Pt(width, height)),
|
||||
})
|
||||
}
|
||||
dot.Y += height
|
||||
}
|
||||
|
||||
|
||||
// align
|
||||
height := dot.Y - hints.Bounds.Min.Y
|
||||
offset := 0
|
||||
|
||||
switch hints.AlignY {
|
||||
case tomo.AlignMiddle:
|
||||
offset = (hints.Bounds.Dy() - height) / 2
|
||||
case tomo.AlignEnd:
|
||||
offset = hints.Bounds.Dy() - height
|
||||
}
|
||||
for _, box := range boxes {
|
||||
box.SetBounds(box.Bounds().Add(image.Pt(0, offset)))
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
boxes.SetBounds(index, bounds[index].Add(image.Pt(0, offset)))
|
||||
}
|
||||
}
|
||||
|
||||
func (row Row) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
func (row Row) Arrange (hints tomo.LayoutHints, boxes tomo.BoxArranger) {
|
||||
expands := func (index int) bool {
|
||||
if index >= len(row) { return false }
|
||||
return row[index]
|
||||
@@ -119,13 +119,14 @@ func (row Row) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
// determine expanding box size
|
||||
expandingSize := 0.0
|
||||
if !hints.OverflowY {
|
||||
gaps := len(boxes) - 1
|
||||
gaps := boxes.Len() - 1
|
||||
freeSpace := float64(hints.Bounds.Dx() - hints.Gap.X * gaps)
|
||||
nExpanding := 0; for index, box := range boxes {
|
||||
nExpanding := 0;
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
if expands(index) {
|
||||
nExpanding ++
|
||||
} else {
|
||||
freeSpace -= float64(box.MinimumSize().X)
|
||||
freeSpace -= float64(boxes.MinimumSize(index).X)
|
||||
}
|
||||
}
|
||||
expandingSize = freeSpace / float64(nExpanding)
|
||||
@@ -134,8 +135,8 @@ func (row Row) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
// determine height
|
||||
height := 0
|
||||
if hints.OverflowY {
|
||||
for _, box := range boxes {
|
||||
minimum := box.MinimumSize()
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
minimum := boxes.MinimumSize(index)
|
||||
if height < minimum.Y { height = minimum.Y }
|
||||
}
|
||||
} else {
|
||||
@@ -144,95 +145,76 @@ func (row Row) Arrange (hints tomo.LayoutHints, boxes []tomo.Box) {
|
||||
|
||||
// arrange
|
||||
dot := hints.Bounds.Min
|
||||
for index, box := range boxes {
|
||||
bounds := make([]image.Rectangle, boxes.Len())
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
if index > 0 { dot.X += hints.Gap.X }
|
||||
|
||||
// determine width
|
||||
width := box.MinimumSize().X
|
||||
width := boxes.MinimumSize(index).X
|
||||
if hints.OverflowY {
|
||||
if box, ok := box.(tomo.ContentBox); ok {
|
||||
width = box.RecommendedHeight(height)
|
||||
}
|
||||
width = boxes.RecommendedHeight(index, height)
|
||||
} else {
|
||||
if expands(index) {
|
||||
width = int(expandingSize)
|
||||
}
|
||||
}
|
||||
|
||||
// set bounds
|
||||
box.SetBounds(image.Rectangle {
|
||||
// store bounds
|
||||
bounds[index] = image.Rectangle {
|
||||
Min: dot,
|
||||
Max: dot.Add(image.Pt(width, height)),
|
||||
})
|
||||
}
|
||||
dot.X += width
|
||||
}
|
||||
|
||||
// align
|
||||
width := dot.X - hints.Bounds.Min.X
|
||||
offset := 0
|
||||
|
||||
switch hints.AlignX {
|
||||
case tomo.AlignMiddle:
|
||||
offset = (hints.Bounds.Dx() - width) / 2
|
||||
case tomo.AlignEnd:
|
||||
offset = hints.Bounds.Dx() - width
|
||||
}
|
||||
for _, box := range boxes {
|
||||
box.SetBounds(box.Bounds().Add(image.Pt(offset, 0)))
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
boxes.SetBounds(index, bounds[index].Add(image.Pt(offset, 0)))
|
||||
}
|
||||
}
|
||||
|
||||
func (column Column) RecommendedHeight (hints tomo.LayoutHints, boxes []tomo.Box, width int) int {
|
||||
func (column Column) RecommendedHeight (hints tomo.LayoutHints, boxes tomo.BoxQuerier, width int) int {
|
||||
height := 0
|
||||
for _, box := range boxes {
|
||||
if box, ok := box.(tomo.ContentBox); ok {
|
||||
height += box.RecommendedHeight(width)
|
||||
} else {
|
||||
height += box.MinimumSize().Y
|
||||
}
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
height += boxes.RecommendedHeight(index, width)
|
||||
}
|
||||
height += hints.Gap.Y * (len(boxes) - 1)
|
||||
height += hints.Gap.Y * (boxes.Len() - 1)
|
||||
return height
|
||||
}
|
||||
|
||||
func (row Row) RecommendedHeight (hints tomo.LayoutHints, boxes []tomo.Box, width int) int {
|
||||
func (row Row) RecommendedHeight (hints tomo.LayoutHints, boxes tomo.BoxQuerier, width int) int {
|
||||
height := 0
|
||||
for _, box := range boxes {
|
||||
minimum := box.MinimumSize()
|
||||
boxHeight := 0
|
||||
if box, ok := box.(tomo.ContentBox); ok {
|
||||
boxHeight = box.RecommendedHeight(minimum.X)
|
||||
} else {
|
||||
boxHeight = minimum.Y
|
||||
}
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
minimum := boxes.MinimumSize(index)
|
||||
boxHeight := boxes.RecommendedHeight(index, minimum.X)
|
||||
if boxHeight > height { height = boxHeight }
|
||||
}
|
||||
return height
|
||||
}
|
||||
|
||||
func (column Column) RecommendedWidth (hints tomo.LayoutHints, boxes []tomo.Box, height int) int {
|
||||
func (column Column) RecommendedWidth (hints tomo.LayoutHints, boxes tomo.BoxQuerier, height int) int {
|
||||
width := 0
|
||||
for _, box := range boxes {
|
||||
minimum := box.MinimumSize()
|
||||
boxWidth := 0
|
||||
if box, ok := box.(tomo.ContentBox); ok {
|
||||
boxWidth = box.RecommendedHeight(minimum.Y)
|
||||
} else {
|
||||
boxWidth = minimum.X
|
||||
}
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
minimum := boxes.MinimumSize(index)
|
||||
boxWidth := boxes.RecommendedWidth(index, minimum.Y)
|
||||
if boxWidth > width { width = boxWidth }
|
||||
}
|
||||
return width
|
||||
}
|
||||
|
||||
func (row Row) RecommendedWidth (hints tomo.LayoutHints, boxes []tomo.Box, height int) int {
|
||||
func (row Row) RecommendedWidth (hints tomo.LayoutHints, boxes tomo.BoxQuerier, height int) int {
|
||||
width := 0
|
||||
for _, box := range boxes {
|
||||
if box, ok := box.(tomo.ContentBox); ok {
|
||||
width += box.RecommendedWidth(height)
|
||||
} else {
|
||||
width += box.MinimumSize().X
|
||||
}
|
||||
for index := 0; index < boxes.Len(); index ++ {
|
||||
width += boxes.RecommendedWidth(index, height)
|
||||
}
|
||||
width += hints.Gap.X * (len(boxes) - 1)
|
||||
width += hints.Gap.X * (boxes.Len() - 1)
|
||||
return width
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user