dynamically update display

This commit is contained in:
Kevin Schoon 2018-01-20 20:03:23 +08:00
parent 6dab576f27
commit 24672d396e
3 changed files with 78 additions and 26 deletions

27
main.go
View File

@ -15,33 +15,12 @@ func maybe(err error) {
}
}
func startTask(task Task, prompter Prompter, db *Store) {
taskID, err := db.CreateTask(task)
maybe(err)
for i := 0; i < task.count; i++ {
// Create a record for
// this particular stent of work
record := &Record{}
// Prompt the client
maybe(prompter.Prompt("Begin Working!"))
record.Start = time.Now()
// Wait the specified interval
time.Sleep(task.duration)
maybe(prompter.Prompt("Take a Break!"))
// Record how long the user waited
// until closing the notification
record.End = time.Now()
maybe(db.CreateRecord(taskID, *record))
}
}
func start(path *string) func(*cli.Cmd) {
return func(cmd *cli.Cmd) {
cmd.Spec = "[OPTIONS] MESSAGE"
var (
duration = cmd.StringOpt("d duration", "25m", "duration of each stent")
count = cmd.IntOpt("c count", 4, "number of working stents")
stents = cmd.IntOpt("s stents", 4, "number of working stents")
message = cmd.StringArg("MESSAGE", "", "descriptive name of the given task")
tags = cmd.StringsOpt("t tag", []string{}, "tags associated with this task")
)
@ -54,10 +33,10 @@ func start(path *string) func(*cli.Cmd) {
task := Task{
Message: *message,
Tags: *tags,
count: *count,
stents: *stents,
duration: parsed,
}
startTask(task, &I3{}, db)
run(task, &I3{}, db)
}
}
}

59
task.go Normal file
View File

@ -0,0 +1,59 @@
package main
import (
"fmt"
"github.com/gosuri/uilive"
"io"
"time"
)
// Task Starting..
//
// 20min remaning [stent 1/4]
// ..
// 15min remaining [stent 2/4]
// ..
// Task Completed!
func display(writer io.Writer, msg Message) {
fmt.Fprintf(
writer,
"%s remaining [ stent %d/%d ]\n",
(msg.Duration - time.Since(msg.Start)).Truncate(time.Second),
msg.CurrentStent,
msg.Stents,
)
}
func run(task Task, prompter Prompter, db *Store) {
taskID, err := db.CreateTask(task)
maybe(err)
writer := uilive.New()
writer.Start()
ticker := time.NewTicker(RefreshInterval)
timer := time.NewTimer(task.duration)
var currentStent int
for currentStent < task.stents {
record := &Record{}
maybe(prompter.Prompt("Begin working!"))
record.Start = time.Now()
timer.Reset(task.duration)
loop:
select {
case <-ticker.C:
display(writer, Message{
Start: record.Start,
Duration: task.duration,
Stents: task.stents,
CurrentStent: currentStent,
})
goto loop
case <-timer.C:
maybe(prompter.Prompt("Take a break!"))
record.End = time.Now()
maybe(db.CreateRecord(taskID, *record))
currentStent++
}
maybe(db.CreateRecord(taskID, *record))
}
writer.Stop()
}

View File

@ -5,6 +5,19 @@ import (
"time"
)
// RefreshInterval is the frequency at which
// the display is updated.
const RefreshInterval = 800 * time.Millisecond
// Message is used internally for updating
// the display.
type Message struct {
Start time.Time
Duration time.Duration
Stents int
CurrentStent int
}
// Task describes some activity
type Task struct {
ID int `json:"id"`
@ -12,7 +25,8 @@ type Task struct {
Records []*Record `json:"records"`
// Free-form tags associated with this task
Tags []string `json:"tags"`
count int
// Number of iterations to perform the task
stents int
duration time.Duration
}