izapple2/izapple2fyne/main.go

129 lines
2.6 KiB
Go

package main
import (
"fmt"
"image"
"time"
"github.com/ivanizag/izapple2"
"github.com/ivanizag/izapple2/screen"
"github.com/pkg/profile"
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/canvas"
"fyne.io/fyne/driver/desktop"
"fyne.io/fyne/layout"
)
type state struct {
a *izapple2.Apple2
app fyne.App
win fyne.Window
devices *panelDevices
showPages bool
screenMode int
}
func main() {
var s state
s.a = izapple2.MainApple()
if s.a != nil {
if s.a.IsProfiling() {
// See the log with:
// go tool pprof --pdf ~/go/bin/izapple2sdl /tmp/profile329536248/cpu.pprof > profile.pdf
defer profile.Start().Stop()
}
fyneRun(&s)
}
}
func fyneRun(s *state) {
s.screenMode = screen.ScreenModeNTSC
s.app = app.New()
s.app.SetIcon(resourceApple2Png)
s.win = s.app.NewWindow("iz-" + s.a.Name)
s.win.SetIcon(resourceApple2Png)
s.devices = newPanelDevices(s)
s.devices.w.Hide()
toolbar := buildToolbar(s)
display := canvas.NewImageFromImage(nil)
display.ScaleMode = canvas.ImageScalePixels // Looks worst but loads less.
display.SetMinSize(fyne.NewSize(280*2, 192*2))
container := fyne.NewContainerWithLayout(
layout.NewBorderLayout(nil, toolbar, nil, s.devices.w),
display, toolbar, s.devices.w,
)
s.win.SetContent(container)
s.win.SetPadded(false)
registerKeyboardEvents(s)
j := newJoysticks(s)
j.start()
s.a.SetJoysticksProvider(j)
go s.a.Run()
ticker := time.NewTicker(60 * time.Millisecond)
done := make(chan bool)
go func() {
for {
select {
case <-done:
return
case <-ticker.C:
if !s.a.IsPaused() {
var img *image.RGBA
if s.showPages {
img = screen.SnapshotParts(s.a, s.screenMode)
s.win.SetTitle(fmt.Sprintf("%v %v %vx%v", s.a.Name, screen.VideoModeName(s.a), img.Rect.Dx()/2, img.Rect.Dy()/2))
} else {
img = screen.Snapshot(s.a, s.screenMode)
}
display.Image = img
canvas.Refresh(display)
}
}
}
}()
s.win.SetOnClosed(func() {
done <- true
})
s.win.Show()
s.app.Run()
}
func registerKeyboardEvents(s *state) {
kp := newKeyboard(s)
canvas := s.win.Canvas()
// Events
canvas.SetOnTypedKey(func(ke *fyne.KeyEvent) {
//fmt.Printf("Event: %v\n", ke.Name)
kp.putKey(ke)
})
canvas.SetOnTypedRune(func(ch rune) {
//fmt.Printf("Rune: %v\n", ch)
kp.putRune(ch)
})
if deskCanvas, ok := canvas.(desktop.Canvas); ok {
deskCanvas.SetOnKeyDown(func(ke *fyne.KeyEvent) {
kp.putKeyAction(ke, true)
//fmt.Printf("Event down: %v\n", ke.Name)
})
deskCanvas.SetOnKeyUp(func(ke *fyne.KeyEvent) {
kp.putKeyAction(ke, false)
//fmt.Printf("Event up: %v\n", ke.Name)
})
}
}