fix basic config layout

This commit is contained in:
aynakeya
2024-04-15 10:04:27 -07:00
parent c9cd78b0eb
commit 139f331a14
14 changed files with 201 additions and 131 deletions

View File

@@ -11,6 +11,7 @@ import (
"AynaLivePlayer/pkg/logger"
loggerRepo "AynaLivePlayer/pkg/logger/repository"
"flag"
"time"
)
var dev = flag.Bool("dev", false, "dev")
@@ -50,7 +51,12 @@ func main() {
global.Logger.Infof("================Current Version: %s================", model.Version(config.Version))
internal.Initialize()
gui.Initialize()
global.EventManager.Start()
go func() {
// temporary fix for gui not render correctly.
// wait until gui rendered then start event dispatching
time.Sleep(1 * time.Second)
global.EventManager.Start()
}()
//plugins := []adapter.Plugin{diange.NewDiange(mainController), qiege.NewQiege(mainController),
// textinfo.NewTextInfo(mainController), webinfo.NewWebInfo(mainController),
// wylogin.NewWYLogin(mainController)}

Binary file not shown.

Binary file not shown.

View File

@@ -1,7 +1,22 @@
package events
import "AynaLivePlayer/core/model"
const PlayerVideoPlayerSetWindowHandleCmd = "cmd.player.videoplayer.set_window_handle"
type PlayerVideoPlayerSetWindowHandleCmdEvent struct {
Handle uintptr
}
const PlayerSetAudioDeviceCmd = "cmd.player.set_audio_device"
type PlayerSetAudioDeviceCmdEvent struct {
Device string
}
const PlayerAudioDeviceUpdate = "update.player.audio_device"
type PlayerAudioDeviceUpdateEvent struct {
Current string
Devices []model.AudioDevice
}

View File

@@ -4,15 +4,3 @@ type AudioDevice struct {
Name string
Description string
}
type PlayerPropertyValue any
type PlayerProperty string
const (
PlayerPropIdleActive PlayerProperty = "idle-active"
PlayerPropTimePos PlayerProperty = "time-pos"
PlayerPropDuration PlayerProperty = "duration"
PlayerPropPercentPos PlayerProperty = "percent-pos"
PlayerPropPause PlayerProperty = "pause"
PlayerPropVolume PlayerProperty = "volume"
)

View File

@@ -1,13 +1,13 @@
package gui
import (
"AynaLivePlayer/core/events"
"AynaLivePlayer/core/model"
"AynaLivePlayer/gui/component"
"AynaLivePlayer/pkg/config"
"AynaLivePlayer/global"
"AynaLivePlayer/pkg/event"
"AynaLivePlayer/pkg/i18n"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)
@@ -28,80 +28,119 @@ func (b *bascicConfig) CreatePanel() fyne.CanvasObject {
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")),
newCheckInit(
i18n.T("gui.config.basic.random_playlist.user"),
func(b bool) {
logger.Infof("Set random playlist for user: %t", b)
if b {
API.Playlists().GetCurrent().Model().Mode = model.PlaylistModeRandom
} else {
API.Playlists().GetCurrent().Model().Mode = model.PlaylistModeNormal
}
},
API.Playlists().GetCurrent().Model().Mode == model.PlaylistModeRandom),
newCheckInit(
i18n.T("gui.config.basic.random_playlist.system"),
func(b bool) {
l().Infof("Set random playlist for system: %t", b)
if b {
API.Playlists().GetDefault().Model().Mode = model.PlaylistModeRandom
} else {
API.Playlists().GetDefault().Model().Mode = model.PlaylistModeNormal
}
},
API.Playlists().GetDefault().Model().Mode == model.PlaylistModeRandom),
playerRandomCheck,
systemRandomCheck,
)
devices := API.PlayControl().GetAudioDevices()
deviceDesc := make([]string, len(devices))
deviceDesc2Name := make(map[string]string)
for i, device := range devices {
deviceDesc[i] = device.Description
deviceDesc2Name[device.Description] = device.Name
}
deviceSel := widget.NewSelect(deviceDesc, func(s string) {
API.PlayControl().SetAudioDevice(deviceDesc2Name[s])
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,
})
})
deviceSel.Selected = API.PlayControl().GetCurrentAudioDevice()
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)
skipPlaylistCheck := widget.NewCheck(i18n.T("gui.config.basic.skip_playlist"), func(b bool) {
})
skipPlaylist := container.NewHBox(
widget.NewLabel(i18n.T("gui.config.basic.skip_playlist")),
component.NewCheckOneWayBinding(
i18n.T("gui.config.basic.skip_playlist.prompt"),
&API.PlayControl().Config().SkipPlaylist,
API.PlayControl().Config().SkipPlaylist),
skipPlaylistCheck,
)
skipWhenErr := container.NewHBox(
widget.NewLabel(i18n.T("gui.config.basic.skip_when_error")),
component.NewCheckOneWayBinding(
i18n.T("gui.config.basic.skip_when_error.prompt"),
&API.PlayControl().Config().AutoNextWhenFail,
API.PlayControl().Config().AutoNextWhenFail),
)
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() {
//err := API.App().CheckUpdate()
//if err != nil {
// showDialogIfError(err)
// return
//}
//if API.App().LatestVersion().Version > API.App().Version().Version {
// dialog.ShowCustom(
// i18n.T("gui.update.new_version"),
// "OK",
// widget.NewRichTextFromMarkdown(API.App().LatestVersion().Info),
// MainWindow)
//}
})
b.panel = container.NewVBox(randomPlaylist, outputDevice, skipPlaylist, skipWhenErr, checkUpdateBox, checkUpdateBtn)
//skipWhenErr := container.NewHBox(
// widget.NewLabel(i18n.T("gui.config.basic.skip_when_error")),
// component.NewCheckOneWayBinding(
// i18n.T("gui.config.basic.skip_when_error.prompt"),
// &API.PlayControl().Config().AutoNextWhenFail,
// API.PlayControl().Config().AutoNextWhenFail),
//)
//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() {
// err := API.App().CheckUpdate()
// if err != nil {
// showDialogIfError(err)
// return
// }
// if API.App().LatestVersion().Version > API.App().Version().Version {
// dialog.ShowCustom(
// i18n.T("gui.update.new_version"),
// "OK",
// widget.NewRichTextFromMarkdown(API.App().LatestVersion().Info),
// MainWindow)
// }
//})
//b.panel = container.NewVBox(randomPlaylist, outputDevice, skipPlaylist, skipWhenErr, checkUpdateBox, checkUpdateBtn)
b.panel = container.NewVBox(randomPlaylist, outputDevice, skipPlaylist)
return b.panel
}

