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

114 lines
2.2 KiB
Go
Raw Normal View History

2022-10-18 16:58:12 +02:00
package screen
2022-10-24 15:57:55 +02:00
import (
"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/widget"
)
2022-10-18 16:58:12 +02:00
2022-10-20 10:40:46 +02:00
type Task struct {
ID string
Action string
}
2022-10-31 15:59:58 +01:00
type ShowRequest struct {
Screen string
Task Task
}
2022-10-18 16:58:12 +02:00
type State struct {
2022-10-24 15:57:55 +02:00
Status string
CurrentScreen string
Tasks []Task
Config map[string]string
Logs []string
2022-10-18 16:58:12 +02:00
}
type Screen interface {
2022-10-24 15:57:55 +02:00
Content() *fyne.Container
2022-10-18 16:58:12 +02:00
Refresh(state State)
2022-10-24 15:57:55 +02:00
Hide()
2022-10-31 15:59:58 +01:00
Show(Task)
2022-10-24 15:57:55 +02:00
}
type ScreenSet struct {
current string
2022-10-31 15:59:58 +01:00
show chan ShowRequest
2022-10-24 15:57:55 +02:00
status binding.String
menu *fyne.Container
screens map[string]Screen
root *fyne.Container
}
func NewScreenSet(requests chan interface{}) *ScreenSet {
status := binding.NewString()
2022-10-31 15:59:58 +01:00
show := make(chan ShowRequest)
2022-10-24 15:57:55 +02:00
tasksButton := widget.NewButton("tasks", func() {
2022-10-31 15:59:58 +01:00
show <- ShowRequest{Screen: "tasks"}
2022-10-24 15:57:55 +02:00
})
configButton := widget.NewButton("config", func() {
2022-10-31 15:59:58 +01:00
show <- ShowRequest{Screen: "config"}
2022-10-24 15:57:55 +02:00
})
logsButton := widget.NewButton("logs", func() {
2022-10-31 15:59:58 +01:00
show <- ShowRequest{Screen: "logs"}
2022-10-24 15:57:55 +02:00
})
statusLabel := widget.NewLabel("> init...")
statusLabel.Bind(status)
statusLabel.TextStyle.Italic = true
menu := container.NewHBox(tasksButton, configButton, logsButton, statusLabel)
screens := map[string]Screen{
"tasks": NewTasks(requests, show),
"logs": NewLog(),
"config": NewConfig(requests, show),
2022-10-31 09:18:36 +01:00
"new": NewNewTask(requests, show),
2022-10-31 15:59:58 +01:00
"update": NewUpdateTask(requests, show),
2022-10-24 15:57:55 +02:00
}
cs := []fyne.CanvasObject{}
for _, s := range screens {
s.Hide()
cs = append(cs, s.Content())
}
2022-10-31 15:59:58 +01:00
screens["tasks"].Show(Task{})
2022-10-24 15:57:55 +02:00
root := container.NewBorder(menu, nil, nil, nil, cs...)
return &ScreenSet{
status: status,
current: "tasks",
show: show,
screens: screens,
root: root,
}
}
func (ss *ScreenSet) Run() {
for s := range ss.show {
2022-10-31 15:59:58 +01:00
if s.Screen != ss.current {
2022-10-24 15:57:55 +02:00
ss.screens[ss.current].Hide()
2022-10-31 15:59:58 +01:00
ss.screens[s.Screen].Show(s.Task)
ss.current = s.Screen
2022-10-24 15:57:55 +02:00
ss.root.Refresh()
}
}
}
func (ss *ScreenSet) Refresh(state State) {
ss.status.Set(fmt.Sprintf("> %s", state.Status))
for _, s := range ss.screens {
s.Refresh(state)
}
ss.root.Refresh()
}
func (ss *ScreenSet) Content() *fyne.Container {
return ss.root
2022-10-18 16:58:12 +02:00
}