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

104 lines
2.4 KiB
Go
Raw Normal View History

2023-02-01 23:48:16 -07:00
package basicElements
2023-01-23 00:05:09 -07:00
import "image"
import "git.tebibyte.media/sashakoshka/tomo/theme"
2023-02-07 09:27:59 -07:00
import "git.tebibyte.media/sashakoshka/tomo/config"
2023-02-01 23:48:16 -07:00
import "git.tebibyte.media/sashakoshka/tomo/canvas"
2023-01-23 00:05:09 -07:00
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-02-07 22:22:40 -07:00
2023-02-08 12:36:14 -07:00
config config.Wrapped
theme theme.Wrapped
2023-02-07 22:22:40 -07:00
onSelect func ()
2023-01-23 00:05:09 -07:00
}
2023-01-24 14:41:12 -07:00
func NewListEntry (text string, onSelect func ()) (entry ListEntry) {
2023-01-23 00:05:09 -07:00
entry = ListEntry {
2023-01-24 14:41:12 -07:00
text: text,
onSelect: onSelect,
2023-01-23 00:05:09 -07:00
}
2023-02-08 12:36:14 -07:00
entry.theme.Case = theme.C("basic", "listEntry")
2023-01-23 00:05:09 -07:00
entry.drawer.SetText([]rune(text))
entry.updateBounds()
return
}
func (entry *ListEntry) Collapse (width int) {
if entry.forcedMinimumWidth == width { return }
entry.forcedMinimumWidth = width
entry.updateBounds()
}
2023-02-07 09:27:59 -07:00
func (entry *ListEntry) SetTheme (new theme.Theme) {
2023-02-08 12:36:14 -07:00
if new == entry.theme.Theme { return }
entry.theme.Theme = new
2023-02-07 09:27:59 -07:00
entry.drawer.SetFace (entry.theme.FontFace (
theme.FontStyleRegular,
2023-02-08 12:36:14 -07:00
theme.FontSizeNormal))
2023-02-07 09:27:59 -07:00
entry.updateBounds()
}
2023-02-08 12:36:14 -07:00
func (entry *ListEntry) SetConfig (new config.Config) {
if new == entry.config.Config { return }
entry.config.Config = new
2023-02-07 09:27:59 -07:00
}
2023-01-23 00:05:09 -07:00
func (entry *ListEntry) updateBounds () {
entry.bounds = image.Rectangle { }
entry.bounds.Max.Y = entry.drawer.LineHeight().Round()
2023-01-23 00:05:09 -07:00
if entry.forcedMinimumWidth > 0 {
2023-01-23 21:54:12 -07:00
entry.bounds.Max.X = entry.forcedMinimumWidth
} else {
entry.bounds.Max.X = entry.drawer.LayoutBounds().Dx()
2023-01-23 00:05:09 -07:00
}
2023-02-08 12:36:14 -07:00
inset := entry.theme.Inset(theme.PatternRaised)
entry.bounds.Max.Y += inset[0] + inset[2]
2023-01-23 21:54:12 -07:00
entry.textPoint =
image.Pt(inset[3], inset[0]).
2023-01-23 21:54:12 -07:00
Sub(entry.drawer.LayoutBounds().Min)
2023-01-23 00:05:09 -07:00
}
func (entry *ListEntry) Draw (
2023-02-01 23:48:16 -07:00
destination canvas.Canvas,
2023-01-23 00:05:09 -07:00
offset image.Point,
2023-01-30 15:01:47 -07:00
focused bool,
on bool,
2023-01-23 00:05:09 -07:00
) (
updatedRegion image.Rectangle,
) {
2023-02-07 09:27:59 -07:00
state := theme.PatternState {
2023-01-30 15:01:47 -07:00
Focused: focused,
On: on,
2023-02-07 09:27:59 -07:00
}
2023-02-08 12:36:14 -07:00
pattern := entry.theme.Pattern (theme.PatternRaised, state)
artist.FillRectangle (
destination,
pattern,
entry.Bounds().Add(offset))
2023-02-08 12:36:14 -07:00
foreground := entry.theme.Pattern (theme.PatternForeground, state)
2023-01-23 00:05:09 -07:00
return entry.drawer.Draw (
destination,
foreground,
2023-01-23 00:05:09 -07:00
offset.Add(entry.textPoint))
}
2023-01-24 14:41:12 -07:00
func (entry *ListEntry) RunSelect () {
if entry.onSelect != nil {
entry.onSelect()
}
}
2023-01-23 00:05:09 -07:00
func (entry *ListEntry) Bounds () (bounds image.Rectangle) {
return entry.bounds
}