173 lines
4.7 KiB
C++
173 lines
4.7 KiB
C++
|
#include "../base.hpp"
|
||
|
Utility *utility = 0;
|
||
|
|
||
|
void Utility::setMode(Interface::Mode mode) {
|
||
|
video.clear();
|
||
|
audio.clear();
|
||
|
|
||
|
mainWindow->nesMenu.setVisible(false);
|
||
|
mainWindow->snesMenu.setVisible(false);
|
||
|
mainWindow->gameBoyMenu.setVisible(false);
|
||
|
|
||
|
if(mode == Interface::Mode::None) {
|
||
|
mainWindow->setTitle(application->title);
|
||
|
mainWindow->setStatusText("No cartridge loaded");
|
||
|
cheatEditor->reset();
|
||
|
stateManager->reset();
|
||
|
}
|
||
|
|
||
|
else if(mode == Interface::Mode::NES) {
|
||
|
mainWindow->setTitle(notdir(interface->baseName));
|
||
|
mainWindow->nesMenu.setVisible(true);
|
||
|
dspaudio.setChannels(1);
|
||
|
}
|
||
|
|
||
|
else if(mode == Interface::Mode::SNES) {
|
||
|
mainWindow->setTitle(notdir(interface->baseName));
|
||
|
mainWindow->snesMenu.setVisible(true);
|
||
|
dspaudio.setChannels(2);
|
||
|
}
|
||
|
|
||
|
else if(mode == Interface::Mode::GameBoy) {
|
||
|
mainWindow->gameBoyMenu.setText(
|
||
|
GameBoy::system.cgb() == false ? "Game Boy" : "Game Boy Color"
|
||
|
);
|
||
|
mainWindow->setTitle(notdir(interface->baseName));
|
||
|
mainWindow->gameBoyMenu.setVisible(true);
|
||
|
dspaudio.setChannels(2);
|
||
|
}
|
||
|
|
||
|
interface->updateDSP();
|
||
|
mainWindow->synchronize();
|
||
|
resizeMainWindow();
|
||
|
}
|
||
|
|
||
|
void Utility::resizeMainWindow(bool shrink) {
|
||
|
Geometry geometry = mainWindow->geometry();
|
||
|
unsigned width = geometry.width, height = geometry.height;
|
||
|
|
||
|
switch(interface->mode()) {
|
||
|
case Interface::Mode::None: return mainWindow->viewport.setGeometry({ 0, 0, 1, 1 });
|
||
|
case Interface::Mode::NES: width = 256, height = 240; break;
|
||
|
case Interface::Mode::SNES: width = 256, height = 240; break;
|
||
|
case Interface::Mode::GameBoy: width = 160, height = 144; break;
|
||
|
}
|
||
|
|
||
|
if(config->video.correctAspectRatio) {
|
||
|
if(interface->mode() == Interface::Mode::NES
|
||
|
|| interface->mode() == Interface::Mode::SNES
|
||
|
) width = (double)width * 1.226;
|
||
|
}
|
||
|
|
||
|
unsigned maxW = geometry.width / width;
|
||
|
unsigned maxH = geometry.height / height;
|
||
|
unsigned maxM = max(1u, min(maxW, maxH));
|
||
|
|
||
|
width = width * maxM;
|
||
|
height = height * maxM;
|
||
|
|
||
|
if(mainWindow->fullScreen() == true) {
|
||
|
if(config->video.fullScreenMode == 1) { //scale
|
||
|
width = (double)width * ((double)geometry.height / height);
|
||
|
height = geometry.height;
|
||
|
}
|
||
|
|
||
|
if(config->video.fullScreenMode == 2) { //stretch
|
||
|
width = geometry.width;
|
||
|
height = geometry.height;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(shrink == false) {
|
||
|
if(geometry.width < width ) width = geometry.width;
|
||
|
if(geometry.height < height) height = geometry.height;
|
||
|
|
||
|
mainWindow->viewport.setGeometry({
|
||
|
(geometry.width - width) / 2, (geometry.height - height) / 2,
|
||
|
width, height
|
||
|
});
|
||
|
} else {
|
||
|
mainWindow->setGeometry({ geometry.x, geometry.y, width, height });
|
||
|
mainWindow->viewport.setGeometry({ 0, 0, width, height });
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Utility::toggleFullScreen() {
|
||
|
static Geometry geometry;
|
||
|
|
||
|
if(mainWindow->fullScreen() == false) {
|
||
|
geometry = mainWindow->geometry();
|
||
|
mainWindow->setMenuVisible(false);
|
||
|
mainWindow->setStatusVisible(false);
|
||
|
mainWindow->setFullScreen(true);
|
||
|
input.acquire();
|
||
|
} else {
|
||
|
input.unacquire();
|
||
|
mainWindow->setMenuVisible(true);
|
||
|
mainWindow->setStatusVisible(true);
|
||
|
mainWindow->setFullScreen(false);
|
||
|
mainWindow->setGeometry(geometry);
|
||
|
}
|
||
|
|
||
|
resizeMainWindow();
|
||
|
if(application->compositionEnable) {
|
||
|
if(config->video.compositionMode == 1) {
|
||
|
compositor::enable(mainWindow->fullScreen() == false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Utility::bindVideoFilter() {
|
||
|
if(filter.opened()) filter.close();
|
||
|
if(config->video.filter == "None") return;
|
||
|
if(filter.open_absolute(config->video.filter)) {
|
||
|
filter.dl_size = filter.sym("filter_size");
|
||
|
filter.dl_render = filter.sym("filter_render");
|
||
|
if(!filter.dl_size || !filter.dl_render) filter.close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Utility::bindVideoShader() {
|
||
|
if(config->video.shader == "None") {
|
||
|
video.set(Video::Shader, (const char*)"");
|
||
|
video.set(Video::Filter, 0u);
|
||
|
} else if(config->video.shader == "Blur") {
|
||
|
video.set(Video::Shader, (const char*)"");
|
||
|
video.set(Video::Filter, 1u);
|
||
|
} else {
|
||
|
string data;
|
||
|
data.readfile(config->video.shader);
|
||
|
video.set(Video::Shader, (const char*)data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Utility::updateStatus() {
|
||
|
time_t currentTime = time(0);
|
||
|
string text;
|
||
|
if((currentTime - statusTime) <= 2) {
|
||
|
text = statusMessage;
|
||
|
} else if(interface->cartridgeLoaded() == false) {
|
||
|
text = "No cartridge loaded";
|
||
|
} else if(application->pause || application->autopause) {
|
||
|
text = "Paused";
|
||
|
} else {
|
||
|
text = statusText;
|
||
|
}
|
||
|
if(text != mainWindow->statusText()) {
|
||
|
mainWindow->setStatusText(text);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Utility::setStatusText(const string &text) {
|
||
|
statusText = text;
|
||
|
}
|
||
|
|
||
|
void Utility::showMessage(const string &message) {
|
||
|
statusTime = time(0);
|
||
|
statusMessage = message;
|
||
|
}
|
||
|
|
||
|
Utility::Utility() {
|
||
|
statusTime = 0;
|
||
|
}
|