View File

@@ -7,6 +7,20 @@ import (
"fyne.io/fyne/v2/widget"
)
var ConfigList = []ConfigLayout{
&bascicConfig{},
}
type ConfigLayout interface {
Title() string
Description() string
CreatePanel() fyne.CanvasObject
}
func AddConfigLayout(cfgs ...ConfigLayout) {
ConfigList = append(ConfigList, cfgs...)
}
func createConfigLayout() fyne.CanvasObject {
// initialize config panels
for _, c := range ConfigList {

View File

@@ -54,9 +54,9 @@ func Initialize() {
container.NewTabItem(i18n.T("gui.tab.history"),
container.NewBorder(nil, nil, nil, nil, createHistoryList()),
),
//container.NewTabItem(i18n.T("gui.tab.config"),
// createConfigLayout(),
//),
container.NewTabItem(i18n.T("gui.tab.config"),
createConfigLayout(),
),
)
tabs.SetTabLocation(container.TabLocationTop)
@@ -82,9 +82,6 @@ func Initialize() {
if config.General.ShowSystemTray {
setupSysTray()
}
//if config2.General.AutoCheckUpdate {
// go checkUpdate()
//}
}
//

View File

@@ -7,7 +7,8 @@ import (
)
type playerConfig struct {
Volume float64
Volume float64
AudioDevice string
}
func (p *playerConfig) Name() string {
@@ -34,4 +35,7 @@ func restoreConfig() {
data := evnt.Data.(events.PlayerPropertyVolumeUpdateEvent)
cfg.Volume = data.Volume
})
global.EventManager.CallA(events.PlayerSetAudioDeviceCmd, events.PlayerSetAudioDeviceCmdEvent{
Device: cfg.AudioDevice,
})
}

View File

@@ -11,6 +11,7 @@ import (
"fmt"
"github.com/AynaLivePlayer/miaosic"
"github.com/aynakeya/go-mpv"
"github.com/tidwall/gjson"
)
var running bool = false
@@ -32,6 +33,7 @@ func SetupPlayer() {
registerHandler()
registerCmdHandler()
restoreConfig()
updateAudioDeviceList()
log.Info("starting mpv player")
go func() {
for running {
@@ -61,6 +63,7 @@ func SetupPlayer() {
}
func StopPlayer() {
cfg.AudioDevice = libmpv.GetPropertyString("audio-device")
log.Info("stopping mpv player")
running = false
// stop player async, should be closed in the end anyway
@@ -230,6 +233,21 @@ func registerCmdHandler() {
log.Warn("set window handle failed", err)
}
})
global.EventManager.RegisterA(events.PlayerSetAudioDeviceCmd, "player.set_audio_device", func(evnt *event.Event) {
device := evnt.Data.(events.PlayerSetAudioDeviceCmdEvent).Device
err := libmpv.SetPropertyString("audio-device", device)
if err != nil {
global.EventManager.CallA(
events.ErrorUpdate,
events.ErrorUpdateEvent{
Error: err,
})
log.Warn("set audio device failed", err)
}
log.Infof("set audio device to %s", device)
return
})
}
func SetWindowHandle(handle uintptr) error {
@@ -238,35 +256,26 @@ func SetWindowHandle(handle uintptr) error {
return libmpv.SetOptionString("vo", "gpu")
}
//func (p *MpvPlayer) IsIdle() bool {
// property, err := p.libmpv.GetProperty("idle-active", mpv.FORMAT_FLAG)
// if err != nil {
// p.log.Warn("[MPV Player] get property idle-active failed", err)
// return false
// }
// return property.(bool)
//}
//// GetAudioDeviceList get output device for mpv
//// return format is []AudioDevice
//func (p *MpvPlayer) GetAudioDeviceList() ([]model.AudioDevice, error) {
// p.log.Debugf("[MPV Player] getting audio device list for mpv")
// property, err := p.libmpv.GetProperty("audio-device-list", mpv.FORMAT_STRING)
// if err != nil {
// return nil, err
// }
// dl := make([]model.AudioDevice, 0)
// gjson.Parse(property.(string)).ForEach(func(key, value gjson.Result) bool {
// dl = append(dl, model.AudioDevice{
// Name: value.Get("name").String(),
// Description: value.Get("description").String(),
// })
// return true
// })
// return dl, nil
//}
//
//func (p *MpvPlayer) SetAudioDevice(device string) error {
// p.log.Debugf("[MPV Player] set audio device %s for mpv", device)
// return p.libmpv.SetPropertyString("audio-device", device)
//}
// // updateAudioDeviceList get output device for mpv
// // return format is []AudioDevice
func updateAudioDeviceList() {
property, err := libmpv.GetProperty("audio-device-list", mpv.FORMAT_STRING)
if err != nil {
return
}
ad := libmpv.GetPropertyString("audio-device")
dl := make([]model.AudioDevice, 0)
gjson.Parse(property.(string)).ForEach(func(key, value gjson.Result) bool {
dl = append(dl, model.AudioDevice{
Name: value.Get("name").String(),
Description: value.Get("description").String(),
})
return true
})
log.Infof("update audio device list %v, current %s", dl, ad)
global.EventManager.CallA(events.PlayerAudioDeviceUpdate, events.PlayerAudioDeviceUpdateEvent{
Current: ad,
Devices: dl,
})
return
}

View File

@@ -40,7 +40,8 @@ func newPlaylist(id model.PlaylistID) *playlist {
pl.Next(event.Data.(events.PlaylistNextCmdEvent).Remove)
})
global.EventManager.RegisterA(events.PlaylistModeChangeCmd(id), "internal.playlist.mode", func(event *event.Event) {
pl.mode = event.Data.(events.PlaylistModeChangeUpdateEvent).Mode
pl.mode = event.Data.(events.PlaylistModeChangeCmdEvent).Mode
log.Infof("Playlist %s mode changed to %d", id, pl.mode)
global.EventManager.CallA(events.PlaylistModeChangeUpdate(id), events.PlaylistModeChangeUpdateEvent{
Mode: pl.mode,
})

View File

@@ -16,6 +16,7 @@ var SystemPlaylist *playlist = nil
var PlaylistsPlaylist *playlist = nil
type playlistConfig struct {
PlayerPlaylistMode model.PlaylistMode
SystemPlaylistMode model.PlaylistMode
SystemPlaylistID string
PlaylistsPath string
@@ -40,6 +41,7 @@ func (p *playlistConfig) OnSave() {
}
var cfg = &playlistConfig{
PlayerPlaylistMode: model.PlaylistModeNormal,
SystemPlaylistMode: model.PlaylistModeNormal,
PlaylistsPath: "playlists.json",
playlists: make([]miaosic.Playlist, 0),
@@ -54,11 +56,11 @@ func Initialize() {
HistoryPlaylist = newPlaylist(model.PlaylistIDHistory)
config.LoadConfig(cfg)
global.EventManager.RegisterA(events.PlaylistModeChangeCmd(model.PlaylistIDSystem), "internal.playlist.system_init", func(event *event.Event) {
cfg.SystemPlaylistMode = event.Data.(events.PlaylistModeChangeUpdateEvent).Mode
global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDPlayer), events.PlaylistModeChangeCmdEvent{
Mode: cfg.PlayerPlaylistMode,
})
global.EventManager.CallA(events.PlaylistModeChangeUpdate(model.PlaylistIDSystem), events.PlaylistModeChangeUpdateEvent{
global.EventManager.CallA(events.PlaylistModeChangeCmd(model.PlaylistIDSystem), events.PlaylistModeChangeCmdEvent{
Mode: cfg.SystemPlaylistMode,
})
@@ -83,4 +85,6 @@ func Close() {
for _, v := range allPlaylists {
cfg.playlists = append(cfg.playlists, *v)
}
cfg.PlayerPlaylistMode = PlayerPlaylist.mode
cfg.SystemPlaylistMode = SystemPlaylist.mode
}

View File

@@ -1,7 +1,6 @@
package diange
import (
"AynaLivePlayer/core/adapter"
"AynaLivePlayer/core/model"
"AynaLivePlayer/gui"
"AynaLivePlayer/gui/component"
@@ -30,11 +29,9 @@ type Diange struct {
SourceCMD []string
cooldowns map[string]int
panel fyne.CanvasObject
contro adapter.IControlBridge
log adapter.ILogger
}
func NewDiange(contr adapter.IControlBridge) *Diange {
func NewDiange() *Diange {
return &Diange{
UserPermission: true,
PrivilegePermission: true,
@@ -44,8 +41,6 @@ func NewDiange(contr adapter.IControlBridge) *Diange {
CustomCMD: "add",
SourceCMD: make([]string, 0),
cooldowns: make(map[string]int),
contro: contr,
log: contr.Logger().WithModule(MODULE_CMD_DIANGE),
}
}

View File

@@ -20,7 +20,6 @@ type Qiege struct {
AdminPermission bool
CustomCMD string
panel fyne.CanvasObject
ctr adapter.IControlBridge
}
func NewQiege(ctr adapter.IControlBridge) *Qiege {
@@ -29,7 +28,6 @@ func NewQiege(ctr adapter.IControlBridge) *Qiege {
PrivilegePermission: true,
AdminPermission: true,
CustomCMD: "skip",
ctr: ctr,
}
}