diff --git a/artist/line.go b/artist/line.go index 72301ab..265698f 100644 --- a/artist/line.go +++ b/artist/line.go @@ -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, diff --git a/elements/basic/list.go b/elements/basic/list.go index a1a12a5..5b71ab8 100644 --- a/elements/basic/list.go +++ b/elements/basic/list.go @@ -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 } diff --git a/elements/basic/listentry.go b/elements/basic/listentry.go index e74b665..cbb7b59 100644 --- a/elements/basic/listentry.go +++ b/elements/basic/listentry.go @@ -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 } diff --git a/elements/testing/mouse.go b/elements/testing/mouse.go index df8954f..56a36ad 100644 --- a/elements/testing/mouse.go +++ b/elements/testing/mouse.go @@ -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) { diff --git a/examples/list/main.go b/examples/list/main.go new file mode 100644 index 0000000..7885cae --- /dev/null +++ b/examples/list/main.go @@ -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() +}