This repository has been archived on 2023-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
tomo-old/elements/basic/listentry.go

74 lines
1.6 KiB
Go
Raw Normal View History

2023-01-23 07:05:09 +00:00
package basic
import "image"
import "git.tebibyte.media/sashakoshka/tomo"
import "git.tebibyte.media/sashakoshka/tomo/theme"
import "git.tebibyte.media/sashakoshka/tomo/artist"
// ListEntry is an item that can be added to a list.
type ListEntry struct {
drawer artist.TextDrawer
bounds image.Rectangle
textPoint image.Point
text string
forcedMinimumWidth int
2023-01-24 21:41:12 +00:00
onSelect func ()
2023-01-23 07:05:09 +00:00
}
2023-01-24 21:41:12 +00:00
func NewListEntry (text string, onSelect func ()) (entry ListEntry) {
2023-01-23 07:05:09 +00:00
entry = ListEntry {
2023-01-24 21:41:12 +00:00
text: text,
onSelect: onSelect,
2023-01-23 07:05:09 +00:00
}
entry.drawer.SetText([]rune(text))
entry.drawer.SetFace(theme.FontFaceRegular())
entry.updateBounds()
return
}
func (entry *ListEntry) Collapse (width int) {
if entry.forcedMinimumWidth == width { return }
entry.forcedMinimumWidth = width
entry.updateBounds()
}
func (entry *ListEntry) updateBounds () {
2023-01-24 04:54:12 +00:00
padding := theme.Padding()
2023-01-23 07:05:09 +00:00
entry.bounds = image.Rectangle { }
2023-01-24 04:54:12 +00:00
entry.bounds.Max.Y = entry.drawer.LineHeight().Round() + padding
2023-01-23 07:05:09 +00:00
if entry.forcedMinimumWidth > 0 {
2023-01-24 04:54:12 +00:00
entry.bounds.Max.X = entry.forcedMinimumWidth
} else {
entry.bounds.Max.X =
entry.drawer.LayoutBounds().Dx() + padding * 2
2023-01-23 07:05:09 +00:00
}
2023-01-24 04:54:12 +00:00
entry.textPoint =
image.Pt(padding, padding / 2).
Sub(entry.drawer.LayoutBounds().Min)
2023-01-23 07:05:09 +00:00
}
func (entry *ListEntry) Draw (
destination tomo.Canvas,
offset image.Point,
selected bool,
) (
updatedRegion image.Rectangle,
) {
return entry.drawer.Draw (
destination,
theme.ForegroundPattern(true),
offset.Add(entry.textPoint))
}
2023-01-24 21:41:12 +00:00
func (entry *ListEntry) RunSelect () {
if entry.onSelect != nil {
entry.onSelect()
}
}
2023-01-23 07:05:09 +00:00
func (entry *ListEntry) Bounds () (bounds image.Rectangle) {
return entry.bounds
}