package app
|
|
|
|
import (
|
|
"os"
|
|
|
|
"git.brettb.xyz/goinv/client/internal/api"
|
|
"git.brettb.xyz/goinv/client/internal/ui/assets"
|
|
"git.brettb.xyz/goinv/client/internal/ui/help"
|
|
"git.brettb.xyz/goinv/client/internal/ui/shelves"
|
|
"git.brettb.xyz/goinv/client/internal/ui/utils"
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type App struct {
|
|
*tview.Application
|
|
APIClient *api.APIClient
|
|
pages *tview.Pages
|
|
logger *zap.Logger
|
|
|
|
help *help.Help
|
|
assets *assets.Assets
|
|
shelves *shelves.Shelves
|
|
// categories *categories.Categories
|
|
// buildings *buildings.Buildings
|
|
menu *tview.TextView
|
|
|
|
currentPage string
|
|
needInitUI bool
|
|
}
|
|
|
|
func NewApp(name, version, host string, logger *zap.Logger) *App {
|
|
sugar := logger.Sugar()
|
|
sugar.Debug("creating app")
|
|
|
|
app := App{
|
|
Application: tview.NewApplication(),
|
|
APIClient: api.NewAPIClient(host),
|
|
pages: tview.NewPages(),
|
|
logger: logger,
|
|
needInitUI: false,
|
|
}
|
|
|
|
app.assets = assets.NewAssets(logger, app.APIClient)
|
|
app.shelves = shelves.NewShelves(logger, app.APIClient)
|
|
|
|
app.help = help.NewHelp(name, version)
|
|
|
|
menuItems := [][]string{
|
|
{utils.HelpScreenKey.Label(), app.help.GetTitle()},
|
|
{utils.AssetsScreenKey.Label(), app.assets.GetTitle()},
|
|
{utils.ShelvesScreenKey.Label(), app.shelves.GetTitle()},
|
|
//{utils.CategoriesScreenKey.Label(), app.categories.GetTitle()},
|
|
//{utils.BuildingsScreenKey.Label(), app.buildings.GetTitle()},
|
|
}
|
|
|
|
app.menu = makeMenu(menuItems)
|
|
|
|
app.pages.AddPage(app.help.GetTitle(), app.help, true, false)
|
|
app.pages.AddPage(app.assets.GetTitle(), app.assets, true, false)
|
|
app.pages.AddPage(app.shelves.GetTitle(), app.shelves, true, false)
|
|
|
|
return &app
|
|
}
|
|
|
|
func (app *App) Run() error {
|
|
app.logger.Info("starting app")
|
|
|
|
flex := tview.NewFlex().
|
|
SetDirection(tview.FlexRow).
|
|
AddItem(app.pages, 0, 1, false).
|
|
AddItem(app.menu, 1, 1, false)
|
|
|
|
app.initUI()
|
|
|
|
app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
|
|
if event.Key() == utils.AppExitKey.Key {
|
|
app.logger.Info("stopping app")
|
|
app.Stop()
|
|
os.Exit(0)
|
|
}
|
|
|
|
if !app.frontScreenHasActiveDialog() {
|
|
event = utils.ParseKeyEventKey(app.logger, event)
|
|
|
|
// Next & Previous Screen
|
|
switch event.Rune() {
|
|
case utils.NextScreenKey.Rune():
|
|
app.switchToNextScreen()
|
|
return nil
|
|
case utils.PreviousScreenKey.Rune():
|
|
app.switchToPreviousScreen()
|
|
}
|
|
|
|
// Normal page key switch
|
|
switch event.Key() {
|
|
case utils.HelpScreenKey.EventKey():
|
|
app.switchToScreen(app.help.GetTitle())
|
|
return nil
|
|
case utils.AssetsScreenKey.EventKey():
|
|
app.switchToScreen(app.assets.GetTitle())
|
|
return nil
|
|
case utils.ShelvesScreenKey.EventKey():
|
|
app.switchToScreen(app.shelves.GetTitle())
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return event
|
|
})
|
|
|
|
app.currentPage = app.assets.GetTitle()
|
|
app.pages.SwitchToPage(app.currentPage)
|
|
|
|
// start the refresh loop
|
|
go app.refresh()
|
|
|
|
if err := app.SetRoot(flex, true).SetFocus(app.assets).EnableMouse(false).Run(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|