package main import ( "fmt" "os" "github.com/asdine/storm/v3" "github.com/gdamore/tcell" "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() } projectRepo = repo.NewProjectRepository(db) taskRepo = repo.NewTaskRepository(db) titleText := tview.NewTextView().SetText("[lime::b]Geek-life [::-]- Task Manager for geeks!").SetDynamicColors(true) cloudStatus := tview.NewTextView().SetText("[::d]Version: 0.1.0").SetTextAlign(tview.AlignRight).SetDynamicColors(true) titleBar := tview.NewFlex(). AddItem(titleText, 0, 2, false). AddItem(cloudStatus, 0, 1, false) statusBar = makeStatusBar(app) 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) layout = tview.NewFlex().SetDirection(tview.FlexRow). AddItem(titleBar, 2, 1, false). AddItem(contents, 0, 2, true). AddItem(statusBar, 1, 1, false) setKeyboardShortcuts() if err := app.SetRoot(layout, true).EnableMouse(true).Run(); err != nil { panic(err) } } func migrate() { util.FatalIfError(db.ReIndex(&model.Project{}), "Error in migrating Projects") util.FatalIfError(db.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 } // 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) } // Global shortcuts switch event.Rune() { case 'p': app.SetFocus(projectPane) case 't': app.SetFocus(taskPane) case 'f': // @TODO : Remove // statusBar.showForSeconds(reflect.TypeOf(app.GetFocus()).String(), 5) statusBar.showForSeconds(fmt.Sprintf("Due: %#v", taskPane.activeTask), 5) } return event }) }