ditty/gui_list.go

284 lines
5.6 KiB
Go
Raw Normal View History

2020-01-09 01:50:52 +00:00
package main
2020-01-09 23:51:37 +00:00
import (
2020-05-25 05:14:28 +00:00
"os"
2020-01-09 23:51:37 +00:00
"path"
"time"
2020-04-24 22:39:02 +00:00
2021-04-09 15:07:07 +00:00
"code.rocketnine.space/tslocum/cview"
2020-09-08 22:06:17 +00:00
"github.com/gdamore/tcell/v2"
2020-01-09 23:51:37 +00:00
)
2020-01-09 01:50:52 +00:00
func listPrevious() {
2020-01-29 15:29:38 +00:00
if queueFocused {
queuePrevious()
return
2020-01-09 01:50:52 +00:00
}
2020-01-09 23:51:37 +00:00
2020-04-24 22:39:02 +00:00
mainList.Transform(cview.TransformPreviousItem)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateLists)
2020-01-09 01:50:52 +00:00
}
func listNext() {
2020-01-29 15:29:38 +00:00
if queueFocused {
queueNext()
return
2020-01-09 01:50:52 +00:00
}
2020-01-09 23:51:37 +00:00
2020-04-24 22:39:02 +00:00
mainList.Transform(cview.TransformNextItem)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateLists)
}
func queuePrevious() {
2020-04-24 22:39:02 +00:00
queueList.Transform(cview.TransformPreviousItem)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateQueue)
}
func queueNext() {
2020-04-24 22:39:02 +00:00
queueList.Transform(cview.TransformNextItem)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateQueue)
2020-01-09 23:51:37 +00:00
}
2020-04-24 22:39:02 +00:00
func listSelectCurrent() {
2020-01-28 17:26:44 +00:00
if queueFocused {
go queueSelect(queueList.GetCurrentItemIndex())
2020-05-01 23:35:50 +00:00
} else {
go listSelect(mainList.GetCurrentItemIndex())
2020-01-28 17:26:44 +00:00
}
2020-05-01 23:35:50 +00:00
}
2020-01-28 17:26:44 +00:00
2020-05-01 23:35:50 +00:00
func listSelect(cursor int) {
2020-04-24 22:39:02 +00:00
if cursor == 0 {
browseFolder(path.Join(mainDirectory, ".."))
2020-01-09 23:51:37 +00:00
return
}
2020-04-24 22:39:02 +00:00
if cursor < 0 || cursor-1 > len(mainFiles) {
return
}
entry := mainFiles[cursor-1]
if entry.IsDir || entry.Mode&os.ModeSymlink != 0 {
2020-05-25 05:14:28 +00:00
browseFolder(entry.RealPath)
2020-01-09 23:51:37 +00:00
return
}
2020-05-25 05:14:28 +00:00
audioFile, err := openFile(entry.RealPath, entry.Metadata)
2020-01-09 23:51:37 +00:00
if err != nil {
statusText = err.Error()
go func() {
time.Sleep(5 * time.Second)
statusText = ""
go app.QueueUpdateDraw(updateMain)
}()
go app.QueueUpdateDraw(updateMain)
return
}
go play(audioFile)
go app.QueueUpdateDraw(updateStatus)
2020-01-09 01:50:52 +00:00
}
2020-05-01 23:35:50 +00:00
func queueSelect(cursor int) {
if cursor < 0 || cursor > len(queueFiles) {
return
}
entry := queueFiles[cursor]
if entry.IsDir || entry.Mode&os.ModeSymlink != 0 {
2020-01-28 17:26:44 +00:00
return
}
2020-05-25 05:14:28 +00:00
audioFile, err := openFile(entry.RealPath, entry.Metadata)
2020-01-28 17:26:44 +00:00
if err != nil {
statusText = err.Error()
go func() {
time.Sleep(5 * time.Second)
statusText = ""
go app.QueueUpdateDraw(updateMain)
}()
go app.QueueUpdateDraw(updateMain)
return
}
queuePlaying = cursor
2020-01-28 17:26:44 +00:00
go play(audioFile)
go app.QueueUpdateDraw(updateStatus)
}
func listQueue() {
if mainList.GetCurrentItemIndex() == 0 {
2020-01-28 17:26:44 +00:00
// TODO Show error
return
}
entry := selectedMainEntry()
if entry == nil {
return
} else if entry.IsDir || entry.Mode&os.ModeSymlink != 0 {
2020-05-25 05:14:28 +00:00
scanFiles := scanFolderRecursively(entry.RealPath)
2020-01-28 17:26:44 +00:00
queueLock.Lock()
queueFiles = append(queueFiles, scanFiles...)
queueLock.Unlock()
2020-01-29 16:54:05 +00:00
if !disableAutoplay && playingFileID == 0 && len(queueFiles) > 0 {
queueSelect(queueList.GetCurrentItemIndex())
2020-01-28 17:26:44 +00:00
}
go app.QueueUpdateDraw(updateQueue)
return
}
queueLock.Lock()
defer queueLock.Unlock()
queueFiles = append(queueFiles, entry)
2020-01-29 16:54:05 +00:00
if !disableAutoplay && playingFileID == 0 {
queueSelect(queueList.GetCurrentItemIndex())
2020-01-28 17:26:44 +00:00
}
go app.QueueUpdateDraw(updateLists)
}
func listDelete() {
if !queueFocused {
return
}
queueLock.Lock()
defer queueLock.Unlock()
cursor := queueList.GetCurrentItemIndex()
2020-04-24 22:39:02 +00:00
if cursor < 0 || len(queueFiles) <= cursor {
2020-01-28 17:26:44 +00:00
return
}
2020-04-24 22:39:02 +00:00
queueFiles = append(queueFiles[:cursor], queueFiles[cursor+1:]...)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateQueue)
}
func selectedMainEntry() *LibraryEntry {
cursor := mainList.GetCurrentItemIndex()
2020-04-24 22:39:02 +00:00
if cursor < 0 || cursor-1 > len(mainFiles) {
return nil
}
return mainFiles[cursor-1]
2020-01-09 01:50:52 +00:00
}
func offsetMainEntry(offset int) *LibraryEntry {
cursor := mainList.GetCurrentItemIndex()
2020-04-24 22:39:02 +00:00
if (cursor-1)+offset < 0 || (cursor-1)+offset >= len(mainFiles) {
2020-01-28 17:26:44 +00:00
return nil
}
2020-04-24 22:39:02 +00:00
return mainFiles[(cursor-1)+offset]
2020-01-09 01:50:52 +00:00
}
2020-01-22 01:10:20 +00:00
func selectedQueueEntry() *LibraryEntry {
cursor := queueList.GetCurrentItemIndex()
2020-04-24 22:39:02 +00:00
if cursor < 0 || cursor-1 > len(queueFiles) {
return nil
}
return queueFiles[cursor]
2020-01-28 17:26:44 +00:00
}
func offsetQueueEntry(offset int) *LibraryEntry {
cursor := queueList.GetCurrentItemIndex()
2020-04-24 22:39:02 +00:00
if cursor+offset < 0 || cursor+offset >= len(queueFiles) {
2020-01-28 17:26:44 +00:00
return nil
}
2020-04-24 22:39:02 +00:00
return queueFiles[cursor+offset]
2020-01-28 17:26:44 +00:00
}
2020-01-22 01:10:20 +00:00
func listPreviousPage() {
2020-01-28 17:26:44 +00:00
if !queueFocused {
2020-04-24 22:39:02 +00:00
mainList.Transform(cview.TransformPreviousPage)
2020-01-22 01:10:20 +00:00
go app.QueueUpdateDraw(updateMain)
2020-01-28 17:26:44 +00:00
} else {
2020-04-24 22:39:02 +00:00
queueList.Transform(cview.TransformPreviousPage)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateQueue)
}
2020-01-22 01:10:20 +00:00
}
func listNextPage() {
2020-01-28 17:26:44 +00:00
if !queueFocused {
2020-04-24 22:39:02 +00:00
mainList.Transform(cview.TransformNextPage)
2020-01-22 01:10:20 +00:00
go app.QueueUpdateDraw(updateMain)
2020-01-28 17:26:44 +00:00
} else {
2020-04-24 22:39:02 +00:00
queueList.Transform(cview.TransformNextPage)
2020-01-28 17:26:44 +00:00
go app.QueueUpdateDraw(updateQueue)
}
2020-01-22 01:10:20 +00:00
}
2020-01-22 22:54:55 +00:00
func listRefresh() {
mainCursor = mainList.GetCurrentItemIndex()
2020-04-24 22:39:02 +00:00
d := mainDirectory
mainDirectory = ""
2020-01-22 22:54:55 +00:00
browseFolder(d)
}
func listToggleHidden() {
showHiddenFolders = !showHiddenFolders
if showHiddenFolders {
2020-01-24 23:35:55 +00:00
statusText = "Hidden folders: shown"
} else {
2020-01-24 23:35:55 +00:00
statusText = "Hidden folders: hidden"
}
go func() {
time.Sleep(3 * time.Second)
statusText = ""
go app.QueueUpdateDraw(updateMain)
}()
listRefresh()
}
2020-01-28 17:26:44 +00:00
func toggleFocusedList() {
queueFocused = !queueFocused
2020-05-01 23:35:50 +00:00
focusUpdated(true)
2020-04-25 13:55:09 +00:00
}
2020-05-01 23:35:50 +00:00
func focusUpdated(setFocus bool) {
2020-04-24 22:39:02 +00:00
if queueFocused {
2020-05-01 23:35:50 +00:00
if setFocus {
app.SetFocus(queueList)
}
2020-04-25 13:55:09 +00:00
2020-04-28 22:07:49 +00:00
mainList.SetSelectedTextColor(tcell.ColorWhite)
queueList.SetSelectedTextColor(tcell.ColorBlack)
mainList.SetSelectedTextAttributes(tcell.AttrBold | tcell.AttrUnderline)
queueList.SetSelectedTextAttributes(0)
mainList.SetSelectedBackgroundColor(tcell.ColorBlack)
2020-04-25 13:55:09 +00:00
queueList.SetSelectedBackgroundColor(tcell.ColorWhite)
2020-04-24 22:39:02 +00:00
} else {
2020-05-01 23:35:50 +00:00
if setFocus {
app.SetFocus(mainList)
}
2020-04-25 13:55:09 +00:00
2020-04-28 22:07:49 +00:00
mainList.SetSelectedTextColor(tcell.ColorBlack)
queueList.SetSelectedTextColor(tcell.ColorWhite)
mainList.SetSelectedTextAttributes(0)
queueList.SetSelectedTextAttributes(tcell.AttrBold | tcell.AttrUnderline)
2020-04-25 13:55:09 +00:00
mainList.SetSelectedBackgroundColor(tcell.ColorWhite)
2020-04-28 22:07:49 +00:00
queueList.SetSelectedBackgroundColor(tcell.ColorBlack)
2020-04-24 22:39:02 +00:00
}
2020-04-28 22:07:49 +00:00
mainList.SetHighlightFullLine(!queueFocused)
queueList.SetHighlightFullLine(queueFocused)
2020-05-01 23:35:50 +00:00
if setFocus {
go app.QueueUpdateDraw(updateLists)
}
2020-01-28 17:26:44 +00:00
}