Files
go2tv/internal/gui/settings.go
2025-01-05 01:02:04 +02:00

222 lines
6.5 KiB
Go

//go:build !(android || ios)
// +build !android,!ios
package gui
import (
"os/exec"
"path/filepath"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/lang"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func settingsWindow(s *FyneScreen) fyne.CanvasObject {
w := s.Current
themeText := widget.NewLabel(lang.L("Theme"))
dropdownTheme := widget.NewSelect([]string{lang.L("System Default"), lang.L("Light"), lang.L("Dark")}, parseTheme)
languageText := widget.NewLabel(lang.L("Language"))
dropdownLanguage := widget.NewSelect([]string{lang.L("System Default"), "English", "中文(简体)"}, parseLanguage(s))
selectedLanguage := fyne.CurrentApp().Preferences().StringWithFallback("Language", "System Default")
if selectedLanguage == "System Default" {
selectedLanguage = lang.L("System Default")
}
dropdownLanguage.PlaceHolder = selectedLanguage
themeName := lang.L(fyne.CurrentApp().Preferences().StringWithFallback("Theme", "System Default"))
dropdownTheme.PlaceHolder = themeName
parseTheme(themeName)
s.systemTheme = fyne.CurrentApp().Settings().ThemeVariant()
ffmpegText := widget.NewLabel("ffmpeg " + lang.L("Path"))
ffmpegTextEntry := widget.NewEntry()
ffmpegFolderReset := widget.NewButtonWithIcon("", theme.CancelIcon(), func() {
path, err := exec.LookPath("ffmpeg")
ffmpegTextEntry.SetText(path)
if err != nil {
ffmpegTextEntry.SetText("ffmpeg")
}
s.ffmpegPath = ffmpegTextEntry.Text
})
ffmpegFolderSelect := widget.NewButtonWithIcon("", theme.FolderOpenIcon(), func() {
fd := dialog.NewFolderOpen(func(lu fyne.ListableURI, err error) {
if err != nil {
dialog.ShowError(err, w)
return
}
if lu == nil {
return
}
p := filepath.ToSlash(lu.Path() + string(filepath.Separator) + "ffmpeg")
ffmpegTextEntry.SetText(p)
}, w)
fd.Resize(fyne.NewSize(w.Canvas().Size().Width*1.2, w.Canvas().Size().Height*1.3))
fd.Show()
})
ffmpegRightButtons := container.NewHBox(ffmpegFolderSelect, ffmpegFolderReset)
ffmpegPathControls := container.New(layout.NewBorderLayout(nil, nil, nil, ffmpegRightButtons), ffmpegRightButtons, ffmpegTextEntry)
ffmpegTextEntry.Text = func() string {
if fyne.CurrentApp().Preferences().String("ffmpeg") != "" {
return fyne.CurrentApp().Preferences().String("ffmpeg")
}
path, _ := exec.LookPath("ffmpeg")
return path
}()
ffmpegTextEntry.Refresh()
s.ffmpegPath = ffmpegTextEntry.Text
ffmpegTextEntry.OnChanged = func(update string) {
s.ffmpegPath = update
fyne.CurrentApp().Preferences().SetString("ffmpeg", update)
s.ffmpegPathChanged = true
}
debugText := widget.NewLabel(lang.L("Debug"))
debugExport := widget.NewButton(lang.L("Export Debug Logs"), func() {
var itemInRing bool
s.Debug.ring.Do(func(p interface{}) {
if p != nil {
itemInRing = true
}
})
if !itemInRing {
dialog.ShowInformation(lang.L("Debug"), lang.L("Debug logs are empty"), w)
return
}
fd := dialog.NewFileSave(func(writer fyne.URIWriteCloser, err error) {
if err != nil {
dialog.ShowError(err, s.Current)
return
}
if writer == nil {
return
}
saveDebugLogs(writer, s)
}, s.Current)
fd.Resize(fyne.NewSize(w.Canvas().Size().Width*1.2, w.Canvas().Size().Height*1.3))
fd.Show()
})
gaplessText := widget.NewLabel(lang.L("Gapless Playback"))
gaplessdropdown := widget.NewSelect([]string{lang.L("Enabled"), lang.L("Disabled")}, func(ss string) {
var selection string
if lang.L("Enabled") == ss {
selection = "Enabled"
}
if lang.L("Disabled") == ss {
selection = "Disabled"
}
if selection == "Enabled" && fyne.CurrentApp().Preferences().StringWithFallback("Gapless", "Disabled") == "Disabled" {
dialog.ShowInformation(lang.L("Gapless Playback"), lang.L(`Some devices don't support gapless playback. If 'Auto-Play Next File' isn't working properly, try turning it off.`), w)
}
fyne.CurrentApp().Preferences().SetString("Gapless", selection)
if s.NextMediaCheck.Checked {
switch selection {
case "Enabled":
switch s.State {
case "Playing", "Paused":
newTVPayload, err := queueNext(s, false)
if err == nil && s.GaplessMediaWatcher == nil {
s.GaplessMediaWatcher = gaplessMediaWatcher
go s.GaplessMediaWatcher(s.serverStopCTX, s, newTVPayload)
}
}
case "Disabled":
// We're disabling gapless playback. If for some reason
// we fail to clear the NextURI it would be best to stop and
// avoid inconsistencies where gapless playback appears disabled
// but in reality it's not.
_, err := queueNext(s, true)
if err != nil {
stopAction(s)
}
}
}
})
gaplessOption := fyne.CurrentApp().Preferences().StringWithFallback("Gapless", "Disabled")
gaplessdropdown.SetSelected(lang.L(gaplessOption))
dropdownTheme.Refresh()
return container.New(layout.NewFormLayout(), themeText, dropdownTheme, languageText, dropdownLanguage, gaplessText, gaplessdropdown, ffmpegText, ffmpegPathControls, debugText, debugExport)
}
func saveDebugLogs(f fyne.URIWriteCloser, s *FyneScreen) {
w := s.Current
defer f.Close()
s.Debug.ring.Do(func(p interface{}) {
if p != nil {
_, err := f.Write([]byte(p.(string)))
if err != nil {
dialog.ShowError(err, w)
}
}
})
dialog.ShowInformation(lang.L("Debug"), lang.L("Saved to")+"... "+f.URI().String(), w)
}
func parseTheme(t string) {
go func() {
time.Sleep(10 * time.Millisecond)
switch t {
case lang.L("Light"):
fyne.CurrentApp().Settings().SetTheme(go2tvTheme{"Light"})
fyne.CurrentApp().Preferences().SetString("Theme", "Light")
case lang.L("Dark"):
fyne.CurrentApp().Settings().SetTheme(go2tvTheme{"Dark"})
fyne.CurrentApp().Preferences().SetString("Theme", "Dark")
default:
fyne.CurrentApp().Settings().SetTheme(go2tvTheme{"System Default"})
fyne.CurrentApp().Preferences().SetString("Theme", "System Default")
}
}()
}
func parseLanguage(s *FyneScreen) func(string) {
w := s.Current
return func(t string) {
if t != fyne.CurrentApp().Preferences().StringWithFallback("Language", "System Default") {
dialog.ShowInformation(lang.L("Update Language Preferences"), lang.L(`Please restart the application for the changes to take effect.`), w)
}
go func() {
switch t {
case "English":
fyne.CurrentApp().Preferences().SetString("Language", "English")
case "中文(简体)":
fyne.CurrentApp().Preferences().SetString("Language", "中文(简体)")
default:
fyne.CurrentApp().Preferences().SetString("Language", "System Default")
}
}()
}
}