]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/gui/mainwin.cpp
Added switch to disable untuned tank circuit, for slower computers.
[virtualjaguar] / src / gui / mainwin.cpp
index 739756ed1915251717f35168ebafb1e13689f1a2..ba0b21ebe09bc94f7e5db84ba6cc2a1ebe760a3b 100644 (file)
@@ -1,9 +1,9 @@
 //
 // mainwin.cpp - Qt-based GUI for Virtual Jaguar: Main Application Window
-// by James L. Hammons
+// by James Hammons
 // (C) 2009 Underground Software
 //
-// JLH = James L. Hammons <jlhamm@acm.org>
+// JLH = James Hammons <jlhamm@acm.org>
 //
 // Who  When        What
 // ---  ----------  -------------------------------------------------------------
@@ -72,7 +72,7 @@
 
 MainWin::MainWin(): running(true), powerButtonOn(false), showUntunedTankCircuit(true),
        cartridgeLoaded(false), CDActive(false),//, alpineLoadSuccessful(false),
-       pauseForFileSelector(false)
+       pauseForFileSelector(false), plzDontKillMyComputer(false)
 {
        videoWidget = new GLWidget(this);
        setCentralWidget(videoWidget);
@@ -97,18 +97,30 @@ MainWin::MainWin(): running(true), powerButtonOn(false), showUntunedTankCircuit(
        // Create actions
 
        quitAppAct = new QAction(tr("E&xit"), this);
-       quitAppAct->setShortcuts(QKeySequence::Quit);
+//     quitAppAct->setShortcuts(QKeySequence::Quit);
+//     quitAppAct->setShortcut(QKeySequence(tr("Alt+x")));
+       quitAppAct->setShortcut(QKeySequence(tr("Ctrl+q")));
        quitAppAct->setStatusTip(tr("Quit Virtual Jaguar"));
        connect(quitAppAct, SIGNAL(triggered()), this, SLOT(close()));
 
-       powerAct = new QAction(QIcon(":/res/power.png"), tr("&Power"), this);
+       powerGreen.addFile(":/res/power-off.png", QSize(), QIcon::Normal, QIcon::Off);
+       powerGreen.addFile(":/res/power-on-green.png", QSize(), QIcon::Normal, QIcon::On);
+       powerRed.addFile(":/res/power-off.png", QSize(), QIcon::Normal, QIcon::Off);
+       powerRed.addFile(":/res/power-on-red.png", QSize(), QIcon::Normal, QIcon::On);
+
+//     powerAct = new QAction(QIcon(":/res/power.png"), tr("&Power"), this);
+       powerAct = new QAction(powerGreen, tr("&Power"), this);
        powerAct->setStatusTip(tr("Powers Jaguar on/off"));
        powerAct->setCheckable(true);
        powerAct->setChecked(false);
 //     powerAct->setDisabled(true);
        connect(powerAct, SIGNAL(triggered()), this, SLOT(TogglePowerState()));
 
-       pauseAct = new QAction(QIcon(":/res/pause.png"), tr("Pause"), this);
+       QIcon pauseIcon;
+       pauseIcon.addFile(":/res/pause-off", QSize(), QIcon::Normal, QIcon::Off);
+       pauseIcon.addFile(":/res/pause-on", QSize(), QIcon::Normal, QIcon::On);
+//     pauseAct = new QAction(QIcon(":/res/pause.png"), tr("Pause"), this);
+       pauseAct = new QAction(pauseIcon, tr("Pause"), this);
        pauseAct->setStatusTip(tr("Toggles the running state"));
        pauseAct->setCheckable(true);
        pauseAct->setDisabled(true);
@@ -173,6 +185,10 @@ MainWin::MainWin(): running(true), powerButtonOn(false), showUntunedTankCircuit(
        useCDAct->setCheckable(true);
        connect(useCDAct, SIGNAL(triggered()), this, SLOT(ToggleCDUsage()));
 
+       frameAdvanceAct = new QAction(QIcon(":/res/generic.png"), tr("&Frame Advance"), this);
+       frameAdvanceAct->setShortcut(QKeySequence(tr("F7")));
+       connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance()));
+
        // Misc. connections...
        connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString)));
        connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause()));
@@ -182,6 +198,7 @@ MainWin::MainWin(): running(true), powerButtonOn(false), showUntunedTankCircuit(
        fileMenu = menuBar()->addMenu(tr("&Jaguar"));
        fileMenu->addAction(powerAct);
        fileMenu->addAction(pauseAct);
+       fileMenu->addAction(frameAdvanceAct);
        fileMenu->addAction(filePickAct);
        fileMenu->addAction(useCDAct);
        fileMenu->addAction(configAct);
@@ -219,6 +236,7 @@ MainWin::MainWin(): running(true), powerButtonOn(false), showUntunedTankCircuit(
 //     running = powerAct->isChecked();
        ntscAct->setChecked(vjs.hardwareTypeNTSC);
        palAct->setChecked(!vjs.hardwareTypeNTSC);
+       powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen);
 
        // Do this in case original size isn't correct (mostly for the first-run case)
        ResizeMainWindow();
@@ -424,6 +442,9 @@ void MainWin::Timer(void)
 
        if (showUntunedTankCircuit)
        {
+               // Some machines can't handle this, so we give them the option to disable it. :-)
+               if (!plzDontKillMyComputer)
+               {
                // Random hash & trash
                // We try to simulate an untuned tank circuit here... :-)
                for(uint32_t x=0; x<videoWidget->rasterWidth; x++)
@@ -434,6 +455,7 @@ void MainWin::Timer(void)
                                        = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24;
                        }
                }
+               }
        }
        else
        {
@@ -526,6 +548,7 @@ void MainWin::SetZoom300(void)
 
 void MainWin::SetNTSC(void)
 {
+       powerAct->setIcon(powerRed);
        timer->setInterval(16);
        vjs.hardwareTypeNTSC = true;
        ResizeMainWindow();
@@ -533,6 +556,7 @@ void MainWin::SetNTSC(void)
 
 void MainWin::SetPAL(void)
 {
+       powerAct->setIcon(powerGreen);
        timer->setInterval(20);
        vjs.hardwareTypeNTSC = false;
        ResizeMainWindow();
@@ -572,7 +596,10 @@ void MainWin::Unpause(void)
        if (pauseForFileSelector)
        {
                pauseForFileSelector = false;
-               ToggleRunState();
+
+               // Some nutter might have unpaused while in the file selector, so check for that
+               if (!running)
+                       ToggleRunState();
        }
 }
 
@@ -625,6 +652,14 @@ void MainWin::ToggleCDUsage(void)
 #endif
 }
 
+void MainWin::FrameAdvance(void)
+{
+//printf("Frame Advance...\n");
+       // Execute 1 frame, then exit (only useful in Pause mode)
+       JaguarExecuteNew();
+       videoWidget->updateGL();
+}
+
 void MainWin::ResizeMainWindow(void)
 {
        videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256));