taskPane modified as a Component (type)

This commit is contained in:
Anis Ahmad
2020-06-10 23:50:13 +06:00
parent ea141f5013
commit 19666900a2
6 changed files with 146 additions and 119 deletions

View File

@@ -2,107 +2,122 @@ package main
import (
"fmt"
"time"
"github.com/asdine/storm/v3"
"github.com/gdamore/tcell"
"github.com/rivo/tview"
"github.com/ajaxray/geek-life/model"
"github.com/ajaxray/geek-life/repository"
)
var (
tasks []model.Task
currentTask *model.Task
currentTaskIdx int
)
type TaskPane struct {
*tview.Flex
list *tview.List
tasks []model.Task
activeTask *model.Task
func prepareTaskPane() {
taskList = tview.NewList().ShowSecondaryText(false)
taskList.SetDoneFunc(func() {
newTask *tview.InputField
projectRepo repository.ProjectRepository
taskRepo repository.TaskRepository
}
func NewTaskPane(projectRepo repository.ProjectRepository, taskRepo repository.TaskRepository) *TaskPane {
pane := TaskPane{
Flex: tview.NewFlex().SetDirection(tview.FlexRow),
list: tview.NewList().ShowSecondaryText(false),
newTask: makeLightTextInput("+[New Task]"),
projectRepo: projectRepo,
taskRepo: taskRepo,
}
pane.list.SetDoneFunc(func() {
app.SetFocus(projectPane)
})
newTask = makeLightTextInput("+[New Task]").
SetDoneFunc(func(key tcell.Key) {
switch key {
case tcell.KeyEnter:
if len(newTask.GetText()) < 3 {
statusBar.showForSeconds("[red::]Task title should be at least 3 character", 5)
return
}
task, err := taskRepo.Create(*projectPane.activeProject, newTask.GetText(), "", "", 0)
if err != nil {
statusBar.showForSeconds("[red::]Could not create Task:"+err.Error(), 5)
}
tasks = append(tasks, task)
addTaskToList(task, len(tasks)-1)
newTask.SetText("")
case tcell.KeyEsc:
app.SetFocus(taskPane)
pane.newTask.SetDoneFunc(func(key tcell.Key) {
switch key {
case tcell.KeyEnter:
name := pane.newTask.GetText()
if len(name) < 3 {
statusBar.showForSeconds("[red::]Task title should be at least 3 character", 5)
return
}
})
task, err := taskRepo.Create(*projectPane.activeProject, name, "", "", 0)
if err != nil {
statusBar.showForSeconds("[red::]Could not create Task:"+err.Error(), 5)
}
taskPane = tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(taskList, 0, 1, true).
AddItem(newTask, 1, 0, false)
pane.tasks = append(pane.tasks, task)
pane.addTaskToList(len(pane.tasks) - 1)
pane.newTask.SetText("")
case tcell.KeyEsc:
app.SetFocus(pane)
}
taskPane.SetBorder(true).SetTitle("[::u]T[::-]asks")
})
pane.
AddItem(pane.list, 0, 1, true).
AddItem(pane.newTask, 1, 0, false)
pane.SetBorder(true).SetTitle("[::u]T[::-]asks")
return &pane
}
func addTaskToList(task model.Task, i int) *tview.List {
return taskList.AddItem(makeTaskListingTitle(task), "", 0, func(taskidx int) func() {
return func() { loadTask(taskidx) }
func (pane *TaskPane) ClearList() {
pane.list.Clear()
pane.tasks = nil
}
func (pane *TaskPane) SetList(tasks []model.Task) {
pane.ClearList()
pane.tasks = tasks
for i := range pane.tasks {
pane.addTaskToList(i)
}
}
func (pane *TaskPane) addTaskToList(i int) *tview.List {
return pane.list.AddItem(makeTaskListingTitle(pane.tasks[i]), "", 0, func(taskidx int) func() {
return func() { taskPane.ActivateTask(taskidx) }
}(i))
}
func loadTask(idx int) {
removeThirdCol()
currentTaskIdx = idx
currentTask = &tasks[currentTaskIdx]
func (pane *TaskPane) handleShortcuts(event *tcell.EventKey) *tcell.EventKey {
switch event.Rune() {
case 'n':
app.SetFocus(pane.newTask)
}
taskName.SetText(fmt.Sprintf("[%s::b]# %s", getTaskTitleColor(*currentTask), currentTask.Title))
taskDetailView.Buf = makeBufferFromString(currentTask.Details)
return event
}
func (pane *TaskPane) LoadProjectTasks(project model.Project) {
var tasks []model.Task
var err error
if tasks, err = taskRepo.GetAllByProject(project); err != nil && err != storm.ErrNotFound {
statusBar.showForSeconds("[red::]Error: "+err.Error(), 5)
} else {
pane.SetList(tasks)
}
}
func (pane *TaskPane) ActivateTask(idx int) {
removeThirdCol()
pane.activeTask = &pane.tasks[idx]
taskName.SetText(fmt.Sprintf("[%s::b]# %s", getTaskTitleColor(*pane.activeTask), pane.activeTask.Title))
taskDetailView.Buf = makeBufferFromString(pane.activeTask.Details)
taskDetailView.SetColorscheme(colorscheme)
taskDetailView.Start()
setTaskDate(currentTask.DueDate, false)
setTaskDate(pane.activeTask.DueDate, false)
setStatusToggle()
contents.AddItem(taskDetailPane, 0, 3, false)
deactivateEditor()
}
func removeThirdCol() {
contents.RemoveItem(taskDetailPane)
contents.RemoveItem(projectDetailPane)
}
func getTaskTitleColor(task model.Task) string {
colorName := "olive"
if task.Completed {
colorName = "lime"
} else if task.DueDate != 0 && task.DueDate < time.Now().Truncate(24*time.Hour).Unix() {
colorName = "red"
}
return colorName
}
func makeTaskListingTitle(task model.Task) string {
checkbox := "[ []"
if task.Completed {
checkbox = "[x[]"
}
return fmt.Sprintf("[%s]%s %s", getTaskTitleColor(task), checkbox, task.Title)
}
func handleTaskPaneShortcuts(event *tcell.EventKey) *tcell.EventKey {
switch event.Rune() {
case 'n':
app.SetFocus(newTask)
}
return event
}