mirror of
https://github.com/aditya-K2/gspt.git
synced 2026-01-07 21:13:50 -05:00
111 lines
2.3 KiB
Go
111 lines
2.3 KiB
Go
package ui
|
|
|
|
import (
|
|
"github.com/aditya-K2/gspt/spt"
|
|
"github.com/aditya-K2/tview"
|
|
"github.com/gdamore/tcell/v2"
|
|
)
|
|
|
|
type navItem struct {
|
|
name string
|
|
action *Action
|
|
}
|
|
|
|
type NavMenu struct {
|
|
*defView
|
|
*tview.Table
|
|
m []navItem
|
|
}
|
|
|
|
func NewNavMenu(m []navItem) *NavMenu {
|
|
T := tview.NewTable()
|
|
n := &NavMenu{&defView{}, T, m}
|
|
|
|
T.SetDrawFunc(func(tcell.Screen, int, int, int, int) (int, int, int, int) {
|
|
for k := range n.m {
|
|
T.SetCell(k, 0,
|
|
GetCell(n.m[k].name, NavStyle))
|
|
}
|
|
return T.GetInnerRect()
|
|
})
|
|
T.SetTitle("Library").SetTitleAlign(tview.AlignLeft)
|
|
T.SetBackgroundColor(tcell.ColorDefault)
|
|
T.SetBorder(true)
|
|
T.SetSelectable(true, false)
|
|
|
|
return n
|
|
}
|
|
|
|
func (n *NavMenu) OpenEntry(e *tcell.EventKey) *tcell.EventKey {
|
|
r, _ := n.Table.GetSelection()
|
|
if r < len(n.m) {
|
|
return (*n.m[r].action).Func()(e)
|
|
}
|
|
return e
|
|
}
|
|
|
|
type PlaylistNav struct {
|
|
*defView
|
|
*tview.Table
|
|
Playlists *spt.UserPlaylists
|
|
c chan bool
|
|
done func(error)
|
|
}
|
|
|
|
func NewPlaylistNav() *PlaylistNav {
|
|
T := tview.NewTable()
|
|
T.SetSelectable(true, false).SetBorder(true)
|
|
T.SetTitle("Playlists").SetTitleAlign(tview.AlignLeft)
|
|
T.SetBackgroundColor(tcell.ColorDefault)
|
|
v := &PlaylistNav{&defView{}, T, nil, make(chan bool), func(err error) {
|
|
if err != nil {
|
|
SendNotification(err.Error())
|
|
}
|
|
}}
|
|
T.SetDrawFunc(func(s tcell.Screen, x, y, w, h int) (int, int, int, int) {
|
|
if v.Playlists == nil {
|
|
v.RefreshState()
|
|
}
|
|
for k, p := range *v.Playlists {
|
|
v.Table.SetCell(k, 0,
|
|
GetCell(p.Name, PlaylistNavStyle))
|
|
}
|
|
return T.GetInnerRect()
|
|
})
|
|
return v
|
|
}
|
|
|
|
func (v *PlaylistNav) PlayEntry(e *tcell.EventKey) *tcell.EventKey {
|
|
r, _ := v.Table.GetSelection()
|
|
if err := spt.PlayContext((*v.Playlists)[r].URI); err != nil {
|
|
SendNotification(err.Error())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (v *PlaylistNav) QueueEntry(e *tcell.EventKey) *tcell.EventKey {
|
|
r, _ := v.Table.GetSelection()
|
|
playlist := (*v.Playlists)[r]
|
|
msg := SendNotificationWithChan("Queueing %s...", playlist.Name)
|
|
go func() {
|
|
if err := spt.QueuePlaylist(playlist.ID); err != nil {
|
|
msg <- err.Error()
|
|
return
|
|
}
|
|
msg <- playlist.Name + " queued succesfully!"
|
|
}()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (v *PlaylistNav) RefreshState() {
|
|
p, ch := spt.CurrentUserPlaylists()
|
|
go func() {
|
|
err := <-ch
|
|
if err != nil {
|
|
SendNotification(err.Error())
|
|
}
|
|
}()
|
|
v.Playlists = p
|
|
}
|