From f3637b45986d097f85d97844febb764ad3c22eda Mon Sep 17 00:00:00 2001 From: Anis Ahmad Date: Sun, 21 Jun 2020 04:43:43 +0600 Subject: [PATCH] Editing in external editor working - issue with Mouse --- app/task_detail.go | 83 +++++++++++++++++++++++++++++++++++++++++----- app/tasks.go | 6 ++-- build.sh | 1 + 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/app/task_detail.go b/app/task_detail.go index b963602..b09e0f5 100644 --- a/app/task_detail.go +++ b/app/task_detail.go @@ -2,6 +2,9 @@ package main import ( "fmt" + "io/ioutil" + "os" + "os/exec" "time" "github.com/gdamore/tcell" @@ -11,6 +14,7 @@ import ( "github.com/ajaxray/geek-life/model" "github.com/ajaxray/geek-life/repository" + "github.com/ajaxray/geek-life/util" ) const dateLayoutISO = "2006-01-02" @@ -175,14 +179,7 @@ func (td *TaskDetailPane) prepareDetailsEditor() { td.taskDetailView.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyEsc: - td.task.Details = td.taskDetailView.Buf.String() - err := taskRepo.Update(td.task) - if err == nil { - statusBar.showForSeconds("[lime]Saved task detail", 5) - } else { - statusBar.showForSeconds("[red]Could not save: "+err.Error(), 5) - } - + td.updateTaskNote(td.taskDetailView.Buf.String()) td.deactivateEditor() return nil } @@ -191,6 +188,16 @@ func (td *TaskDetailPane) prepareDetailsEditor() { }) } +func (td *TaskDetailPane) updateTaskNote(note string) { + td.task.Details = note + err := taskRepo.Update(td.task) + if err == nil { + statusBar.showForSeconds("[lime]Saved task detail", 5) + } else { + statusBar.showForSeconds("[red]Could not save: "+err.Error(), 5) + } +} + func makeBufferFromString(content string) *femto.Buffer { buff := femto.NewBufferFromString(content, "") // taskDetail.Settings["ruler"] = false @@ -217,6 +224,64 @@ func (td *TaskDetailPane) deactivateEditor() { app.SetFocus(td) } +func (td *TaskDetailPane) editInExternalEditor() { + + tmpFileName, err := writeToTmpFile(td.task.Details) + if err != nil { + statusBar.showForSeconds("[red::]Failed to create tmp file. Try in-app editing by pressing i", 5) + return + } + + var messageToShow, updatedContent string + app.Suspend(func() { + cmd := exec.Command(util.GetEnvStr("EDITOR", "vim"), tmpFileName) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + messageToShow = "[red::]Failed to save content. Try in-app editing by pressing i" + return + } + + if content, readErr := ioutil.ReadFile(tmpFileName); readErr == nil { + updatedContent = string(content) + } else { + messageToShow = "[red::]Failed to load external editing. Try in-app editing by pressing i" + } + }) + + if messageToShow != "" { + statusBar.showForSeconds(messageToShow, 10) + } + + if updatedContent != "" { + td.updateTaskNote(updatedContent) + td.SetTask(td.task) + } + + app.ForceDraw() + // @TODO: Not working - fix it + app.EnableMouse(true) + _ = os.Remove(tmpFileName) + + // app.SetFocus(td) +} + +// writeToTmpFile writes given content to a tmpFile and returns the filename +func writeToTmpFile(content string) (string, error) { + tmpFile, err := ioutil.TempFile("", "geek_life_task_note_*.md") + if err != nil { + return "", err + } + fileName := tmpFile.Name() + + if err = ioutil.WriteFile(fileName, []byte(content), 0777); err != nil { + return "", err + } + + return fileName, tmpFile.Close() +} + func (td *TaskDetailPane) handleShortcuts(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyEsc: @@ -229,6 +294,8 @@ func (td *TaskDetailPane) handleShortcuts(event *tcell.EventKey) *tcell.EventKey switch event.Rune() { case 'e': td.activateEditor() + case 'v': + td.editInExternalEditor() case 'd': app.SetFocus(td.taskDate) case ' ': diff --git a/app/tasks.go b/app/tasks.go index 453a105..c2ff906 100644 --- a/app/tasks.go +++ b/app/tasks.go @@ -147,8 +147,10 @@ func (pane *TaskPane) ClearCompletedTasks() { func (pane TaskPane) setHintMessage() { if len(projectPane.projects) == 0 { - pane.hint.SetText("Welcome to the organized life!\n------------------------------\n Create TaskList/Project at the bottom of Projects pane.\n (Press p,n)") + pane.hint.SetText("Welcome to the organized life!\n------------------------------\n Create TaskList/Project at the bottom of Projects pane.\n (Press p,n) \n\nHelp - https://bit.ly/cli-task") } else { - pane.hint.SetText("Select a TaskList/Project to load tasks.\nPress p,n to create new Project.") + pane.hint.SetText("Select a TaskList/Project to load tasks.\nPress p,n to create new Project.\n\nHelp - https://bit.ly/cli-task") } + + // Add: For help - https://bit.ly/cli-task } diff --git a/build.sh b/build.sh index cd44bd6..f4ec039 100644 --- a/build.sh +++ b/build.sh @@ -1,3 +1,4 @@ +# go build -o geek-life ./app 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