Refactored StatusBar - changed into a type, other small fixes
This commit is contained in:
@@ -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.
|
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.
|
In that case, just mention `DB_FILE` as an environment variable.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
28
app/cli.go
28
app/cli.go
@@ -20,9 +20,8 @@ var (
|
|||||||
projectPane, projectDetailPane *tview.Flex
|
projectPane, projectDetailPane *tview.Flex
|
||||||
taskPane, taskDetailPane *tview.Flex
|
taskPane, taskDetailPane *tview.Flex
|
||||||
layout, contents *tview.Flex
|
layout, contents *tview.Flex
|
||||||
statusBar *tview.Pages
|
|
||||||
message *tview.TextView
|
statusBar *StatusBar
|
||||||
shortcutsPage, messagePage string = "shortcuts", "message"
|
|
||||||
|
|
||||||
db *storm.DB
|
db *storm.DB
|
||||||
projectRepo repository.ProjectRepository
|
projectRepo repository.ProjectRepository
|
||||||
@@ -51,7 +50,7 @@ func main() {
|
|||||||
prepareProjectPane()
|
prepareProjectPane()
|
||||||
prepareProjectDetail()
|
prepareProjectDetail()
|
||||||
prepareTaskPane()
|
prepareTaskPane()
|
||||||
prepareStatusBar()
|
statusBar = makeStatusBar(app)
|
||||||
prepareDetailPane()
|
prepareDetailPane()
|
||||||
|
|
||||||
contents = tview.NewFlex().
|
contents = tview.NewFlex().
|
||||||
@@ -94,28 +93,9 @@ func setKeyboardShortcuts() *tview.Application {
|
|||||||
app.SetFocus(taskPane)
|
app.SetFocus(taskPane)
|
||||||
case 'f':
|
case 'f':
|
||||||
// @TODO : Remove
|
// @TODO : Remove
|
||||||
showMessage(reflect.TypeOf(app.GetFocus()).String())
|
statusBar.showForSeconds(reflect.TypeOf(app.GetFocus()).String(), 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
return event
|
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,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func deleteCurrentProject() {
|
|||||||
_ = taskRepo.Delete(&tasks[i])
|
_ = taskRepo.Delete(&tasks[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
showMessage("Removed Project: " + currentProject.Title)
|
statusBar.showForSeconds("[lime]Removed Project: "+currentProject.Title, 5)
|
||||||
removeThirdCol()
|
removeThirdCol()
|
||||||
taskList.Clear()
|
taskList.Clear()
|
||||||
projectList.Clear()
|
projectList.Clear()
|
||||||
@@ -46,5 +46,5 @@ func clearCompletedTasks() {
|
|||||||
count++
|
count++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
showMessage(fmt.Sprintf("[yellow]%d tasks cleared!", count))
|
statusBar.showForSeconds(fmt.Sprintf("[yellow]%d tasks cleared!", count), 5)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,15 +18,15 @@ func prepareProjectPane() {
|
|||||||
switch key {
|
switch key {
|
||||||
case tcell.KeyEnter:
|
case tcell.KeyEnter:
|
||||||
if len(newProject.GetText()) < 3 {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
project, err := projectRepo.Create(newProject.GetText(), "")
|
project, err := projectRepo.Create(newProject.GetText(), "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
showMessage("[red::]Failed to create Project:" + err.Error())
|
statusBar.showForSeconds("[red::]Failed to create Project:"+err.Error(), 5)
|
||||||
} else {
|
} 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)
|
projects = append(projects, project)
|
||||||
addProjectToList(len(projects)-1, true)
|
addProjectToList(len(projects)-1, true)
|
||||||
newProject.SetText("")
|
newProject.SetText("")
|
||||||
@@ -47,7 +47,7 @@ func loadProjectList() {
|
|||||||
var err error
|
var err error
|
||||||
projects, err = projectRepo.GetAll()
|
projects, err = projectRepo.GetAll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
showMessage("Could not load Projects: " + err.Error())
|
statusBar.showForSeconds("Could not load Projects: "+err.Error(), 5)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ func loadProject(idx int) {
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
if tasks, err = taskRepo.GetAllByProject(*currentProject); err != nil && err != storm.ErrNotFound {
|
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 {
|
for i, task := range tasks {
|
||||||
|
|||||||
58
app/status_bar.go
Normal file
58
app/status_bar.go
Normal file
@@ -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)
|
||||||
|
})
|
||||||
|
}()
|
||||||
|
}
|
||||||
@@ -122,7 +122,7 @@ func setTaskDate(unixDate int64, update bool) {
|
|||||||
if update {
|
if update {
|
||||||
currentTask.DueDate = unixDate
|
currentTask.DueDate = unixDate
|
||||||
if err := taskRepo.UpdateField(currentTask, "DueDate", unixDate); err != nil {
|
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
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,9 +163,9 @@ func prepareDetailsEditor() {
|
|||||||
currentTask.Details = taskDetailView.Buf.String()
|
currentTask.Details = taskDetailView.Buf.String()
|
||||||
err := taskRepo.Update(currentTask)
|
err := taskRepo.Update(currentTask)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
showMessage("[lime]Saved task detail")
|
statusBar.showForSeconds("[lime]Saved task detail", 5)
|
||||||
} else {
|
} else {
|
||||||
showMessage("[red]Could not save: " + err.Error())
|
statusBar.showForSeconds("[red]Could not save: "+err.Error(), 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
deactivateEditor()
|
deactivateEditor()
|
||||||
|
|||||||
@@ -27,13 +27,13 @@ func prepareTaskPane() {
|
|||||||
switch key {
|
switch key {
|
||||||
case tcell.KeyEnter:
|
case tcell.KeyEnter:
|
||||||
if len(newTask.GetText()) < 3 {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
task, err := taskRepo.Create(*currentProject, newTask.GetText(), "", "", 0)
|
task, err := taskRepo.Create(*currentProject, newTask.GetText(), "", "", 0)
|
||||||
if err != nil {
|
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)
|
tasks = append(tasks, task)
|
||||||
|
|||||||
23
app/util.go
23
app/util.go
@@ -45,23 +45,6 @@ func parseDateInputOrCurrent(inputText string) time.Time {
|
|||||||
return time.Now()
|
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 {
|
func makeButton(label string, handler func()) *tview.Button {
|
||||||
btn := tview.NewButton(label).SetSelectedFunc(handler).
|
btn := tview.NewButton(label).SetSelectedFunc(handler).
|
||||||
SetLabelColor(tcell.ColorWhite)
|
SetLabelColor(tcell.ColorWhite)
|
||||||
@@ -75,3 +58,9 @@ func ignoreKeyEvt() bool {
|
|||||||
textInputs := []string{"*tview.InputField", "*femto.View"}
|
textInputs := []string{"*tview.InputField", "*femto.View"}
|
||||||
return util.InArray(reflect.TypeOf(app.GetFocus()).String(), textInputs)
|
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) }
|
||||||
|
}
|
||||||
|
|||||||
2
build.sh
2
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=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=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=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_*
|
upx builds/geek-life_*
|
||||||
Reference in New Issue
Block a user