From 5fc5af92df645959ddb3077b3342b38591ef487d Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 4 Mar 2023 01:42:14 -0500 Subject: [PATCH] Layouts now take in proper margin and padding values --- elements/basic/container.go | 15 ++++++-------- layouts/basic/dialog.go | 39 +++++++++++++++++++------------------ layouts/basic/horizontal.go | 38 +++++++++++++++++++----------------- layouts/basic/vertical.go | 31 +++++++++++++++-------------- layouts/layout.go | 11 +++++++---- 5 files changed, 69 insertions(+), 65 deletions(-) diff --git a/elements/basic/container.go b/elements/basic/container.go index e2cbe26..22aa8a5 100644 --- a/elements/basic/container.go +++ b/elements/basic/container.go @@ -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()) } diff --git a/layouts/basic/dialog.go b/layouts/basic/dialog.go index f7fdc4f..ed3b45e 100644 --- a/layouts/basic/dialog.go +++ b/layouts/basic/dialog.go @@ -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 diff --git a/layouts/basic/horizontal.go b/layouts/basic/horizontal.go index d37e27d..e27c3fe 100644 --- a/layouts/basic/horizontal.go +++ b/layouts/basic/horizontal.go @@ -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 } } diff --git a/layouts/basic/vertical.go b/layouts/basic/vertical.go index dc43da8..a66c648 100644 --- a/layouts/basic/vertical.go +++ b/layouts/basic/vertical.go @@ -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 diff --git a/layouts/layout.go b/layouts/layout.go index 5a5d511..786a2b3 100644 --- a/layouts/layout.go +++ b/layouts/layout.go @@ -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,