55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
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
|
|
// it can be arranged by a Layout.
|
|
type LayoutEntry struct {
|
|
elements.Element
|
|
Bounds image.Rectangle
|
|
Expand bool
|
|
}
|
|
|
|
// TODO: have layouts take in artist.Inset for margin and padding
|
|
// TODO: create a layout that only displays the first element and full screen.
|
|
// basically a blank layout for containers that only ever have one element.
|
|
|
|
// Layout is capable of arranging elements within a container. It is also able
|
|
// to determine the minimum amount of room it needs to do so.
|
|
type Layout interface {
|
|
// Arrange takes in a slice of entries and a bounding width and height,
|
|
// and changes the position of the entiries in the slice so that they
|
|
// are properly laid out. The given width and height should not be less
|
|
// than what is returned by MinimumSize.
|
|
Arrange (
|
|
entries []LayoutEntry,
|
|
margin image.Point,
|
|
padding artist.Inset,
|
|
bounds image.Rectangle,
|
|
)
|
|
|
|
// MinimumSize returns the minimum width and height that the layout
|
|
// needs to properly arrange the given slice of layout entries.
|
|
MinimumSize (
|
|
entries []LayoutEntry,
|
|
margin image.Point,
|
|
padding artist.Inset,
|
|
) (
|
|
width, height int,
|
|
)
|
|
|
|
// FlexibleHeightFor Returns the minimum height the layout needs to lay
|
|
// out the specified elements at the given width, taking into account
|
|
// flexible elements.
|
|
FlexibleHeightFor (
|
|
entries []LayoutEntry,
|
|
margin image.Point,
|
|
padding artist.Inset,
|
|
squeeze int,
|
|
) (
|
|
height int,
|
|
)
|
|
}
|