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.
|
||||
|
||||
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
|
||||
|
||||
28
app/cli.go
28
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,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
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 {
|
||||
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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
23
app/util.go
23
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) }
|
||||
}
|
||||
|
||||
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=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_*
|
||||
Reference in New Issue
Block a user