make-containers-better #10
@ -246,10 +246,9 @@ func (element *Container) SetConfig (new config.Config) {
|
||||
func (element *Container) FlexibleHeightFor (width int) (height int) {
|
||||
margin := element.theme.Margin(theme.PatternBackground)
|
||||
padding := element.theme.Padding(theme.PatternBackground)
|
||||
// TODO: have layouts take in entire margins/padding
|
||||
return element.layout.FlexibleHeightFor (
|
||||
element.children,
|
||||
margin.X, padding.Horizontal(), width)
|
||||
margin, padding, width)
|
||||
}
|
||||
|
||||
func (element *Container) OnFlexibleHeightChange (callback func ()) {
|
||||
@ -323,13 +322,12 @@ func (element *Container) unfocusAllChildren() {
|
||||
func (element *Container) updateMinimumSize () {
|
||||
margin := element.theme.Margin(theme.PatternBackground)
|
||||
padding := element.theme.Padding(theme.PatternBackground)
|
||||
// TODO: have layouts take in entire margins/padding
|
||||
width, height := element.layout.MinimumSize (
|
||||
element.children, margin.X, padding.Horizontal())
|
||||
element.children, margin, padding)
|
||||
if element.flexible {
|
||||
height = element.layout.FlexibleHeightFor (
|
||||
element.children, margin.X,
|
||||
padding.Horizontal(), width)
|
||||
element.children, margin,
|
||||
padding, width)
|
||||
}
|
||||
element.core.SetMinimumSize(width, height)
|
||||
}
|
||||
@ -337,8 +335,7 @@ func (element *Container) updateMinimumSize () {
|
||||
func (element *Container) doLayout () {
|
||||
margin := element.theme.Margin(theme.PatternBackground)
|
||||
padding := element.theme.Padding(theme.PatternBackground)
|
||||
// TODO: have layouts take in entire margins/padding
|
||||
element.layout.Arrange (
|
||||
element.children, margin.X,
|
||||
padding.Horizontal(), element.Bounds())
|
||||
element.children, margin,
|
||||
padding, element.Bounds())
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package basicLayouts
|
||||
|
||||
import "image"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/layouts"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
|
||||
|
||||
@ -21,11 +22,11 @@ type Dialog struct {
|
||||
// Arrange arranges a list of entries into a dialog.
|
||||
func (layout Dialog) Arrange (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
bounds image.Rectangle,
|
||||
) {
|
||||
if layout.Pad { bounds = bounds.Inset(padding) }
|
||||
if layout.Pad { bounds = padding.Apply(bounds) }
|
||||
|
||||
controlRowWidth, controlRowHeight := 0, 0
|
||||
if len(entries) > 1 {
|
||||
@ -39,7 +40,7 @@ func (layout Dialog) Arrange (
|
||||
main.Bounds.Min = bounds.Min
|
||||
mainHeight := bounds.Dy() - controlRowHeight
|
||||
if layout.Gap {
|
||||
mainHeight -= margin
|
||||
mainHeight -= margin.Y
|
||||
}
|
||||
main.Bounds.Max = main.Bounds.Min.Add(image.Pt(bounds.Dx(), mainHeight))
|
||||
entries[0] = main
|
||||
@ -59,7 +60,7 @@ func (layout Dialog) Arrange (
|
||||
freeSpace -= entryMinWidth
|
||||
}
|
||||
if index > 0 && layout.Gap {
|
||||
freeSpace -= margin
|
||||
freeSpace -= margin.X
|
||||
}
|
||||
}
|
||||
expandingElementWidth := 0
|
||||
@ -75,7 +76,7 @@ func (layout Dialog) Arrange (
|
||||
|
||||
// set the size and position of each element in the control row
|
||||
for index, entry := range entries[1:] {
|
||||
if index > 0 && layout.Gap { dot.X += margin }
|
||||
if index > 0 && layout.Gap { dot.X += margin.X }
|
||||
|
||||
entry.Bounds.Min = dot
|
||||
entryWidth := 0
|
||||
@ -102,8 +103,8 @@ func (layout Dialog) Arrange (
|
||||
// arrange the given list of entries.
|
||||
func (layout Dialog) MinimumSize (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
) (
|
||||
width, height int,
|
||||
) {
|
||||
@ -114,7 +115,7 @@ func (layout Dialog) MinimumSize (
|
||||
}
|
||||
|
||||
if len(entries) > 1 {
|
||||
if layout.Gap { height += margin }
|
||||
if layout.Gap { height += margin.X }
|
||||
additionalWidth,
|
||||
additionalHeight := layout.minimumSizeOfControlRow (
|
||||
entries[1:], margin, padding)
|
||||
@ -125,8 +126,8 @@ func (layout Dialog) MinimumSize (
|
||||
}
|
||||
|
||||
if layout.Pad {
|
||||
width += padding * 2
|
||||
height += padding * 2
|
||||
width += padding.Horizontal()
|
||||
height += padding.Vertical()
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -135,14 +136,14 @@ func (layout Dialog) MinimumSize (
|
||||
// specified elements at the given width, taking into account flexible elements.
|
||||
func (layout Dialog) FlexibleHeightFor (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
width int,
|
||||
) (
|
||||
height int,
|
||||
) {
|
||||
if layout.Pad {
|
||||
width -= margin * 2
|
||||
width -= padding.Horizontal()
|
||||
}
|
||||
|
||||
if len(entries) > 0 {
|
||||
@ -156,14 +157,14 @@ func (layout Dialog) FlexibleHeightFor (
|
||||
}
|
||||
|
||||
if len(entries) > 1 {
|
||||
if layout.Gap { height += margin }
|
||||
if layout.Gap { height += margin.Y }
|
||||
_, additionalHeight := layout.minimumSizeOfControlRow (
|
||||
entries[1:], margin, padding)
|
||||
height += additionalHeight
|
||||
}
|
||||
|
||||
if layout.Pad {
|
||||
height += padding * 2
|
||||
height += padding.Vertical()
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -172,8 +173,8 @@ func (layout Dialog) FlexibleHeightFor (
|
||||
// the control row.
|
||||
func (layout Dialog) minimumSizeOfControlRow (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
) (
|
||||
width, height int,
|
||||
) {
|
||||
@ -184,7 +185,7 @@ func (layout Dialog) minimumSizeOfControlRow (
|
||||
}
|
||||
width += entryWidth
|
||||
if layout.Gap && index > 0 {
|
||||
width += margin
|
||||
width += margin.X
|
||||
}
|
||||
}
|
||||
return
|
||||
|
@ -1,6 +1,7 @@
|
||||
package basicLayouts
|
||||
|
||||
import "image"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/layouts"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
|
||||
|
||||
@ -19,11 +20,11 @@ type Horizontal struct {
|
||||
// Arrange arranges a list of entries horizontally.
|
||||
func (layout Horizontal) Arrange (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
bounds image.Rectangle,
|
||||
) {
|
||||
if layout.Pad { bounds = bounds.Inset(padding) }
|
||||
if layout.Pad { bounds = padding.Apply(bounds) }
|
||||
|
||||
// get width of expanding elements
|
||||
expandingElementWidth := layout.expandingElementWidth (
|
||||
@ -32,7 +33,7 @@ func (layout Horizontal) Arrange (
|
||||
// set the size and position of each element
|
||||
dot := bounds.Min
|
||||
for index, entry := range entries {
|
||||
if index > 0 && layout.Gap { dot.X += margin }
|
||||
if index > 0 && layout.Gap { dot.X += margin.X }
|
||||
|
||||
entry.Bounds.Min = dot
|
||||
entryWidth := 0
|
||||
@ -52,7 +53,8 @@ func (layout Horizontal) Arrange (
|
||||
// arrange the given list of entries.
|
||||
func (layout Horizontal) MinimumSize (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
) (
|
||||
width, height int,
|
||||
) {
|
||||
@ -63,13 +65,13 @@ func (layout Horizontal) MinimumSize (
|
||||
}
|
||||
width += entryWidth
|
||||
if layout.Gap && index > 0 {
|
||||
width += margin
|
||||
width += margin.X
|
||||
}
|
||||
}
|
||||
|
||||
if layout.Pad {
|
||||
width += margin * 2
|
||||
height += margin * 2
|
||||
width += padding.Horizontal()
|
||||
height += padding.Vertical()
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -78,13 +80,13 @@ func (layout Horizontal) MinimumSize (
|
||||
// specified elements at the given width, taking into account flexible elements.
|
||||
func (layout Horizontal) FlexibleHeightFor (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
width int,
|
||||
) (
|
||||
height int,
|
||||
) {
|
||||
if layout.Pad { width -= padding * 2 }
|
||||
if layout.Pad { width -= padding.Horizontal() }
|
||||
|
||||
// get width of expanding elements
|
||||
expandingElementWidth := layout.expandingElementWidth (
|
||||
@ -92,8 +94,8 @@ func (layout Horizontal) FlexibleHeightFor (
|
||||
|
||||
x, y := 0, 0
|
||||
if layout.Pad {
|
||||
x += padding
|
||||
y += padding
|
||||
x += padding.Horizontal()
|
||||
y += padding.Vertical()
|
||||
}
|
||||
|
||||
// set the size and position of each element
|
||||
@ -108,19 +110,19 @@ func (layout Horizontal) FlexibleHeightFor (
|
||||
if entryHeight > height { height = entryHeight }
|
||||
|
||||
x += entryWidth
|
||||
if index > 0 && layout.Gap { x += margin }
|
||||
if index > 0 && layout.Gap { x += margin.X }
|
||||
}
|
||||
|
||||
if layout.Pad {
|
||||
height += padding * 2
|
||||
height += padding.Vertical()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (layout Horizontal) expandingElementWidth (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
freeSpace int,
|
||||
) (
|
||||
width int,
|
||||
@ -137,7 +139,7 @@ func (layout Horizontal) expandingElementWidth (
|
||||
freeSpace -= entryMinWidth
|
||||
}
|
||||
if index > 0 && layout.Gap {
|
||||
freeSpace -= margin
|
||||
freeSpace -= margin.X
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package basicLayouts
|
||||
|
||||
import "image"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/layouts"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
|
||||
|
||||
@ -19,11 +20,11 @@ type Vertical struct {
|
||||
// Arrange arranges a list of entries vertically.
|
||||
func (layout Vertical) Arrange (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
bounds image.Rectangle,
|
||||
) {
|
||||
if layout.Pad { bounds = bounds.Inset(padding) }
|
||||
if layout.Pad { bounds = padding.Apply(bounds) }
|
||||
|
||||
// count the number of expanding elements and the amount of free space
|
||||
// for them to collectively occupy, while gathering minimum heights.
|
||||
@ -46,7 +47,7 @@ func (layout Vertical) Arrange (
|
||||
freeSpace -= entryMinHeight
|
||||
}
|
||||
if index > 0 && layout.Gap {
|
||||
freeSpace -= margin
|
||||
freeSpace -= margin.Y
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,7 +59,7 @@ func (layout Vertical) Arrange (
|
||||
// set the size and position of each element
|
||||
dot := bounds.Min
|
||||
for index, entry := range entries {
|
||||
if index > 0 && layout.Gap { dot.Y += margin }
|
||||
if index > 0 && layout.Gap { dot.Y += margin.Y }
|
||||
|
||||
entry.Bounds.Min = dot
|
||||
entryHeight := 0
|
||||
@ -78,8 +79,8 @@ func (layout Vertical) Arrange (
|
||||
// arrange the given list of entries.
|
||||
func (layout Vertical) MinimumSize (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
) (
|
||||
width, height int,
|
||||
) {
|
||||
@ -90,13 +91,13 @@ func (layout Vertical) MinimumSize (
|
||||
}
|
||||
height += entryHeight
|
||||
if layout.Gap && index > 0 {
|
||||
height += margin
|
||||
height += margin.Y
|
||||
}
|
||||
}
|
||||
|
||||
if layout.Pad {
|
||||
width += padding * 2
|
||||
height += padding * 2
|
||||
width += padding.Horizontal()
|
||||
height += padding.Vertical()
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -105,15 +106,15 @@ func (layout Vertical) MinimumSize (
|
||||
// specified elements at the given width, taking into account flexible elements.
|
||||
func (layout Vertical) FlexibleHeightFor (
|
||||
entries []layouts.LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
width int,
|
||||
) (
|
||||
height int,
|
||||
) {
|
||||
if layout.Pad {
|
||||
width -= padding * 2
|
||||
height += padding * 2
|
||||
width -= padding.Horizontal()
|
||||
height += padding.Vertical()
|
||||
}
|
||||
|
||||
for index, entry := range entries {
|
||||
@ -126,7 +127,7 @@ func (layout Vertical) FlexibleHeightFor (
|
||||
}
|
||||
|
||||
if layout.Gap && index > 0 {
|
||||
height += margin
|
||||
height += margin.Y
|
||||
}
|
||||
}
|
||||
return
|
||||
|
@ -1,6 +1,7 @@
|
||||
package layouts
|
||||
|
||||
import "image"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
|
||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
|
||||
|
||||
// LayoutEntry associates an element with layout and positioning information so
|
||||
@ -24,7 +25,8 @@ type Layout interface {
|
||||
// than what is returned by MinimumSize.
|
||||
Arrange (
|
||||
entries []LayoutEntry,
|
||||
margin, padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
bounds image.Rectangle,
|
||||
)
|
||||
|
||||
@ -32,7 +34,8 @@ type Layout interface {
|
||||
// needs to properly arrange the given slice of layout entries.
|
||||
MinimumSize (
|
||||
entries []LayoutEntry,
|
||||
margin, padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
) (
|
||||
width, height int,
|
||||
)
|
||||
@ -42,8 +45,8 @@ type Layout interface {
|
||||
// flexible elements.
|
||||
FlexibleHeightFor (
|
||||
entries []LayoutEntry,
|
||||
margin int,
|
||||
padding int,
|
||||
margin image.Point,
|
||||
padding artist.Inset,
|
||||
squeeze int,
|
||||
) (
|
||||
height int,
|
||||
|
Reference in New Issue
Block a user