Files
AynaLivePlayer/gui/component/lyrics/lyricline.go
2025-10-06 23:52:10 +08:00

98 lines
1.9 KiB
Go

package lyrics
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/driver/desktop"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
type lyricLine struct {
widget.BaseWidget
Text string
SizeName fyne.ThemeSizeName
ColorName fyne.ThemeColorName
HoveredColorName fyne.ThemeColorName
Alignment fyne.TextAlign
Tappable bool
onTapped func()
hovered bool
richtext *widget.RichText
}
func newLyricLine(text string, onTapped func()) *lyricLine {
l := &lyricLine{
Text: text,
SizeName: theme.SizeNameSubHeadingText,
ColorName: theme.ColorNameForeground,
Alignment: fyne.TextAlignLeading,
onTapped: onTapped,
}
l.ExtendBaseWidget(l)
return l
}
var _ desktop.Hoverable = (*lyricLine)(nil)
func (l *lyricLine) MouseIn(*desktop.MouseEvent) {
if l.Tappable {
l.hovered = true
l.Refresh()
}
}
func (l *lyricLine) MouseMoved(*desktop.MouseEvent) {
}
func (l *lyricLine) MouseOut() {
l.hovered = false
l.Refresh()
}
var _ desktop.Cursorable = (*lyricLine)(nil)
func (l *lyricLine) Cursor() desktop.Cursor {
if l.Tappable {
return desktop.PointerCursor
}
return desktop.DefaultCursor
}
var _ fyne.Tappable = (*lyricLine)(nil)
func (l *lyricLine) Tapped(*fyne.PointEvent) {
if l.Tappable {
l.onTapped()
}
}
func (l *lyricLine) updateRichText() {
if l.richtext == nil {
l.richtext = widget.NewRichText(&widget.TextSegment{
Style: widget.RichTextStyleSubHeading,
})
l.richtext.Wrapping = fyne.TextWrapWord
}
seg := l.richtext.Segments[0].(*widget.TextSegment)
seg.Text = l.Text
seg.Style.Alignment = l.Alignment
if l.hovered {
seg.Style.ColorName = l.HoveredColorName
} else {
seg.Style.ColorName = l.ColorName
}
seg.Style.SizeName = l.SizeName
}
func (l *lyricLine) Refresh() {
l.updateRichText()
l.richtext.Refresh()
}
func (l *lyricLine) CreateRenderer() fyne.WidgetRenderer {
l.updateRichText()
return widget.NewSimpleRenderer(l.richtext)
}