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