2015-02-28 01:51:53 +00:00
|
|
|
#include "../tomoko.hpp"
|
|
|
|
Presentation* presentation = nullptr;
|
|
|
|
|
|
|
|
Presentation::Presentation() {
|
|
|
|
presentation = this;
|
|
|
|
|
|
|
|
libraryMenu.setText("Library");
|
|
|
|
for(auto& emulator : program->emulators) {
|
|
|
|
for(auto& media : emulator->media) {
|
|
|
|
if(media.bootable == false) continue;
|
|
|
|
auto item = new MenuItem{&libraryMenu};
|
|
|
|
item->setText({media.name, " ..."}).onActivate([=] {
|
|
|
|
libraryManager->show(media.type);
|
|
|
|
});
|
|
|
|
loadBootableMedia.append(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-03 10:14:49 +00:00
|
|
|
systemMenu.setText("System").setVisible(false);
|
2015-04-21 11:51:57 +00:00
|
|
|
powerSystem.setText("Power").onActivate([&] { program->powerCycle(); });
|
|
|
|
resetSystem.setText("Reset").onActivate([&] { program->softReset(); });
|
2015-03-03 10:14:49 +00:00
|
|
|
unloadSystem.setText("Unload").onActivate([&] { program->unloadMedia(); drawSplashScreen(); });
|
2015-02-28 01:51:53 +00:00
|
|
|
|
|
|
|
settingsMenu.setText("Settings");
|
2015-03-03 10:14:49 +00:00
|
|
|
videoScaleMenu.setText("Video Scale");
|
|
|
|
MenuRadioItem::group({videoScaleSmall, videoScaleNormal, videoScaleLarge});
|
|
|
|
if(config().video.scale == "Small") videoScaleSmall.setChecked();
|
|
|
|
if(config().video.scale == "Normal") videoScaleNormal.setChecked();
|
|
|
|
if(config().video.scale == "Large") videoScaleLarge.setChecked();
|
|
|
|
videoScaleSmall.setText("Small").onActivate([&] {
|
|
|
|
config().video.scale = "Small";
|
|
|
|
resizeViewport();
|
|
|
|
});
|
|
|
|
videoScaleNormal.setText("Normal").onActivate([&] {
|
|
|
|
config().video.scale = "Normal";
|
|
|
|
resizeViewport();
|
|
|
|
});
|
|
|
|
videoScaleLarge.setText("Large").onActivate([&] {
|
|
|
|
config().video.scale = "Large";
|
|
|
|
resizeViewport();
|
|
|
|
});
|
2015-04-21 11:58:59 +00:00
|
|
|
aspectCorrection.setText("Aspect Correction").setChecked(config().video.aspectCorrection).onToggle([&] {
|
|
|
|
config().video.aspectCorrection = aspectCorrection.checked();
|
|
|
|
resizeViewport();
|
|
|
|
});
|
Update to v094r13 release.
byuu says:
This version polishes up the input dialogue (reset, erase, disable
button when item not focused, split device ID from mapping name), adds
color emulation toggle, and add dummy menu items for remaining features
(to be filled in later.)
Also, it now compiles cleanly on Windows with GTK.
I didn't test with TDM-GCC-32, because for god knows what reason, the
32-bit version ships with headers from Windows 95 OSR2 only. So I built
with TDM-GCC-64 with arch=x86.
And uh, apparently, moving or resizing a window causes a Visual C++
runtime exception in the GTK+ DLLs. This doesn't happen with trance or
renshuu built with TDM-GCC-32. So, yeah, like I said, don't use -m32.
2015-03-07 10:21:47 +00:00
|
|
|
videoFilterMenu.setText("Video Filter");
|
|
|
|
MenuRadioItem::group({videoFilterNone, videoFilterBlur});
|
|
|
|
if(config().video.filter == "None") videoFilterNone.setChecked();
|
|
|
|
if(config().video.filter == "Blur") videoFilterBlur.setChecked();
|
|
|
|
videoFilterNone.setText("None").onActivate([&] { config().video.filter = "None"; program->updateVideoFilter(); });
|
|
|
|
videoFilterBlur.setText("Blur").onActivate([&] { config().video.filter = "Blur"; program->updateVideoFilter(); });
|
|
|
|
colorEmulation.setText("Color Emulation").setChecked(config().video.colorEmulation).onToggle([&] {
|
|
|
|
config().video.colorEmulation = colorEmulation.checked();
|
|
|
|
program->updateVideoPalette();
|
|
|
|
});
|
2015-04-21 11:58:59 +00:00
|
|
|
maskOverscan.setText("Mask Overscan").setChecked(config().video.overscan.mask).onToggle([&] {
|
|
|
|
config().video.overscan.mask = maskOverscan.checked();
|
Update to v094r13 release.
byuu says:
This version polishes up the input dialogue (reset, erase, disable
button when item not focused, split device ID from mapping name), adds
color emulation toggle, and add dummy menu items for remaining features
(to be filled in later.)
Also, it now compiles cleanly on Windows with GTK.
I didn't test with TDM-GCC-32, because for god knows what reason, the
32-bit version ships with headers from Windows 95 OSR2 only. So I built
with TDM-GCC-64 with arch=x86.
And uh, apparently, moving or resizing a window causes a Visual C++
runtime exception in the GTK+ DLLs. This doesn't happen with trance or
renshuu built with TDM-GCC-32. So, yeah, like I said, don't use -m32.
2015-03-07 10:21:47 +00:00
|
|
|
});
|
2015-03-03 10:14:49 +00:00
|
|
|
synchronizeVideo.setText("Synchronize Video").setChecked(config().video.synchronize).onToggle([&] {
|
|
|
|
config().video.synchronize = synchronizeVideo.checked();
|
|
|
|
video.set(Video::Synchronize, config().video.synchronize);
|
|
|
|
});
|
|
|
|
synchronizeAudio.setText("Synchronize Audio").setChecked(config().audio.synchronize).onToggle([&] {
|
|
|
|
config().audio.synchronize = synchronizeAudio.checked();
|
|
|
|
audio.set(Audio::Synchronize, config().audio.synchronize);
|
|
|
|
});
|
|
|
|
muteAudio.setText("Mute Audio").setChecked(config().audio.mute).onToggle([&] {
|
|
|
|
config().audio.mute = muteAudio.checked();
|
|
|
|
program->dsp.setVolume(config().audio.mute ? 0.0 : 1.0);
|
|
|
|
});
|
2015-04-13 11:16:33 +00:00
|
|
|
showStatusBar.setText("Show Status Bar").setChecked(config().userInterface.showStatusBar).onToggle([&] {
|
|
|
|
config().userInterface.showStatusBar = showStatusBar.checked();
|
|
|
|
statusBar.setVisible(config().userInterface.showStatusBar);
|
|
|
|
if(visible()) resizeViewport();
|
|
|
|
});
|
2015-04-21 11:51:57 +00:00
|
|
|
showConfiguration.setText("Configuration ...").onActivate([&] { settingsManager->show(0); });
|
2015-02-28 01:51:53 +00:00
|
|
|
|
Update to v094r13 release.
byuu says:
This version polishes up the input dialogue (reset, erase, disable
button when item not focused, split device ID from mapping name), adds
color emulation toggle, and add dummy menu items for remaining features
(to be filled in later.)
Also, it now compiles cleanly on Windows with GTK.
I didn't test with TDM-GCC-32, because for god knows what reason, the
32-bit version ships with headers from Windows 95 OSR2 only. So I built
with TDM-GCC-64 with arch=x86.
And uh, apparently, moving or resizing a window causes a Visual C++
runtime exception in the GTK+ DLLs. This doesn't happen with trance or
renshuu built with TDM-GCC-32. So, yeah, like I said, don't use -m32.
2015-03-07 10:21:47 +00:00
|
|
|
toolsMenu.setText("Tools").setVisible(false);
|
|
|
|
saveStateMenu.setText("Save State");
|
2015-04-13 11:16:33 +00:00
|
|
|
saveSlot1.setText("Slot 1").onActivate([&] { program->saveState(1); });
|
|
|
|
saveSlot2.setText("Slot 2").onActivate([&] { program->saveState(2); });
|
|
|
|
saveSlot3.setText("Slot 3").onActivate([&] { program->saveState(3); });
|
|
|
|
saveSlot4.setText("Slot 4").onActivate([&] { program->saveState(4); });
|
|
|
|
saveSlot5.setText("Slot 5").onActivate([&] { program->saveState(5); });
|
Update to v094r13 release.
byuu says:
This version polishes up the input dialogue (reset, erase, disable
button when item not focused, split device ID from mapping name), adds
color emulation toggle, and add dummy menu items for remaining features
(to be filled in later.)
Also, it now compiles cleanly on Windows with GTK.
I didn't test with TDM-GCC-32, because for god knows what reason, the
32-bit version ships with headers from Windows 95 OSR2 only. So I built
with TDM-GCC-64 with arch=x86.
And uh, apparently, moving or resizing a window causes a Visual C++
runtime exception in the GTK+ DLLs. This doesn't happen with trance or
renshuu built with TDM-GCC-32. So, yeah, like I said, don't use -m32.
2015-03-07 10:21:47 +00:00
|
|
|
loadStateMenu.setText("Load State");
|
2015-04-13 11:16:33 +00:00
|
|
|
loadSlot1.setText("Slot 1").onActivate([&] { program->loadState(1); });
|
|
|
|
loadSlot2.setText("Slot 2").onActivate([&] { program->loadState(2); });
|
|
|
|
loadSlot3.setText("Slot 3").onActivate([&] { program->loadState(3); });
|
|
|
|
loadSlot4.setText("Slot 4").onActivate([&] { program->loadState(4); });
|
|
|
|
loadSlot5.setText("Slot 5").onActivate([&] { program->loadState(5); });
|
2015-04-21 11:51:57 +00:00
|
|
|
cheatEditor.setText("Cheat Editor").onActivate([&] { toolsManager->show(0); });
|
|
|
|
stateManager.setText("State Manager").onActivate([&] { toolsManager->show(1); });
|
2015-02-28 01:51:53 +00:00
|
|
|
|
|
|
|
statusBar.setFont(Font::sans(8, "Bold"));
|
2015-04-13 11:16:33 +00:00
|
|
|
statusBar.setVisible(config().userInterface.showStatusBar);
|
2015-02-28 01:51:53 +00:00
|
|
|
|
2015-03-02 09:13:28 +00:00
|
|
|
onClose([&] { program->quit(); });
|
2015-02-28 01:51:53 +00:00
|
|
|
|
|
|
|
setTitle({"tomoko v", Emulator::Version});
|
2015-03-03 10:14:49 +00:00
|
|
|
setResizable(false);
|
2015-04-13 11:16:33 +00:00
|
|
|
setBackgroundColor({16, 16, 16});
|
2015-03-03 10:14:49 +00:00
|
|
|
resizeViewport();
|
|
|
|
}
|
|
|
|
|
2015-05-23 05:29:18 +00:00
|
|
|
auto Presentation::updateEmulator() -> void {
|
|
|
|
if(!emulator) return;
|
Update to v094r20 release.
byuu says:
Main reason for this WIP was because of all the added lines to hiro for
selective component disabling. May as well get all the diff-noise apart
from code changes.
It also merges something I've been talking to Cydrak about ... making
nall::string::(integer,decimal) do built-in binary,octal,hex decoding
instead of just failing on those. This will have fun little side effects
all over the place, like being able to view a topic on my forum via
"forum.byuu.org/topic/0b10010110", heh.
There are two small changes to higan itself, though. First up, I fixed
the resampler ratio when loading non-SNES games. Tested and I can play
Game Boy games fine now. Second, I hooked up menu option hiding for
reset and controller selection. Right now, this works like higan v094,
but I'm thinking I might want to show the "Device -> Controller" even if
that's all that's there. It kind of jives nicer with the input settings
window to see the labels there, I think. And if we ever do add more
stuff, it'll be nice that people already always expect that menu there.
Remaining issues:
* add slotted cart loader (SGB, BSX, ST)
* add DIP switch selection window (NSS)
* add timing configuration (video/audio sync)
2015-05-23 05:37:08 +00:00
|
|
|
resetSystem.setVisible(emulator->information.resettable);
|
|
|
|
inputPort1.setVisible(false).reset();
|
|
|
|
inputPort2.setVisible(false).reset();
|
2015-05-23 05:29:18 +00:00
|
|
|
|
|
|
|
for(auto n : range(emulator->port)) {
|
|
|
|
if(n >= 2) break;
|
|
|
|
auto& port = emulator->port[n];
|
|
|
|
auto& menu = (n == 0 ? inputPort1 : inputPort2);
|
|
|
|
menu.setText(port.name);
|
|
|
|
|
Update to v094r20 release.
byuu says:
Main reason for this WIP was because of all the added lines to hiro for
selective component disabling. May as well get all the diff-noise apart
from code changes.
It also merges something I've been talking to Cydrak about ... making
nall::string::(integer,decimal) do built-in binary,octal,hex decoding
instead of just failing on those. This will have fun little side effects
all over the place, like being able to view a topic on my forum via
"forum.byuu.org/topic/0b10010110", heh.
There are two small changes to higan itself, though. First up, I fixed
the resampler ratio when loading non-SNES games. Tested and I can play
Game Boy games fine now. Second, I hooked up menu option hiding for
reset and controller selection. Right now, this works like higan v094,
but I'm thinking I might want to show the "Device -> Controller" even if
that's all that's there. It kind of jives nicer with the input settings
window to see the labels there, I think. And if we ever do add more
stuff, it'll be nice that people already always expect that menu there.
Remaining issues:
* add slotted cart loader (SGB, BSX, ST)
* add DIP switch selection window (NSS)
* add timing configuration (video/audio sync)
2015-05-23 05:37:08 +00:00
|
|
|
vector<MenuRadioItem> items;
|
2015-05-23 05:29:18 +00:00
|
|
|
for(auto& device : port.device) {
|
|
|
|
MenuRadioItem item{&menu};
|
|
|
|
item.setText(device.name).onActivate([=] {
|
|
|
|
emulator->connect(port.id, device.id);
|
|
|
|
});
|
|
|
|
items.append(item);
|
|
|
|
}
|
|
|
|
MenuRadioItem::group(items);
|
Update to v094r20 release.
byuu says:
Main reason for this WIP was because of all the added lines to hiro for
selective component disabling. May as well get all the diff-noise apart
from code changes.
It also merges something I've been talking to Cydrak about ... making
nall::string::(integer,decimal) do built-in binary,octal,hex decoding
instead of just failing on those. This will have fun little side effects
all over the place, like being able to view a topic on my forum via
"forum.byuu.org/topic/0b10010110", heh.
There are two small changes to higan itself, though. First up, I fixed
the resampler ratio when loading non-SNES games. Tested and I can play
Game Boy games fine now. Second, I hooked up menu option hiding for
reset and controller selection. Right now, this works like higan v094,
but I'm thinking I might want to show the "Device -> Controller" even if
that's all that's there. It kind of jives nicer with the input settings
window to see the labels there, I think. And if we ever do add more
stuff, it'll be nice that people already always expect that menu there.
Remaining issues:
* add slotted cart loader (SGB, BSX, ST)
* add DIP switch selection window (NSS)
* add timing configuration (video/audio sync)
2015-05-23 05:37:08 +00:00
|
|
|
if(items.size() > 1) menu.setVisible();
|
2015-05-23 05:29:18 +00:00
|
|
|
}
|
Update to v094r20 release.
byuu says:
Main reason for this WIP was because of all the added lines to hiro for
selective component disabling. May as well get all the diff-noise apart
from code changes.
It also merges something I've been talking to Cydrak about ... making
nall::string::(integer,decimal) do built-in binary,octal,hex decoding
instead of just failing on those. This will have fun little side effects
all over the place, like being able to view a topic on my forum via
"forum.byuu.org/topic/0b10010110", heh.
There are two small changes to higan itself, though. First up, I fixed
the resampler ratio when loading non-SNES games. Tested and I can play
Game Boy games fine now. Second, I hooked up menu option hiding for
reset and controller selection. Right now, this works like higan v094,
but I'm thinking I might want to show the "Device -> Controller" even if
that's all that's there. It kind of jives nicer with the input settings
window to see the labels there, I think. And if we ever do add more
stuff, it'll be nice that people already always expect that menu there.
Remaining issues:
* add slotted cart loader (SGB, BSX, ST)
* add DIP switch selection window (NSS)
* add timing configuration (video/audio sync)
2015-05-23 05:37:08 +00:00
|
|
|
|
|
|
|
systemMenuSeparatorPorts.setVisible(inputPort1.visible() || inputPort2.visible());
|
2015-05-23 05:29:18 +00:00
|
|
|
}
|
|
|
|
|
2015-03-03 10:14:49 +00:00
|
|
|
auto Presentation::resizeViewport() -> void {
|
|
|
|
signed width = 256;
|
|
|
|
signed height = 240;
|
|
|
|
|
2015-04-21 11:51:57 +00:00
|
|
|
if(emulator) {
|
|
|
|
width = emulator->information.width;
|
|
|
|
height = emulator->information.height;
|
2015-03-03 10:14:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-13 11:16:33 +00:00
|
|
|
if(fullScreen() == false) {
|
2015-04-21 11:51:57 +00:00
|
|
|
bool arc = config().video.aspectCorrection && emulator && emulator->information.aspectRatio != 1.0;
|
2015-04-13 11:16:33 +00:00
|
|
|
|
|
|
|
if(config().video.scale == "Small" ) width *= 1, height *= 1;
|
|
|
|
if(config().video.scale == "Normal") width *= 2, height *= 2;
|
|
|
|
if(config().video.scale == "Large" ) width *= 4, height *= 4;
|
|
|
|
if(arc) width = width * 8 / 7;
|
|
|
|
|
|
|
|
setSize({width, height});
|
|
|
|
viewport.setGeometry({0, 0, width, height});
|
|
|
|
setPlacement(0.5, 0.5);
|
|
|
|
} else {
|
|
|
|
auto desktop = Desktop::size();
|
|
|
|
|
|
|
|
//aspect ratio correction is always enabled in fullscreen mode
|
|
|
|
//note that below algorithm yields 7:6 ratio on 2560x(1440,1600) monitors
|
|
|
|
//this is extremely close to the optimum 8:7 ratio
|
|
|
|
//it is used so that linear interpolation isn't required
|
|
|
|
//todo: we should handle other resolutions nicely as well
|
|
|
|
unsigned multiplier = desktop.height() / height;
|
|
|
|
width *= 1 + multiplier;
|
|
|
|
height *= multiplier;
|
|
|
|
|
Update to v094r20 release.
byuu says:
Main reason for this WIP was because of all the added lines to hiro for
selective component disabling. May as well get all the diff-noise apart
from code changes.
It also merges something I've been talking to Cydrak about ... making
nall::string::(integer,decimal) do built-in binary,octal,hex decoding
instead of just failing on those. This will have fun little side effects
all over the place, like being able to view a topic on my forum via
"forum.byuu.org/topic/0b10010110", heh.
There are two small changes to higan itself, though. First up, I fixed
the resampler ratio when loading non-SNES games. Tested and I can play
Game Boy games fine now. Second, I hooked up menu option hiding for
reset and controller selection. Right now, this works like higan v094,
but I'm thinking I might want to show the "Device -> Controller" even if
that's all that's there. It kind of jives nicer with the input settings
window to see the labels there, I think. And if we ever do add more
stuff, it'll be nice that people already always expect that menu there.
Remaining issues:
* add slotted cart loader (SGB, BSX, ST)
* add DIP switch selection window (NSS)
* add timing configuration (video/audio sync)
2015-05-23 05:37:08 +00:00
|
|
|
signed x = (desktop.width() - width) / 2;
|
|
|
|
signed y = (desktop.height() - height) / 2;
|
2015-04-13 11:16:33 +00:00
|
|
|
|
|
|
|
if(x < 0) x = 0;
|
|
|
|
if(y < 0) y = 0;
|
|
|
|
if(width > desktop.width()) width = desktop.width();
|
|
|
|
if(height > desktop.height()) height = desktop.height();
|
|
|
|
|
|
|
|
viewport.setGeometry({x, y, width, height});
|
2015-03-03 10:14:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-21 11:51:57 +00:00
|
|
|
if(!emulator) drawSplashScreen();
|
2015-03-03 10:14:49 +00:00
|
|
|
}
|
|
|
|
|
2015-04-13 11:16:33 +00:00
|
|
|
auto Presentation::toggleFullScreen() -> void {
|
|
|
|
if(fullScreen() == false) {
|
|
|
|
menuBar.setVisible(false);
|
|
|
|
statusBar.setVisible(false);
|
|
|
|
setResizable(true);
|
|
|
|
setFullScreen(true);
|
2015-05-23 05:29:18 +00:00
|
|
|
if(!input.acquired()) input.acquire();
|
2015-04-13 11:16:33 +00:00
|
|
|
} else {
|
2015-05-23 05:29:18 +00:00
|
|
|
if(input.acquired()) input.unacquire();
|
2015-04-13 11:16:33 +00:00
|
|
|
setFullScreen(false);
|
|
|
|
setResizable(false);
|
|
|
|
menuBar.setVisible(true);
|
|
|
|
statusBar.setVisible(config().userInterface.showStatusBar);
|
|
|
|
}
|
|
|
|
|
|
|
|
Application::processEvents();
|
|
|
|
resizeViewport();
|
|
|
|
}
|
|
|
|
|
2015-03-03 10:14:49 +00:00
|
|
|
auto Presentation::drawSplashScreen() -> void {
|
|
|
|
uint32* output;
|
|
|
|
unsigned length;
|
|
|
|
if(video.lock(output, length, 256, 240)) {
|
|
|
|
for(auto y : range(240)) {
|
|
|
|
uint32* dp = output + y * (length >> 2);
|
|
|
|
for(auto x : range(256)) *dp++ = 0xff000000;
|
|
|
|
}
|
|
|
|
video.unlock();
|
|
|
|
video.refresh();
|
|
|
|
}
|
2015-02-28 01:51:53 +00:00
|
|
|
}
|