diff --git a/cmd/canal/main.go b/cmd/canal/main.go index abd9cf3..77a090e 100644 --- a/cmd/canal/main.go +++ b/cmd/canal/main.go @@ -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) diff --git a/internal/board/board.go b/internal/board/board.go index a0545ae..a9d97c6 100644 --- a/internal/board/board.go +++ b/internal/board/board.go @@ -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() } diff --git a/internal/ui/init.go b/internal/ui/init.go index 4f198b6..c3a1759 100644 --- a/internal/ui/init.go +++ b/internal/ui/init.go @@ -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() }) diff --git a/internal/ui/app.go b/internal/ui/ui.go similarity index 67% rename from internal/ui/app.go rename to internal/ui/ui.go index a5eaa5f..735d2da 100644 --- a/internal/ui/app.go +++ b/internal/ui/ui.go @@ -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 {