From a9b8fe76df1d6aed02eeab5cb236979d4ec4ebd4 Mon Sep 17 00:00:00 2001 From: Ivan Izaguirre Date: Fri, 16 Oct 2020 00:38:15 +0200 Subject: [PATCH] UI to select screen modes --- izapple2fyne/fyneKeyboard.go | 8 +- izapple2fyne/main.go | 67 ++------------ izapple2fyne/resources.go | 15 +++ izapple2fyne/resources/monitor.svg | 1 + izapple2fyne/resources/television-classic.svg | 1 + izapple2fyne/resources/television.svg | 1 + izapple2fyne/toolbar.go | 68 ++++++++++++++ izapple2fyne/toolbarScreen.go | 92 +++++++++++++++++++ 8 files changed, 190 insertions(+), 63 deletions(-) create mode 100644 izapple2fyne/resources/monitor.svg create mode 100644 izapple2fyne/resources/television-classic.svg create mode 100644 izapple2fyne/resources/television.svg create mode 100644 izapple2fyne/toolbar.go create mode 100644 izapple2fyne/toolbarScreen.go diff --git a/izapple2fyne/fyneKeyboard.go b/izapple2fyne/fyneKeyboard.go index b7b7969..e44fb52 100644 --- a/izapple2fyne/fyneKeyboard.go +++ b/izapple2fyne/fyneKeyboard.go @@ -103,7 +103,11 @@ func (k *keyboard) putKey(keyEvent *fyne.KeyEvent) { k.s.a.SendCommand(izapple2.CommandToggleSpeed) } case fyne.KeyF6: - k.s.a.SendCommand(izapple2.CommandToggleColor) + if k.s.screenMode != izapple2.ScreenModeGreen { + k.s.screenMode = izapple2.ScreenModeGreen + } else { + k.s.screenMode = izapple2.ScreenModeNTSC + } case fyne.KeyF7: k.s.showPages = !k.s.showPages case fyne.KeyF9: @@ -114,7 +118,7 @@ func (k *keyboard) putKey(keyEvent *fyne.KeyEvent) { k.s.a.SendCommand(izapple2.CommandToggleCPUTrace) case fyne.KeyF12: //case fyne.KeyPrintScreen: - err := izapple2.SaveSnapshot(k.s.a, "snapshot.png") + err := izapple2.SaveSnapshot(k.s.a, k.s.screenMode, "snapshot.png") if err != nil { fmt.Printf("Error saving snapshoot: %v.\n.", err) } else { diff --git a/izapple2fyne/main.go b/izapple2fyne/main.go index 052e6af..144195e 100644 --- a/izapple2fyne/main.go +++ b/izapple2fyne/main.go @@ -14,8 +14,6 @@ import ( "fyne.io/fyne/canvas" "fyne.io/fyne/driver/desktop" "fyne.io/fyne/layout" - "fyne.io/fyne/theme" - "fyne.io/fyne/widget" ) type state struct { @@ -25,7 +23,8 @@ type state struct { devices *panelDevices - showPages bool + showPages bool + screenMode int } func main() { @@ -43,12 +42,15 @@ func main() { } func fyneRun(s *state) { + s.screenMode = izapple2.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) screen := canvas.NewImageFromImage(nil) screen.ScaleMode = canvas.ImageScalePixels // Looks worst but loads less. @@ -82,7 +84,7 @@ func fyneRun(s *state) { img = s.a.SnapshotParts() s.win.SetTitle(fmt.Sprintf("%v %v %vx%v", s.a.Name, s.a.VideoModeName(), img.Rect.Dx()/2, img.Rect.Dy()/2)) } else { - img = s.a.Snapshot() + img = s.a.Snapshot(s.screenMode) } screen.Image = img canvas.Refresh(screen) @@ -102,63 +104,6 @@ func fyneRun(s *state) { s.app.Run() } -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(), - "Snapshot saved on 'snapshot.png'")) - } - }), - //widget.NewToolbarSeparator(), - //newToolbarDisk("S6D1"), - 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() - } - }), - ) -} - func registerKeyboardEvents(s *state) { kp := newKeyboard(s) canvas := s.win.Canvas() diff --git a/izapple2fyne/resources.go b/izapple2fyne/resources.go index e533faf..b17f58d 100644 --- a/izapple2fyne/resources.go +++ b/izapple2fyne/resources.go @@ -27,6 +27,11 @@ var resourceLayersTripleSvg = &fyne.StaticResource{ StaticContent: []byte{ 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 63, 62, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 115, 118, 103, 32, 80, 85, 66, 76, 73, 67, 32, 34, 45, 47, 47, 87, 51, 67, 47, 47, 68, 84, 68, 32, 83, 86, 71, 32, 49, 46, 49, 47, 47, 69, 78, 34, 32, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 71, 114, 97, 112, 104, 105, 99, 115, 47, 83, 86, 71, 47, 49, 46, 49, 47, 68, 84, 68, 47, 115, 118, 103, 49, 49, 46, 100, 116, 100, 34, 62, 60, 115, 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 119, 105, 100, 116, 104, 61, 34, 50, 52, 34, 32, 104, 101, 105, 103, 104, 116, 61, 34, 50, 52, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 50, 52, 32, 50, 52, 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 49, 50, 32, 48, 76, 51, 32, 55, 76, 52, 46, 54, 51, 32, 56, 46, 50, 55, 76, 49, 50, 32, 49, 52, 76, 49, 57, 46, 51, 54, 32, 56, 46, 50, 55, 76, 50, 49, 32, 55, 76, 49, 50, 32, 48, 77, 49, 57, 46, 51, 55, 32, 49, 48, 46, 55, 51, 76, 49, 50, 32, 49, 54, 46, 52, 55, 76, 52, 46, 54, 50, 32, 49, 48, 46, 55, 52, 76, 51, 32, 49, 50, 76, 49, 50, 32, 49, 57, 76, 50, 49, 32, 49, 50, 76, 49, 57, 46, 51, 55, 32, 49, 48, 46, 55, 51, 77, 49, 57, 46, 51, 55, 32, 49, 53, 46, 55, 51, 76, 49, 50, 32, 50, 49, 46, 52, 55, 76, 52, 46, 54, 50, 32, 49, 53, 46, 55, 52, 76, 51, 32, 49, 55, 76, 49, 50, 32, 50, 52, 76, 50, 49, 32, 49, 55, 76, 49, 57, 46, 51, 55, 32, 49, 53, 46, 55, 51, 90, 34, 32, 47, 62, 60, 47, 115, 118, 103, 62}} +var resourceMonitorSvg = &fyne.StaticResource{ + StaticName: "monitor.svg", + StaticContent: []byte{ + 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 63, 62, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 115, 118, 103, 32, 80, 85, 66, 76, 73, 67, 32, 34, 45, 47, 47, 87, 51, 67, 47, 47, 68, 84, 68, 32, 83, 86, 71, 32, 49, 46, 49, 47, 47, 69, 78, 34, 32, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 71, 114, 97, 112, 104, 105, 99, 115, 47, 83, 86, 71, 47, 49, 46, 49, 47, 68, 84, 68, 47, 115, 118, 103, 49, 49, 46, 100, 116, 100, 34, 62, 60, 115, 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 119, 105, 100, 116, 104, 61, 34, 50, 52, 34, 32, 104, 101, 105, 103, 104, 116, 61, 34, 50, 52, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 50, 52, 32, 50, 52, 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 50, 49, 44, 49, 54, 72, 51, 86, 52, 72, 50, 49, 77, 50, 49, 44, 50, 72, 51, 67, 49, 46, 56, 57, 44, 50, 32, 49, 44, 50, 46, 56, 57, 32, 49, 44, 52, 86, 49, 54, 65, 50, 44, 50, 32, 48, 32, 48, 44, 48, 32, 51, 44, 49, 56, 72, 49, 48, 86, 50, 48, 72, 56, 86, 50, 50, 72, 49, 54, 86, 50, 48, 72, 49, 52, 86, 49, 56, 72, 50, 49, 65, 50, 44, 50, 32, 48, 32, 48, 44, 48, 32, 50, 51, 44, 49, 54, 86, 52, 67, 50, 51, 44, 50, 46, 56, 57, 32, 50, 50, 46, 49, 44, 50, 32, 50, 49, 44, 50, 90, 34, 32, 47, 62, 60, 47, 115, 118, 103, 62}} + var resourcePageLayoutSidebarRightSvg = &fyne.StaticResource{ StaticName: "page-layout-sidebar-right.svg", StaticContent: []byte{ @@ -51,3 +56,13 @@ var resourceRestartSvg = &fyne.StaticResource{ StaticName: "restart.svg", StaticContent: []byte{ 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 63, 62, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 115, 118, 103, 32, 80, 85, 66, 76, 73, 67, 32, 34, 45, 47, 47, 87, 51, 67, 47, 47, 68, 84, 68, 32, 83, 86, 71, 32, 49, 46, 49, 47, 47, 69, 78, 34, 32, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 71, 114, 97, 112, 104, 105, 99, 115, 47, 83, 86, 71, 47, 49, 46, 49, 47, 68, 84, 68, 47, 115, 118, 103, 49, 49, 46, 100, 116, 100, 34, 62, 60, 115, 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 119, 105, 100, 116, 104, 61, 34, 50, 52, 34, 32, 104, 101, 105, 103, 104, 116, 61, 34, 50, 52, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 50, 52, 32, 50, 52, 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 49, 50, 44, 52, 67, 49, 52, 46, 49, 44, 52, 32, 49, 54, 46, 49, 44, 52, 46, 56, 32, 49, 55, 46, 54, 44, 54, 46, 51, 67, 50, 48, 46, 55, 44, 57, 46, 52, 32, 50, 48, 46, 55, 44, 49, 52, 46, 53, 32, 49, 55, 46, 54, 44, 49, 55, 46, 54, 67, 49, 53, 46, 56, 44, 49, 57, 46, 53, 32, 49, 51, 46, 51, 44, 50, 48, 46, 50, 32, 49, 48, 46, 57, 44, 49, 57, 46, 57, 76, 49, 49, 46, 52, 44, 49, 55, 46, 57, 67, 49, 51, 46, 49, 44, 49, 56, 46, 49, 32, 49, 52, 46, 57, 44, 49, 55, 46, 53, 32, 49, 54, 46, 50, 44, 49, 54, 46, 50, 67, 49, 56, 46, 53, 44, 49, 51, 46, 57, 32, 49, 56, 46, 53, 44, 49, 48, 46, 49, 32, 49, 54, 46, 50, 44, 55, 46, 55, 67, 49, 53, 46, 49, 44, 54, 46, 54, 32, 49, 51, 46, 53, 44, 54, 32, 49, 50, 44, 54, 86, 49, 48, 46, 54, 76, 55, 44, 53, 46, 54, 76, 49, 50, 44, 48, 46, 54, 86, 52, 77, 54, 46, 51, 44, 49, 55, 46, 54, 67, 51, 46, 55, 44, 49, 53, 32, 51, 46, 51, 44, 49, 49, 32, 53, 46, 49, 44, 55, 46, 57, 76, 54, 46, 54, 44, 57, 46, 52, 67, 53, 46, 53, 44, 49, 49, 46, 54, 32, 53, 46, 57, 44, 49, 52, 46, 52, 32, 55, 46, 56, 44, 49, 54, 46, 50, 67, 56, 46, 51, 44, 49, 54, 46, 55, 32, 56, 46, 57, 44, 49, 55, 46, 49, 32, 57, 46, 54, 44, 49, 55, 46, 52, 76, 57, 44, 49, 57, 46, 52, 67, 56, 44, 49, 57, 32, 55, 46, 49, 44, 49, 56, 46, 52, 32, 54, 46, 51, 44, 49, 55, 46, 54, 90, 34, 32, 47, 62, 60, 47, 115, 118, 103, 62}} + +var resourceTelevisionClassicSvg = &fyne.StaticResource{ + StaticName: "television-classic.svg", + StaticContent: []byte{ + 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 63, 62, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 115, 118, 103, 32, 80, 85, 66, 76, 73, 67, 32, 34, 45, 47, 47, 87, 51, 67, 47, 47, 68, 84, 68, 32, 83, 86, 71, 32, 49, 46, 49, 47, 47, 69, 78, 34, 32, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 71, 114, 97, 112, 104, 105, 99, 115, 47, 83, 86, 71, 47, 49, 46, 49, 47, 68, 84, 68, 47, 115, 118, 103, 49, 49, 46, 100, 116, 100, 34, 62, 60, 115, 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 119, 105, 100, 116, 104, 61, 34, 50, 52, 34, 32, 104, 101, 105, 103, 104, 116, 61, 34, 50, 52, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 50, 52, 32, 50, 52, 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 56, 46, 49, 54, 44, 51, 76, 54, 46, 55, 53, 44, 52, 46, 52, 49, 76, 57, 46, 51, 52, 44, 55, 72, 52, 67, 50, 46, 56, 57, 44, 55, 32, 50, 44, 55, 46, 56, 57, 32, 50, 44, 57, 86, 49, 57, 67, 50, 44, 50, 48, 46, 49, 49, 32, 50, 46, 56, 57, 44, 50, 49, 32, 52, 44, 50, 49, 72, 50, 48, 67, 50, 49, 46, 49, 49, 44, 50, 49, 32, 50, 50, 44, 50, 48, 46, 49, 49, 32, 50, 50, 44, 49, 57, 86, 57, 67, 50, 50, 44, 55, 46, 56, 57, 32, 50, 49, 46, 49, 49, 44, 55, 32, 50, 48, 44, 55, 72, 49, 52, 46, 54, 54, 76, 49, 55, 46, 50, 53, 44, 52, 46, 52, 49, 76, 49, 53, 46, 56, 52, 44, 51, 76, 49, 50, 44, 54, 46, 56, 52, 76, 56, 46, 49, 54, 44, 51, 77, 52, 44, 57, 72, 49, 55, 86, 49, 57, 72, 52, 86, 57, 77, 49, 57, 46, 53, 44, 57, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 50, 48, 46, 53, 44, 49, 48, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 49, 57, 46, 53, 44, 49, 49, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 49, 56, 46, 53, 44, 49, 48, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 49, 57, 46, 53, 44, 57, 77, 49, 57, 46, 53, 44, 49, 50, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 50, 48, 46, 53, 44, 49, 51, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 49, 57, 46, 53, 44, 49, 52, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 49, 56, 46, 53, 44, 49, 51, 65, 49, 44, 49, 32, 48, 32, 48, 44, 49, 32, 49, 57, 46, 53, 44, 49, 50, 90, 34, 32, 47, 62, 60, 47, 115, 118, 103, 62}} + +var resourceTelevisionSvg = &fyne.StaticResource{ + StaticName: "television.svg", + StaticContent: []byte{ + 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 85, 84, 70, 45, 56, 34, 63, 62, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 115, 118, 103, 32, 80, 85, 66, 76, 73, 67, 32, 34, 45, 47, 47, 87, 51, 67, 47, 47, 68, 84, 68, 32, 83, 86, 71, 32, 49, 46, 49, 47, 47, 69, 78, 34, 32, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 71, 114, 97, 112, 104, 105, 99, 115, 47, 83, 86, 71, 47, 49, 46, 49, 47, 68, 84, 68, 47, 115, 118, 103, 49, 49, 46, 100, 116, 100, 34, 62, 60, 115, 118, 103, 32, 120, 109, 108, 110, 115, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 50, 48, 48, 48, 47, 115, 118, 103, 34, 32, 120, 109, 108, 110, 115, 58, 120, 108, 105, 110, 107, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 120, 108, 105, 110, 107, 34, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 49, 34, 32, 119, 105, 100, 116, 104, 61, 34, 50, 52, 34, 32, 104, 101, 105, 103, 104, 116, 61, 34, 50, 52, 34, 32, 118, 105, 101, 119, 66, 111, 120, 61, 34, 48, 32, 48, 32, 50, 52, 32, 50, 52, 34, 62, 60, 112, 97, 116, 104, 32, 100, 61, 34, 77, 50, 49, 44, 49, 55, 72, 51, 86, 53, 72, 50, 49, 77, 50, 49, 44, 51, 72, 51, 65, 50, 44, 50, 32, 48, 32, 48, 44, 48, 32, 49, 44, 53, 86, 49, 55, 65, 50, 44, 50, 32, 48, 32, 48, 44, 48, 32, 51, 44, 49, 57, 72, 56, 86, 50, 49, 72, 49, 54, 86, 49, 57, 72, 50, 49, 65, 50, 44, 50, 32, 48, 32, 48, 44, 48, 32, 50, 51, 44, 49, 55, 86, 53, 65, 50, 44, 50, 32, 48, 32, 48, 44, 48, 32, 50, 49, 44, 51, 90, 34, 32, 47, 62, 60, 47, 115, 118, 103, 62}} diff --git a/izapple2fyne/resources/monitor.svg b/izapple2fyne/resources/monitor.svg new file mode 100644 index 0000000..e8be002 --- /dev/null +++ b/izapple2fyne/resources/monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/izapple2fyne/resources/television-classic.svg b/izapple2fyne/resources/television-classic.svg new file mode 100644 index 0000000..4b82ff3 --- /dev/null +++ b/izapple2fyne/resources/television-classic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/izapple2fyne/resources/television.svg b/izapple2fyne/resources/television.svg new file mode 100644 index 0000000..6c6dfcc --- /dev/null +++ b/izapple2fyne/resources/television.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/izapple2fyne/toolbar.go b/izapple2fyne/toolbar.go new file mode 100644 index 0000000..578b530 --- /dev/null +++ b/izapple2fyne/toolbar.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + + "github.com/ivanizag/izapple2" + + "fyne.io/fyne" + "fyne.io/fyne/theme" + "fyne.io/fyne/widget" +) + +func buildCommandToolbar(s *state, icon fyne.Resource, command int) widget.ToolbarItem { + return widget.NewToolbarAction( + theme.NewThemedResource(icon, nil), func() { + s.a.SendCommand(command) + }) +} + +func buildToolbar(s *state) *widget.Toolbar { + tb := widget.NewToolbar() + tb.Append(buildCommandToolbar(s, resourceRestartSvg, izapple2.CommandReset)) + tb.Append(buildCommandToolbar(s, resourcePauseSvg, izapple2.CommandPauseUnpauseEmulator)) + tb.Append(buildCommandToolbar(s, resourceFastForwardSvg, izapple2.CommandToggleSpeed)) + tb.Append(widget.NewToolbarSeparator()) + tb.Append(newToolbarScreen(s)) + tb.Append(widget.NewToolbarSeparator()) + tb.Append(widget.NewToolbarAction( + theme.NewThemedResource(resourceLayersTripleSvg, nil), func() { + s.showPages = !s.showPages + if !s.showPages { + s.win.SetTitle("iz-" + s.a.Name) + } + })) + tb.Append(widget.NewToolbarAction( + theme.NewThemedResource(resourceCameraSvg, nil), func() { + err := izapple2.SaveSnapshot(s.a, s.screenMode, "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(), + "Snapshot saved on 'snapshot.png'")) + } + })) + //tb.Append(widget.NewToolbarSeparator()) + //tb.Append(newToolbarDisk("S6D1") + tb.Append(widget.NewToolbarSpacer()) + tb.Append(widget.NewToolbarAction( + theme.ViewFullScreenIcon(), + func() { + s.win.SetFullScreen(!s.win.FullScreen()) + })) + tb.Append(widget.NewToolbarAction( + theme.NewThemedResource(resourcePageLayoutSidebarRightSvg, nil), + func() { + w := s.devices.w + if w.Visible() { + w.Hide() + } else { + w.Show() + } + })) + + return tb +} diff --git a/izapple2fyne/toolbarScreen.go b/izapple2fyne/toolbarScreen.go new file mode 100644 index 0000000..973f376 --- /dev/null +++ b/izapple2fyne/toolbarScreen.go @@ -0,0 +1,92 @@ +package main + +import ( + "fyne.io/fyne" + "fyne.io/fyne/theme" + "fyne.io/fyne/widget" + "github.com/ivanizag/izapple2" +) + +type toolbarScreen struct { + s *state + w fyne.CanvasObject + ntsc *widget.Button + ntscDisabled *widget.Icon + plain *widget.Button + plainDisabled *widget.Icon + green *widget.Button + greenDisabled *widget.Icon +} + +func newToolbarScreen(s *state) *toolbarScreen { + var tbs toolbarScreen + tbs.s = s + + tbs.ntsc = widget.NewButtonWithIcon("", + theme.NewThemedResource(resourceTelevisionClassicSvg, nil), + func() { + tbs.setScreenMode(izapple2.ScreenModeNTSC) + }) + tbs.ntscDisabled = widget.NewIcon( + theme.NewDisabledResource(resourceTelevisionClassicSvg)) + + tbs.plain = widget.NewButtonWithIcon("", + theme.NewThemedResource(resourceTelevisionSvg, nil), + func() { + tbs.setScreenMode(izapple2.ScreenModePlain) + }) + tbs.plainDisabled = widget.NewIcon( + theme.NewDisabledResource(resourceTelevisionSvg)) + + tbs.green = widget.NewButtonWithIcon("", + theme.NewThemedResource(resourceMonitorSvg, nil), + func() { + tbs.setScreenMode(izapple2.ScreenModeGreen) + }) + tbs.greenDisabled = widget.NewIcon( + theme.NewDisabledResource(resourceMonitorSvg)) + + tbs.w = widget.NewHBox( + tbs.ntsc, tbs.ntscDisabled, + tbs.plain, tbs.plainDisabled, + tbs.green, tbs.greenDisabled) + + tbs.ntscDisabled.Hide() + tbs.plainDisabled.Hide() + tbs.greenDisabled.Hide() + tbs.setScreenMode(s.screenMode) + + return &tbs +} + +func (tbs *toolbarScreen) setScreenMode(screenMode int) { + switch tbs.s.screenMode { + case izapple2.ScreenModeNTSC: + tbs.ntsc.Show() + tbs.ntscDisabled.Hide() + case izapple2.ScreenModePlain: + tbs.plain.Show() + tbs.plainDisabled.Hide() + case izapple2.ScreenModeGreen: + tbs.green.Show() + tbs.greenDisabled.Hide() + } + + tbs.s.screenMode = screenMode + + switch screenMode { + case izapple2.ScreenModeNTSC: + tbs.ntsc.Hide() + tbs.ntscDisabled.Show() + case izapple2.ScreenModePlain: + tbs.plain.Hide() + tbs.plainDisabled.Show() + case izapple2.ScreenModeGreen: + tbs.green.Hide() + tbs.greenDisabled.Show() + } +} + +func (tbs *toolbarScreen) ToolbarObject() fyne.CanvasObject { + return tbs.w +}