diff --git a/go.mod b/go.mod index acd2e12..5efb099 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/vsariola/sointu go 1.15 -require github.com/hajimehoshi/oto v0.6.6 +require ( + gioui.org v0.0.0-20201106195654-dbc0796d0207 + github.com/hajimehoshi/oto v0.6.6 +) diff --git a/go4k/cmd/sointu-tracker/main.go b/go4k/cmd/sointu-tracker/main.go new file mode 100644 index 0000000..1cc2284 --- /dev/null +++ b/go4k/cmd/sointu-tracker/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "gioui.org/app" + "gioui.org/unit" + "github.com/vsariola/sointu/go4k/tracker" + "os" +) + +func main() { + go func() { + w := app.NewWindow( + app.Size(unit.Dp(800), unit.Dp(600)), + app.Title("Sointu Tracker"), + ) + if err := tracker.New().Run(w); err != nil { + fmt.Println(err) + os.Exit(1) + } + os.Exit(0) + }() + app.Main() +} diff --git a/go4k/tracker/keyevent.go b/go4k/tracker/keyevent.go new file mode 100644 index 0000000..d302bef --- /dev/null +++ b/go4k/tracker/keyevent.go @@ -0,0 +1,17 @@ +package tracker + +import ( + "gioui.org/io/key" + "os" +) + +// KeyEvent handles incoming key events and returns true if repaint is needed. +func (t *Tracker) KeyEvent(e key.Event) bool { + if e.State == key.Press { + switch e.Name { + case key.NameEscape: + os.Exit(0) + } + } + return false +} diff --git a/go4k/tracker/layout.go b/go4k/tracker/layout.go new file mode 100644 index 0000000..b7ef134 --- /dev/null +++ b/go4k/tracker/layout.go @@ -0,0 +1,7 @@ +package tracker + +import "gioui.org/layout" + +func (t *Tracker) Layout(gtx layout.Context) { + t.QuitButton.Layout(gtx) +} diff --git a/go4k/tracker/run.go b/go4k/tracker/run.go new file mode 100644 index 0000000..6e4dab0 --- /dev/null +++ b/go4k/tracker/run.go @@ -0,0 +1,35 @@ +package tracker + +import ( + "gioui.org/app" + "gioui.org/io/key" + "gioui.org/io/system" + "gioui.org/layout" + "gioui.org/op" + "os" +) + +func (t *Tracker) Run(w *app.Window) error { + var ops op.Ops + for { + select { + case e := <-w.Events(): + switch e := e.(type) { + case system.DestroyEvent: + return e.Err + case key.Event: + if t.KeyEvent(e) { + w.Invalidate() + } + case system.FrameEvent: + gtx := layout.NewContext(&ops, e) + if t.QuitButton.Clicked() { + os.Exit(0) + } + t.Layout(gtx) + e.Frame(gtx.Ops) + } + } + } + +} diff --git a/go4k/tracker/tracker.go b/go4k/tracker/tracker.go new file mode 100644 index 0000000..736e680 --- /dev/null +++ b/go4k/tracker/tracker.go @@ -0,0 +1,13 @@ +package tracker + +import "gioui.org/widget" + +type Tracker struct { + QuitButton *widget.Clickable +} + +func New() *Tracker { + return &Tracker{ + QuitButton: new(widget.Clickable), + } +}