1 #include "main.moc"
2 MainWindow *mainWindow;
3 
MainWindow()4 MainWindow::MainWindow() : QbWindow(config().geometry.mainWindow) {
5   setObjectName("main-window");
6   setWindowTitle(string() << bsnesTitle << " v" << bsnesVersion);
7   setCloseOnEscape(false);
8 
9   //menu bar
10   #if defined(PLATFORM_OSX)
11   menuBar = new QMenuBar(0);
12   #else
13   menuBar = new QMenuBar;
14   #endif
15 
16   system = menuBar->addMenu("&System");
17 
18   system_load = system->addAction("Load &Cartridge ...");
19   system_load->setIcon(QIcon(":/16x16/document-open.png"));
20 
21   system_loadSpecial = system->addMenu("Load &Special");
22   system_loadSpecial->setIcon(QIcon(":/16x16/document-open.png"));
23 
24   system_loadSpecial_bsxSlotted = system_loadSpecial->addAction("Load BS-X &Slotted Cartridge ...");
25   system_loadSpecial_bsxSlotted->setIcon(QIcon(":/16x16/document-open.png"));
26 
27   system_loadSpecial_bsx = system_loadSpecial->addAction("Load &BS-X Cartridge ...");
28   system_loadSpecial_bsx->setIcon(QIcon(":/16x16/document-open.png"));
29 
30   system_loadSpecial_sufamiTurbo = system_loadSpecial->addAction("Load Sufami &Turbo Cartridge ...");
31   system_loadSpecial_sufamiTurbo->setIcon(QIcon(":/16x16/document-open.png"));
32 
33   system_loadSpecial_superGameBoy = system_loadSpecial->addAction("Load Super &Game Boy Cartridge ...");
34   system_loadSpecial_superGameBoy->setIcon(QIcon(":/16x16/document-open.png"));
35 
36   system->addSeparator();
37 
38   system->addAction(system_power = new QbCheckAction("&Power", 0));
39 
40   system_reset = system->addAction("&Reset");
41   system_reset->setIcon(QIcon(":/16x16/view-refresh.png"));
42 
43   system->addSeparator();
44 
45   system_port1 = system->addMenu("Controller Port &1");
46   system_port1->setIcon(QIcon(":/16x16/input-gaming.png"));
47   system_port1->addAction(system_port1_none = new QbRadioAction("&None", 0));
48   system_port1->addAction(system_port1_gamepad = new QbRadioAction("&Gamepad", 0));
49   system_port1->addAction(system_port1_asciipad = new QbRadioAction("&asciiPad", 0));
50   system_port1->addAction(system_port1_multitap = new QbRadioAction("&Multitap", 0));
51   system_port1->addAction(system_port1_mouse = new QbRadioAction("&Mouse", 0));
52 
53   system_port2 = system->addMenu("Controller Port &2");
54   system_port2->setIcon(QIcon(":/16x16/input-gaming.png"));
55   system_port2->addAction(system_port2_none = new QbRadioAction("&None", 0));
56   system_port2->addAction(system_port2_gamepad = new QbRadioAction("&Gamepad", 0));
57   system_port2->addAction(system_port2_asciipad = new QbRadioAction("&asciiPad", 0));
58   system_port2->addAction(system_port2_multitap = new QbRadioAction("&Multitap", 0));
59   system_port2->addAction(system_port2_mouse = new QbRadioAction("&Mouse", 0));
60   system_port2->addAction(system_port2_superscope = new QbRadioAction("&Super Scope", 0));
61   system_port2->addAction(system_port2_justifier = new QbRadioAction("&Justifier", 0));
62   system_port2->addAction(system_port2_justifiers = new QbRadioAction("Two &Justifiers", 0));
63 
64   #if !defined(PLATFORM_OSX)
65   system->addSeparator();
66   #endif
67 
68   system_exit = system->addAction("E&xit");
69   system_exit->setIcon(QIcon(":/16x16/process-stop.png"));
70   system_exit->setMenuRole(QAction::QuitRole);
71 
72   settings = menuBar->addMenu("S&ettings");
73 
74   settings_videoMode = settings->addMenu("Video &Mode");
75   settings_videoMode->setIcon(QIcon(":/16x16/video-display.png"));
76 
77   settings_videoMode->addAction(settings_videoMode_1x = new QbRadioAction("Scale &1x", 0));
78 
79   settings_videoMode->addAction(settings_videoMode_2x = new QbRadioAction("Scale &2x", 0));
80 
81   settings_videoMode->addAction(settings_videoMode_3x = new QbRadioAction("Scale &3x", 0));
82 
83   settings_videoMode->addAction(settings_videoMode_4x = new QbRadioAction("Scale &4x", 0));
84 
85   settings_videoMode->addAction(settings_videoMode_5x = new QbRadioAction("Scale &5x", 0));
86 
87   settings_videoMode->addSeparator();
88 
89   settings_videoMode->addAction(settings_videoMode_correctAspectRatio = new QbCheckAction("Correct &Aspect Ratio", 0));
90 
91   settings_videoMode->addSeparator();
92 
93   settings_videoMode->addAction(settings_videoMode_ntsc = new QbRadioAction("&NTSC", 0));
94   settings_videoMode->addAction(settings_videoMode_pal = new QbRadioAction("&PAL", 0));
95 
96   if(filter.opened()) {
97     settings_videoFilter = settings->addMenu("Video &Filter");
98     settings_videoFilter->setIcon(QIcon(":/16x16/image-x-generic.png"));
99 
100     settings_videoFilter_configure = settings_videoFilter->addAction("&Configure Active Filter ...");
101     settings_videoFilter_configure->setIcon(QIcon(":/16x16/preferences-desktop.png"));
102     settings_videoFilter->addSeparator();
103 
104     settings_videoFilter->addAction(settings_videoFilter_none = new QbRadioAction("&None", 0));
105     settings_videoFilter_list.add(settings_videoFilter_none);
106 
107     lstring filterlist;
108     filterlist.split(";", filter.dl_supported());
109     for(unsigned i = 0; i < filterlist.size(); i++) {
110       QbRadioAction *action = new QbRadioAction(filterlist[i], 0);
111       settings_videoFilter->addAction(action);
112       settings_videoFilter_list.add(action);
113     }
114   }
115 
116   settings->addAction(settings_smoothVideo = new QbCheckAction("&Smooth Video Output", 0));
117 
118   settings->addSeparator();
119 
120   settings->addAction(settings_muteAudio = new QbCheckAction("&Mute Audio Output", 0));
121 
122   settings->addSeparator();
123 
124   settings_emulationSpeed = settings->addMenu("Emulation &Speed");
125   settings_emulationSpeed->setIcon(QIcon(":/16x16/appointment-new.png"));
126 
127   settings_emulationSpeed->addAction(settings_emulationSpeed_slowest = new QbRadioAction("Slowest", 0));
128 
129   settings_emulationSpeed->addAction(settings_emulationSpeed_slow = new QbRadioAction("Slow", 0));
130 
131   settings_emulationSpeed->addAction(settings_emulationSpeed_normal = new QbRadioAction("Normal", 0));
132 
133   settings_emulationSpeed->addAction(settings_emulationSpeed_fast = new QbRadioAction("Fast", 0));
134 
135   settings_emulationSpeed->addAction(settings_emulationSpeed_fastest = new QbRadioAction("Fastest", 0));
136 
137   settings_emulationSpeed->addSeparator();
138 
139   settings_emulationSpeed->addAction(settings_emulationSpeed_syncVideo = new QbCheckAction("Sync &Video", 0));
140 
141   settings_emulationSpeed->addAction(settings_emulationSpeed_syncAudio = new QbCheckAction("Sync &Audio", 0));
142 
143   settings_configuration = settings->addAction("&Configuration ...");
144   settings_configuration->setIcon(QIcon(":/16x16/preferences-desktop.png"));
145   settings_configuration->setMenuRole(QAction::PreferencesRole);
146 
147   tools = menuBar->addMenu("&Tools");
148 
149   tools_movies = tools->addMenu("&Movies");
150   tools_movies->setIcon(QIcon(":/16x16/applications-multimedia.png"));
151 
152   tools_movies_play = tools_movies->addAction("Play Movie ...");
153   tools_movies_play->setIcon(QIcon(":/16x16/media-playback-start.png"));
154 
155   tools_movies_stop = tools_movies->addAction("Stop");
156   tools_movies_stop->setIcon(QIcon(":/16x16/media-playback-stop.png"));
157 
158   tools_movies_recordFromPowerOn = tools_movies->addAction("Record Movie (and restart system)");
159   tools_movies_recordFromPowerOn->setIcon(QIcon(":/16x16/media-record.png"));
160 
161   tools_movies_recordFromHere = tools_movies->addAction("Record Movie (starting from here)");
162   tools_movies_recordFromHere->setIcon(QIcon(":/16x16/media-record.png"));
163 
164   tools_captureScreenshot = tools->addAction("&Capture Screenshot");
165   tools_captureScreenshot->setIcon(QIcon(":/16x16/image-x-generic.png"));
166 
167   tools->addSeparator();
168 
169   tools_dialog = tools->addAction("&Tools Dialog ...");
170   tools_dialog->setIcon(QIcon(":/16x16/preferences-desktop.png"));
171 
172   tools_debugger = tools->addAction("&Debugger ...");
173   tools_debugger->setIcon(QIcon(":/16x16/utilities-terminal.png"));
174   #if !defined(DEBUGGER)
175   tools_debugger->setVisible(false);
176   #endif
177 
178   help = menuBar->addMenu("&Help");
179 
180   help_documentation = help->addAction("&Documentation ...");
181   help_documentation->setIcon(QIcon(":/16x16/text-x-generic.png"));
182 
183   help_license = help->addAction("&License ...");
184   help_license->setIcon(QIcon(":/16x16/text-x-generic.png"));
185 
186   #if !defined(PLATFORM_OSX)
187   help->addSeparator();
188   #endif
189 
190   help_about = help->addAction("&About ...");
191   help_about->setIcon(QIcon(":/16x16/help-browser.png"));
192   help_about->setMenuRole(QAction::AboutRole);
193 
194   //canvas
195   canvasContainer = new CanvasObject;
196   canvasContainer->setAcceptDrops(true); {
197     canvasContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
198     canvasContainer->setObjectName("backdrop");
199 
200     canvasLayout = new QVBoxLayout; {
201       canvasLayout->setMargin(0);
202       canvasLayout->setAlignment(Qt::AlignCenter);
203 
204       canvas = new CanvasWidget;
205       canvas->setAcceptDrops(true);
206       canvas->setFocusPolicy(Qt::StrongFocus);
207       canvas->setAttribute(Qt::WA_PaintOnScreen, true);  //disable Qt painting on focus / resize
208 
209       QPalette palette;
210       palette.setColor(QPalette::Window, QColor(0, 0, 0));
211       canvas->setPalette(palette);
212       canvas->setAutoFillBackground(true);
213     }
214     canvasLayout->addWidget(canvas);
215   }
216   canvasContainer->setLayout(canvasLayout);
217 
218   //status bar
219   statusBar = new QStatusBar;
220   statusBar->showMessage("");
221   systemState = new QLabel;
222   statusBar->addPermanentWidget(systemState);
223 
224   //layout
225   layout = new QVBoxLayout;
226   layout->setMargin(0);
227   layout->setSpacing(0);
228   #if !defined(PLATFORM_OSX)
229   layout->addWidget(menuBar);
230   #endif
231   layout->addWidget(canvasContainer);
232   layout->addWidget(statusBar);
233   setLayout(layout);
234 
235   //slots
236   connect(system_load, SIGNAL(triggered()), this, SLOT(loadCartridge()));
237   connect(system_loadSpecial_bsxSlotted, SIGNAL(triggered()), this, SLOT(loadBsxSlottedCartridge()));
238   connect(system_loadSpecial_bsx, SIGNAL(triggered()), this, SLOT(loadBsxCartridge()));
239   connect(system_loadSpecial_sufamiTurbo, SIGNAL(triggered()), this, SLOT(loadSufamiTurboCartridge()));
240   connect(system_loadSpecial_superGameBoy, SIGNAL(triggered()), this, SLOT(loadSuperGameBoyCartridge()));
241   connect(system_power, SIGNAL(triggered()), this, SLOT(power()));
242   connect(system_reset, SIGNAL(triggered()), this, SLOT(reset()));
243   connect(system_port1_none, SIGNAL(triggered()), this, SLOT(setPort1None()));
244   connect(system_port1_gamepad, SIGNAL(triggered()), this, SLOT(setPort1Gamepad()));
245   connect(system_port1_asciipad, SIGNAL(triggered()), this, SLOT(setPort1Asciipad()));
246   connect(system_port1_multitap, SIGNAL(triggered()), this, SLOT(setPort1Multitap()));
247   connect(system_port1_mouse, SIGNAL(triggered()), this, SLOT(setPort1Mouse()));
248   connect(system_port2_none, SIGNAL(triggered()), this, SLOT(setPort2None()));
249   connect(system_port2_gamepad, SIGNAL(triggered()), this, SLOT(setPort2Gamepad()));
250   connect(system_port2_asciipad, SIGNAL(triggered()), this, SLOT(setPort2Asciipad()));
251   connect(system_port2_multitap, SIGNAL(triggered()), this, SLOT(setPort2Multitap()));
252   connect(system_port2_mouse, SIGNAL(triggered()), this, SLOT(setPort2Mouse()));
253   connect(system_port2_superscope, SIGNAL(triggered()), this, SLOT(setPort2SuperScope()));
254   connect(system_port2_justifier, SIGNAL(triggered()), this, SLOT(setPort2Justifier()));
255   connect(system_port2_justifiers, SIGNAL(triggered()), this, SLOT(setPort2Justifiers()));
256   connect(system_exit, SIGNAL(triggered()), this, SLOT(quit()));
257   connect(settings_videoMode_1x, SIGNAL(triggered()), this, SLOT(setVideoMode1x()));
258   connect(settings_videoMode_2x, SIGNAL(triggered()), this, SLOT(setVideoMode2x()));
259   connect(settings_videoMode_3x, SIGNAL(triggered()), this, SLOT(setVideoMode3x()));
260   connect(settings_videoMode_4x, SIGNAL(triggered()), this, SLOT(setVideoMode4x()));
261   connect(settings_videoMode_5x, SIGNAL(triggered()), this, SLOT(setVideoMode5x()));
262   connect(settings_videoMode_correctAspectRatio, SIGNAL(triggered()), this, SLOT(toggleAspectCorrection()));
263   connect(settings_videoMode_ntsc, SIGNAL(triggered()), this, SLOT(setVideoNtsc()));
264   connect(settings_videoMode_pal, SIGNAL(triggered()), this, SLOT(setVideoPal()));
265   if(filter.opened()) {
266     connect(settings_videoFilter_configure, SIGNAL(triggered()), this, SLOT(configureFilter()));
267     for(unsigned i = 0; i < settings_videoFilter_list.size(); i++) {
268       connect(settings_videoFilter_list[i], SIGNAL(triggered()), this, SLOT(setFilter()));
269     }
270   }
271   connect(settings_smoothVideo, SIGNAL(triggered()), this, SLOT(toggleSmoothVideo()));
272   connect(settings_muteAudio, SIGNAL(triggered()), this, SLOT(muteAudio()));
273   connect(settings_emulationSpeed_slowest, SIGNAL(triggered()), this, SLOT(setSpeedSlowest()));
274   connect(settings_emulationSpeed_slow, SIGNAL(triggered()), this, SLOT(setSpeedSlow()));
275   connect(settings_emulationSpeed_normal, SIGNAL(triggered()), this, SLOT(setSpeedNormal()));
276   connect(settings_emulationSpeed_fast, SIGNAL(triggered()), this, SLOT(setSpeedFast()));
277   connect(settings_emulationSpeed_fastest, SIGNAL(triggered()), this, SLOT(setSpeedFastest()));
278   connect(settings_emulationSpeed_syncVideo, SIGNAL(triggered()), this, SLOT(syncVideo()));
279   connect(settings_emulationSpeed_syncAudio, SIGNAL(triggered()), this, SLOT(syncAudio()));
280   connect(settings_configuration, SIGNAL(triggered()), this, SLOT(showConfigWindow()));
281   connect(tools_movies_play, SIGNAL(triggered()), this, SLOT(playMovie()));
282   connect(tools_movies_stop, SIGNAL(triggered()), this, SLOT(stopMovie()));
283   connect(tools_movies_recordFromPowerOn, SIGNAL(triggered()), this, SLOT(recordMovieFromPowerOn()));
284   connect(tools_movies_recordFromHere, SIGNAL(triggered()), this, SLOT(recordMovieFromHere()));
285   connect(tools_captureScreenshot, SIGNAL(triggered()), this, SLOT(saveScreenshot()));
286   connect(tools_debugger, SIGNAL(triggered()), this, SLOT(showDebugger()));
287   connect(tools_dialog, SIGNAL(triggered()), this, SLOT(showToolsDialog()));
288   connect(help_documentation, SIGNAL(triggered()), this, SLOT(showDocumentation()));
289   connect(help_license, SIGNAL(triggered()), this, SLOT(showLicense()));
290   connect(help_about, SIGNAL(triggered()), this, SLOT(showAbout()));
291 
292   syncUi();
293 }
294 
syncUi()295 void MainWindow::syncUi() {
296   system_power->setEnabled(SNES::cartridge.loaded());
297   system_power->setChecked (application.power == true);
298   system_power->setEnabled(SNES::cartridge.loaded());
299   system_reset->setEnabled(SNES::cartridge.loaded() && application.power);
300 
301   system_port1_none->setChecked      (config().input.port1 == ControllerPort1::None);
302   system_port1_gamepad->setChecked    (config().input.port1 == ControllerPort1::Gamepad);
303   system_port1_asciipad->setChecked  (config().input.port1 == ControllerPort1::Asciipad);
304   system_port1_multitap->setChecked  (config().input.port1 == ControllerPort1::Multitap);
305   system_port1_mouse->setChecked     (config().input.port1 == ControllerPort1::Mouse);
306 
307   system_port2_none->setChecked      (config().input.port2 == ControllerPort2::None);
308   system_port2_gamepad->setChecked    (config().input.port2 == ControllerPort2::Gamepad);
309   system_port2_asciipad->setChecked  (config().input.port2 == ControllerPort2::Asciipad);
310   system_port2_multitap->setChecked  (config().input.port2 == ControllerPort2::Multitap);
311   system_port2_mouse->setChecked     (config().input.port2 == ControllerPort2::Mouse);
312   system_port2_superscope->setChecked(config().input.port2 == ControllerPort2::SuperScope);
313   system_port2_justifier->setChecked (config().input.port2 == ControllerPort2::Justifier);
314   system_port2_justifiers->setChecked(config().input.port2 == ControllerPort2::Justifiers);
315 
316   settings_videoMode_1x->setChecked(config().video.context->multiplier == 1);
317   settings_videoMode_2x->setChecked(config().video.context->multiplier == 2);
318   settings_videoMode_3x->setChecked(config().video.context->multiplier == 3);
319   settings_videoMode_4x->setChecked(config().video.context->multiplier == 4);
320   settings_videoMode_5x->setChecked(config().video.context->multiplier == 5);
321 
322   settings_videoMode_correctAspectRatio->setChecked(config().video.context->correctAspectRatio);
323   settings_videoMode_ntsc->setChecked(config().video.context->region == 0);
324   settings_videoMode_pal->setChecked (config().video.context->region == 1);
325 
326   if(filter.opened()) {
327     //only enable configuration option if the active filter supports it ...
328     settings_videoFilter_configure->setEnabled(filter.settings());
329 
330     for(unsigned i = 0; i < settings_videoFilter_list.size(); i++) {
331       settings_videoFilter_list[i]->setChecked(config().video.context->swFilter == i);
332     }
333   }
334 
335   settings_smoothVideo->setChecked(config().video.context->hwFilter == 1);
336   settings_muteAudio->setChecked(config().audio.mute);
337 
338   settings_emulationSpeed_slowest->setChecked(config().system.speed == 0);
339   settings_emulationSpeed_slow->setChecked   (config().system.speed == 1);
340   settings_emulationSpeed_normal->setChecked (config().system.speed == 2);
341   settings_emulationSpeed_fast->setChecked   (config().system.speed == 3);
342   settings_emulationSpeed_fastest->setChecked(config().system.speed == 4);
343 
344   settings_emulationSpeed_syncVideo->setChecked(config().video.synchronize);
345   settings_emulationSpeed_syncAudio->setChecked(config().audio.synchronize);
346 
347   //movies contian save states to synchronize playback to recorded input
348   tools_movies->setEnabled(SNES::cartridge.loaded() && cartridge.saveStatesSupported());
349   if(tools_movies->isEnabled()) {
350     tools_movies_play->setEnabled(movie.state == Movie::Inactive);
351     tools_movies_stop->setEnabled(movie.state != Movie::Inactive);
352     tools_movies_recordFromPowerOn->setEnabled(movie.state == Movie::Inactive);
353     tools_movies_recordFromHere->setEnabled(movie.state == Movie::Inactive);
354   }
355 }
356 
isActive()357 bool MainWindow::isActive() {
358   return isActiveWindow() && !isMinimized();
359 }
360 
loadCartridge()361 void MainWindow::loadCartridge() {
362   diskBrowser->loadCartridge();
363 }
364 
loadBsxSlottedCartridge()365 void MainWindow::loadBsxSlottedCartridge() {
366   loaderWindow->loadBsxSlottedCartridge("", "");
367 }
368 
loadBsxCartridge()369 void MainWindow::loadBsxCartridge() {
370   loaderWindow->loadBsxCartridge(config().path.bsx, "");
371 }
372 
loadSufamiTurboCartridge()373 void MainWindow::loadSufamiTurboCartridge() {
374   loaderWindow->loadSufamiTurboCartridge(config().path.st, "", "");
375 }
376 
loadSuperGameBoyCartridge()377 void MainWindow::loadSuperGameBoyCartridge() {
378   loaderWindow->loadSuperGameBoyCartridge(config().path.sgb, "");
379 }
380 
power()381 void MainWindow::power() {
382   system_power->toggleChecked();
383   if(system_power->isChecked()) {
384     utility.modifySystemState(Utility::PowerOn);
385   } else {
386     utility.modifySystemState(Utility::PowerOff);
387   }
388 }
389 
reset()390 void MainWindow::reset() {
391   utility.modifySystemState(Utility::Reset);
392 }
393 
setPort1None()394 void MainWindow::setPort1None() {
395   config().input.port1 = ControllerPort1::None;
396   SNES::config.controller_port1 = SNES::Input::DeviceNone;
397   utility.updateControllers();
398 }
399 
setPort1Gamepad()400 void MainWindow::setPort1Gamepad() {
401   config().input.port1 = ControllerPort1::Gamepad;
402   SNES::config.controller_port1 = SNES::Input::DeviceJoypad;
403   utility.updateControllers();
404 }
405 
setPort1Asciipad()406 void MainWindow::setPort1Asciipad() {
407   config().input.port1 = ControllerPort1::Asciipad;
408   SNES::config.controller_port1 = SNES::Input::DeviceJoypad;
409   utility.updateControllers();
410 }
411 
setPort1Multitap()412 void MainWindow::setPort1Multitap() {
413   config().input.port1 = ControllerPort1::Multitap;
414   SNES::config.controller_port1 = SNES::Input::DeviceMultitap;
415   utility.updateControllers();
416 }
417 
setPort1Mouse()418 void MainWindow::setPort1Mouse() {
419   config().input.port1 = ControllerPort1::Mouse;
420   SNES::config.controller_port1 = SNES::Input::DeviceMouse;
421   utility.updateControllers();
422 }
423 
setPort2None()424 void MainWindow::setPort2None() {
425   config().input.port2 = ControllerPort2::None;
426   SNES::config.controller_port2 = SNES::Input::DeviceNone;
427   utility.updateControllers();
428 }
429 
setPort2Gamepad()430 void MainWindow::setPort2Gamepad() {
431   config().input.port2 = ControllerPort2::Gamepad;
432   SNES::config.controller_port2 = SNES::Input::DeviceJoypad;
433   utility.updateControllers();
434 }
435 
setPort2Asciipad()436 void MainWindow::setPort2Asciipad() {
437   config().input.port2 = ControllerPort2::Asciipad;
438   SNES::config.controller_port2 = SNES::Input::DeviceJoypad;
439   utility.updateControllers();
440 }
441 
setPort2Multitap()442 void MainWindow::setPort2Multitap() {
443   config().input.port2 = ControllerPort2::Multitap;
444   SNES::config.controller_port2 = SNES::Input::DeviceMultitap;
445   utility.updateControllers();
446 }
447 
setPort2Mouse()448 void MainWindow::setPort2Mouse() {
449   config().input.port2 = ControllerPort2::Mouse;
450   SNES::config.controller_port2 = SNES::Input::DeviceMouse;
451   utility.updateControllers();
452 }
453 
setPort2SuperScope()454 void MainWindow::setPort2SuperScope() {
455   config().input.port2 = ControllerPort2::SuperScope;
456   SNES::config.controller_port2 = SNES::Input::DeviceSuperScope;
457   utility.updateControllers();
458 }
459 
setPort2Justifier()460 void MainWindow::setPort2Justifier() {
461   config().input.port2 = ControllerPort2::Justifier;
462   SNES::config.controller_port2 = SNES::Input::DeviceJustifier;
463   utility.updateControllers();
464 }
465 
setPort2Justifiers()466 void MainWindow::setPort2Justifiers() {
467   config().input.port2 = ControllerPort2::Justifiers;
468   SNES::config.controller_port2 = SNES::Input::DeviceJustifiers;
469   utility.updateControllers();
470 }
471 
quit()472 void MainWindow::quit() {
473   hide();
474   application.terminate = true;
475 }
476 
setVideoMode1x()477 void MainWindow::setVideoMode1x() { utility.setScale(1); }
setVideoMode2x()478 void MainWindow::setVideoMode2x() { utility.setScale(2); }
setVideoMode3x()479 void MainWindow::setVideoMode3x() { utility.setScale(3); }
setVideoMode4x()480 void MainWindow::setVideoMode4x() { utility.setScale(4); }
setVideoMode5x()481 void MainWindow::setVideoMode5x() { utility.setScale(5); }
482 
toggleAspectCorrection()483 void MainWindow::toggleAspectCorrection() { utility.toggleAspectCorrection(); }
484 
setVideoNtsc()485 void MainWindow::setVideoNtsc() { utility.setNtscMode(); }
setVideoPal()486 void MainWindow::setVideoPal()  { utility.setPalMode(); }
487 
toggleSmoothVideo()488 void MainWindow::toggleSmoothVideo() { utility.toggleSmoothVideoOutput(); }
489 
configureFilter()490 void MainWindow::configureFilter() {
491   QWidget *widget = filter.settings();
492   if(widget) {
493     widget->show();
494     widget->activateWindow();
495     widget->raise();
496   }
497 }
498 
setFilter()499 void MainWindow::setFilter() {
500   for(unsigned i = 0; i < settings_videoFilter_list.size(); i++) {
501     if(sender() == settings_videoFilter_list[i]) {
502       config().video.context->swFilter = i;
503       utility.updateSoftwareFilter();
504       syncUi();
505       return;
506     }
507   }
508 }
509 
muteAudio()510 void MainWindow::muteAudio() {
511   settings_muteAudio->toggleChecked();
512   config().audio.mute = settings_muteAudio->isChecked();
513 }
514 
setSpeedSlowest()515 void MainWindow::setSpeedSlowest() { config().system.speed = 0; utility.updateEmulationSpeed(); syncUi(); }
setSpeedSlow()516 void MainWindow::setSpeedSlow()    { config().system.speed = 1; utility.updateEmulationSpeed(); syncUi(); }
setSpeedNormal()517 void MainWindow::setSpeedNormal()  { config().system.speed = 2; utility.updateEmulationSpeed(); syncUi(); }
setSpeedFast()518 void MainWindow::setSpeedFast()    { config().system.speed = 3; utility.updateEmulationSpeed(); syncUi(); }
setSpeedFastest()519 void MainWindow::setSpeedFastest() { config().system.speed = 4; utility.updateEmulationSpeed(); syncUi(); }
520 
syncVideo()521 void MainWindow::syncVideo() { utility.toggleSynchronizeVideo(); }
syncAudio()522 void MainWindow::syncAudio() { utility.toggleSynchronizeAudio(); }
523 
showConfigWindow()524 void MainWindow::showConfigWindow() { settingsWindow->show(); }
525 
playMovie()526 void MainWindow::playMovie() {
527   movie.chooseFile();
528   syncUi();
529 }
530 
stopMovie()531 void MainWindow::stopMovie() {
532   movie.stop();
533   syncUi();
534 }
535 
recordMovieFromPowerOn()536 void MainWindow::recordMovieFromPowerOn() {
537   utility.modifySystemState(Utility::PowerCycle);
538   movie.record();
539   syncUi();
540 }
541 
recordMovieFromHere()542 void MainWindow::recordMovieFromHere() {
543   movie.record();
544   syncUi();
545 }
546 
saveScreenshot()547 void MainWindow::saveScreenshot() {
548   //tell SNES::Interface to save a screenshot at the next video_refresh() event
549   interface.saveScreenshot = true;
550 }
551 
showDebugger()552 void MainWindow::showDebugger() {
553   #if defined(DEBUGGER)
554   debugger->show();
555   #endif
556 }
557 
showToolsDialog()558 void MainWindow::showToolsDialog() { toolsWindow->show(); }
559 
showDocumentation()560 void MainWindow::showDocumentation()  {
561   QFile file(":/documentation.html");
562   if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
563     htmlViewerWindow->show("Usage Documentation", file.readAll().constData());
564     file.close();
565   }
566 }
567 
showLicense()568 void MainWindow::showLicense() {
569   QFile file(":/license.html");
570   if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
571     htmlViewerWindow->show("License Agreement", file.readAll().constData());
572     file.close();
573   }
574 }
showAbout()575 void MainWindow::showAbout() {
576   aboutWindow->show();
577 }
578 
closeEvent(QCloseEvent * event)579 void MainWindow::closeEvent(QCloseEvent *event) {
580   QbWindow::closeEvent(event);
581   quit();
582 }
583 
584 //============
585 //CanvasObject
586 //============
587 
588 //implement drag-and-drop support:
589 //drag cartridge image onto main window canvas area to load
590 
dragEnterEvent(QDragEnterEvent * event)591 void CanvasObject::dragEnterEvent(QDragEnterEvent *event) {
592   if(event->mimeData()->hasUrls()) {
593     //do not accept multiple files at once
594     if(event->mimeData()->urls().count() == 1) event->acceptProposedAction();
595   }
596 }
597 
dropEvent(QDropEvent * event)598 void CanvasObject::dropEvent(QDropEvent *event) {
599   if(event->mimeData()->hasUrls()) {
600     QList<QUrl> list = event->mimeData()->urls();
601     if(list.count() == 1) cartridge.loadNormal(list.at(0).toLocalFile().toUtf8().constData());
602   }
603 }
604 
605 //accept all key events for this widget to prevent system chime from playing on OS X
606 //key events are actually handled by Input class
607 
keyPressEvent(QKeyEvent * event)608 void CanvasObject::keyPressEvent(QKeyEvent *event) {
609 }
610 
keyReleaseEvent(QKeyEvent * event)611 void CanvasObject::keyReleaseEvent(QKeyEvent *event) {
612 }
613 
614 //===========
615 //CanvasWidget
616 //============
617 
618 //custom video render and mouse capture functionality
619 
paintEngine() const620 QPaintEngine* CanvasWidget::paintEngine() const {
621   if(SNES::cartridge.loaded()) {
622     video.refresh();
623     return 0;
624   }
625   return QWidget::paintEngine();
626 }
627 
mouseReleaseEvent(QMouseEvent * event)628 void CanvasWidget::mouseReleaseEvent(QMouseEvent *event) {
629   //acquire exclusive mode access to mouse when video output widget is clicked
630   //(will only acquire if cart is loaded, and mouse / lightgun is in use.)
631   utility.acquireMouse();
632 }
633 
paintEvent(QPaintEvent * event)634 void CanvasWidget::paintEvent(QPaintEvent *event) {
635   event->ignore();
636 }
637