Layouts now take in proper margin and padding values

This commit is contained in:
Sasha Koshka 2023-03-04 01:42:14 -05:00
parent 90ce0d7281
commit 5fc5af92df
5 changed files with 69 additions and 65 deletions

View File

@ -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())
}

View File

@ -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

View File

@ -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
}
}

View File

@ -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

View File

@ -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,