bsnes/qt/base/main.cpp

675 lines
27 KiB
C++

#include "main.moc"
MainWindow *mainWindow;
MainWindow::MainWindow() {
setObjectName("main-window");
setWindowTitle(string() << SNES::Info::Name << " v" << SNES::Info::Version);
setCloseOnEscape(false);
setGeometryString(&config().geometry.mainWindow);
application.windowList.append(this);
//menu bar
#if defined(PLATFORM_OSX)
menuBar = new QMenuBar(0);
#else
menuBar = new QMenuBar;
#endif
system = menuBar->addMenu("&System");
system_load = system->addAction("Load &Cartridge ...");
system_load->setIcon(QIcon(":/16x16/document-open.png"));
system_loadSpecial = system->addMenu("Load &Special");
system_loadSpecial->setIcon(QIcon(":/16x16/document-open.png"));
system_loadSpecial_bsxSlotted = system_loadSpecial->addAction("Load BS-X &Slotted Cartridge ...");
system_loadSpecial_bsxSlotted->setIcon(QIcon(":/16x16/document-open.png"));
system_loadSpecial_bsx = system_loadSpecial->addAction("Load &BS-X Cartridge ...");
system_loadSpecial_bsx->setIcon(QIcon(":/16x16/document-open.png"));
system_loadSpecial_sufamiTurbo = system_loadSpecial->addAction("Load Sufami &Turbo Cartridge ...");
system_loadSpecial_sufamiTurbo->setIcon(QIcon(":/16x16/document-open.png"));
system_loadSpecial_superGameBoy = system_loadSpecial->addAction("Load Super &Game Boy Cartridge ...");
system_loadSpecial_superGameBoy->setIcon(QIcon(":/16x16/document-open.png"));
system->addSeparator();
system->addAction(system_power = new CheckAction("&Power", 0));
system_reset = system->addAction("&Reset");
system_reset->setIcon(QIcon(":/16x16/view-refresh.png"));
system->addSeparator();
system_port1 = system->addMenu("Controller Port &1");
system_port1->setIcon(QIcon(":/16x16/input-gaming.png"));
system_port1->addAction(system_port1_none = new RadioAction("&None", 0));
system_port1->addAction(system_port1_gamepad = new RadioAction("&Gamepad", 0));
system_port1->addAction(system_port1_asciipad = new RadioAction("&asciiPad", 0));
system_port1->addAction(system_port1_multitap = new RadioAction("&Multitap", 0));
system_port1->addAction(system_port1_mouse = new RadioAction("&Mouse", 0));
system_port2 = system->addMenu("Controller Port &2");
system_port2->setIcon(QIcon(":/16x16/input-gaming.png"));
system_port2->addAction(system_port2_none = new RadioAction("&None", 0));
system_port2->addAction(system_port2_gamepad = new RadioAction("&Gamepad", 0));
system_port2->addAction(system_port2_asciipad = new RadioAction("&asciiPad", 0));
system_port2->addAction(system_port2_multitap = new RadioAction("&Multitap", 0));
system_port2->addAction(system_port2_mouse = new RadioAction("&Mouse", 0));
system_port2->addAction(system_port2_superscope = new RadioAction("&Super Scope", 0));
system_port2->addAction(system_port2_justifier = new RadioAction("&Justifier", 0));
system_port2->addAction(system_port2_justifiers = new RadioAction("Two &Justifiers", 0));
#if !defined(PLATFORM_OSX)
system->addSeparator();
#endif
system_exit = system->addAction("E&xit");
system_exit->setIcon(QIcon(":/16x16/process-stop.png"));
system_exit->setMenuRole(QAction::QuitRole);
settings = menuBar->addMenu("S&ettings");
settings_videoMode = settings->addMenu("Video &Mode");
settings_videoMode->setIcon(QIcon(":/16x16/video-display.png"));
settings_videoMode->addAction(settings_videoMode_1x = new RadioAction("Scale &1x", 0));
settings_videoMode->addAction(settings_videoMode_2x = new RadioAction("Scale &2x", 0));
settings_videoMode->addAction(settings_videoMode_3x = new RadioAction("Scale &3x", 0));
settings_videoMode->addAction(settings_videoMode_4x = new RadioAction("Scale &4x", 0));
settings_videoMode->addAction(settings_videoMode_5x = new RadioAction("Scale &5x", 0));
settings_videoMode->addAction(settings_videoMode_max_normal = new RadioAction("Scale Max - &Normal", 0));
settings_videoMode->addAction(settings_videoMode_max_wide = new RadioAction("Scale Max - &Wide", 0));
settings_videoMode->addAction(settings_videoMode_max_wideZoom = new RadioAction("Scale Max - Wide &Zoom", 0));
settings_videoMode->addSeparator();
settings_videoMode->addAction(settings_videoMode_correctAspectRatio = new CheckAction("Correct &Aspect Ratio", 0));
settings_videoMode->addSeparator();
settings_videoMode->addAction(settings_videoMode_ntsc = new RadioAction("&NTSC", 0));
settings_videoMode->addAction(settings_videoMode_pal = new RadioAction("&PAL", 0));
if(filter.opened()) {
settings_videoFilter = settings->addMenu("Video &Filter");
settings_videoFilter->setIcon(QIcon(":/16x16/image-x-generic.png"));
settings_videoFilter_configure = settings_videoFilter->addAction("&Configure Active Filter ...");
settings_videoFilter_configure->setIcon(QIcon(":/16x16/preferences-desktop.png"));
settings_videoFilter->addSeparator();
settings_videoFilter->addAction(settings_videoFilter_none = new RadioAction("&None", 0));
settings_videoFilter_list.append(settings_videoFilter_none);
lstring filterlist;
filterlist.split(";", filter.dl_supported());
for(unsigned i = 0; i < filterlist.size(); i++) {
RadioAction *action = new RadioAction(filterlist[i], 0);
settings_videoFilter->addAction(action);
settings_videoFilter_list.append(action);
}
}
settings->addAction(settings_smoothVideo = new CheckAction("&Smooth Video Output", 0));
settings->addSeparator();
settings->addAction(settings_muteAudio = new CheckAction("&Mute Audio Output", 0));
settings->addSeparator();
settings_emulationSpeed = settings->addMenu("Emulation &Speed");
settings_emulationSpeed->setIcon(QIcon(":/16x16/appointment-new.png"));
settings_emulationSpeed->addAction(settings_emulationSpeed_slowest = new RadioAction("Slowest", 0));
settings_emulationSpeed->addAction(settings_emulationSpeed_slow = new RadioAction("Slow", 0));
settings_emulationSpeed->addAction(settings_emulationSpeed_normal = new RadioAction("Normal", 0));
settings_emulationSpeed->addAction(settings_emulationSpeed_fast = new RadioAction("Fast", 0));
settings_emulationSpeed->addAction(settings_emulationSpeed_fastest = new RadioAction("Fastest", 0));
settings_emulationSpeed->addSeparator();
settings_emulationSpeed->addAction(settings_emulationSpeed_syncVideo = new CheckAction("Sync &Video", 0));
settings_emulationSpeed->addAction(settings_emulationSpeed_syncAudio = new CheckAction("Sync &Audio", 0));
settings_configuration = settings->addAction("&Configuration ...");
settings_configuration->setIcon(QIcon(":/16x16/preferences-desktop.png"));
settings_configuration->setMenuRole(QAction::PreferencesRole);
tools = menuBar->addMenu("&Tools");
tools_movies = tools->addMenu("&Movies");
tools_movies->setIcon(QIcon(":/16x16/applications-multimedia.png"));
tools_movies_play = tools_movies->addAction("Play Movie ...");
tools_movies_play->setIcon(QIcon(":/16x16/media-playback-start.png"));
tools_movies_stop = tools_movies->addAction("Stop");
tools_movies_stop->setIcon(QIcon(":/16x16/media-playback-stop.png"));
tools_movies_recordFromPowerOn = tools_movies->addAction("Record Movie (and restart system)");
tools_movies_recordFromPowerOn->setIcon(QIcon(":/16x16/media-record.png"));
tools_movies_recordFromHere = tools_movies->addAction("Record Movie (starting from here)");
tools_movies_recordFromHere->setIcon(QIcon(":/16x16/media-record.png"));
tools_captureScreenshot = tools->addAction("&Capture Screenshot");
tools_captureScreenshot->setIcon(QIcon(":/16x16/image-x-generic.png"));
tools->addSeparator();
tools_cheatEditor = tools->addAction("Cheat &Editor ...");
tools_cheatEditor->setIcon(QIcon(":/16x16/accessories-text-editor.png"));
tools_cheatFinder = tools->addAction("Cheat &Finder ...");
tools_cheatFinder->setIcon(QIcon(":/16x16/system-search.png"));
tools_stateManager = tools->addAction("&State Manager ...");
tools_stateManager->setIcon(QIcon(":/16x16/system-file-manager.png"));
tools_debugger = tools->addAction("&Debugger ...");
tools_debugger->setIcon(QIcon(":/16x16/utilities-terminal.png"));
#if !defined(DEBUGGER)
tools_debugger->setVisible(false);
#endif
help = menuBar->addMenu("&Help");
help_documentation = help->addAction("&Documentation ...");
help_documentation->setIcon(QIcon(":/16x16/text-x-generic.png"));
help_license = help->addAction("&License ...");
help_license->setIcon(QIcon(":/16x16/text-x-generic.png"));
#if !defined(PLATFORM_OSX)
help->addSeparator();
#endif
help_about = help->addAction("&About ...");
help_about->setIcon(QIcon(":/16x16/help-browser.png"));
help_about->setMenuRole(QAction::AboutRole);
//canvas
canvasContainer = new CanvasObject;
canvasContainer->setAcceptDrops(true); {
canvasContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
canvasContainer->setObjectName("backdrop");
canvasLayout = new QVBoxLayout; {
canvasLayout->setMargin(0);
canvasLayout->setAlignment(Qt::AlignCenter);
canvas = new CanvasWidget;
canvas->setAcceptDrops(true);
canvas->setFocusPolicy(Qt::StrongFocus);
canvas->setAttribute(Qt::WA_PaintOnScreen, true); //disable Qt painting on focus / resize
QPalette palette;
palette.setColor(QPalette::Window, QColor(0, 0, 0));
canvas->setPalette(palette);
canvas->setAutoFillBackground(true);
}
canvasLayout->addWidget(canvas);
}
canvasContainer->setLayout(canvasLayout);
//status bar
statusBar = new QStatusBar;
statusBar->setSizeGripEnabled(false);
statusBar->showMessage("");
systemState = new QLabel;
statusBar->addPermanentWidget(systemState);
//layout
layout = new QVBoxLayout;
layout->setMargin(0);
layout->setSpacing(0);
#if !defined(PLATFORM_OSX)
layout->addWidget(menuBar);
#endif
layout->addWidget(canvasContainer);
layout->addWidget(statusBar);
setLayout(layout);
//slots
connect(system_load, SIGNAL(triggered()), this, SLOT(loadCartridge()));
connect(system_loadSpecial_bsxSlotted, SIGNAL(triggered()), this, SLOT(loadBsxSlottedCartridge()));
connect(system_loadSpecial_bsx, SIGNAL(triggered()), this, SLOT(loadBsxCartridge()));
connect(system_loadSpecial_sufamiTurbo, SIGNAL(triggered()), this, SLOT(loadSufamiTurboCartridge()));
connect(system_loadSpecial_superGameBoy, SIGNAL(triggered()), this, SLOT(loadSuperGameBoyCartridge()));
connect(system_power, SIGNAL(triggered()), this, SLOT(power()));
connect(system_reset, SIGNAL(triggered()), this, SLOT(reset()));
connect(system_port1_none, SIGNAL(triggered()), this, SLOT(setPort1None()));
connect(system_port1_gamepad, SIGNAL(triggered()), this, SLOT(setPort1Gamepad()));
connect(system_port1_asciipad, SIGNAL(triggered()), this, SLOT(setPort1Asciipad()));
connect(system_port1_multitap, SIGNAL(triggered()), this, SLOT(setPort1Multitap()));
connect(system_port1_mouse, SIGNAL(triggered()), this, SLOT(setPort1Mouse()));
connect(system_port2_none, SIGNAL(triggered()), this, SLOT(setPort2None()));
connect(system_port2_gamepad, SIGNAL(triggered()), this, SLOT(setPort2Gamepad()));
connect(system_port2_asciipad, SIGNAL(triggered()), this, SLOT(setPort2Asciipad()));
connect(system_port2_multitap, SIGNAL(triggered()), this, SLOT(setPort2Multitap()));
connect(system_port2_mouse, SIGNAL(triggered()), this, SLOT(setPort2Mouse()));
connect(system_port2_superscope, SIGNAL(triggered()), this, SLOT(setPort2SuperScope()));
connect(system_port2_justifier, SIGNAL(triggered()), this, SLOT(setPort2Justifier()));
connect(system_port2_justifiers, SIGNAL(triggered()), this, SLOT(setPort2Justifiers()));
connect(system_exit, SIGNAL(triggered()), this, SLOT(quit()));
connect(settings_videoMode_1x, SIGNAL(triggered()), this, SLOT(setVideoMode1x()));
connect(settings_videoMode_2x, SIGNAL(triggered()), this, SLOT(setVideoMode2x()));
connect(settings_videoMode_3x, SIGNAL(triggered()), this, SLOT(setVideoMode3x()));
connect(settings_videoMode_4x, SIGNAL(triggered()), this, SLOT(setVideoMode4x()));
connect(settings_videoMode_5x, SIGNAL(triggered()), this, SLOT(setVideoMode5x()));
connect(settings_videoMode_max_normal, SIGNAL(triggered()), this, SLOT(setVideoModeMaxNormal()));
connect(settings_videoMode_max_wide, SIGNAL(triggered()), this, SLOT(setVideoModeMaxWide()));
connect(settings_videoMode_max_wideZoom, SIGNAL(triggered()), this, SLOT(setVideoModeMaxWideZoom()));
connect(settings_videoMode_correctAspectRatio, SIGNAL(triggered()), this, SLOT(toggleAspectCorrection()));
connect(settings_videoMode_ntsc, SIGNAL(triggered()), this, SLOT(setVideoNtsc()));
connect(settings_videoMode_pal, SIGNAL(triggered()), this, SLOT(setVideoPal()));
if(filter.opened()) {
connect(settings_videoFilter_configure, SIGNAL(triggered()), this, SLOT(configureFilter()));
for(unsigned i = 0; i < settings_videoFilter_list.size(); i++) {
connect(settings_videoFilter_list[i], SIGNAL(triggered()), this, SLOT(setFilter()));
}
}
connect(settings_smoothVideo, SIGNAL(triggered()), this, SLOT(toggleSmoothVideo()));
connect(settings_muteAudio, SIGNAL(triggered()), this, SLOT(muteAudio()));
connect(settings_emulationSpeed_slowest, SIGNAL(triggered()), this, SLOT(setSpeedSlowest()));
connect(settings_emulationSpeed_slow, SIGNAL(triggered()), this, SLOT(setSpeedSlow()));
connect(settings_emulationSpeed_normal, SIGNAL(triggered()), this, SLOT(setSpeedNormal()));
connect(settings_emulationSpeed_fast, SIGNAL(triggered()), this, SLOT(setSpeedFast()));
connect(settings_emulationSpeed_fastest, SIGNAL(triggered()), this, SLOT(setSpeedFastest()));
connect(settings_emulationSpeed_syncVideo, SIGNAL(triggered()), this, SLOT(syncVideo()));
connect(settings_emulationSpeed_syncAudio, SIGNAL(triggered()), this, SLOT(syncAudio()));
connect(settings_configuration, SIGNAL(triggered()), this, SLOT(showConfigWindow()));
connect(tools_movies_play, SIGNAL(triggered()), this, SLOT(playMovie()));
connect(tools_movies_stop, SIGNAL(triggered()), this, SLOT(stopMovie()));
connect(tools_movies_recordFromPowerOn, SIGNAL(triggered()), this, SLOT(recordMovieFromPowerOn()));
connect(tools_movies_recordFromHere, SIGNAL(triggered()), this, SLOT(recordMovieFromHere()));
connect(tools_captureScreenshot, SIGNAL(triggered()), this, SLOT(saveScreenshot()));
connect(tools_cheatEditor, SIGNAL(triggered()), this, SLOT(showCheatEditor()));
connect(tools_cheatFinder, SIGNAL(triggered()), this, SLOT(showCheatFinder()));
connect(tools_stateManager, SIGNAL(triggered()), this, SLOT(showStateManager()));
connect(tools_debugger, SIGNAL(triggered()), this, SLOT(showDebugger()));
connect(help_documentation, SIGNAL(triggered()), this, SLOT(showDocumentation()));
connect(help_license, SIGNAL(triggered()), this, SLOT(showLicense()));
connect(help_about, SIGNAL(triggered()), this, SLOT(showAbout()));
syncUi();
}
void MainWindow::syncUi() {
system_power->setEnabled(SNES::cartridge.loaded());
system_power->setChecked(application.power == true);
system_power->setEnabled(SNES::cartridge.loaded());
system_reset->setEnabled(SNES::cartridge.loaded() && application.power);
system_port1_none->setChecked (config().input.port1 == ControllerPort1::None);
system_port1_gamepad->setChecked (config().input.port1 == ControllerPort1::Gamepad);
system_port1_asciipad->setChecked (config().input.port1 == ControllerPort1::Asciipad);
system_port1_multitap->setChecked (config().input.port1 == ControllerPort1::Multitap);
system_port1_mouse->setChecked (config().input.port1 == ControllerPort1::Mouse);
system_port2_none->setChecked (config().input.port2 == ControllerPort2::None);
system_port2_gamepad->setChecked (config().input.port2 == ControllerPort2::Gamepad);
system_port2_asciipad->setChecked (config().input.port2 == ControllerPort2::Asciipad);
system_port2_multitap->setChecked (config().input.port2 == ControllerPort2::Multitap);
system_port2_mouse->setChecked (config().input.port2 == ControllerPort2::Mouse);
system_port2_superscope->setChecked(config().input.port2 == ControllerPort2::SuperScope);
system_port2_justifier->setChecked (config().input.port2 == ControllerPort2::Justifier);
system_port2_justifiers->setChecked(config().input.port2 == ControllerPort2::Justifiers);
settings_videoMode_1x->setChecked (config().video.context->multiplier == 1);
settings_videoMode_2x->setChecked (config().video.context->multiplier == 2);
settings_videoMode_3x->setChecked (config().video.context->multiplier == 3);
settings_videoMode_4x->setChecked (config().video.context->multiplier == 4);
settings_videoMode_5x->setChecked (config().video.context->multiplier == 5);
settings_videoMode_max_normal->setChecked(config().video.context->multiplier == 6);
settings_videoMode_max_wide->setChecked (config().video.context->multiplier == 7);
settings_videoMode_max_wideZoom->setChecked (config().video.context->multiplier == 8);
settings_videoMode_max_normal->setVisible(config().video.isFullscreen == true);
settings_videoMode_max_wide->setVisible (config().video.isFullscreen == true);
settings_videoMode_max_wideZoom->setVisible (config().video.isFullscreen == true);
settings_videoMode_correctAspectRatio->setChecked(config().video.context->correctAspectRatio);
settings_videoMode_ntsc->setChecked(config().video.context->region == 0);
settings_videoMode_pal->setChecked (config().video.context->region == 1);
if(filter.opened()) {
//only enable configuration option if the active filter supports it ...
settings_videoFilter_configure->setEnabled(filter.settings());
for(unsigned i = 0; i < settings_videoFilter_list.size(); i++) {
settings_videoFilter_list[i]->setChecked(config().video.context->swFilter == i);
}
}
settings_smoothVideo->setChecked(config().video.context->hwFilter == 1);
settings_muteAudio->setChecked(config().audio.mute);
settings_emulationSpeed_slowest->setChecked(config().system.speed == 0);
settings_emulationSpeed_slow->setChecked (config().system.speed == 1);
settings_emulationSpeed_normal->setChecked (config().system.speed == 2);
settings_emulationSpeed_fast->setChecked (config().system.speed == 3);
settings_emulationSpeed_fastest->setChecked(config().system.speed == 4);
settings_emulationSpeed_syncVideo->setChecked(config().video.synchronize);
settings_emulationSpeed_syncAudio->setChecked(config().audio.synchronize);
//movies contian save states to synchronize playback to recorded input
tools_movies->setEnabled(SNES::cartridge.loaded() && cartridge.saveStatesSupported());
if(tools_movies->isEnabled()) {
tools_movies_play->setEnabled(movie.state == Movie::Inactive);
tools_movies_stop->setEnabled(movie.state != Movie::Inactive);
tools_movies_recordFromPowerOn->setEnabled(movie.state == Movie::Inactive);
tools_movies_recordFromHere->setEnabled(movie.state == Movie::Inactive);
}
}
bool MainWindow::isActive() {
return isActiveWindow() && !isMinimized();
}
void MainWindow::loadCartridge() {
fileBrowser->setWindowTitle("Load Cartridge");
fileBrowser->loadCartridge(FileBrowser::LoadDirect);
}
void MainWindow::loadBsxSlottedCartridge() {
loaderWindow->loadBsxSlottedCartridge("", "");
}
void MainWindow::loadBsxCartridge() {
loaderWindow->loadBsxCartridge(config().path.bsx, "");
}
void MainWindow::loadSufamiTurboCartridge() {
loaderWindow->loadSufamiTurboCartridge(config().path.st, "", "");
}
void MainWindow::loadSuperGameBoyCartridge() {
loaderWindow->loadSuperGameBoyCartridge(config().path.sgb, "");
}
void MainWindow::power() {
system_power->toggleChecked();
if(system_power->isChecked()) {
utility.modifySystemState(Utility::PowerOn);
} else {
utility.modifySystemState(Utility::PowerOff);
}
}
void MainWindow::reset() {
utility.modifySystemState(Utility::Reset);
}
void MainWindow::setPort1None() {
config().input.port1 = ControllerPort1::None;
SNES::config.controller_port1 = SNES::Input::Device::None;
utility.updateControllers();
}
void MainWindow::setPort1Gamepad() {
config().input.port1 = ControllerPort1::Gamepad;
SNES::config.controller_port1 = SNES::Input::Device::Joypad;
utility.updateControllers();
}
void MainWindow::setPort1Asciipad() {
config().input.port1 = ControllerPort1::Asciipad;
SNES::config.controller_port1 = SNES::Input::Device::Joypad;
utility.updateControllers();
}
void MainWindow::setPort1Multitap() {
config().input.port1 = ControllerPort1::Multitap;
SNES::config.controller_port1 = SNES::Input::Device::Multitap;
utility.updateControllers();
}
void MainWindow::setPort1Mouse() {
config().input.port1 = ControllerPort1::Mouse;
SNES::config.controller_port1 = SNES::Input::Device::Mouse;
utility.updateControllers();
}
void MainWindow::setPort2None() {
config().input.port2 = ControllerPort2::None;
SNES::config.controller_port2 = SNES::Input::Device::None;
utility.updateControllers();
}
void MainWindow::setPort2Gamepad() {
config().input.port2 = ControllerPort2::Gamepad;
SNES::config.controller_port2 = SNES::Input::Device::Joypad;
utility.updateControllers();
}
void MainWindow::setPort2Asciipad() {
config().input.port2 = ControllerPort2::Asciipad;
SNES::config.controller_port2 = SNES::Input::Device::Joypad;
utility.updateControllers();
}
void MainWindow::setPort2Multitap() {
config().input.port2 = ControllerPort2::Multitap;
SNES::config.controller_port2 = SNES::Input::Device::Multitap;
utility.updateControllers();
}
void MainWindow::setPort2Mouse() {
config().input.port2 = ControllerPort2::Mouse;
SNES::config.controller_port2 = SNES::Input::Device::Mouse;
utility.updateControllers();
}
void MainWindow::setPort2SuperScope() {
config().input.port2 = ControllerPort2::SuperScope;
SNES::config.controller_port2 = SNES::Input::Device::SuperScope;
utility.updateControllers();
}
void MainWindow::setPort2Justifier() {
config().input.port2 = ControllerPort2::Justifier;
SNES::config.controller_port2 = SNES::Input::Device::Justifier;
utility.updateControllers();
}
void MainWindow::setPort2Justifiers() {
config().input.port2 = ControllerPort2::Justifiers;
SNES::config.controller_port2 = SNES::Input::Device::Justifiers;
utility.updateControllers();
}
void MainWindow::quit() {
hide();
application.terminate = true;
}
void MainWindow::setVideoMode1x() { utility.setScale(1); }
void MainWindow::setVideoMode2x() { utility.setScale(2); }
void MainWindow::setVideoMode3x() { utility.setScale(3); }
void MainWindow::setVideoMode4x() { utility.setScale(4); }
void MainWindow::setVideoMode5x() { utility.setScale(5); }
void MainWindow::setVideoModeMaxNormal() { utility.setScale(6); }
void MainWindow::setVideoModeMaxWide() { utility.setScale(7); }
void MainWindow::setVideoModeMaxWideZoom() { utility.setScale(8); }
void MainWindow::toggleAspectCorrection() { utility.toggleAspectCorrection(); }
void MainWindow::setVideoNtsc() { utility.setNtscMode(); }
void MainWindow::setVideoPal() { utility.setPalMode(); }
void MainWindow::toggleSmoothVideo() { utility.toggleSmoothVideoOutput(); }
void MainWindow::configureFilter() {
QWidget *widget = filter.settings();
if(widget) {
widget->show();
widget->activateWindow();
widget->raise();
}
}
void MainWindow::setFilter() {
for(unsigned i = 0; i < settings_videoFilter_list.size(); i++) {
if(sender() == settings_videoFilter_list[i]) {
config().video.context->swFilter = i;
utility.updateSoftwareFilter();
syncUi();
return;
}
}
}
void MainWindow::muteAudio() {
settings_muteAudio->toggleChecked();
config().audio.mute = settings_muteAudio->isChecked();
}
void MainWindow::setSpeedSlowest() { config().system.speed = 0; utility.updateEmulationSpeed(); syncUi(); }
void MainWindow::setSpeedSlow() { config().system.speed = 1; utility.updateEmulationSpeed(); syncUi(); }
void MainWindow::setSpeedNormal() { config().system.speed = 2; utility.updateEmulationSpeed(); syncUi(); }
void MainWindow::setSpeedFast() { config().system.speed = 3; utility.updateEmulationSpeed(); syncUi(); }
void MainWindow::setSpeedFastest() { config().system.speed = 4; utility.updateEmulationSpeed(); syncUi(); }
void MainWindow::syncVideo() { utility.toggleSynchronizeVideo(); }
void MainWindow::syncAudio() { utility.toggleSynchronizeAudio(); }
void MainWindow::showConfigWindow() { settingsWindow->show(); }
void MainWindow::playMovie() {
movie.chooseFile();
syncUi();
}
void MainWindow::stopMovie() {
movie.stop();
syncUi();
}
void MainWindow::recordMovieFromPowerOn() {
utility.modifySystemState(Utility::PowerCycle);
movie.record();
syncUi();
}
void MainWindow::recordMovieFromHere() {
movie.record();
syncUi();
}
void MainWindow::saveScreenshot() {
//tell SNES::Interface to save a screenshot at the next video_refresh() event
interface.saveScreenshot = true;
}
void MainWindow::showCheatEditor() { toolsWindow->tab->setCurrentIndex(0); toolsWindow->show(); }
void MainWindow::showCheatFinder() { toolsWindow->tab->setCurrentIndex(1); toolsWindow->show(); }
void MainWindow::showStateManager() { toolsWindow->tab->setCurrentIndex(2); toolsWindow->show(); }
void MainWindow::showDebugger() {
#if defined(DEBUGGER)
debugger->show();
#endif
}
void MainWindow::showDocumentation() {
QFile file(":/documentation.html");
if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
htmlViewerWindow->show("Usage Documentation", file.readAll().constData());
file.close();
}
}
void MainWindow::showLicense() {
QFile file(":/license.html");
if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
htmlViewerWindow->show("License Agreement", file.readAll().constData());
file.close();
}
}
void MainWindow::showAbout() {
aboutWindow->show();
}
void MainWindow::resizeEvent(QResizeEvent *event) {
Window::resizeEvent(event);
QApplication::processEvents();
}
void MainWindow::closeEvent(QCloseEvent *event) {
Window::closeEvent(event);
quit();
}
//============
//CanvasObject
//============
//implement drag-and-drop support:
//drag cartridge image onto main window canvas area to load
void CanvasObject::dragEnterEvent(QDragEnterEvent *event) {
if(event->mimeData()->hasUrls()) {
//do not accept multiple files at once
if(event->mimeData()->urls().count() == 1) event->acceptProposedAction();
}
}
void CanvasObject::dropEvent(QDropEvent *event) {
if(event->mimeData()->hasUrls()) {
QList<QUrl> list = event->mimeData()->urls();
if(list.count() == 1) cartridge.loadNormal(list.at(0).toLocalFile().toUtf8().constData());
}
}
//accept all key events for this widget to prevent system chime from playing on OS X
//key events are actually handled by Input class
void CanvasObject::keyPressEvent(QKeyEvent *event) {
}
void CanvasObject::keyReleaseEvent(QKeyEvent *event) {
}
//===========
//CanvasWidget
//============
//custom video render and mouse capture functionality
QPaintEngine* CanvasWidget::paintEngine() const {
if(SNES::cartridge.loaded()) {
video.refresh();
return 0;
}
return QWidget::paintEngine();
}
void CanvasWidget::mouseReleaseEvent(QMouseEvent *event) {
//acquire exclusive mode access to mouse when video output widget is clicked
//(will only acquire if cart is loaded, and mouse / lightgun is in use.)
utility.acquireMouse();
}
void CanvasWidget::paintEvent(QPaintEvent *event) {
event->ignore();
}