Layouts now take in proper margin and padding values
This commit is contained in:
		
							parent
							
								
									90ce0d7281
								
							
						
					
					
						commit
						5fc5af92df
					
				@ -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