From b431e44110630be5b8898b9abaa158773beddf41 Mon Sep 17 00:00:00 2001 From: Sander Schobers Date: Sat, 28 Mar 2020 10:50:40 +0100 Subject: [PATCH] Added application. --- alui/application.go | 117 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 alui/application.go diff --git a/alui/application.go b/alui/application.go new file mode 100644 index 0000000..cdd0703 --- /dev/null +++ b/alui/application.go @@ -0,0 +1,117 @@ +package alui + +import ( + "errors" + + "github.com/spf13/afero" + "opslag.de/schobers/allg5" + "opslag.de/schobers/fs/vfs" + "opslag.de/schobers/geom" +) + +type Application struct { + disp *allg5.Display + eq *allg5.EventQueue + dirs map[string]vfs.CopyDir +} + +func NewApplication(size geom.Point, dispOptions allg5.NewDisplayOptions) (*Application, error) { + var init = allg5.InitAll + init.Audio = false + err := allg5.Init(init) + if err != nil { + return nil, err + } + + app := &Application{} + + disp, err := allg5.NewDisplay(size.X, size.Y, dispOptions) + if err != nil { + return nil, err + } + app.disp = disp + + eq, err := allg5.NewEventQueue() + if err != nil { + app.Destroy() + return nil, err + } + app.eq = eq + + eq.RegisterDisplay(disp) + eq.RegisterKeyboard() + eq.RegisterMouse() + + return app, nil +} + +func (a *Application) Destroy() { + a.disp.Destroy() + a.eq.Destroy() + if a.dirs != nil { + for _, dir := range a.dirs { + dir.Destroy() + } + } +} + +func (a *Application) AddDir(path string, backup afero.Fs) (vfs.CopyDir, error) { + fs := vfs.NewOsFsFallback(path, backup) + copy, err := vfs.NewCopyDir(fs) + if err != nil { + return nil, err + } + if a.dirs == nil { + a.dirs = map[string]vfs.CopyDir{} + } + a.dirs[path] = copy + return copy, nil +} + +func (a *Application) UseFile(dir, name string, use func(string) error) error { + if a.dirs == nil { + return errors.New(`no directories available`) + } + resources, ok := a.dirs[dir] + if !ok { + return errors.New(`direct not found`) + } + path, err := resources.Retrieve(name) + if err != nil { + return err + } + return use(path) +} + +func (a *Application) Run(main Control, init func(*UI) error) error { + disp := a.disp + eq := a.eq + + ui := NewUI(disp, main) + defer ui.Destroy() + err := init(ui) + if err != nil { + return err + } + + ctx := ui.Context() + for { + allg5.ClearToColor(ctx.Palette.Icon) + ui.Render() + disp.Flip() + + e := eq.Get() + for e != nil { + switch e := e.(type) { + case *allg5.DisplayCloseEvent: + return nil + case *allg5.KeyCharEvent: + if e.KeyCode == allg5.KeyF4 && e.Modifiers&allg5.KeyModAlt != 0 { + return nil + } + } + ui.Handle(e) + e = eq.Get() + } + } +}