136 lines
2.7 KiB
Go
136 lines
2.7 KiB
Go
package tui
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"git.dayanhub.com/sagi/subsonic-tui/internal/client"
|
|
"git.dayanhub.com/sagi/subsonic-tui/internal/config"
|
|
"git.dayanhub.com/sagi/subsonic-tui/internal/playback"
|
|
"git.dayanhub.com/sagi/subsonic-tui/internal/tui/views"
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
)
|
|
|
|
type TUI struct {
|
|
app *tview.Application
|
|
layout views.View
|
|
|
|
client *client.Client
|
|
playbackCtl *playback.Controller
|
|
}
|
|
|
|
func NewLogin() *TUI {
|
|
app := tview.NewApplication()
|
|
layout := views.NewLoginView(func(u, p, url string) {
|
|
c := client.NewClient(url)
|
|
|
|
err := c.Authenticate(u, p)
|
|
if err != nil {
|
|
app.Stop()
|
|
fmt.Printf("[Error] Failed to login. Aborting %e", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
config.SetURL(url)
|
|
config.SetUsername(u)
|
|
config.SetPassword(p)
|
|
config.SaveConfig()
|
|
app.Stop()
|
|
}, func() {
|
|
app.Stop()
|
|
os.Exit(0)
|
|
})
|
|
app.EnableMouse(true).
|
|
SetRoot(layout.GetView(), true)
|
|
|
|
app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == tcell.KeyEsc {
|
|
app.Stop()
|
|
os.Exit(0)
|
|
}
|
|
|
|
return event
|
|
})
|
|
|
|
return &TUI{
|
|
app: app,
|
|
layout: layout,
|
|
}
|
|
}
|
|
|
|
func NewPlayer(client *client.Client, playbackCtl *playback.Controller) *TUI {
|
|
app := tview.NewApplication()
|
|
|
|
layout := views.NewLayout(client, playbackCtl, func() {
|
|
go app.Draw()
|
|
})
|
|
help := views.NewHelp()
|
|
|
|
pages := tview.NewPages()
|
|
pages.AddPage("app", layout.GetView(), true, true)
|
|
pages.AddPage("help", help.GetView(), true, false)
|
|
|
|
help.SetKeyPressedFunc(func() {
|
|
pages.SwitchToPage("app")
|
|
})
|
|
app.EnableMouse(true).
|
|
SetRoot(pages, true)
|
|
|
|
app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if currentPage, _ := pages.GetFrontPage(); currentPage == "help" {
|
|
pages.SwitchToPage("app")
|
|
help.GetView().Blur()
|
|
layout.GetView().Focus(nil)
|
|
|
|
return nil
|
|
}
|
|
|
|
if layout.Mode() == views.StatusModeSearch {
|
|
return event
|
|
}
|
|
|
|
switch event.Rune() {
|
|
case 'q':
|
|
app.Stop()
|
|
fmt.Println("Exiting..")
|
|
|
|
return nil
|
|
case 'h':
|
|
return tcell.NewEventKey(tcell.KeyLeft, rune(tcell.KeyLeft), event.Modifiers())
|
|
case 'j':
|
|
return tcell.NewEventKey(tcell.KeyDown, rune(tcell.KeyDown), event.Modifiers())
|
|
case 'k':
|
|
return tcell.NewEventKey(tcell.KeyUp, rune(tcell.KeyUp), event.Modifiers())
|
|
case 'l':
|
|
return tcell.NewEventKey(tcell.KeyRight, rune(tcell.KeyRight), event.Modifiers())
|
|
case '?':
|
|
pages.SwitchToPage("help")
|
|
layout.GetView().Blur()
|
|
|
|
go app.Draw()
|
|
default:
|
|
return event
|
|
}
|
|
|
|
return event
|
|
})
|
|
|
|
app.SetAfterDrawFunc(func(screen tcell.Screen) {
|
|
layout.Update()
|
|
})
|
|
app.GetFocus().Blur()
|
|
|
|
// app.SetFocus(layout.GetView())
|
|
|
|
return &TUI{
|
|
app: app,
|
|
layout: layout,
|
|
client: client,
|
|
playbackCtl: playbackCtl,
|
|
}
|
|
}
|
|
|
|
func (t *TUI) Run() error {
|
|
return t.app.Run()
|
|
}
|