You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

124 lines
3.0 KiB

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
}