feat: move a card between statuses #3
4 changed files with 67 additions and 74 deletions
|
@ -7,7 +7,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
canal := ui.NewApp()
|
canal := ui.NewUI()
|
||||||
|
|
||||||
if err := canal.Run(); err != nil {
|
if err := canal.Run(); err != nil {
|
||||||
fmt.Printf("Error: an error occurred while running Canal, %s", err)
|
fmt.Printf("Error: an error occurred while running Canal, %s", err)
|
||||||
|
|
|
@ -50,6 +50,10 @@ func Open(path string) (Board, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Board) Close() error {
|
func (b *Board) Close() error {
|
||||||
|
if b.db == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
return b.db.Close()
|
return b.db.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,73 +1,9 @@
|
||||||
package ui
|
package ui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gdamore/tcell/v2"
|
|
||||||
"github.com/rivo/tview"
|
"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.
|
// newAddForm creates a new Form primitive for creating a new card.
|
||||||
func newAddForm(u *UI) *tview.Form {
|
func newAddForm(u *UI) *tview.Form {
|
||||||
add := tview.NewForm()
|
add := tview.NewForm()
|
||||||
|
@ -81,12 +17,12 @@ func newAddForm(u *UI) *tview.Form {
|
||||||
// TODO: error value needs handling
|
// TODO: error value needs handling
|
||||||
_ = u.newCard(title, "")
|
_ = u.newCard(title, "")
|
||||||
add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("")
|
add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("")
|
||||||
u.pages.SwitchToPage(mainPage)
|
u.pages.SwitchToPage(mainPageName)
|
||||||
u.setColumnFocus()
|
u.setColumnFocus()
|
||||||
})
|
})
|
||||||
|
|
||||||
add.AddButton("Cancel", func() {
|
add.AddButton("Cancel", func() {
|
||||||
u.pages.SwitchToPage(mainPage)
|
u.pages.SwitchToPage(mainPageName)
|
||||||
add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("")
|
add.GetFormItemByLabel(titleField).(*tview.InputField).SetText("")
|
||||||
u.setColumnFocus()
|
u.setColumnFocus()
|
||||||
})
|
})
|
||||||
|
|
|
@ -5,19 +5,18 @@ import (
|
||||||
|
|
||||||
"codeflow.dananglin.me.uk/apollo/canal/internal/board"
|
"codeflow.dananglin.me.uk/apollo/canal/internal/board"
|
||||||
"github.com/rivo/tview"
|
"github.com/rivo/tview"
|
||||||
|
"github.com/gdamore/tcell/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type shiftDirection int
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
shiftLeft shiftDirection = iota
|
shiftLeft int = iota
|
||||||
shiftRight
|
shiftRight
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
mainPage string = "main"
|
mainPageName string = "main"
|
||||||
quitPage string = "quit"
|
quitPageName string = "quit"
|
||||||
addPage string = "add"
|
addPageName string = "add"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UI does some magical stuff.
|
// UI does some magical stuff.
|
||||||
|
@ -29,6 +28,60 @@ type UI struct {
|
||||||
pages *tview.Pages
|
pages *tview.Pages
|
||||||
focusedColumn int
|
focusedColumn int
|
||||||
board board.Board
|
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.
|
// shutdown shuts down the application.
|
||||||
|
@ -99,7 +152,7 @@ func (u *UI) updateBoard(statusList []board.Status) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UI) shiftColumnFocus(s shiftDirection) {
|
func (u *UI) shiftColumnFocus(s int) {
|
||||||
switch s {
|
switch s {
|
||||||
case shiftRight:
|
case shiftRight:
|
||||||
if u.focusedColumn == len(u.columns)-1 {
|
if u.focusedColumn == len(u.columns)-1 {
|
Loading…
Reference in a new issue