Containers are no longer in their own dir because why were they
This commit is contained in:
		
							parent
							
								
									a7de6c7f3b
								
							
						
					
					
						commit
						775390e884
					
				@ -1,4 +1,4 @@
 | 
				
			|||||||
package containers
 | 
					package elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "image"
 | 
					import "image"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
@ -1,368 +0,0 @@
 | 
				
			|||||||
package containers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "image"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/core"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/default/theme"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/default/config"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DocumentContainer is a scrollable container capable of containing flexible
 | 
					 | 
				
			||||||
// elements.
 | 
					 | 
				
			||||||
type DocumentContainer struct {
 | 
					 | 
				
			||||||
	*core.Core
 | 
					 | 
				
			||||||
	*core.Propagator
 | 
					 | 
				
			||||||
	core core.CoreControl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	children []tomo.LayoutEntry
 | 
					 | 
				
			||||||
	scroll   image.Point
 | 
					 | 
				
			||||||
	warping  bool
 | 
					 | 
				
			||||||
	contentBounds image.Rectangle
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	config config.Wrapped
 | 
					 | 
				
			||||||
	theme  theme.Wrapped
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	onScrollBoundsChange func ()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewDocumentContainer creates a new document container.
 | 
					 | 
				
			||||||
func NewDocumentContainer () (element *DocumentContainer) {
 | 
					 | 
				
			||||||
	element = &DocumentContainer { }
 | 
					 | 
				
			||||||
	element.theme.Case = tomo.C("tomo", "documentContainer")
 | 
					 | 
				
			||||||
	element.Core, element.core = core.NewCore(element, element.redoAll)
 | 
					 | 
				
			||||||
	element.Propagator = core.NewPropagator(element, element.core)
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Adopt adds a new child element to the container. If expand is true, then the
 | 
					 | 
				
			||||||
// element will stretch to either side of the container (much like a css block
 | 
					 | 
				
			||||||
// element). If expand is false, the element will share a line with other inline
 | 
					 | 
				
			||||||
// elements.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) Adopt (child tomo.Element, expand bool) {
 | 
					 | 
				
			||||||
	// set event handlers
 | 
					 | 
				
			||||||
	if child0, ok := child.(tomo.Themeable); ok {
 | 
					 | 
				
			||||||
		child0.SetTheme(element.theme.Theme)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if child0, ok := child.(tomo.Configurable); ok {
 | 
					 | 
				
			||||||
		child0.SetConfig(element.config.Config)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// add child
 | 
					 | 
				
			||||||
	element.children = append (element.children, tomo.LayoutEntry {
 | 
					 | 
				
			||||||
		Element: child,
 | 
					 | 
				
			||||||
		Expand:  expand,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	child.SetParent(element)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// refresh stale data
 | 
					 | 
				
			||||||
	element.updateMinimumSize()
 | 
					 | 
				
			||||||
	if element.core.HasImage() && !element.warping {
 | 
					 | 
				
			||||||
		element.redoAll()
 | 
					 | 
				
			||||||
		element.core.DamageAll()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Warp runs the specified callback, deferring all layout and rendering updates
 | 
					 | 
				
			||||||
// until the callback has finished executing. This allows for aplications to
 | 
					 | 
				
			||||||
// perform batch gui updates without flickering and stuff.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) Warp (callback func ()) {
 | 
					 | 
				
			||||||
	if element.warping {
 | 
					 | 
				
			||||||
		callback()
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	element.warping = true
 | 
					 | 
				
			||||||
	callback()
 | 
					 | 
				
			||||||
	element.warping = false
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if element.core.HasImage() {
 | 
					 | 
				
			||||||
		element.redoAll()
 | 
					 | 
				
			||||||
		element.core.DamageAll()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Disown removes the given child from the container if it is contained within
 | 
					 | 
				
			||||||
// it.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) Disown (child tomo.Element) {
 | 
					 | 
				
			||||||
	for index, entry := range element.children {
 | 
					 | 
				
			||||||
		if entry.Element == child {
 | 
					 | 
				
			||||||
			element.clearChildEventHandlers(entry.Element)
 | 
					 | 
				
			||||||
			element.children = append (
 | 
					 | 
				
			||||||
				element.children[:index],
 | 
					 | 
				
			||||||
				element.children[index + 1:]...)
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	element.updateMinimumSize()
 | 
					 | 
				
			||||||
	if element.core.HasImage() && !element.warping {
 | 
					 | 
				
			||||||
		element.redoAll()
 | 
					 | 
				
			||||||
		element.core.DamageAll()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) clearChildEventHandlers (child tomo.Element) {
 | 
					 | 
				
			||||||
	child.DrawTo(nil, image.Rectangle { }, nil)
 | 
					 | 
				
			||||||
	child.SetParent(nil)
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	if child, ok := child.(tomo.Focusable); ok {
 | 
					 | 
				
			||||||
		if child.Focused() {
 | 
					 | 
				
			||||||
			child.HandleUnfocus()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DisownAll removes all child elements from the container at once.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) DisownAll () {
 | 
					 | 
				
			||||||
	for _, entry := range element.children {
 | 
					 | 
				
			||||||
		element.clearChildEventHandlers(entry.Element)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	element.children = nil
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	element.updateMinimumSize()
 | 
					 | 
				
			||||||
	if element.core.HasImage() && !element.warping {
 | 
					 | 
				
			||||||
		element.redoAll()
 | 
					 | 
				
			||||||
		element.core.DamageAll()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Children returns a slice containing this element's children.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) Children () (children []tomo.Element) {
 | 
					 | 
				
			||||||
	children = make([]tomo.Element, len(element.children))
 | 
					 | 
				
			||||||
	for index, entry := range element.children {
 | 
					 | 
				
			||||||
		children[index] = entry.Element
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CountChildren returns the amount of children contained within this element.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) CountChildren () (count int) {
 | 
					 | 
				
			||||||
	return len(element.children)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Child returns the child at the specified index. If the index is out of
 | 
					 | 
				
			||||||
// bounds, this method will return nil.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) Child (index int) (child tomo.Element) {
 | 
					 | 
				
			||||||
	if index < 0 || index > len(element.children) { return }
 | 
					 | 
				
			||||||
	return element.children[index].Element
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ChildAt returns the child that contains the specified x and y coordinates. If
 | 
					 | 
				
			||||||
// there are no children at the coordinates, this method will return nil.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) ChildAt (point image.Point) (child tomo.Element) {
 | 
					 | 
				
			||||||
	for _, entry := range element.children {
 | 
					 | 
				
			||||||
		if point.In(entry.Bounds) {
 | 
					 | 
				
			||||||
			child = entry.Element
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) redoAll () {
 | 
					 | 
				
			||||||
	if !element.core.HasImage() { return }
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	// do a layout
 | 
					 | 
				
			||||||
	element.doLayout()
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	maxScrollHeight := element.maxScrollHeight()
 | 
					 | 
				
			||||||
	if element.scroll.Y > maxScrollHeight {
 | 
					 | 
				
			||||||
		element.scroll.Y = maxScrollHeight
 | 
					 | 
				
			||||||
		element.doLayout()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// draw a background
 | 
					 | 
				
			||||||
	rocks := make([]image.Rectangle, len(element.children))
 | 
					 | 
				
			||||||
	for index, entry := range element.children {
 | 
					 | 
				
			||||||
		rocks[index] = entry.Bounds
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	pattern := element.theme.Pattern (
 | 
					 | 
				
			||||||
		tomo.PatternBackground,
 | 
					 | 
				
			||||||
		tomo.State { })
 | 
					 | 
				
			||||||
	artist.DrawShatter(element.core, pattern, element.Bounds(), rocks...)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	element.partition()
 | 
					 | 
				
			||||||
	if parent, ok := element.core.Parent().(tomo.ScrollableParent); ok {
 | 
					 | 
				
			||||||
		parent.NotifyScrollBoundsChange(element)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if element.onScrollBoundsChange != nil {
 | 
					 | 
				
			||||||
		element.onScrollBoundsChange()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) partition () {
 | 
					 | 
				
			||||||
	for _, entry := range element.children {
 | 
					 | 
				
			||||||
		entry.DrawTo(nil, entry.Bounds, nil)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// cut our canvas up and give peices to child elements
 | 
					 | 
				
			||||||
	for _, entry := range element.children {
 | 
					 | 
				
			||||||
		if entry.Bounds.Overlaps(element.Bounds()) {
 | 
					 | 
				
			||||||
			entry.DrawTo (	
 | 
					 | 
				
			||||||
				canvas.Cut(element.core, entry.Bounds),
 | 
					 | 
				
			||||||
				entry.Bounds, func (region image.Rectangle) {
 | 
					 | 
				
			||||||
					element.core.DamageRegion(region)
 | 
					 | 
				
			||||||
				})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) Window () tomo.Window {
 | 
					 | 
				
			||||||
	return element.core.Window()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NotifyMinimumSizeChange notifies the container that the minimum size of a
 | 
					 | 
				
			||||||
// child element has changed.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) NotifyMinimumSizeChange (child tomo.Element) {
 | 
					 | 
				
			||||||
	element.redoAll()
 | 
					 | 
				
			||||||
	element.core.DamageAll()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DrawBackground draws a portion of the container's background pattern within
 | 
					 | 
				
			||||||
// the specified bounds. The container will not push these changes.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) DrawBackground (bounds image.Rectangle) {
 | 
					 | 
				
			||||||
	element.core.DrawBackgroundBounds (
 | 
					 | 
				
			||||||
		element.theme.Pattern(tomo.PatternBackground, tomo.State { }),
 | 
					 | 
				
			||||||
		bounds)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NotifyFlexibleHeightChange notifies the parent that the parameters
 | 
					 | 
				
			||||||
// affecting a child's flexible height have changed. This method is
 | 
					 | 
				
			||||||
// expected to be called by flexible child element when their content
 | 
					 | 
				
			||||||
// changes.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) NotifyFlexibleHeightChange (child tomo.Flexible) {
 | 
					 | 
				
			||||||
	element.redoAll()
 | 
					 | 
				
			||||||
	element.core.DamageAll()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetTheme sets the element's theme.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) SetTheme (new tomo.Theme) {
 | 
					 | 
				
			||||||
	if new == element.theme.Theme { return }
 | 
					 | 
				
			||||||
	element.theme.Theme = new
 | 
					 | 
				
			||||||
	element.Propagator.SetTheme(new)
 | 
					 | 
				
			||||||
	element.redoAll()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetConfig sets the element's configuration.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) SetConfig (new tomo.Config) {
 | 
					 | 
				
			||||||
	if new == element.config.Config { return }
 | 
					 | 
				
			||||||
	element.Propagator.SetConfig(new)
 | 
					 | 
				
			||||||
	element.redoAll()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ScrollContentBounds returns the full content size of the element.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) ScrollContentBounds () image.Rectangle {
 | 
					 | 
				
			||||||
	return element.contentBounds
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ScrollViewportBounds returns the size and position of the element's
 | 
					 | 
				
			||||||
// viewport relative to ScrollBounds.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) ScrollViewportBounds () image.Rectangle {
 | 
					 | 
				
			||||||
	padding := element.theme.Padding(tomo.PatternBackground)
 | 
					 | 
				
			||||||
	bounds  := padding.Apply(element.Bounds())
 | 
					 | 
				
			||||||
	bounds   = bounds.Sub(bounds.Min).Add(element.scroll)
 | 
					 | 
				
			||||||
	return bounds
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ScrollTo scrolls the viewport to the specified point relative to
 | 
					 | 
				
			||||||
// ScrollBounds.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) ScrollTo (position image.Point) {
 | 
					 | 
				
			||||||
	if position.Y < 0 {
 | 
					 | 
				
			||||||
		position.Y = 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	maxScrollHeight := element.maxScrollHeight()
 | 
					 | 
				
			||||||
	if position.Y > maxScrollHeight {
 | 
					 | 
				
			||||||
		position.Y = maxScrollHeight
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	element.scroll = position
 | 
					 | 
				
			||||||
	if element.core.HasImage() && !element.warping {
 | 
					 | 
				
			||||||
		element.redoAll()
 | 
					 | 
				
			||||||
		element.core.DamageAll()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// OnScrollBoundsChange sets a function to be called when the element's viewport
 | 
					 | 
				
			||||||
// bounds, content bounds, or scroll axes change.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) OnScrollBoundsChange (callback func ()) {
 | 
					 | 
				
			||||||
	element.onScrollBoundsChange = callback
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) maxScrollHeight () (height int) {
 | 
					 | 
				
			||||||
	padding := element.theme.Padding(tomo.PatternSunken)
 | 
					 | 
				
			||||||
	viewportHeight := element.Bounds().Dy() - padding.Vertical()
 | 
					 | 
				
			||||||
	height = element.contentBounds.Dy() - viewportHeight
 | 
					 | 
				
			||||||
	if height < 0 { height = 0 }
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ScrollAxes returns the supported axes for scrolling.
 | 
					 | 
				
			||||||
func (element *DocumentContainer) ScrollAxes () (horizontal, vertical bool) {
 | 
					 | 
				
			||||||
	return false, true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) doLayout () {
 | 
					 | 
				
			||||||
	margin := element.theme.Margin(tomo.PatternBackground)
 | 
					 | 
				
			||||||
	padding := element.theme.Padding(tomo.PatternBackground)
 | 
					 | 
				
			||||||
	bounds := padding.Apply(element.Bounds())
 | 
					 | 
				
			||||||
	element.contentBounds = image.Rectangle { }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dot := bounds.Min.Sub(element.scroll)
 | 
					 | 
				
			||||||
	xStart := dot.X
 | 
					 | 
				
			||||||
	rowHeight := 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	nextLine := func () {
 | 
					 | 
				
			||||||
		dot.X = xStart
 | 
					 | 
				
			||||||
		dot.Y += margin.Y
 | 
					 | 
				
			||||||
		dot.Y += rowHeight
 | 
					 | 
				
			||||||
		rowHeight = 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	for index, entry := range element.children {
 | 
					 | 
				
			||||||
		if dot.X > xStart && entry.Expand {
 | 
					 | 
				
			||||||
			nextLine()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
		width, height := entry.MinimumSize()
 | 
					 | 
				
			||||||
		if width + dot.X > bounds.Dx() && !entry.Expand {
 | 
					 | 
				
			||||||
			nextLine()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if width < bounds.Dx() && entry.Expand {
 | 
					 | 
				
			||||||
			width = bounds.Dx()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if typedChild, ok := entry.Element.(tomo.Flexible); ok {
 | 
					 | 
				
			||||||
			height = typedChild.FlexibleHeightFor(width)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if rowHeight < height {
 | 
					 | 
				
			||||||
			rowHeight = height
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		entry.Bounds.Min = dot
 | 
					 | 
				
			||||||
		entry.Bounds.Max = image.Pt(dot.X + width, dot.Y + height)
 | 
					 | 
				
			||||||
		element.children[index] = entry
 | 
					 | 
				
			||||||
		element.contentBounds = element.contentBounds.Union(entry.Bounds)
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if entry.Expand {
 | 
					 | 
				
			||||||
			nextLine()
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			dot.X += width + margin.X
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	element.contentBounds =
 | 
					 | 
				
			||||||
		element.contentBounds.Sub(element.contentBounds.Min)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (element *DocumentContainer) updateMinimumSize () {
 | 
					 | 
				
			||||||
	padding := element.theme.Padding(tomo.PatternBackground)
 | 
					 | 
				
			||||||
	minimumWidth := 0
 | 
					 | 
				
			||||||
	for _, entry := range element.children {
 | 
					 | 
				
			||||||
		width, _ := entry.MinimumSize()
 | 
					 | 
				
			||||||
		if width > minimumWidth {
 | 
					 | 
				
			||||||
			minimumWidth = width
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	element.core.SetMinimumSize (
 | 
					 | 
				
			||||||
		minimumWidth + padding.Horizontal(),
 | 
					 | 
				
			||||||
		padding.Vertical())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
package containers
 | 
					package elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "image"
 | 
					import "image"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
@ -1,10 +1,9 @@
 | 
				
			|||||||
package containers
 | 
					package elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "image"
 | 
					import "image"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
// import "git.tebibyte.media/sashakoshka/tomo/input"
 | 
					// import "git.tebibyte.media/sashakoshka/tomo/input"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/default/theme"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/default/theme"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/default/config"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/default/config"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -12,8 +11,8 @@ type Scroll struct {
 | 
				
			|||||||
	entity tomo.ContainerEntity
 | 
						entity tomo.ContainerEntity
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	child      tomo.Scrollable
 | 
						child      tomo.Scrollable
 | 
				
			||||||
	horizontal *elements.ScrollBar
 | 
						horizontal *ScrollBar
 | 
				
			||||||
	vertical   *elements.ScrollBar
 | 
						vertical   *ScrollBar
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	config config.Wrapped
 | 
						config config.Wrapped
 | 
				
			||||||
	theme  theme.Wrapped
 | 
						theme  theme.Wrapped
 | 
				
			||||||
@ -25,7 +24,7 @@ func NewScroll (horizontal, vertical bool) (element *Scroll) {
 | 
				
			|||||||
	element.entity = tomo.NewEntity(element).(tomo.ContainerEntity)
 | 
						element.entity = tomo.NewEntity(element).(tomo.ContainerEntity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if horizontal {
 | 
						if horizontal {
 | 
				
			||||||
		element.horizontal = elements.NewScrollBar(false)
 | 
							element.horizontal = NewScrollBar(false)
 | 
				
			||||||
		element.horizontal.OnScroll (func (viewport image.Point) {
 | 
							element.horizontal.OnScroll (func (viewport image.Point) {
 | 
				
			||||||
			if element.child != nil {
 | 
								if element.child != nil {
 | 
				
			||||||
				element.child.ScrollTo(viewport)
 | 
									element.child.ScrollTo(viewport)
 | 
				
			||||||
@ -39,7 +38,7 @@ func NewScroll (horizontal, vertical bool) (element *Scroll) {
 | 
				
			|||||||
		element.entity.Adopt(element.horizontal)
 | 
							element.entity.Adopt(element.horizontal)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if vertical {
 | 
						if vertical {
 | 
				
			||||||
		element.vertical = elements.NewScrollBar(true)
 | 
							element.vertical = NewScrollBar(true)
 | 
				
			||||||
		element.vertical.OnScroll (func (viewport image.Point) {
 | 
							element.vertical.OnScroll (func (viewport image.Point) {
 | 
				
			||||||
			if element.child != nil {
 | 
								if element.child != nil {
 | 
				
			||||||
				element.child.ScrollTo(viewport)
 | 
									element.child.ScrollTo(viewport)
 | 
				
			||||||
@ -4,7 +4,6 @@ import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/textdraw"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/textdraw"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -15,7 +14,7 @@ func run () {
 | 
				
			|||||||
	window.SetTitle("Text alignment")
 | 
						window.SetTitle("Text alignment")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewDocument()
 | 
						container := containers.NewDocument()
 | 
				
			||||||
	scrollContainer := containers.NewScroll(false, true)
 | 
						scrollContainer := elements.NewScroll(false, true)
 | 
				
			||||||
	scrollContainer.Adopt(container)
 | 
						scrollContainer.Adopt(container)
 | 
				
			||||||
	window.Adopt(scrollContainer)
 | 
						window.Adopt(scrollContainer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
@ -14,7 +13,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
				
			||||||
	window.SetTitle("Checkboxes")
 | 
						window.SetTitle("Checkboxes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	introText := elements.NewLabel (
 | 
						introText := elements.NewLabel (
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,6 @@ import "git.tebibyte.media/sashakoshka/tomo/data"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -26,9 +25,9 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 256, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 256, 0))
 | 
				
			||||||
	window.SetTitle("Clipboard")
 | 
						window.SetTitle("Clipboard")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	textInput := elements.NewTextBox("", "")
 | 
						textInput := elements.NewTextBox("", "")
 | 
				
			||||||
	controlRow := containers.NewHBox(false, true)
 | 
						controlRow := elements.NewHBox(false, true)
 | 
				
			||||||
	copyButton := elements.NewButton("Copy")
 | 
						copyButton := elements.NewButton("Copy")
 | 
				
			||||||
	copyButton.SetIcon(tomo.IconCopy)
 | 
						copyButton.SetIcon(tomo.IconCopy)
 | 
				
			||||||
	pasteButton := elements.NewButton("Paste")
 | 
						pasteButton := elements.NewButton("Paste")
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,6 @@ import _ "image/png"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -22,8 +21,8 @@ func run () {
 | 
				
			|||||||
	file.Close()
 | 
						file.Close()
 | 
				
			||||||
	if err != nil { panic(err.Error()); return  }
 | 
						if err != nil { panic(err.Error()); return  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	scrollContainer := containers.NewScroll(false, true)
 | 
						scrollContainer := elements.NewScroll(false, true)
 | 
				
			||||||
	document := containers.NewDocument()
 | 
						document := elements.NewDocument()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	document.Adopt (elements.NewLabel (
 | 
						document.Adopt (elements.NewLabel (
 | 
				
			||||||
		"A document container is a vertically stacked container " +
 | 
							"A document container is a vertically stacked container " +
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@ import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/flow"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/flow"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func main () {
 | 
				
			|||||||
func run () {
 | 
					func run () {
 | 
				
			||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 192, 192))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 192, 192))
 | 
				
			||||||
	window.SetTitle("adventure")
 | 
						window.SetTitle("adventure")
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var world flow.Flow
 | 
						var world flow.Flow
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,6 @@ import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/fun"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements/fun"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -16,7 +15,7 @@ func main () {
 | 
				
			|||||||
func run () {
 | 
					func run () {
 | 
				
			||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 200, 216))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 200, 216))
 | 
				
			||||||
	window.SetTitle("Clock")
 | 
						window.SetTitle("Clock")
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clock := fun.NewAnalogClock(time.Now())
 | 
						clock := fun.NewAnalogClock(time.Now())
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 0))
 | 
				
			||||||
	window.SetTitle("horizontal stack")
 | 
						window.SetTitle("horizontal stack")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewHBox(true, true)
 | 
						container := elements.NewHBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container.Adopt(elements.NewLabel("this is sample text", true), true)
 | 
						container.Adopt(elements.NewLabel("this is sample text", true), true)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 0))
 | 
				
			||||||
	window.SetTitle("Icons")
 | 
						window.SetTitle("Icons")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container.Adopt(elements.NewLabel("Just some of the wonderful icons we have:", false), false)
 | 
						container.Adopt(elements.NewLabel("Just some of the wonderful icons we have:", false), false)
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@ import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func main () {
 | 
				
			|||||||
func run () {
 | 
					func run () {
 | 
				
			||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
				
			||||||
	window.SetTitle("Enter Details")
 | 
						window.SetTitle("Enter Details")
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// create inputs
 | 
						// create inputs
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,6 @@ import "image"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -15,7 +14,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(200, 200, 256, 256))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(200, 200, 256, 256))
 | 
				
			||||||
	window.SetTitle("Main")
 | 
						window.SetTitle("Main")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	container.Adopt(elements.NewLabel("Main window", false), true)
 | 
						container.Adopt(elements.NewLabel("Main window", false), true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@ import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -15,7 +14,7 @@ func run () {
 | 
				
			|||||||
	if err != nil { panic(err.Error()) }
 | 
						if err != nil { panic(err.Error()) }
 | 
				
			||||||
	window.SetTitle("Dialog Boxes")
 | 
						window.SetTitle("Dialog Boxes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container.Adopt(elements.NewLabel("Try out different dialogs:", false), true)
 | 
						container.Adopt(elements.NewLabel("Try out different dialogs:", false), true)
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@ import "time"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
@ -14,7 +13,7 @@ func main () {
 | 
				
			|||||||
func run () {
 | 
					func run () {
 | 
				
			||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
				
			||||||
	window.SetTitle("Approaching")
 | 
						window.SetTitle("Approaching")
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container.Adopt (elements.NewLabel (
 | 
						container.Adopt (elements.NewLabel (
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,6 @@ import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/popups"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:embed wall.png
 | 
					//go:embed wall.png
 | 
				
			||||||
var wallTextureBytes []uint8
 | 
					var wallTextureBytes []uint8
 | 
				
			||||||
@ -22,7 +21,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 640, 480))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 640, 480))
 | 
				
			||||||
	window.SetTitle("Raycaster")
 | 
						window.SetTitle("Raycaster")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(false, false)
 | 
						container := elements.NewVBox(false, false)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wallTexture, _ := TextureFrom(bytes.NewReader(wallTextureBytes))
 | 
						wallTexture, _ := TextureFrom(bytes.NewReader(wallTextureBytes))
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func main () {
 | 
				
			|||||||
func run () {
 | 
					func run () {
 | 
				
			||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 240))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 240))
 | 
				
			||||||
	window.SetTitle("Scroll")
 | 
						window.SetTitle("Scroll")
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	textBox := elements.NewTextBox("", copypasta)
 | 
						textBox := elements.NewTextBox("", copypasta)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
				
			||||||
	window.SetTitle("Spaced Out")
 | 
						window.SetTitle("Spaced Out")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container.Adopt (elements.NewLabel("This is at the top", false), false)
 | 
						container.Adopt (elements.NewLabel("This is at the top", false), false)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
	tomo.Run(run)
 | 
						tomo.Run(run)
 | 
				
			||||||
@ -13,7 +12,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0))
 | 
				
			||||||
	window.SetTitle("Switches")
 | 
						window.SetTitle("Switches")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
	window.Adopt(container)
 | 
						window.Adopt(container)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container.Adopt(elements.NewSwitch("hahahah", false), false)
 | 
						container.Adopt(elements.NewSwitch("hahahah", false), false)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package main
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/testing"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements/testing"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
					import _ "git.tebibyte.media/sashakoshka/tomo/backends/all"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main () {
 | 
					func main () {
 | 
				
			||||||
@ -14,7 +13,7 @@ func run () {
 | 
				
			|||||||
	window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 128, 128))
 | 
						window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 128, 128))
 | 
				
			||||||
	window.SetTitle("vertical stack")
 | 
						window.SetTitle("vertical stack")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	container := containers.NewVBox(true, true)
 | 
						container := elements.NewVBox(true, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	label    := elements.NewLabel("it is a label hehe", true)
 | 
						label    := elements.NewLabel("it is a label hehe", true)
 | 
				
			||||||
	button   := elements.NewButton("drawing pad")
 | 
						button   := elements.NewButton("drawing pad")
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ package popups
 | 
				
			|||||||
import "image"
 | 
					import "image"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo"
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
import "git.tebibyte.media/sashakoshka/tomo/elements/containers"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DialogKind defines the semantic role of a dialog window.
 | 
					// DialogKind defines the semantic role of a dialog window.
 | 
				
			||||||
type DialogKind int
 | 
					type DialogKind int
 | 
				
			||||||
@ -44,9 +43,9 @@ func NewDialog (
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	window.SetTitle(title)
 | 
						window.SetTitle(title)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	box        := containers.NewVBox(true,  true)
 | 
						box        := elements.NewVBox(true,  true)
 | 
				
			||||||
	messageRow := containers.NewHBox(false, true)
 | 
						messageRow := elements.NewHBox(false, true)
 | 
				
			||||||
	controlRow := containers.NewHBox(false, true)
 | 
						controlRow := elements.NewHBox(false, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	iconId := tomo.IconInformation
 | 
						iconId := tomo.IconInformation
 | 
				
			||||||
	switch kind {
 | 
						switch kind {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user