emdb/desktop-client/gui/gui.go

103 lines
1.9 KiB
Go

package gui
import (
"strings"
"code.ewintr.nl/emdb/desktop-client/backend"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget"
)
type GUI struct {
a fyne.App
w fyne.Window
in chan backend.State
out chan backend.Command
s *State
}
func New(out chan backend.Command, in chan backend.State) *GUI {
a := app.New()
w := a.NewWindow("EMDB")
w.Resize(fyne.NewSize(800, 600))
g := &GUI{
a: a,
w: w,
in: in,
out: out,
s: NewState(),
}
g.SetContent()
return g
}
func (g *GUI) Run() {
go func() {
for s := range g.in {
g.Update(s)
}
}()
g.w.ShowAndRun()
}
func (g *GUI) Update(bs backend.State) {
// watched
watched := make([]string, 0, len(bs.Watched))
for _, m := range bs.Watched {
watched = append(watched, m.EnglishTitle)
}
g.s.Watched.Set(watched)
// log
g.s.Log.Set(strings.Join(bs.Log, "\n"))
}
func (g *GUI) SetContent() {
label1 := widget.NewLabel("Label 1")
label2 := widget.NewLabel("Label 2")
value2 := widget.NewLabel("Something")
input := widget.NewEntry()
input.SetPlaceHolder("Enter text...")
form := container.New(layout.NewFormLayout(), label1, input, label2, value2)
button := widget.NewButton("Save", func() {
g.out <- backend.Command{
Name: backend.CommandAdd,
Args: map[string]any{
backend.ArgName: input.Text,
},
}
})
grid := container.NewBorder(nil, button, nil, nil, form)
logLines := container.NewVScroll(widget.NewLabelWithData(g.s.Log))
//logLines.ScrollToBottom()
list := widget.NewListWithData(g.s.Watched,
func() fyne.CanvasObject {
return widget.NewLabel("template")
},
func(i binding.DataItem, o fyne.CanvasObject) {
o.(*widget.Label).Bind(i.(binding.String))
})
tabs := container.NewAppTabs(
container.NewTabItem("Watched", list),
container.NewTabItem("TheMovieDB", grid),
container.NewTabItem("Log", logLines),
)
g.w.SetContent(tabs)
}