Refactored StatusBar - changed into a type, other small fixes

This commit is contained in:
Anis Ahmad
2020-06-08 01:05:17 +06:00
parent 62d04b2963
commit a6af1a617a
9 changed files with 82 additions and 55 deletions

View File

@@ -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

View File

@@ -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,
)
}

View File

@@ -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)
}

View File

@@ -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 {

58
app/status_bar.go Normal file
View 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)
})
}()
}

View File

@@ -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()

View File

@@ -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)

View File

@@ -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) }
}

View File

@@ -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_*