mirror of
https://github.com/romychs/Ocean-240.2-Emulator.git
synced 2026-04-21 11:03:21 +03:00
192 lines
4.8 KiB
Go
192 lines
4.8 KiB
Go
package forms
|
|
|
|
import (
|
|
"fmt"
|
|
"image/color"
|
|
"okemu/config"
|
|
"okemu/okean240"
|
|
"okemu/okean240/fdc"
|
|
"os"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/app"
|
|
"fyne.io/fyne/v2/canvas"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/dialog"
|
|
"fyne.io/fyne/v2/driver/desktop"
|
|
"fyne.io/fyne/v2/layout"
|
|
"fyne.io/fyne/v2/storage"
|
|
"fyne.io/fyne/v2/theme"
|
|
"fyne.io/fyne/v2/widget"
|
|
)
|
|
|
|
func NewMainWindow(computer *okean240.ComputerType, config *config.OkEmuConfig, title string) (*fyne.Window, *canvas.Raster, *widget.Label) {
|
|
emulatorApp := app.NewWithID("oceanemu-0001-0000-0001-8f33aba1fc0e")
|
|
w := emulatorApp.NewWindow(title)
|
|
|
|
// Handle all keys typed in main window canvas
|
|
w.Canvas().SetOnTypedKey(
|
|
func(key *fyne.KeyEvent) {
|
|
computer.PutKey(key)
|
|
})
|
|
|
|
w.Canvas().SetOnTypedRune(
|
|
func(key rune) {
|
|
computer.PutRune(key)
|
|
})
|
|
|
|
addShortcuts(w.Canvas(), computer)
|
|
|
|
// ---
|
|
label := widget.NewLabel(fmt.Sprintf("Screen size: %dx%d", computer.ScreenWidth(), computer.ScreenHeight()))
|
|
|
|
raster := canvas.NewRasterWithPixels(
|
|
func(x, y, w, h int) color.Color {
|
|
var xx uint16
|
|
if computer.ScreenWidth() == 512 {
|
|
xx = uint16(x)
|
|
} else {
|
|
xx = uint16(x) / 2
|
|
}
|
|
return computer.GetPixel(xx, uint16(y/2))
|
|
})
|
|
raster.Resize(fyne.NewSize(512, 512))
|
|
raster.SetMinSize(fyne.NewSize(512, 512))
|
|
|
|
centerRaster := container.NewCenter(raster)
|
|
w.Resize(fyne.NewSize(600, 600))
|
|
|
|
//vBox := container.NewVBox(
|
|
// newToolbar(computer, w, emulatorApp, config),
|
|
// centerRaster,
|
|
// label,
|
|
//)
|
|
vBox := container.NewBorder(
|
|
newToolbar(computer, w, emulatorApp, config),
|
|
label,
|
|
nil,
|
|
nil,
|
|
centerRaster,
|
|
)
|
|
w.SetContent(vBox)
|
|
|
|
return &w, raster, label
|
|
}
|
|
|
|
var floppyDriveExt = []string{".okd", ".dat", ".bin", ".raw"}
|
|
|
|
func newOkdOpenDialog(drive byte, c *okean240.ComputerType, w fyne.Window, config *config.OkEmuConfig) *dialog.FileDialog {
|
|
fod := dialog.NewFileOpen(func(reader fyne.URIReadCloser, err error) {
|
|
// Read file list error occurred
|
|
if err != nil {
|
|
dialog.ShowError(err, w)
|
|
return
|
|
}
|
|
// User Cancelled
|
|
if reader == nil {
|
|
return
|
|
}
|
|
// User select Open button, load data
|
|
err = c.LoadFloppyData(drive, reader)
|
|
if err != nil {
|
|
dialog.ShowError(err, w)
|
|
}
|
|
_ = reader.Close()
|
|
}, w)
|
|
fod.SetFileName(config.FDC[drive].FloppyFile)
|
|
cwd, e := os.Getwd()
|
|
if e == nil {
|
|
uri, e := storage.ListerForURI(storage.NewFileURI(cwd))
|
|
if e == nil {
|
|
fod.SetLocation(uri)
|
|
}
|
|
}
|
|
fod.SetTitleText(fmt.Sprintf("Load floppy %s: image", string(rune(int(drive+66)))))
|
|
fod.SetFilter(storage.NewExtensionFileFilter(floppyDriveExt))
|
|
fod.Resize(fyne.NewSize(580, 500))
|
|
return fod
|
|
}
|
|
|
|
func newToolbar(c *okean240.ComputerType, w fyne.Window, a fyne.App, config *config.OkEmuConfig) *fyne.Container {
|
|
hBox := container.NewHBox()
|
|
|
|
for d := 0; d < fdc.TotalDrives; d++ {
|
|
hBox.Add(widget.NewLabel(string(rune(66+d)) + ":"))
|
|
hBox.Add(widget.NewToolbar(
|
|
// Button Open
|
|
widget.NewToolbarAction(theme.FolderOpenIcon(), func() {
|
|
newOkdOpenDialog(byte(d), c, w, config).Show()
|
|
}),
|
|
// Button Save
|
|
widget.NewToolbarAction(theme.DocumentSaveIcon(), func() {
|
|
err := c.SaveFloppy(byte(d))
|
|
if err != nil {
|
|
dialog.ShowError(err, w)
|
|
}
|
|
}),
|
|
))
|
|
hBox.Add(widget.NewSeparator())
|
|
}
|
|
|
|
//hBox.Add(widget.NewButtonWithIcon("1", theme.DownloadIcon(), func() {
|
|
// c.SetRamBytes(ramBytes)
|
|
//}))
|
|
//
|
|
//hBox.Add(widget.NewSeparator())
|
|
hBox.Add(widget.NewButtonWithIcon("^C", theme.MediaStopIcon(), func() {
|
|
c.PutCtrlKey(0x03)
|
|
}))
|
|
hBox.Add(widget.NewSeparator())
|
|
bNorm := widget.NewButtonWithIcon("", theme.MediaPlayIcon(), nil)
|
|
bFast := widget.NewButtonWithIcon("", theme.MediaFastForwardIcon(), nil)
|
|
|
|
bFast.OnTapped = func() {
|
|
c.SetFullSpeed(true)
|
|
c.SetCPUFrequency(50_000_000)
|
|
bNorm.Enable()
|
|
bFast.Disable()
|
|
}
|
|
|
|
bNorm.OnTapped = func() {
|
|
c.SetFullSpeed(false)
|
|
c.SetCPUFrequency(2_500_000)
|
|
bNorm.Disable()
|
|
bFast.Enable()
|
|
}
|
|
|
|
bNorm.Disable()
|
|
|
|
//hBox.Add(cbFreq)
|
|
hBox.Add(bNorm)
|
|
hBox.Add(bFast)
|
|
|
|
hBox.Add(widget.NewSeparator())
|
|
hBox.Add(widget.NewButtonWithIcon("", theme.SettingsIcon(), func() {
|
|
cfg := config.Clone()
|
|
d := dialog.NewCustomConfirm("OK-Emu settings", "Save", "Cancel", settingsDialog(cfg), func(b bool) {
|
|
if b {
|
|
cfg.Save()
|
|
}
|
|
}, w)
|
|
d.Resize(fyne.NewSize(450, 360))
|
|
//w.SetContent(settings.NewSettings().LoadAppearanceScreen(w))
|
|
d.Show()
|
|
}))
|
|
hBox.Add(layout.NewSpacer())
|
|
hBox.Add(widget.NewButtonWithIcon("Reset", theme.MediaReplayIcon(), func() {
|
|
c.SetPendingHardReset(true)
|
|
//computer.Reset(conf)
|
|
}))
|
|
return hBox
|
|
}
|
|
|
|
// Add shortcuts for all Ctrl+<Letter>
|
|
func addShortcuts(c fyne.Canvas, computer *okean240.ComputerType) {
|
|
// Add shortcuts for Ctrl+A to Ctrl+Z
|
|
for kName := 'A'; kName <= 'Z'; kName++ {
|
|
kk := fyne.KeyName(kName)
|
|
sc := &desktop.CustomShortcut{KeyName: kk, Modifier: fyne.KeyModifierControl}
|
|
c.AddShortcut(sc, func(shortcut fyne.Shortcut) { computer.PutCtrlKey(byte(kName&0xff) - 0x40) })
|
|
}
|
|
}
|