gte/cmd/android-app/runner/runner.go

115 lines
2.5 KiB
Go

package runner
import (
"fmt"
"ewintr.nl/gte/cmd/android-app/component"
"ewintr.nl/gte/cmd/android-app/screen"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
)
type Runner struct {
fyneApp fyne.App
fyneWindow fyne.Window
conf *component.Configuration
logger *component.Logger
tasks *component.Tasks
screens []screen.Screen
status string
requests chan interface{}
refresh chan bool
}
func NewRunner() *Runner {
return &Runner{
requests: make(chan interface{}, 3),
refresh: make(chan bool),
}
}
func (r *Runner) Init() {
fyneApp := app.NewWithID("nl.ewintr.gte")
w := fyneApp.NewWindow("gte - getting things email")
r.logger = component.NewLogger()
logScreen := screen.NewLog()
logTab := container.NewTabItem("log", logScreen.Content())
r.screens = append(r.screens, logScreen)
r.conf = component.NewConfigurationFromPreferences(fyneApp.Preferences())
r.conf.Load()
configScreen := screen.NewConfig(r.requests)
configTab := container.NewTabItem("config", configScreen.Content())
r.screens = append(r.screens, configScreen)
r.logger.Log("initializing tasks...")
tasks, err := component.NewTasks(r.conf)
if err != nil {
r.logger.Log(err.Error())
}
r.tasks = tasks
taskScreen := screen.NewTasks(r.requests)
taskTab := container.NewTabItem("tasks", taskScreen.Content())
r.screens = append(r.screens, taskScreen)
tabs := container.NewAppTabs(taskTab, configTab, logTab)
w.SetContent(tabs)
r.fyneApp = fyneApp
r.fyneWindow = w
r.requests <- screen.SyncTasksRequest{}
}
func (r *Runner) Run() {
go r.refresher()
go r.processRequest()
r.fyneWindow.ShowAndRun()
}
func (r *Runner) processRequest() {
for req := range r.requests {
r.logger.Log(fmt.Sprintf("request %T: %s", req, req))
switch v := req.(type) {
case screen.SaveConfigRequest:
for k, val := range v.Fields {
r.conf.Set(k, val)
}
case screen.SyncTasksRequest:
r.status = "syncing..."
r.refresh <- true
count, err := r.tasks.Sync()
if err != nil {
r.logger.Log(err.Error())
}
r.logger.Log(fmt.Sprintf("fetched: %d", count))
r.status = "synced"
r.refresh <- true
default:
r.logger.Log("request unknown")
}
}
}
func (r *Runner) refresher() {
for range r.refresh {
tasks, err := r.tasks.Today()
if err != nil {
r.logger.Log(err.Error())
}
state := screen.State{
Status: r.status,
Tasks: tasks,
Config: r.conf.Fields(),
Logs: r.logger.Lines(),
}
for _, s := range r.screens {
s.Refresh(state)
}
}
}