X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fmainwin.cpp;h=9a739870df9083a596593f11d30c84204fd3db4f;hb=5c28b6dbf7aa20441c8a51f484f4f64b1966f7e3;hp=e7a6ba8c7d505d18177331f07de3b7263c6aea44;hpb=437c16a8f1d73b28d7262819654b88b207231154;p=virtualjaguar diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index e7a6ba8..9a73987 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -35,14 +35,19 @@ #include "SDL.h" #include "app.h" -#include "glwidget.h" #include "about.h" -#include "help.h" -#include "settings.h" -#include "filepicker.h" #include "configdialog.h" +#include "filepicker.h" +#include "gamepad.h" #include "generaltab.h" +#include "glwidget.h" +#include "help.h" +#include "settings.h" #include "version.h" +#include "debug/cpubrowser.h" +#include "debug/m68kdasmbrowser.h" +#include "debug/memorybrowser.h" +#include "debug/opbrowser.h" #include "dac.h" #include "jaguar.h" @@ -96,6 +101,10 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), aboutWin = new AboutWindow(this); helpWin = new HelpWindow(this); filePickWin = new FilePickerWindow(this); + memBrowseWin = new MemoryBrowserWindow(this); + cpuBrowseWin = new CPUBrowserWindow(this); + opBrowseWin = new OPBrowserWindow(this); + m68kDasmBrowseWin = new M68KDasmBrowserWindow(this); videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -193,10 +202,35 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), useCDAct->setCheckable(true); connect(useCDAct, SIGNAL(triggered()), this, SLOT(ToggleCDUsage())); - frameAdvanceAct = new QAction(QIcon(":/res/generic.png"), tr("&Frame Advance"), this); + frameAdvanceAct = new QAction(QIcon(":/res/frame-advance.png"), tr("&Frame Advance"), this); frameAdvanceAct->setShortcut(QKeySequence(tr("F7"))); connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance())); + fullScreenAct = new QAction(QIcon(":/res/generic.png"), tr("F&ull Screen"), this); + fullScreenAct->setShortcut(QKeySequence(tr("F9"))); + connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(ToggleFullScreen())); + + // Debugger Actions + memBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("Memory Browser"), this); + memBrowseAct->setStatusTip(tr("Shows the Jaguar memory browser window")); +// memBrowseAct->setCheckable(true); + connect(memBrowseAct, SIGNAL(triggered()), this, SLOT(ShowMemoryBrowserWin())); + + cpuBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("CPU Browser"), this); + cpuBrowseAct->setStatusTip(tr("Shows the Jaguar CPU browser window")); +// memBrowseAct->setCheckable(true); + connect(cpuBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCPUBrowserWin())); + + opBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("OP Browser"), this); + opBrowseAct->setStatusTip(tr("Shows the Jaguar OP browser window")); +// memBrowseAct->setCheckable(true); + connect(opBrowseAct, SIGNAL(triggered()), this, SLOT(ShowOPBrowserWin())); + + m68kDasmBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("68K Listing Browser"), this); + m68kDasmBrowseAct->setStatusTip(tr("Shows the 68K disassembly browser window")); +// memBrowseAct->setCheckable(true); + connect(m68kDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowM68KDasmBrowserWin())); + // Misc. connections... connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString))); connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause())); @@ -212,6 +246,15 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), fileMenu->addAction(configAct); fileMenu->addAction(quitAppAct); + if (vjs.hardwareTypeAlpine) + { + debugMenu = menuBar()->addMenu(tr("&Debug")); + debugMenu->addAction(memBrowseAct); + debugMenu->addAction(cpuBrowseAct); + debugMenu->addAction(opBrowseAct); + debugMenu->addAction(m68kDasmBrowseAct); + } + helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(helpAct); helpMenu->addAction(aboutAct); @@ -230,6 +273,16 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), toolbar->addAction(palAct); toolbar->addSeparator(); toolbar->addAction(blurAct); + toolbar->addAction(fullScreenAct); + + if (vjs.hardwareTypeAlpine) + { + debugbar = addToolBar(tr("&Debug")); + debugbar->addAction(memBrowseAct); + debugbar->addAction(cpuBrowseAct); + debugbar->addAction(opBrowseAct); + debugbar->addAction(m68kDasmBrowseAct); + } // Create status bar statusBar()->showMessage(tr("Ready")); @@ -242,13 +295,13 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), // Set up timer based loop for animation... timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(Timer())); -//This is only correct for PAL. !!! FIX !!! [DONE] -//Use timer->setInterval( int msec ) to fix this on the fly -// timer->start(20); + // This isn't very accurate for NTSC: This is early by 40 msec per frame. // This is because it's discarding the 0.6666... on the end of the fraction. // Alas, 6 doesn't divide cleanly into 10. :-P - timer->start(vjs.hardwareTypeNTSC ? 16 : 20); +//Should we defer this until SyncUI? Probably. +//No, it doesn't work, because it uses setInterval() instead of start()... +// timer->start(vjs.hardwareTypeNTSC ? 16 : 20); // We set this initially, to make VJ behave somewhat as it would if no // cart were inserted and the BIOS was set as active... @@ -309,6 +362,7 @@ void MainWin::LoadFile(QString file) void MainWin::SyncUI(void) { // Set toolbar buttons/menus based on settings read in (sync the UI)... + // (Really, this is to sync command line options passed in) blurAct->setChecked(vjs.glFilter); x1Act->setChecked(zoomLevel == 1); x2Act->setChecked(zoomLevel == 2); @@ -317,6 +371,13 @@ void MainWin::SyncUI(void) ntscAct->setChecked(vjs.hardwareTypeNTSC); palAct->setChecked(!vjs.hardwareTypeNTSC); powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen); + + fullScreen = vjs.fullscreen; + SetFullScreen(fullScreen); + + // Reset the timer to be what was set in the command line (if any): +// timer->setInterval(vjs.hardwareTypeNTSC ? 16 : 20); + timer->start(vjs.hardwareTypeNTSC ? 16 : 20); } @@ -338,7 +399,13 @@ void MainWin::keyPressEvent(QKeyEvent * e) e->accept(); return; } - +/* + if (e->key() == Qt::Key_F9) + { + ToggleFullScreen(); + return; + } +*/ HandleKeys(e, true); } @@ -437,6 +504,21 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) } +void MainWin::HandleGamepads(void) +{ + Gamepad::Update(); + + for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++) + { + if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT)) + joypad_0_buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00); + + if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT)) + joypad_1_buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00); + } +} + + void MainWin::Open(void) { } @@ -455,12 +537,14 @@ void MainWin::Configure(void) QString before = vjs.ROMPath; QString alpineBefore = vjs.alpineROMPath; QString absBefore = vjs.absROMPath; - bool audioBefore = vjs.audioEnabled; +// bool audioBefore = vjs.audioEnabled; + bool audioBefore = vjs.DSPEnabled; dlg.UpdateVJSettings(); QString after = vjs.ROMPath; QString alpineAfter = vjs.alpineROMPath; QString absAfter = vjs.absROMPath; - bool audioAfter = vjs.audioEnabled; +// bool audioAfter = vjs.audioEnabled; + bool audioAfter = vjs.DSPEnabled; bool allowOld = allowUnknownSoftware; //ick. @@ -497,7 +581,8 @@ void MainWin::Configure(void) } } - // If the "Enable audio" checkbox changed, then we have to re-init the DAC... + // If the "Enable DSP" checkbox changed, then we have to re-init the DAC, + // since it's running in the host audio IRQ... if (audioBefore != audioAfter) { DACDone(); @@ -537,6 +622,7 @@ void MainWin::Timer(void) else { // Otherwise, run the Jaguar simulation + HandleGamepads(); JaguarExecuteNew(); } @@ -756,9 +842,82 @@ void MainWin::FrameAdvance(void) } +void MainWin::SetFullScreen(bool state/*= true*/) +{ + if (state) + { + mainWinPosition = pos(); +// mainWinSize = size(); + menuBar()->hide(); + statusBar()->hide(); + showFullScreen(); + QRect r = QApplication::desktop()->availableGeometry(); +// double targetWidth = 320.0, targetHeight = (vjs.hardwareTypeNTSC ? 240.0 : 256.0); + double targetWidth = (double)VIRTUAL_SCREEN_WIDTH, + targetHeight = (double)(vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL); + double aspectRatio = targetWidth / targetHeight; + // NOTE: Really should check here to see which dimension constrains the other. + // Right now, we assume that height is the constraint. + int newWidth = (int)(aspectRatio * (double)r.height()); + + videoWidget->setFixedSize(newWidth, r.height()); + showFullScreen(); + } + else + { + menuBar()->show(); + statusBar()->show(); + showNormal(); + ResizeMainWindow(); + move(mainWinPosition); + } + + // For some reason, this doesn't work: If the emu is paused, toggling from + // fullscreen to windowed (& vice versa) shows a white screen. +// videoWidget->updateGL(); +} + + +void MainWin::ToggleFullScreen(void) +{ + fullScreen = !fullScreen; + SetFullScreen(fullScreen); +} + + +void MainWin::ShowMemoryBrowserWin(void) +{ + memBrowseWin->show(); + memBrowseWin->RefreshContents(); +} + + +void MainWin::ShowCPUBrowserWin(void) +{ + cpuBrowseWin->show(); + cpuBrowseWin->RefreshContents(); +} + + +void MainWin::ShowOPBrowserWin(void) +{ + opBrowseWin->show(); + opBrowseWin->RefreshContents(); +} + + +void MainWin::ShowM68KDasmBrowserWin(void) +{ + m68kDasmBrowseWin->show(); + m68kDasmBrowseWin->RefreshContents(); +} + + void MainWin::ResizeMainWindow(void) { - videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256)); +// videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256)); + videoWidget->setFixedSize(zoomLevel * VIRTUAL_SCREEN_WIDTH, + zoomLevel * (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL)); show(); for(int i=0; i<2; i++) @@ -775,11 +934,11 @@ void MainWin::ResizeMainWindow(void) void MainWin::ReadSettings(void) { QSettings settings("Underground Software", "Virtual Jaguar"); - QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); + mainWinPosition = settings.value("pos", QPoint(200, 200)).toPoint(); QSize size = settings.value("size", QSize(400, 400)).toSize(); resize(size); - move(pos); - pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint(); + move(mainWinPosition); + QPoint pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint(); filePickWin->move(pos); zoomLevel = settings.value("zoom", 2).toInt();