package ui import ( "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) // NewApp returns a new App. func NewApp() App { a := App{ Application: tview.NewApplication(), pages: tview.NewPages(), flex: tview.NewFlex(), focusedColumn: 0, } initApp(&a) return a } // initApp initialises App. func initApp(a *App) { a.pages.AddPage(mainPage, a.flex, true, true) quit := newQuitModal(a) a.pages.AddPage(quitPage, quit, false, false) add := newAddForm(a) a.pages.AddPage(addPage, add, false, false) a.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Rune() == 'q' { a.pages.ShowPage(quitPage) a.SetFocus(quit) } else if event.Rune() == 'o' { a.openProject("") } else if event.Rune() == 'a' { a.pages.ShowPage(addPage) a.SetFocus(add) } return event }) a.SetRoot(a.pages, true) } // newQuitModal returns a new modal for the user's confirmation // for quitting the application. func newQuitModal(app *App) *tview.Modal { quit := *tview.NewModal() quitDoneFunc := func(_ int, buttonLabel string) { switch buttonLabel { case "Quit": app.shutdown() default: app.pages.SwitchToPage("main") app.setColumnFocus() } } quit.SetText("Do you want to quit the application?"). AddButtons([]string{"Quit", "Cancel"}). SetDoneFunc(quitDoneFunc) return &quit } // newAddForm creates a new Form primitive for creating a new card. func newAddForm(app *App) *tview.Form { add := tview.NewForm() titleField := "Title" add.AddInputField(titleField, "", 0, nil, nil) add.AddButton("Save", func() { title := add.GetFormItemByLabel(titleField).(*tview.InputField).GetText() // TODO: error value needs handling _ = app.newCard(title, "") add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("") app.pages.SwitchToPage(mainPage) app.setColumnFocus() }) add.AddButton("Cancel", func() { app.pages.SwitchToPage(mainPage) add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("") app.setColumnFocus() }) add.SetBorder(true) add.SetTitle(" New Card ") return add }