izapple2/izapple2fyne/main.go

186 lines
4.2 KiB
Go
Raw Normal View History

2020-10-09 17:22:47 +00:00
package main
import (
2020-10-11 18:31:55 +00:00
"fmt"
"image"
2020-10-09 17:22:47 +00:00
"time"
"github.com/ivanizag/izapple2"
"github.com/pkg/profile"
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/canvas"
2020-10-10 15:35:25 +00:00
"fyne.io/fyne/driver/desktop"
2020-10-09 17:22:47 +00:00
"fyne.io/fyne/layout"
2020-10-11 18:31:55 +00:00
"fyne.io/fyne/theme"
2020-10-09 17:22:47 +00:00
"fyne.io/fyne/widget"
)
2020-10-11 18:31:55 +00:00
type state struct {
2020-10-12 15:19:51 +00:00
a *izapple2.Apple2
app fyne.App
win fyne.Window
2020-10-11 18:31:55 +00:00
2020-10-12 17:29:30 +00:00
devices *panelDevices
2020-10-11 18:31:55 +00:00
showPages bool
}
2020-10-09 17:22:47 +00:00
func main() {
2020-10-11 18:31:55 +00:00
var s state
s.a = izapple2.MainApple()
if s.a != nil {
if s.a.IsProfiling() {
2020-10-09 17:22:47 +00:00
// See the log with:
// go tool pprof --pdf ~/go/bin/izapple2sdl /tmp/profile329536248/cpu.pprof > profile.pdf
defer profile.Start().Stop()
}
2020-10-11 18:31:55 +00:00
fyneRun(&s)
2020-10-09 17:22:47 +00:00
}
}
2020-10-11 18:31:55 +00:00
func fyneRun(s *state) {
2020-10-12 15:19:51 +00:00
s.app = app.New()
2020-10-12 17:29:30 +00:00
s.app.SetIcon(resourceApple2Png)
2020-10-12 15:19:51 +00:00
s.win = s.app.NewWindow("iz-" + s.a.Name)
2020-10-12 17:29:30 +00:00
s.win.SetIcon(resourceApple2Png)
2020-10-11 18:31:55 +00:00
2020-10-12 17:29:30 +00:00
s.devices = newPanelDevices(s)
toolbar := buildToolbar(s)
2020-10-09 17:22:47 +00:00
screen := canvas.NewImageFromImage(nil)
2020-10-14 19:54:51 +00:00
screen.ScaleMode = canvas.ImageScalePixels // Looks worst but loads less.
2020-10-12 17:29:30 +00:00
screen.SetMinSize(fyne.NewSize(280*2, 192*2))
2020-10-09 17:22:47 +00:00
container := fyne.NewContainerWithLayout(
2020-10-12 17:29:30 +00:00
layout.NewBorderLayout(nil, toolbar, nil, s.devices.w),
screen, toolbar, s.devices.w,
2020-10-09 17:22:47 +00:00
)
2020-10-12 15:19:51 +00:00
s.win.SetContent(container)
s.win.SetPadded(false)
2020-10-10 15:35:25 +00:00
2020-10-12 15:19:51 +00:00
registerKeyboardEvents(s)
2020-10-12 17:29:30 +00:00
j := newJoysticks(s)
2020-10-12 15:19:51 +00:00
j.start()
s.a.SetJoysticksProvider(j)
2020-10-09 17:22:47 +00:00
2020-10-11 18:31:55 +00:00
go s.a.Run()
2020-10-10 15:35:25 +00:00
2020-10-09 17:22:47 +00:00
ticker := time.NewTicker(60 * time.Millisecond)
done := make(chan bool)
go func() {
for {
select {
case <-done:
return
case <-ticker.C:
2020-10-11 18:31:55 +00:00
if !s.a.IsPaused() {
var img *image.RGBA
if s.showPages {
img = s.a.SnapshotParts()
2020-10-12 15:19:51 +00:00
s.win.SetTitle(fmt.Sprintf("%v %v %vx%v", s.a.Name, s.a.VideoModeName(), img.Rect.Dx()/2, img.Rect.Dy()/2))
2020-10-11 18:31:55 +00:00
} else {
img = s.a.Snapshot()
}
2020-10-09 17:22:47 +00:00
screen.Image = img
canvas.Refresh(screen)
}
}
}
}()
2020-10-12 15:19:51 +00:00
s.win.SetOnClosed(func() {
2020-10-09 17:22:47 +00:00
done <- true
})
2020-10-12 15:19:51 +00:00
s.win.Show()
2020-10-12 17:29:30 +00:00
fmt.Printf("%v\n", s.win.Canvas().Scale())
2020-10-12 15:19:51 +00:00
s.app.Run()
2020-10-12 17:29:30 +00:00
}
2020-10-09 17:22:47 +00:00
2020-10-12 17:29:30 +00:00
func buildToolbar(s *state) *widget.Toolbar {
return widget.NewToolbar(
widget.NewToolbarAction(
theme.NewThemedResource(resourceRestartSvg, nil), func() {
s.a.SendCommand(izapple2.CommandReset)
}),
widget.NewToolbarAction(
theme.NewThemedResource(resourcePauseSvg, nil), func() {
s.a.SendCommand(izapple2.CommandPauseUnpauseEmulator)
}),
widget.NewToolbarAction(
theme.NewThemedResource(resourceFastForwardSvg, nil), func() {
s.a.SendCommand(izapple2.CommandToggleSpeed)
}),
widget.NewToolbarSeparator(),
widget.NewToolbarAction(
theme.NewThemedResource(resourcePaletteSvg, nil), func() {
s.a.SendCommand(izapple2.CommandToggleColor)
}),
widget.NewToolbarAction(
theme.NewThemedResource(resourceLayersTripleSvg, nil), func() {
s.showPages = !s.showPages
if !s.showPages {
s.win.SetTitle("iz-" + s.a.Name)
}
}),
widget.NewToolbarAction(
theme.NewThemedResource(resourceCameraSvg, nil), func() {
err := izapple2.SaveSnapshot(s.a, "snapshot.png")
if err != nil {
s.app.SendNotification(fyne.NewNotification(
s.win.Title(),
fmt.Sprintf("Error saving snapshoot: %v.\n.", err)))
} else {
s.app.SendNotification(fyne.NewNotification(
s.win.Title(),
2020-10-14 19:54:51 +00:00
"Snapshot saved on 'snapshot.png'"))
2020-10-12 17:29:30 +00:00
}
}),
2020-10-14 19:54:51 +00:00
//widget.NewToolbarSeparator(),
//newToolbarDisk("S6D1"),
2020-10-12 17:29:30 +00:00
widget.NewToolbarSpacer(),
widget.NewToolbarAction(theme.ViewFullScreenIcon(), func() {
s.win.SetFullScreen(!s.win.FullScreen())
}),
widget.NewToolbarAction(
theme.NewThemedResource(resourcePageLayoutSidebarRightSvg, nil), func() {
w := s.devices.w
if w.Visible() {
w.Hide()
} else {
w.Show()
}
}),
)
2020-10-09 17:22:47 +00:00
}
2020-10-10 15:35:25 +00:00
2020-10-12 15:19:51 +00:00
func registerKeyboardEvents(s *state) {
2020-10-11 18:31:55 +00:00
kp := newKeyboard(s)
2020-10-12 15:19:51 +00:00
canvas := s.win.Canvas()
2020-10-10 15:35:25 +00:00
2020-10-12 15:19:51 +00:00
// Events
2020-10-10 15:35:25 +00:00
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)
})
}
}