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