package ui import ( "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) // NewApp returns a new App. func NewApp() UI { a := UI{ Application: tview.NewApplication(), pages: tview.NewPages(), flex: tview.NewFlex(), focusedColumn: 0, } initApp(&a) return a } // initApp initialises App. func initApp(u *UI) { u.pages.AddPage(mainPage, u.flex, true, true) quit := newQuitModal(u) u.pages.AddPage(quitPage, quit, false, false) add := newAddForm(u) u.pages.AddPage(addPage, add, false, false) u.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Rune() == 'q' { u.pages.ShowPage(quitPage) u.SetFocus(quit) } else if event.Rune() == 'o' { u.openBoard("") } else if event.Rune() == 'a' { u.pages.ShowPage(addPage) u.SetFocus(add) } return event }) u.SetRoot(u.pages, true) } // newQuitModal returns a new modal for the user's confirmation // for quitting the application. func newQuitModal(u *UI) *tview.Modal { quit := *tview.NewModal() quitDoneFunc := func(_ int, buttonLabel string) { switch buttonLabel { case "Quit": u.shutdown() default: u.pages.SwitchToPage("main") u.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(u *UI) *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 _ = u.newCard(title, "") add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("") u.pages.SwitchToPage(mainPage) u.setColumnFocus() }) add.AddButton("Cancel", func() { u.pages.SwitchToPage(mainPage) add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("") u.setColumnFocus() }) add.SetBorder(true) add.SetTitle(" New Card ") return add }