From a6af1a617ab9fe86646d5b934f976d647ccca982 Mon Sep 17 00:00:00 2001 From: Anis Ahmad Date: Mon, 8 Jun 2020 01:05:17 +0600 Subject: [PATCH] Refactored StatusBar - changed into a type, other small fixes --- README.md | 2 +- app/cli.go | 28 +++------------------ app/project_detail.go | 4 +-- app/projects.go | 10 ++++---- app/status_bar.go | 58 +++++++++++++++++++++++++++++++++++++++++++ app/task_detail.go | 6 ++--- app/tasks.go | 4 +-- app/util.go | 23 +++++------------ build.sh | 2 +- 9 files changed, 82 insertions(+), 55 deletions(-) create mode 100644 app/status_bar.go diff --git a/README.md b/README.md index 7a7bd49..6267efb 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ I will be glad to accept your PR. :) By default, it will try to create a db file in you home directory. -But as a geek, you may try to put it different location (e,g, in you dropbox for syncing). +But as a geek, you may try to put it different location (e,g, in your dropbox for syncing). In that case, just mention `DB_FILE` as an environment variable. ```bash diff --git a/app/cli.go b/app/cli.go index 87eac02..353e3d5 100644 --- a/app/cli.go +++ b/app/cli.go @@ -20,9 +20,8 @@ var ( projectPane, projectDetailPane *tview.Flex taskPane, taskDetailPane *tview.Flex layout, contents *tview.Flex - statusBar *tview.Pages - message *tview.TextView - shortcutsPage, messagePage string = "shortcuts", "message" + + statusBar *StatusBar db *storm.DB projectRepo repository.ProjectRepository @@ -51,7 +50,7 @@ func main() { prepareProjectPane() prepareProjectDetail() prepareTaskPane() - prepareStatusBar() + statusBar = makeStatusBar(app) prepareDetailPane() contents = tview.NewFlex(). @@ -94,28 +93,9 @@ func setKeyboardShortcuts() *tview.Application { app.SetFocus(taskPane) case 'f': // @TODO : Remove - showMessage(reflect.TypeOf(app.GetFocus()).String()) + statusBar.showForSeconds(reflect.TypeOf(app.GetFocus()).String(), 5) } return event }) } - -func prepareStatusBar() { - statusBar = tview.NewPages() - - message = tview.NewTextView().SetDynamicColors(true).SetText("Loading...") - statusBar.AddPage(messagePage, message, true, true) - - statusBar.AddPage(shortcutsPage, - tview.NewGrid(). - SetColumns(0, 0, 0, 0). - SetRows(0). - AddItem(tview.NewTextView().SetText("Navigate List: ↓/↑"), 0, 0, 1, 1, 0, 0, false). - AddItem(tview.NewTextView().SetText("New Task/Project: n").SetTextAlign(tview.AlignCenter), 0, 1, 1, 1, 0, 0, false). - AddItem(tview.NewTextView().SetText("Step back: Esc").SetTextAlign(tview.AlignCenter), 0, 2, 1, 1, 0, 0, false). - AddItem(tview.NewTextView().SetText("Quit: Ctrl+C").SetTextAlign(tview.AlignRight), 0, 3, 1, 1, 0, 0, false), - true, - true, - ) -} diff --git a/app/project_detail.go b/app/project_detail.go index b554509..b40fc4a 100644 --- a/app/project_detail.go +++ b/app/project_detail.go @@ -29,7 +29,7 @@ func deleteCurrentProject() { _ = taskRepo.Delete(&tasks[i]) } - showMessage("Removed Project: " + currentProject.Title) + statusBar.showForSeconds("[lime]Removed Project: "+currentProject.Title, 5) removeThirdCol() taskList.Clear() projectList.Clear() @@ -46,5 +46,5 @@ func clearCompletedTasks() { count++ } } - showMessage(fmt.Sprintf("[yellow]%d tasks cleared!", count)) + statusBar.showForSeconds(fmt.Sprintf("[yellow]%d tasks cleared!", count), 5) } diff --git a/app/projects.go b/app/projects.go index 42e43cf..1e8c617 100644 --- a/app/projects.go +++ b/app/projects.go @@ -18,15 +18,15 @@ func prepareProjectPane() { switch key { case tcell.KeyEnter: if len(newProject.GetText()) < 3 { - showMessage("[red::]Project name should be at least 3 character") + statusBar.showForSeconds("[red::]Project name should be at least 3 character", 5) return } project, err := projectRepo.Create(newProject.GetText(), "") if err != nil { - showMessage("[red::]Failed to create Project:" + err.Error()) + statusBar.showForSeconds("[red::]Failed to create Project:"+err.Error(), 5) } else { - showMessage(fmt.Sprintf("[yellow::]Project %s created. Press n to start adding new tasks.", newProject.GetText())) + statusBar.showForSeconds(fmt.Sprintf("[yellow::]Project %s created. Press n to start adding new tasks.", newProject.GetText()), 5) projects = append(projects, project) addProjectToList(len(projects)-1, true) newProject.SetText("") @@ -47,7 +47,7 @@ func loadProjectList() { var err error projects, err = projectRepo.GetAll() if err != nil { - showMessage("Could not load Projects: " + err.Error()) + statusBar.showForSeconds("Could not load Projects: "+err.Error(), 5) return } @@ -86,7 +86,7 @@ func loadProject(idx int) { var err error if tasks, err = taskRepo.GetAllByProject(*currentProject); err != nil && err != storm.ErrNotFound { - showMessage("[red::]Error: " + err.Error()) + statusBar.showForSeconds("[red::]Error: "+err.Error(), 5) } for i, task := range tasks { diff --git a/app/status_bar.go b/app/status_bar.go new file mode 100644 index 0000000..949a58b --- /dev/null +++ b/app/status_bar.go @@ -0,0 +1,58 @@ +package main + +import ( + "time" + + "github.com/rivo/tview" +) + +type StatusBar struct { + *tview.Pages + message *tview.TextView + container *tview.Application +} + +// Name of page keys +const ( + defaultPage = "default" + messagePage = "message" +) + +func makeStatusBar(app *tview.Application) *StatusBar { + statusBar := StatusBar{ + Pages: tview.NewPages(), + message: tview.NewTextView().SetDynamicColors(true).SetText("Loading..."), + container: app, + } + + statusBar.AddPage(messagePage, statusBar.message, true, true) + statusBar.AddPage(defaultPage, + tview.NewGrid(). // Content will not be modified, So, no need to declare explicitly + SetColumns(0, 0, 0, 0). + SetRows(0). + AddItem(tview.NewTextView().SetText("Navigate List: ↓/↑"), 0, 0, 1, 1, 0, 0, false). + AddItem(tview.NewTextView().SetText("New Task/Project: n").SetTextAlign(tview.AlignCenter), 0, 1, 1, 1, 0, 0, false). + AddItem(tview.NewTextView().SetText("Step back: Esc").SetTextAlign(tview.AlignCenter), 0, 2, 1, 1, 0, 0, false). + AddItem(tview.NewTextView().SetText("Quit: Ctrl+C").SetTextAlign(tview.AlignRight), 0, 3, 1, 1, 0, 0, false), + true, + true, + ) + + return &statusBar +} + +func (bar *StatusBar) showForSeconds(message string, timeout int) { + if bar.container == nil { + return + } + + bar.message.SetText(message) + bar.SwitchToPage(messagePage) + + go func() { + time.Sleep(time.Second * time.Duration(timeout)) + bar.container.QueueUpdateDraw(func() { + bar.SwitchToPage(defaultPage) + }) + }() +} diff --git a/app/task_detail.go b/app/task_detail.go index f7656db..649b059 100644 --- a/app/task_detail.go +++ b/app/task_detail.go @@ -122,7 +122,7 @@ func setTaskDate(unixDate int64, update bool) { if update { currentTask.DueDate = unixDate if err := taskRepo.UpdateField(currentTask, "DueDate", unixDate); err != nil { - showMessage("Could not update due date: " + err.Error()) + statusBar.showForSeconds("Could not update due date: "+err.Error(), 5) return } } @@ -163,9 +163,9 @@ func prepareDetailsEditor() { currentTask.Details = taskDetailView.Buf.String() err := taskRepo.Update(currentTask) if err == nil { - showMessage("[lime]Saved task detail") + statusBar.showForSeconds("[lime]Saved task detail", 5) } else { - showMessage("[red]Could not save: " + err.Error()) + statusBar.showForSeconds("[red]Could not save: "+err.Error(), 5) } deactivateEditor() diff --git a/app/tasks.go b/app/tasks.go index af2e682..2822945 100644 --- a/app/tasks.go +++ b/app/tasks.go @@ -27,13 +27,13 @@ func prepareTaskPane() { switch key { case tcell.KeyEnter: if len(newTask.GetText()) < 3 { - showMessage("[red::]Task title should be at least 3 character") + statusBar.showForSeconds("[red::]Task title should be at least 3 character", 5) return } task, err := taskRepo.Create(*currentProject, newTask.GetText(), "", "", 0) if err != nil { - showMessage("[red::]Could not create Task:" + err.Error()) + statusBar.showForSeconds("[red::]Could not create Task:"+err.Error(), 5) } tasks = append(tasks, task) diff --git a/app/util.go b/app/util.go index b96b4b8..890cf75 100644 --- a/app/util.go +++ b/app/util.go @@ -45,23 +45,6 @@ func parseDateInputOrCurrent(inputText string) time.Time { return time.Now() } -func showMessage(text string) { - message.SetText(text) - statusBar.SwitchToPage(messagePage) - - go func() { - time.Sleep(time.Second * 5) - app.QueueUpdateDraw(func() { - statusBar.SwitchToPage(shortcutsPage) - }) - }() -} - -func yetToImplement(feature string) func() { - message := fmt.Sprintf("[yellow]%s is yet to implement. Please Check in next version.", feature) - return func() { showMessage(message) } -} - func makeButton(label string, handler func()) *tview.Button { btn := tview.NewButton(label).SetSelectedFunc(handler). SetLabelColor(tcell.ColorWhite) @@ -75,3 +58,9 @@ func ignoreKeyEvt() bool { textInputs := []string{"*tview.InputField", "*femto.View"} return util.InArray(reflect.TypeOf(app.GetFocus()).String(), textInputs) } + +// yetToImplement - to use as callback for unimplemented features +func yetToImplement(feature string) func() { + message := fmt.Sprintf("[yellow]%s is yet to implement. Please Check in next version.", feature) + return func() { statusBar.showForSeconds(message, 5) } +} diff --git a/build.sh b/build.sh index 726bec4..cd44bd6 100644 --- a/build.sh +++ b/build.sh @@ -1,5 +1,5 @@ env GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o builds/geek-life_darwin-amd64 ./app env GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o builds/geek-life_linux-amd64 ./app env GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o builds/geek-life_linux-arm64 ./app -env GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o builds/geek-life_windows-386.exe ./app +env GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o builds/geek-life_windows-386 ./app upx builds/geek-life_* \ No newline at end of file