Files
AynaLivePlayer/gui/config_basic.go
2024-08-25 10:42:18 -07:00

137 lines
4.3 KiB
Go

package gui
import (
"AynaLivePlayer/core/events"
"AynaLivePlayer/core/model"
"AynaLivePlayer/global"
"AynaLivePlayer/gui/component"
"AynaLivePlayer/pkg/config"
"AynaLivePlayer/pkg/event"
"AynaLivePlayer/pkg/i18n"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
type bascicConfig struct {
panel fyne.CanvasObject
}
func (b *bascicConfig) Title() string {
return i18n.T("gui.config.basic.title")
}
func (b *bascicConfig) Description() string {
return i18n.T("gui.config.basic.description")
}
func (b *bascicConfig) CreatePanel() fyne.CanvasObject {
if b.panel != nil {
return b.panel
}
playerRandomCheck := widget.NewCheck(i18n.T("gui.config.basic.random_playlist.user"),
func(b bool) {
mode := model.PlaylistModeNormal
if b {
mode = model.PlaylistModeRandom
}
logger.Infof("Set player playlist mode to %d", mode)
global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDPlayer),
events.PlaylistModeChangeCmdEvent{
Mode: mode,
})
})
global.EventManager.RegisterA(events.PlaylistModeChangeUpdate(model.PlaylistIDPlayer),
"gui.config.basic.random_playlist.player",
func(event *event.Event) {
data := event.Data.(events.PlaylistModeChangeUpdateEvent)
playerRandomCheck.SetChecked(data.Mode == model.PlaylistModeRandom)
})
systemRandomCheck := widget.NewCheck(i18n.T("gui.config.basic.random_playlist.system"),
func(b bool) {
mode := model.PlaylistModeNormal
if b {
mode = model.PlaylistModeRandom
}
global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDSystem),
events.PlaylistModeChangeCmdEvent{
Mode: mode,
})
})
global.EventManager.RegisterA(events.PlaylistModeChangeUpdate(model.PlaylistIDSystem),
"gui.config.basic.random_playlist.system",
func(event *event.Event) {
data := event.Data.(events.PlaylistModeChangeUpdateEvent)
systemRandomCheck.SetChecked(data.Mode == model.PlaylistModeRandom)
})
randomPlaylist := container.NewHBox(
widget.NewLabel(i18n.T("gui.config.basic.random_playlist")),
playerRandomCheck,
systemRandomCheck,
)
deviceDesc2Name := make(map[string]string)
deviceSel := widget.NewSelect(make([]string, 0), func(s string) {
name, ok := deviceDesc2Name[s]
if !ok {
return
}
global.EventManager.CallA(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{
Device: name,
})
})
global.EventManager.RegisterA(
events.PlayerAudioDeviceUpdate,
"gui.config.basic.audio_device.update",
func(event *event.Event) {
data := event.Data.(events.PlayerAudioDeviceUpdateEvent)
devices := make([]string, len(data.Devices))
deviceDesc2Name = make(map[string]string)
currentDevice := ""
for i, device := range data.Devices {
devices[i] = device.Description
deviceDesc2Name[device.Description] = device.Name
if device.Name == data.Current {
currentDevice = device.Description
}
}
logger.Infof("update audio device. set current to %s (%s)", data.Current, deviceDesc2Name[data.Current])
deviceSel.Options = devices
deviceSel.Selected = currentDevice
deviceSel.Refresh()
})
outputDevice := container.NewBorder(nil, nil,
widget.NewLabel(i18n.T("gui.config.basic.audio_device")), nil,
deviceSel)
skipWhenErr := container.NewHBox(
widget.NewLabel(i18n.T("gui.config.basic.skip_when_error")),
component.NewCheckOneWayBinding(
i18n.T("gui.config.basic.skip_when_error.prompt"),
&config.General.PlayNextOnFail,
config.General.PlayNextOnFail),
)
checkUpdateBox := container.NewHBox(
widget.NewLabel(i18n.T("gui.config.basic.auto_check_update")),
component.NewCheckOneWayBinding(
i18n.T("gui.config.basic.auto_check_update.prompt"),
&config.General.AutoCheckUpdate,
config.General.AutoCheckUpdate),
)
checkUpdateBtn := widget.NewButton(i18n.T("gui.config.basic.check_update"), func() {
global.EventManager.CallA(events.CheckUpdateCmd, events.CheckUpdateCmdEvent{})
})
useSysPlaylistBtn := container.NewHBox(
widget.NewLabel(i18n.T("gui.config.basic.use_system_playlist")),
component.NewCheckOneWayBinding(
i18n.T("gui.config.basic.use_system_playlist.prompt"),
&config.General.UseSystemPlaylist,
config.General.UseSystemPlaylist),
)
b.panel = container.NewVBox(randomPlaylist, useSysPlaylistBtn, skipWhenErr, outputDevice, checkUpdateBox, checkUpdateBtn)
return b.panel
}