lsnes/ui/utility/utility.cpp

173 lines
4.7 KiB
C++
Raw Normal View History

2013-05-03 17:47:34 +03:00
#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;
}