diff --git a/lyrics.go b/lyrics.go index 2032ea8..3adaaab 100644 --- a/lyrics.go +++ b/lyrics.go @@ -24,6 +24,7 @@ import ( var lyricsTxt *fynesyncedlyrics.LyricsViewer var lyricsRect *canvas.Rectangle var lyricsAlt *widget.RichText +var lyricPage *fyne.Container func lyricsPage(w fyne.Window) fyne.CanvasObject { lyricsTxt = fynesyncedlyrics.NewLyricsViewer() @@ -31,11 +32,9 @@ func lyricsPage(w fyne.Window) fyne.CanvasObject { lyricsAlt = widget.NewRichText() lyricsAlt.Hide() - page := container.NewStack(lyricsRect, container.NewCenter(lyricsAlt), lyricsTxt) - //lyricsTxt.ActiveLyricPosition = fynesyncedlyrics.ActiveLyricPositionTop - lyricsTxt.TextSizeName = theme.SizeNameHeadingText + lyricPage = container.NewStack(lyricsRect, container.NewCenter(lyricsAlt), lyricsTxt) - editor := lyricsEditorPage(w, page) + editor := lyricsEditorPage(w, lyricPage) editor.Hide() return container.NewBorder(container.NewHBox( @@ -62,14 +61,14 @@ func lyricsPage(w fyne.Window) fyne.CanvasObject { return } editor.Show() - page.Hide() + lyricPage.Hide() } else { editor.Hide() - page.Show() + lyricPage.Show() } }, }, - ), nil, nil, nil, page, editor) + ), nil, nil, nil, lyricPage, editor) } func syncedLyricsEditorPage() fyne.CanvasObject { diff --git a/main.go b/main.go index 873a6ad..5a18f33 100644 --- a/main.go +++ b/main.go @@ -162,7 +162,8 @@ func main() { songProgressSlider = widget.NewSlider(0, 0) songProgressSlider.Disable() - songVolumeSlider = widget.NewSlider(-10, 10) + songVolumeSlider = widget.NewSlider(-2, 2) + songVolumeSlider.Step = 0.01 posd, fulld = widget.NewRichText(&widget.TextSegment{Text: "0:00", Style: widget.RichTextStyle{ColorName: theme.ColorNameDisabled}}), widget.NewRichText(&widget.TextSegment{Text: "-:--", Style: widget.RichTextStyle{ColorName: theme.ColorNameDisabled}}) prevf := 0.0 @@ -192,9 +193,10 @@ func main() { volumeIcon := widget.NewIcon(theme.VolumeMuteIcon()) songVolumeSlider.OnChanged = func(f float64) { + player.SetMute(f == -1) player.SetVolume(f) switch { - case f == -10: + case f == -2: volumeIcon.SetResource(theme.VolumeMuteIcon()) case f >= 0: volumeIcon.SetResource(theme.VolumeUpIcon()) diff --git a/player/player.go b/player/player.go index 3737e13..b05b936 100644 --- a/player/player.go +++ b/player/player.go @@ -143,6 +143,14 @@ func (p *Player) SetVolume(v float64) { p.streamer.SetVolume(v) } +func (p *Player) SetMute(b bool) { + p.streamer.SetMute(b) +} + +func (p *Player) Mute() bool { + return p.streamer.Mute() +} + func (p *Player) Queue() []*Song { return p.queue } diff --git a/songs.go b/songs.go index bb53af8..5c1c7ba 100644 --- a/songs.go +++ b/songs.go @@ -17,9 +17,15 @@ import ( "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" + fynesyncedlyrics "github.com/dweymouth/fyne-lyrics" ) func getLyrics(song *pl.Song) { + lyricsTxt = fynesyncedlyrics.NewLyricsViewer() + lyricsTxt.TextSizeName = theme.SizeNameHeadingText + lyricPage.Objects[2] = lyricsTxt + lyricPage.Refresh() + source := preferences.Preferences.String("lyrics.source") var err error @@ -73,7 +79,6 @@ func setPlayedSong(song *pl.Song, w fyne.Window) { getLyrics(song) - lyricsTxt.SetCurrentLine(0) pause.SetIcon(theme.MediaPauseIcon()) d, err := http.Get(song.Thumbnails.Min().URL) diff --git a/streamer/streamer.go b/streamer/streamer.go index 4a45880..4f1cb82 100644 --- a/streamer/streamer.go +++ b/streamer/streamer.go @@ -56,6 +56,14 @@ func (s *Streamer) Volume() float64 { return s.v.Volume } +func (s *Streamer) SetMute(b bool) { + s.v.Silent = b +} + +func (s *Streamer) Mute() bool { + return s.v.Silent +} + func (s *Streamer) Stream(samples [][2]float64) (n int, ok bool) { return s.r.Stream(samples) } diff --git a/util/hebrewfix.go b/util/hebrewfix.go new file mode 100644 index 0000000..83e1a3d --- /dev/null +++ b/util/hebrewfix.go @@ -0,0 +1,52 @@ +package util + +import "strings" + +const ( + hebrewRangeMin = 1470 + hebrewRangeMax = 1524 +) + +func reverse[T comparable](sl []T) []T { + rev := make([]T, len(sl)) + for i := range sl { + rev[i] = sl[len(sl)-1-i] + } + return rev +} + +func HebrewFix(s string) string { + var has bool + words := strings.Split(s, " ") + for i, word := range words { + if checkHeb(word) { + has = true + var ( + hebrewPart, englishPart string + hebrewPartDone bool + ) + for _, char := range word { + if hebrewPartDone { + englishPart += string(char) + } else { + if char >= hebrewRangeMin && char <= hebrewRangeMax { + hebrewPart += string(char) + } else { + hebrewPartDone = true + englishPart += string(char) + } + } + } + words[i] = englishPart + string(reverse([]rune(hebrewPart))) + } + } + if has { + words = reverse(words) + } + return strings.Join(words, " ") +} + +func checkHeb(s string) bool { + r := []rune(s) + return r[0] >= hebrewRangeMin && r[0] <= hebrewRangeMax +}