Added application.
This commit is contained in:
parent
c194f443a7
commit
b431e44110
117
alui/application.go
Normal file
117
alui/application.go
Normal file
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user