gask/model.go

120 lines
2.5 KiB
Go

package main
import (
"strings"
"time"
todotxt "github.com/br0xen/go-todotxt"
)
func (a *AppState) addTask(taskString string) error {
t, err := todotxt.ParseTask(taskString)
if err != nil {
return err
}
if t.CreatedDate.IsZero() {
t.CreatedDate = time.Now()
}
a.TaskList.AddTask(t)
return nil
}
func (a *AppState) toggleTaskComplete(id int) error {
var task *todotxt.Task
var err error
if task, err = a.TaskList.GetTask(id); err != nil {
return err
}
if task.Completed {
task.Reopen()
} else {
task.Complete()
}
return nil
}
func (a *AppState) archiveTask(id int) error {
var err error
var task *todotxt.Task
if task, err = a.TaskList.GetTask(id); err != nil {
return err
}
task.Completed = true
if err := a.TaskList.ArchiveTaskToFile(*task, app.getDoneFile()); err != nil {
return err
}
a.TaskList.RemoveTask(*task)
return nil
}
func (a *AppState) getFilterPredicate(filter string) func(todotxt.Task) bool {
var predicates []func(todotxt.Task) bool
// If none of the 'filter' is in upper-case, do a case-insensitive filter
checkCase := true
if strings.ToLower(filter) == filter {
checkCase = false
}
filterParts := strings.Split(filter, " ")
for _, part := range filterParts {
if strings.HasPrefix(part, "@") {
predicates = append(predicates, func(t todotxt.Task) bool {
for _, v := range t.Contexts {
if "@"+v == part {
return true
}
}
return false
})
} else if strings.HasPrefix(part, "+") {
predicates = append(predicates, func(t todotxt.Task) bool {
for _, v := range t.Projects {
if "+"+v == part {
return true
}
}
return false
})
} else {
predicates = append(predicates, func(t todotxt.Task) bool {
val := t.Original
if !checkCase {
val = strings.ToLower(t.Original)
}
return strings.Contains(val, part)
})
}
}
return func(t todotxt.Task) bool {
for _, v := range predicates {
if v(t) {
return true
}
}
return false
}
}
func (a *AppState) LoadTaskList() error {
var err error
var tl todotxt.TaskList
tl, err = todotxt.LoadFromFilename(a.getTodoFile())
a.TaskList = &tl
return err
}
func (a *AppState) LoadDoneList() error {
var err error
var tl todotxt.TaskList
tl, err = todotxt.LoadFromFilename(a.getDoneFile())
a.DoneList = &tl
return err
}
func (a *AppState) WriteList() error {
return a.TaskList.WriteToFilename(a.getTodoFile())
}
func (a *AppState) WriteDoneList() error {
return a.DoneList.WriteToFilename(a.getDoneFile())
}