Added a list example

This commit is contained in:
Sasha Koshka 2023-01-24 16:41:12 -05:00
parent 68f1d052d2
commit 5edfbf8110
5 changed files with 83 additions and 12 deletions

View File

@ -123,6 +123,8 @@ func abs (in int) (out int) {
return
}
// TODO: this method of doing things sucks and can cause a segfault. we should
// not be doing it this way
func squareAround (
data []color.RGBA,
stride int,

View File

@ -359,6 +359,9 @@ func (element *List) selectUnderMouse (x, y int) (updated bool) {
if element.onSelectedEntryChange != nil {
element.onSelectedEntryChange(element.selectedEntry)
}
if element.selectedEntry >= 0 {
element.entries[element.selectedEntry].RunSelect()
}
return true
}

View File

@ -12,13 +12,13 @@ type ListEntry struct {
textPoint image.Point
text string
forcedMinimumWidth int
onClick func ()
onSelect func ()
}
func NewListEntry (text string, onClick func ()) (entry ListEntry) {
func NewListEntry (text string, onSelect func ()) (entry ListEntry) {
entry = ListEntry {
text: text,
onClick: onClick,
text: text,
onSelect: onSelect,
}
entry.drawer.SetText([]rune(text))
entry.drawer.SetFace(theme.FontFaceRegular())
@ -62,6 +62,12 @@ func (entry *ListEntry) Draw (
offset.Add(entry.textPoint))
}
func (entry *ListEntry) RunSelect () {
if entry.onSelect != nil {
entry.onSelect()
}
}
func (entry *ListEntry) Bounds () (bounds image.Rectangle) {
return entry.bounds
}

View File

@ -28,22 +28,23 @@ func NewMouse () (element *Mouse) {
func (element *Mouse) Resize (width, height int) {
element.core.AllocateCanvas(width, height)
bounds := element.Bounds()
artist.FillRectangle (
element.core,
theme.AccentPattern(),
element.Bounds())
bounds)
artist.StrokeRectangle (
element.core,
artist.NewUniform(color.Black), 1,
element.Bounds())
artist.Line (
element.core, artist.NewUniform(color.White), 3,
image.Pt(1, 1),
image.Pt(width - 2, height - 2))
bounds)
artist.Line (
element.core, artist.NewUniform(color.White), 1,
image.Pt(1, height - 2),
image.Pt(width - 2, 1))
image.Pt(1, 1),
image.Pt(bounds.Dx() - 2, bounds.Dy() - 2))
artist.Line (
element.core, artist.NewUniform(color.White), 1,
image.Pt(1, bounds.Dy() - 2),
image.Pt(bounds.Dx() - 2, 1))
}
func (element *Mouse) HandleMouseDown (x, y int, button tomo.Button) {

59
examples/list/main.go Normal file
View File

@ -0,0 +1,59 @@
package main
import "git.tebibyte.media/sashakoshka/tomo"
import "git.tebibyte.media/sashakoshka/tomo/popups"
import "git.tebibyte.media/sashakoshka/tomo/layouts"
import "git.tebibyte.media/sashakoshka/tomo/elements/basic"
import "git.tebibyte.media/sashakoshka/tomo/elements/testing"
import _ "git.tebibyte.media/sashakoshka/tomo/backends/x"
func main () {
tomo.Run(run)
}
func run () {
window, _ := tomo.NewWindow(300, 2)
window.SetTitle("List Sidebar")
container := basic.NewContainer(layouts.Horizontal { true, true })
window.Adopt(container)
var currentPage tomo.Element
turnPage := func (newPage tomo.Element) {
container.Warp (func () {
if currentPage != nil {
container.Disown(currentPage)
}
container.Adopt(newPage, true)
currentPage = newPage
})
}
button := basic.NewButton("I do nothing!")
button.OnClick (func () {
popups.NewDialog(popups.DialogKindInfo, "", "Sike!")
})
mouse := testing.NewMouse()
input := basic.NewTextBox("Write some text", "")
form := basic.NewContainer(layouts.Vertical { true, false})
form.Adopt(basic.NewLabel("I have:", false), false)
form.Adopt(basic.NewSpacer(true), false)
form.Adopt(basic.NewCheckbox("Skin", true), false)
form.Adopt(basic.NewCheckbox("Blood", false), false)
form.Adopt(basic.NewCheckbox("Bone", false), false)
list := basic.NewList (
basic.NewListEntry("button", func () { turnPage(button) }),
basic.NewListEntry("mouse", func () { turnPage(mouse) }),
basic.NewListEntry("input", func () { turnPage(input) }),
basic.NewListEntry("form", func () { turnPage(form) }))
list.Collapse(96, 0)
container.Adopt(list, false)
turnPage (basic.NewLabel (
"The List element can be easily used as a sidebar. " +
"Click on entries to flip pages!", true))
window.OnClose(tomo.Stop)
window.Show()
}