mirror of
https://github.com/AynaLivePlayer/AynaLivePlayer.git
synced 2025-12-10 04:08:13 +08:00
98 lines
1.9 KiB
Go
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)
|
|
}
|