Files
geek-life/app/cli.go
2021-01-18 03:32:01 +06:00

122 lines
2.9 KiB
Go

package main
import (
"fmt"
"os"
"github.com/asdine/storm/v3"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
"github.com/ajaxray/geek-life/model"
"github.com/ajaxray/geek-life/repository"
repo "github.com/ajaxray/geek-life/repository/storm"
"github.com/ajaxray/geek-life/util"
)
var (
app *tview.Application
layout, contents *tview.Flex
statusBar *StatusBar
projectPane *ProjectPane
taskPane *TaskPane
taskDetailPane *TaskDetailPane
projectDetailPane *ProjectDetailPane
db *storm.DB
projectRepo repository.ProjectRepository
taskRepo repository.TaskRepository
)
func main() {
app = tview.NewApplication()
db = util.ConnectStorm()
defer func() {
if err := db.Close(); err != nil {
util.LogIfError(err, "Error in closing storm Db")
}
}()
if len(os.Args) > 1 && os.Args[1] == "migrate" {
migrate(db)
} else {
projectRepo = repo.NewProjectRepository(db)
taskRepo = repo.NewTaskRepository(db)
layout = tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(makeTitleBar(), 2, 1, false).
AddItem(prepareContentPages(), 0, 2, true).
AddItem(prepareStatusBar(app), 1, 1, false)
setKeyboardShortcuts()
if err := app.SetRoot(layout, true).EnableMouse(true).Run(); err != nil {
panic(err)
}
}
}
func migrate(database *storm.DB) {
util.FatalIfError(database.ReIndex(&model.Project{}), "Error in migrating Projects")
util.FatalIfError(database.ReIndex(&model.Task{}), "Error in migrating Tasks")
fmt.Println("Migration completed. Start geek-life normally.")
os.Exit(0)
}
func setKeyboardShortcuts() *tview.Application {
return app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if ignoreKeyEvt() {
return event
}
// Global shortcuts
switch event.Rune() {
case 'p':
app.SetFocus(projectPane)
return nil
case 't':
app.SetFocus(taskPane)
return nil
}
// Handle based on current focus. Handlers may modify event
switch {
case projectPane.HasFocus():
event = projectPane.handleShortcuts(event)
case taskPane.HasFocus():
event = taskPane.handleShortcuts(event)
case taskDetailPane.HasFocus():
event = taskDetailPane.handleShortcuts(event)
}
return event
})
}
func prepareContentPages() *tview.Flex {
projectPane = NewProjectPane(projectRepo)
taskPane = NewTaskPane(projectRepo, taskRepo)
projectDetailPane = NewProjectDetailPane()
taskDetailPane = NewTaskDetailPane(taskRepo)
contents = tview.NewFlex().
AddItem(projectPane, 25, 1, true).
AddItem(taskPane, 0, 2, false)
return contents
}
func makeTitleBar() *tview.Flex {
titleText := tview.NewTextView().SetText("[lime::b]Geek-life [::-]- Task Manager for geeks!").SetDynamicColors(true)
versionInfo := tview.NewTextView().SetText("[::d]Version: 0.1.1").SetTextAlign(tview.AlignRight).SetDynamicColors(true)
return tview.NewFlex().
AddItem(titleText, 0, 2, false).
AddItem(versionInfo, 0, 1, false)
}