Dan Anglin
b07ce3f415
Create a new Board type in the board package which is a wrapper around the BoltDB db pointer to remove direct access to the BoltDB database from the UI package.
99 lines
2.1 KiB
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.openBoard("")
|
|
} 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
|
|
}
|