diff --git a/elements/box.go b/elements/box.go index 29b3e13..143060d 100644 --- a/elements/box.go +++ b/elements/box.go @@ -54,9 +54,16 @@ func NewHBox (space Space, children ...tomo.Element) (element *Box) { } // NewHBox creates a new vertical box. -func NewVBox (space Space) (element *Box) { - element = NewHBox(space) - element.vertical = true +func NewVBox (space Space, children ...tomo.Element) (element *Box) { + element = &Box { + padding: space.Includes(SpacePadding), + margin: space.Includes(SpaceMargin), + vertical: true, + } + element.scratch = make(map[tomo.Element] scratchEntry) + element.theme.Case = tomo.C("tomo", "box") + element.entity = tomo.NewEntity(element).(tomo.ContainerEntity) + element.Adopt(children...) return } diff --git a/elements/containers/common.go b/elements/containers/common.go new file mode 100644 index 0000000..d65e71c --- /dev/null +++ b/elements/containers/common.go @@ -0,0 +1,104 @@ +package containers + +import "image" +import "git.tebibyte.media/sashakoshka/tomo" +import "git.tebibyte.media/sashakoshka/tomo/default/theme" +import "git.tebibyte.media/sashakoshka/tomo/default/config" + +type childManager struct { + onChange func () + children []tomo.LayoutEntry + parent tomo.Parent + theme theme.Wrapped + config config.Wrapped +} + +// Adopt adds a new child element to the container. If expand is set to true, +// the element will expand (instead of contract to its minimum size), in +// whatever way is defined by the container's layout. +func (manager *childManager) Adopt (child tomo.Element, expand bool) { + if child0, ok := child.(tomo.Themeable); ok { + child0.SetTheme(manager.theme.Theme) + } + if child0, ok := child.(tomo.Configurable); ok { + child0.SetConfig(manager.config.Config) + } + child.SetParent(manager.parent) + + manager.children = append (manager.children, tomo.LayoutEntry { + Element: child, + Expand: expand, + }) + + manager.onChange() +} + + +// Disown removes the given child from the container if it is contained within +// it. +func (manager *childManager) Disown (child tomo.Element) { + for index, entry := range manager.children { + if entry.Element == child { + manager.clearChildEventHandlers(entry.Element) + manager.children = append ( + manager.children[:index], + manager.children[index + 1:]...) + break + } + } + + manager.onChange() +} + +// DisownAll removes all child elements from the container at once. +func (manager *childManager) DisownAll () { + for _, entry := range manager.children { + manager.clearChildEventHandlers(entry.Element) + } + manager.children = nil + + manager.onChange() +} + +// Children returns a slice containing this element's children. +func (manager *childManager) Children () (children []tomo.Element) { + children = make([]tomo.Element, len(manager.children)) + for index, entry := range manager.children { + children[index] = entry.Element + } + return +} + +// CountChildren returns the amount of children contained within this element. +func (manager *childManager) CountChildren () (count int) { + return len(manager.children) +} + +// Child returns the child at the specified index. If the index is out of +// bounds, this method will return nil. +func (manager *childManager) Child (index int) (child tomo.Element) { + if index < 0 || index > len(manager.children) { return } + return manager.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 (manager *childManager) ChildAt (point image.Point) (child tomo.Element) { + for _, entry := range manager.children { + if point.In(entry.Bounds) { + child = entry.Element + } + } + return +} + +func (manager *childManager) 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() + } + } +} diff --git a/examples/clipboard/main.go b/examples/clipboard/main.go index cfdc921..4102686 100644 --- a/examples/clipboard/main.go +++ b/examples/clipboard/main.go @@ -129,5 +129,7 @@ func imageWindow (parent tomo.Window, image image.Image) { container.AdoptExpand(elements.NewImage(image)) container.Adopt(closeButton) window.Adopt(container) + + closeButton.Focus() window.Show() } diff --git a/examples/documentContainer/main.go b/examples/documentContainer/main.go index eab82cd..146137b 100644 --- a/examples/documentContainer/main.go +++ b/examples/documentContainer/main.go @@ -22,44 +22,40 @@ func run () { if err != nil { panic(err.Error()); return } document := elements.NewDocument() - - document.Adopt (elements.NewLabel ( - "A document container is a vertically stacked container " + - "capable of properly laying out flexible elements such as " + - "text-wrapped labels. You can also include normal elements " + - "like:", true), true) - document.Adopt (elements.NewButton ( - "Buttons,"), true) - document.Adopt (elements.NewCheckbox ( - "Checkboxes,", true), true) - document.Adopt(elements.NewTextBox("", "And text boxes."), true) - document.Adopt (elements.NewSpacer(true), true) - document.Adopt (elements.NewLabel ( - "Document containers are meant to be placed inside of a " + - "ScrollContainer, like this one.", true), true) - document.Adopt (elements.NewLabel ( - "You could use document containers to do things like display various " + - "forms of hypertext (like HTML, gemtext, markdown, etc.), " + - "lay out a settings menu with descriptive label text between " + - "control groups like in iOS, or list comment or chat histories.", - true), true) - document.Adopt(elements.NewImage(logo), true) - document.Adopt (elements.NewLabel ( - "You can also choose whether each element is on its own line " + - "(sort of like an HTML/CSS block element) or on a line with " + - "other adjacent elements (like an HTML/CSS inline element).", - true), true) - document.Adopt(elements.NewButton("Just"), false) - document.Adopt(elements.NewButton("like"), false) - document.Adopt(elements.NewButton("this."), false) - document.Adopt (elements.NewLabel ( - "Oh, you're a switch? Then name all of these switches:", - true), true) + document.Adopt ( + elements.NewLabelWrapped ( + "A document container is a vertically stacked container " + + "capable of properly laying out flexible elements such as " + + "text-wrapped labels. You can also include normal elements " + + "like:"), + elements.NewButton("Buttons,"), + elements.NewCheckbox("Checkboxes,", true), + elements.NewTextBox("", "And text boxes."), + elements.NewLine(), + elements.NewLabelWrapped ( + "Document containers are meant to be placed inside of a " + + "ScrollContainer, like this one."), + elements.NewLabelWrapped ( + "You could use document containers to do things like display various " + + "forms of hypertext (like HTML, gemtext, markdown, etc.), " + + "lay out a settings menu with descriptive label text between " + + "control groups like in iOS, or list comment or chat histories."), + elements.NewImage(logo), + elements.NewLabelWrapped ( + "You can also choose whether each element is on its own line " + + "(sort of like an HTML/CSS block element) or on a line with " + + "other adjacent elements (like an HTML/CSS inline element).")) + document.AdoptInline ( + elements.NewButton("Just"), + elements.NewButton("like"), + elements.NewButton("this.")) + document.Adopt (elements.NewLabelWrapped ( + "Oh, you're a switch? Then name all of these switches:")) for i := 0; i < 30; i ++ { - document.Adopt(elements.NewSwitch("", false), false) + document.AdoptInline(elements.NewSwitch("", false)) } - window.Adopt(elements.NewScroll(document, false, true)) + window.Adopt(elements.NewScroll(elements.ScrollVertical, document)) window.OnClose(tomo.Stop) window.Show() } diff --git a/examples/flow/main.go b/examples/flow/main.go index 381eb40..dac69cc 100644 --- a/examples/flow/main.go +++ b/examples/flow/main.go @@ -12,15 +12,15 @@ func main () { func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 192, 192)) window.SetTitle("adventure") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) var world flow.Flow world.Transition = container.DisownAll world.Stages = map [string] func () { "start": func () { - label := elements.NewLabel ( - "you are standing next to a river.", true) + label := elements.NewLabelWrapped ( + "you are standing next to a river.") button0 := elements.NewButton("go in the river") button0.OnClick(world.SwitchFunc("wet")) @@ -29,70 +29,65 @@ func run () { button2 := elements.NewButton("turn around") button2.OnClick(world.SwitchFunc("bear")) - container.Adopt(label, true) - container.Adopt(button0, false) - container.Adopt(button1, false) - container.Adopt(button2, false) + container.AdoptExpand(label) + container.Adopt(button0, button1, button2) button0.Focus() }, "wet": func () { - label := elements.NewLabel ( + label := elements.NewLabelWrapped ( "you get completely soaked.\n" + - "you die of hypothermia.", true) + "you die of hypothermia.") button0 := elements.NewButton("try again") button0.OnClick(world.SwitchFunc("start")) button1 := elements.NewButton("exit") button1.OnClick(tomo.Stop) - container.Adopt(label, true) - container.Adopt(button0, false) - container.Adopt(button1, false) + container.AdoptExpand(label) + container.Adopt(button0, button1) button0.Focus() }, "house": func () { - label := elements.NewLabel ( + label := elements.NewLabelWrapped ( "you are standing in front of a delapidated " + - "house.", true) + "house.") button1 := elements.NewButton("go inside") button1.OnClick(world.SwitchFunc("inside")) button0 := elements.NewButton("turn back") button0.OnClick(world.SwitchFunc("start")) - container.Adopt(label, true) - container.Adopt(button1, false) - container.Adopt(button0, false) + container.AdoptExpand(label) + container.Adopt(button0, button1) button1.Focus() }, "inside": func () { - label := elements.NewLabel ( + label := elements.NewLabelWrapped ( "you are standing inside of the house.\n" + "it is dark, but rays of light stream " + "through the window.\n" + "there is nothing particularly interesting " + - "here.", true) + "here.") button0 := elements.NewButton("go back outside") button0.OnClick(world.SwitchFunc("house")) - container.Adopt(label, true) - container.Adopt(button0, false) + container.AdoptExpand(label) + container.Adopt(button0) button0.Focus() }, "bear": func () { - label := elements.NewLabel ( + label := elements.NewLabelWrapped ( "you come face to face with a bear.\n" + - "it eats you (it was hungry).", true) + "it eats you (it was hungry).") button0 := elements.NewButton("try again") button0.OnClick(world.SwitchFunc("start")) button1 := elements.NewButton("exit") button1.OnClick(tomo.Stop) - container.Adopt(label, true) - container.Adopt(button0, false) - container.Adopt(button1, false) + container.AdoptExpand(label) + container.Adopt(button0, button1) button0.Focus() }, } diff --git a/examples/goroutines/main.go b/examples/goroutines/main.go index 29f547a..5df9198 100644 --- a/examples/goroutines/main.go +++ b/examples/goroutines/main.go @@ -15,13 +15,13 @@ func main () { func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 200, 216)) window.SetTitle("Clock") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) clock := fun.NewAnalogClock(time.Now()) - container.Adopt(clock, true) - label := elements.NewLabel(formatTime(), false) - container.Adopt(label, false) + label := elements.NewLabel(formatTime()) + container.AdoptExpand(clock) + container.Adopt(label) window.OnClose(tomo.Stop) window.Show() diff --git a/examples/hbox/main.go b/examples/hbox/main.go index ed5a112..b469ae7 100644 --- a/examples/hbox/main.go +++ b/examples/hbox/main.go @@ -12,12 +12,12 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 0)) window.SetTitle("horizontal stack") - container := elements.NewHBox(true, true) + container := elements.NewHBox(elements.SpaceBoth) window.Adopt(container) - container.Adopt(elements.NewLabel("this is sample text", true), true) - container.Adopt(elements.NewLabel("this is sample text", true), true) - container.Adopt(elements.NewLabel("this is sample text", true), true) + container.AdoptExpand(elements.NewLabelWrapped("this is sample text")) + container.AdoptExpand(elements.NewLabelWrapped("this is sample text")) + container.AdoptExpand(elements.NewLabelWrapped("this is sample text")) window.OnClose(tomo.Stop) window.Show() diff --git a/examples/icons/main.go b/examples/icons/main.go index 5e17d2a..01ed2f5 100644 --- a/examples/icons/main.go +++ b/examples/icons/main.go @@ -12,29 +12,31 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 0)) window.SetTitle("Icons") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) - container.Adopt(elements.NewLabel("Just some of the wonderful icons we have:", false), false) - container.Adopt(elements.NewSpacer(true), false) - container.Adopt(icons(tomo.IconHome, tomo.IconHistory), true) - container.Adopt(icons(tomo.IconFile, tomo.IconNetwork), true) - container.Adopt(icons(tomo.IconOpen, tomo.IconRemoveFavorite), true) - container.Adopt(icons(tomo.IconCursor, tomo.IconDistort), true) + container.Adopt ( + elements.NewLabel("Just some of the wonderful icons we have:"), + elements.NewLine()) + container.AdoptExpand ( + icons(tomo.IconHome, tomo.IconHistory), + icons(tomo.IconFile, tomo.IconNetwork), + icons(tomo.IconOpen, tomo.IconRemoveFavorite), + icons(tomo.IconCursor, tomo.IconDistort)) closeButton := elements.NewButton("Yes verynice") closeButton.SetIcon(tomo.IconYes) closeButton.OnClick(tomo.Stop) - container.Adopt(closeButton, false) + container.Adopt(closeButton) window.OnClose(tomo.Stop) window.Show() } -func icons (min, max tomo.Icon) (container *containers.Box) { - container = containers.NewHBox(false, true) +func icons (min, max tomo.Icon) (container *elements.Box) { + container = elements.NewHBox(elements.SpaceMargin) for index := min; index <= max; index ++ { - container.Adopt(elements.NewIcon(index, tomo.IconSizeSmall), true) + container.AdoptExpand(elements.NewIcon(index, tomo.IconSizeSmall)) } return } diff --git a/examples/image/image.go b/examples/image/image.go index 5731ac9..0dc2100 100644 --- a/examples/image/image.go +++ b/examples/image/image.go @@ -9,7 +9,6 @@ import "git.tebibyte.media/sashakoshka/tomo" import "git.tebibyte.media/sashakoshka/tomo/popups" import "git.tebibyte.media/sashakoshka/tomo/elements" import _ "git.tebibyte.media/sashakoshka/tomo/backends/all" -import "git.tebibyte.media/sashakoshka/tomo/elements/containers" func main () { tomo.Run(run) @@ -25,7 +24,7 @@ func run () { file.Close() if err != nil { fatalError(window, err); return } - container := containers.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) logoImage := elements.NewImage(logo) button := elements.NewButton("Show me a gopher instead") button.OnClick (func () { @@ -34,11 +33,11 @@ func run () { gopher, _, err := image.Decode(bytes.NewReader(gopher.GopherPng())) if err != nil { fatalError(window, err); return } - container.Adopt(elements.NewImage(gopher),true) + container.AdoptExpand(elements.NewImage(gopher)) }) - container.Adopt(logoImage, true) - container.Adopt(button, false) + container.AdoptExpand(logoImage) + container.Adopt(button) window.Adopt(container) button.Focus() diff --git a/examples/input/main.go b/examples/input/main.go index b0e8a84..e8035c0 100644 --- a/examples/input/main.go +++ b/examples/input/main.go @@ -12,7 +12,7 @@ func main () { func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0)) window.SetTitle("Enter Details") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) // create inputs @@ -45,13 +45,8 @@ func run () { fingerLength.OnChange(check) // add elements to container - container.Adopt(elements.NewLabel("Choose your words carefully.", false), true) - container.Adopt(firstName, false) - container.Adopt(lastName, false) - container.Adopt(fingerLength, false) - container.Adopt(elements.NewSpacer(true), false) - container.Adopt(button, false) - + container.AdoptExpand(elements.NewLabel("Choose your words carefully.")) + container.Adopt(firstName, lastName, fingerLength, elements.NewLine(), button) window.OnClose(tomo.Stop) window.Show() } diff --git a/examples/label/main.go b/examples/label/main.go index 0429587..96dc6a8 100644 --- a/examples/label/main.go +++ b/examples/label/main.go @@ -11,7 +11,7 @@ func main () { func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 480, 360)) window.SetTitle("example label") - window.Adopt(elements.NewLabel(text, true)) + window.Adopt(elements.NewLabelWrapped(text)) window.OnClose(tomo.Stop) window.Show() } diff --git a/examples/list/main.go b/examples/list/main.go index 9f49fee..1e4fbc4 100644 --- a/examples/list/main.go +++ b/examples/list/main.go @@ -14,7 +14,7 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 300, 0)) window.SetTitle("List Sidebar") - container := elements.NewHBox(true, true) + container := elements.NewHBox(elements.SpaceBoth) window.Adopt(container) var currentPage tomo.Element @@ -22,29 +22,30 @@ func run () { if currentPage != nil { container.Disown(currentPage) } - container.Adopt(newPage, true) + container.AdoptExpand(newPage) currentPage = newPage } - intro := elements.NewLabel ( + intro := elements.NewLabelWrapped ( "The List element can be easily used as a sidebar. " + - "Click on entries to flip pages!", true) + "Click on entries to flip pages!") button := elements.NewButton("I do nothing!") button.OnClick (func () { popups.NewDialog(popups.DialogKindInfo, window, "", "Sike!") }) mouse := testing.NewMouse() input := elements.NewTextBox("Write some text", "") - form := elements.NewVBox(false, true) - form.Adopt(elements.NewLabel("I have:", false), false) - form.Adopt(elements.NewSpacer(true), false) - form.Adopt(elements.NewCheckbox("Skin", true), false) - form.Adopt(elements.NewCheckbox("Blood", false), false) - form.Adopt(elements.NewCheckbox("Bone", false), false) + form := elements.NewVBox ( + elements.SpaceMargin, + elements.NewLabel("I have:"), + elements.NewLine(), + elements.NewCheckbox("Skin", true), + elements.NewCheckbox("Blood", false), + elements.NewCheckbox("Bone", false)) art := testing.NewArtist() makePage := func (name string, callback func ()) tomo.Selectable { - cell := elements.NewCell(elements.NewLabel(name, false)) + cell := elements.NewCell(elements.NewLabel(name)) cell.OnSelectionChange (func () { if cell.Selected() { callback() } }) @@ -60,7 +61,7 @@ func run () { makePage("art", func () { turnPage(art) })) list.Collapse(96, 0) - container.Adopt(list, false) + container.Adopt(list) turnPage(intro) window.OnClose(tomo.Stop) diff --git a/examples/panels/main.go b/examples/panels/main.go index 0141795..b28b204 100644 --- a/examples/panels/main.go +++ b/examples/panels/main.go @@ -14,8 +14,9 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(200, 200, 256, 256)) window.SetTitle("Main") - container := elements.NewVBox(true, true) - container.Adopt(elements.NewLabel("Main window", false), true) + container := elements.NewVBox ( + elements.SpaceBoth, + elements.NewLabel("Main window")) window.Adopt(container) window.OnClose(tomo.Stop) @@ -31,8 +32,9 @@ func createPanel (parent tomo.MainWindow, id int, bounds image.Rectangle) { window, _ := parent.NewPanel(bounds) title := fmt.Sprint("Panel #", id) window.SetTitle(title) - container := containers.NewVBox(true, true) - container.Adopt(elements.NewLabel(title, false), true) + container := elements.NewVBox ( + elements.SpaceBoth, + elements.NewLabel(title)) window.Adopt(container) window.Show() } diff --git a/examples/popups/main.go b/examples/popups/main.go index eb4f395..4b2c83a 100644 --- a/examples/popups/main.go +++ b/examples/popups/main.go @@ -14,10 +14,10 @@ func run () { if err != nil { panic(err.Error()) } window.SetTitle("Dialog Boxes") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) - container.Adopt(elements.NewLabel("Try out different dialogs:", false), true) + container.AdoptExpand(elements.NewLabel("Try out different dialogs:")) infoButton := elements.NewButton("popups.DialogKindInfo") infoButton.OnClick (func () { @@ -27,7 +27,7 @@ func run () { "Information", "You are wacky") }) - container.Adopt(infoButton, false) + container.Adopt(infoButton) infoButton.Focus() questionButton := elements.NewButton("popups.DialogKindQuestion") @@ -41,7 +41,7 @@ func run () { popups.Button { "No", func () { } }, popups.Button { "Not sure", func () { } }) }) - container.Adopt(questionButton, false) + container.Adopt(questionButton) warningButton := elements.NewButton("popups.DialogKindWarning") warningButton.OnClick (func () { @@ -51,7 +51,7 @@ func run () { "Warning", "They are fast approaching.") }) - container.Adopt(warningButton, false) + container.Adopt(warningButton) errorButton := elements.NewButton("popups.DialogKindError") errorButton.OnClick (func () { @@ -61,7 +61,7 @@ func run () { "Error", "There is nowhere left to go.") }) - container.Adopt(errorButton, false) + container.Adopt(errorButton) menuButton := elements.NewButton("menu") menuButton.OnClick (func () { @@ -70,14 +70,14 @@ func run () { tomo.Bounds(0, 0, 64, 64). Add(menuButton.Entity().Bounds().Min)) if err != nil { println(err.Error()) } - menu.Adopt(elements.NewLabel("I'm a shy window...", true)) + menu.Adopt(elements.NewLabelWrapped("I'm a shy window...")) menu.Show() }) - container.Adopt(menuButton, false) + container.Adopt(menuButton) cancelButton := elements.NewButton("No thank you.") cancelButton.OnClick(tomo.Stop) - container.Adopt(cancelButton, false) + container.Adopt(cancelButton) window.OnClose(tomo.Stop) window.Show() diff --git a/examples/progress/main.go b/examples/progress/main.go index 33831b9..0fad66b 100644 --- a/examples/progress/main.go +++ b/examples/progress/main.go @@ -13,16 +13,15 @@ func main () { func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0)) window.SetTitle("Approaching") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) - container.Adopt (elements.NewLabel ( - "Rapidly approaching your location...", false), false) + container.AdoptExpand(elements.NewLabel("Rapidly approaching your location...")) bar := elements.NewProgressBar(0) - container.Adopt(bar, false) + container.Adopt(bar) button := elements.NewButton("Stop") button.SetEnabled(false) - container.Adopt(button, false) + container.Adopt(button) window.OnClose(tomo.Stop) window.Show() diff --git a/examples/raycaster/main.go b/examples/raycaster/main.go index b0c8906..46e0471 100644 --- a/examples/raycaster/main.go +++ b/examples/raycaster/main.go @@ -21,7 +21,7 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 640, 480)) window.SetTitle("Raycaster") - container := elements.NewVBox(false, false) + container := elements.NewVBox(elements.SpaceNone) window.Adopt(container) wallTexture, _ := TextureFrom(bytes.NewReader(wallTextureBytes)) @@ -48,16 +48,16 @@ func run () { wallTexture, }) - topBar := containers.NewHBox(true, true) + topBar := elements.NewHBox(elements.SpaceBoth) staminaBar := elements.NewProgressBar(game.Stamina()) healthBar := elements.NewProgressBar(game.Health()) - topBar.Adopt(elements.NewLabel("Stamina:", false), false) - topBar.Adopt(staminaBar, true) - topBar.Adopt(elements.NewLabel("Health:", false), false) - topBar.Adopt(healthBar, true) - container.Adopt(topBar, false) - container.Adopt(game, true) + topBar.Adopt(elements.NewLabel("Stamina:")) + topBar.AdoptExpand(staminaBar) + topBar.Adopt(elements.NewLabel("Health:")) + topBar.AdoptExpand(healthBar) + container.Adopt(topBar) + container.AdoptExpand(game) game.Focus() game.OnStatUpdate (func () { diff --git a/examples/scroll/main.go b/examples/scroll/main.go index 83aa521..05cbbdf 100644 --- a/examples/scroll/main.go +++ b/examples/scroll/main.go @@ -12,12 +12,12 @@ func main () { func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 360, 240)) window.SetTitle("Scroll") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) textBox := elements.NewTextBox("", copypasta) - disconnectedContainer := elements.NewHBox(false, true) + disconnectedContainer := elements.NewHBox(elements.SpaceMargin) list := elements.NewList ( 2, elements.NewCell(elements.NewCheckbox("Item 0", true)), @@ -42,8 +42,9 @@ func run () { elements.NewCell(elements.NewCheckbox("Item 19", false)), elements.NewCell(elements.NewCheckbox("Item 20", true)), elements.NewCell(elements.NewCheckbox("Item 21", false)), - elements.NewCell (elements.NewScroll (elements.NewTextBox ( - "", "I bet you weren't expecting this!"), true, false))) + elements.NewCell(elements.NewScroll ( + elements.ScrollHorizontal, + elements.NewTextBox("", "I bet you weren't expecting this!")))) list.Collapse(0, 32) scrollBar := elements.NewScrollBar(true) list.OnScrollBoundsChange (func () { @@ -55,16 +56,16 @@ func run () { list.ScrollTo(viewport) }) - container.Adopt(elements.NewLabel("A ScrollContainer:", false), false) - container.Adopt(elements.NewScroll(textBox, true, false), false) - disconnectedContainer.Adopt(list, false) - disconnectedContainer.Adopt (elements.NewLabel ( + container.Adopt(elements.NewLabel("A ScrollContainer:")) + container.Adopt(elements.NewScroll(elements.ScrollHorizontal, textBox)) + disconnectedContainer.Adopt(list) + disconnectedContainer.AdoptExpand(elements.NewLabelWrapped ( "Notice how the scroll bar to the right can be used to " + "control the list, despite not even touching it. It is " + "indeed a thing you can do. It is also terrible UI design so " + - "don't do it.", true), true) - disconnectedContainer.Adopt(scrollBar, false) - container.Adopt(disconnectedContainer, true) + "don't do it.")) + disconnectedContainer.Adopt(scrollBar) + container.AdoptExpand(disconnectedContainer) window.OnClose(tomo.Stop) window.Show() diff --git a/examples/spacer/main.go b/examples/spacer/main.go index e74dbba..a537a37 100644 --- a/examples/spacer/main.go +++ b/examples/spacer/main.go @@ -12,15 +12,15 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0)) window.SetTitle("Spaced Out") - container := elements.NewVBox(true, true) - window.Adopt(container) - - container.Adopt (elements.NewLabel("This is at the top", false), false) - container.Adopt (elements.NewSpacer(true), false) - container.Adopt (elements.NewLabel("This is in the middle", false), false) - container.Adopt (elements.NewSpacer(false), true) - container.Adopt (elements.NewLabel("This is at the bottom", false), false) + container := elements.NewVBox ( + elements.SpaceBoth, + elements.NewLabel("This is at the top"), + elements.NewLine(), + elements.NewLabel("This is in the middle")) + container.AdoptExpand(elements.NewSpacer()) + container.Adopt(elements.NewLabel("This is at the bottom")) + window.Adopt(container) window.OnClose(tomo.Stop) window.Show() } diff --git a/examples/switch/main.go b/examples/switch/main.go index fa38c92..70c2b88 100644 --- a/examples/switch/main.go +++ b/examples/switch/main.go @@ -12,12 +12,12 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 0, 0)) window.SetTitle("Switches") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) window.Adopt(container) - container.Adopt(elements.NewSwitch("hahahah", false), false) - container.Adopt(elements.NewSwitch("hehehehheheh", false), false) - container.Adopt(elements.NewSwitch("you can flick da swicth", false), false) + container.Adopt(elements.NewSwitch("hahahah", false)) + container.Adopt(elements.NewSwitch("hehehehheheh", false)) + container.Adopt(elements.NewSwitch("you can flick da swicth", false)) window.OnClose(tomo.Stop) window.Show() diff --git a/examples/vbox/main.go b/examples/vbox/main.go index d90edb0..3c6bfd9 100644 --- a/examples/vbox/main.go +++ b/examples/vbox/main.go @@ -13,26 +13,25 @@ func run () { window, _ := tomo.NewWindow(tomo.Bounds(0, 0, 128, 128)) window.SetTitle("vertical stack") - container := elements.NewVBox(true, true) + container := elements.NewVBox(elements.SpaceBoth) - label := elements.NewLabel("it is a label hehe", true) + label := elements.NewLabelWrapped("it is a label hehe") button := elements.NewButton("drawing pad") okButton := elements.NewButton("OK") button.OnClick (func () { container.DisownAll() - container.Adopt(elements.NewLabel("Draw here:", false), false) - container.Adopt(testing.NewMouse(), true) - container.Adopt(okButton, false) + container.Adopt(elements.NewLabel("Draw here (not really):")) + container.AdoptExpand(testing.NewMouse()) + container.Adopt(okButton) okButton.Focus() }) okButton.OnClick(tomo.Stop) - - container.Adopt(label, true) - container.Adopt(button, false) - container.Adopt(okButton, false) - okButton.Focus() - + + container.AdoptExpand(label) + container.Adopt(button, okButton) window.Adopt(container) + + okButton.Focus() window.OnClose(tomo.Stop) window.Show() }