pelican/internal/ui/init.go

99 lines
2.1 KiB
Go

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
}