132 lines
2.7 KiB
Go
132 lines
2.7 KiB
Go
|
package views
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"github.com/delucks/go-subsonic"
|
||
|
"github.com/gdamore/tcell/v2"
|
||
|
"github.com/rivo/tview"
|
||
|
)
|
||
|
|
||
|
var _ View = &queue{}
|
||
|
|
||
|
type queue struct {
|
||
|
view *tview.Table
|
||
|
currentSong int
|
||
|
songQueue []*subsonic.Child
|
||
|
playFunc func(song *subsonic.Child)
|
||
|
}
|
||
|
|
||
|
func NewQueue() *queue {
|
||
|
|
||
|
table := tview.NewTable()
|
||
|
|
||
|
table.SetBackgroundColor(tcell.ColorBlack)
|
||
|
table.SetTitle("Queue [4]")
|
||
|
table.SetBorder(true)
|
||
|
table.SetFocusFunc(func() {
|
||
|
table.SetBorderColor(tcell.ColorRed)
|
||
|
})
|
||
|
table.SetBlurFunc(func() {
|
||
|
table.SetBorderColor(tcell.ColorWhite)
|
||
|
})
|
||
|
|
||
|
return &queue{
|
||
|
view: table,
|
||
|
currentSong: 0,
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func (q *queue) SetPlayFunc(f func(song *subsonic.Child)) {
|
||
|
q.playFunc = f
|
||
|
}
|
||
|
|
||
|
func (q *queue) PlayCurrent() {
|
||
|
if len(q.songQueue) > 0 {
|
||
|
q.playFunc(q.songQueue[q.currentSong])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (q *queue) Add(songs ...*subsonic.Child) {
|
||
|
shouldStartPlaying := len(q.songQueue) == 0
|
||
|
q.songQueue = append(q.songQueue, songs...)
|
||
|
if shouldStartPlaying {
|
||
|
q.currentSong = 0
|
||
|
q.Update()
|
||
|
q.playFunc(songs[0])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (q *queue) ReplaceAll(songs ...*subsonic.Child) {
|
||
|
q.Clear()
|
||
|
q.Add(songs...)
|
||
|
q.view.ScrollToBeginning()
|
||
|
|
||
|
}
|
||
|
|
||
|
func (q *queue) Next() {
|
||
|
if len(q.songQueue) > q.currentSong+1 {
|
||
|
q.currentSong = q.currentSong + 1
|
||
|
song := q.songQueue[q.currentSong]
|
||
|
q.playFunc(song)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
func (q *queue) Prev() {
|
||
|
if q.currentSong > 0 {
|
||
|
q.currentSong = q.currentSong - 1
|
||
|
song := q.songQueue[q.currentSong]
|
||
|
q.Update()
|
||
|
q.playFunc(song)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func (q *queue) Clear() {
|
||
|
q.songQueue = []*subsonic.Child{}
|
||
|
q.Update()
|
||
|
}
|
||
|
|
||
|
func (q *queue) drawQueue() {
|
||
|
q.view.Clear()
|
||
|
list := q.view
|
||
|
list.SetWrapSelection(true, false)
|
||
|
list.SetSelectable(true, false)
|
||
|
for i, song := range q.songQueue {
|
||
|
isCurrentSong := q.currentSong == i
|
||
|
isPlayed := i < q.currentSong
|
||
|
bgColor := tcell.ColorBlack
|
||
|
if isCurrentSong {
|
||
|
bgColor = tcell.ColorDarkRed
|
||
|
} else if isPlayed {
|
||
|
bgColor = tcell.ColorDarkGray
|
||
|
}
|
||
|
num := tview.NewTableCell(fmt.Sprintf("%d", i+1)).SetTextColor(tcell.ColorYellow).SetBackgroundColor(bgColor)
|
||
|
title := tview.NewTableCell(song.Title).SetMaxWidth(15).SetExpansion(2).SetBackgroundColor(bgColor)
|
||
|
artist := tview.NewTableCell(song.Artist).SetMaxWidth(15).SetExpansion(1).SetBackgroundColor(bgColor)
|
||
|
d := time.Second * time.Duration(song.Duration)
|
||
|
duration := tview.NewTableCell(d.String()).SetAlign(tview.AlignRight).SetExpansion(1).SetBackgroundColor(bgColor)
|
||
|
list.SetCell(i, 0, num)
|
||
|
list.SetCell(i, 1, title)
|
||
|
list.SetCell(i, 2, artist)
|
||
|
list.SetCell(i, 3, duration)
|
||
|
}
|
||
|
|
||
|
list.SetSelectedFunc(func(row, column int) {
|
||
|
q.currentSong = row
|
||
|
q.playFunc(q.songQueue[row])
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func (q *queue) Update() {
|
||
|
|
||
|
q.drawQueue()
|
||
|
|
||
|
}
|
||
|
|
||
|
func (q *queue) GetView() tview.Primitive {
|
||
|
return q.view
|
||
|
}
|