refactoring the ui package

This commit is contained in:
Dan Anglin 2023-04-22 19:18:47 +01:00
parent 22e1f10079
commit 0523cd661e
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
4 changed files with 67 additions and 74 deletions

View file

@ -7,7 +7,7 @@ import (
)
func main() {
canal := ui.NewApp()
canal := ui.NewUI()
if err := canal.Run(); err != nil {
fmt.Printf("Error: an error occurred while running Canal, %s", err)

View file

@ -50,6 +50,10 @@ func Open(path string) (Board, error) {
}
func (b *Board) Close() error {
if b.db == nil {
return nil
}
return b.db.Close()
}

View file

@ -1,73 +1,9 @@
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()
@ -81,12 +17,12 @@ func newAddForm(u *UI) *tview.Form {
// TODO: error value needs handling
_ = u.newCard(title, "")
add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("")
u.pages.SwitchToPage(mainPage)
u.pages.SwitchToPage(mainPageName)
u.setColumnFocus()
})
add.AddButton("Cancel", func() {
u.pages.SwitchToPage(mainPage)
u.pages.SwitchToPage(mainPageName)
add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("")
u.setColumnFocus()
})

View file

@ -5,19 +5,18 @@ import (
"codeflow.dananglin.me.uk/apollo/canal/internal/board"
"github.com/rivo/tview"
"github.com/gdamore/tcell/v2"
)
type shiftDirection int
const (
shiftLeft shiftDirection = iota
shiftLeft int = iota
shiftRight
)
const (
mainPage string = "main"
quitPage string = "quit"
addPage string = "add"
mainPageName string = "main"
quitPageName string = "quit"
addPageName string = "add"
)
// UI does some magical stuff.
@ -29,6 +28,60 @@ type UI struct {
pages *tview.Pages
focusedColumn int
board board.Board
quit *tview.Modal
}
// NewUI returns a new UI value.
func NewUI() UI {
u := UI{
Application: tview.NewApplication(),
pages: tview.NewPages(),
flex: tview.NewFlex(),
quit: tview.NewModal(),
focusedColumn: 0,
}
u.initialise()
return u
}
// initialise the UI.
func (u *UI) initialise() {
u.pages.AddPage(mainPageName, u.flex, true, true)
u.initQuitModal()
u.pages.AddPage(quitPageName, u.quit, false, false)
u.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if event.Rune() == 'q' {
u.pages.ShowPage(quitPageName)
u.SetFocus(u.quit)
} else if event.Rune() == 'o' {
u.openBoard("")
}
return event
})
u.SetRoot(u.pages, true)
}
// initQuitModal initialises the quit modal.
func (u *UI) initQuitModal() {
quitDoneFunc := func(_ int, buttonLabel string) {
switch buttonLabel {
case "Quit":
u.shutdown()
default:
u.pages.SwitchToPage("main")
u.setColumnFocus()
}
}
u.quit.SetText("Do you want to quit the application?").
AddButtons([]string{"Quit", "Cancel"}).
SetDoneFunc(quitDoneFunc)
}
// shutdown shuts down the application.
@ -99,7 +152,7 @@ func (u *UI) updateBoard(statusList []board.Status) error {
return nil
}
func (u *UI) shiftColumnFocus(s shiftDirection) {
func (u *UI) shiftColumnFocus(s int) {
switch s {
case shiftRight:
if u.focusedColumn == len(u.columns)-1 {