Browsing multiple systems is now possible! Just press left or right.

Also, config files can have comments (lines that start wih #).
This commit is contained in:
Aloshi 2012-07-21 15:57:53 -05:00
parent 561e4a7f44
commit f368a1f4cd
12 changed files with 107 additions and 39 deletions

View file

@ -14,4 +14,5 @@ You can build it by just running `make`.
Configuring Configuring
=========== ===========
At the moment, the software looks for a file named "systems.cfg" in the directory it is run from. An example is included, though at the moment only one system should be defined. At the moment, the software looks for a file named "systems.cfg" in the directory it is run from. An example is included.

0
mame/fakemamegame.zip Normal file
View file

View file

@ -17,11 +17,11 @@ std::string GameData::getName()
std::string GameData::getValidPath() std::string GameData::getValidPath()
{ {
//a quick and dirty way to insert a backslash before spaces //a quick and dirty way to insert a backslash before most characters that would mess up a bash path
std::string path = mPath; std::string path = mPath;
for(unsigned int i = 0; i < path.length(); i++) for(unsigned int i = 0; i < path.length(); i++)
{ {
if(path[i] == *" ") if(path[i] == *" " || path[i] == *"'" || path[i] == *"\"" || path[i] == *"\\")
{ {
path.insert(i, "\\"); path.insert(i, "\\");
i++; i++;

View file

@ -56,6 +56,7 @@ void InputManager::processEvent(SDL_Event* event)
//catch emergency quit event //catch emergency quit event
if(event->key.keysym.sym == SDLK_F4) if(event->key.keysym.sym == SDLK_F4)
{ {
//I have no idea if SDL will delete this event, but we're quitting, so I don't think it really matters
SDL_Event* quit = new SDL_Event(); SDL_Event* quit = new SDL_Event();
quit->type = SDL_QUIT; quit->type = SDL_QUIT;
SDL_PushEvent(quit); SDL_PushEvent(quit);

View file

@ -29,7 +29,8 @@ void Renderer::drawText(std::string text, int x, int y, int color)
if(!font) if(!font)
loadFonts(); loadFonts();
//SDL_Color sdlcolor = (SDL_Color)color; //SDL_MapRGB(//{(char)color, (char)(*(&color + 1)), (char)(*(&color + 2))}; //SDL_Color is a struct of four bytes, with the first three being colors. An int is four bytes.
//So, we can just pretend the int is an SDL_Color.
SDL_Color* sdlcolor = (SDL_Color*)&color; SDL_Color* sdlcolor = (SDL_Color*)&color;
SDL_Surface* textSurf = TTF_RenderText_Blended(font, text.c_str(), *sdlcolor); SDL_Surface* textSurf = TTF_RenderText_Blended(font, text.c_str(), *sdlcolor);

View file

@ -4,6 +4,8 @@
#include <fstream> #include <fstream>
#include <stdlib.h> #include <stdlib.h>
std::vector<SystemData*> SystemData::sSystemVector;
namespace fs = boost::filesystem; namespace fs = boost::filesystem;
SystemData::SystemData(std::string name, std::string startPath, std::string extension, std::string command) SystemData::SystemData(std::string name, std::string startPath, std::string extension, std::string command)
@ -103,15 +105,17 @@ std::string SystemData::getName()
return mName; return mName;
} }
//creates system files from information located in a config file
std::vector<SystemData*> SystemData::loadConfig(std::string path)
//creates systems from information located in a config file
void SystemData::loadConfig(std::string path)
{ {
deleteSystems();
std::cout << "Loading system config file \"" << path << "\"...\n"; std::cout << "Loading system config file \"" << path << "\"...\n";
std::vector<SystemData*> returnVec;
std::ifstream file(path.c_str()); std::ifstream file(path.c_str());
if(file.is_open()) if(file.is_open())
{ {
std::string line; std::string line;
@ -120,8 +124,8 @@ std::vector<SystemData*> SystemData::loadConfig(std::string path)
{ {
std::getline(file, line); std::getline(file, line);
//skip blank lines //skip blank lines and comments
if(line.empty()) if(line.empty() || line[0] == *"#")
continue; continue;
//find the name (left of the equals sign) and the value (right of the equals sign) //find the name (left of the equals sign) and the value (right of the equals sign)
@ -141,6 +145,7 @@ std::vector<SystemData*> SystemData::loadConfig(std::string path)
if(lineValid) if(lineValid)
{ {
//map the value to the appropriate variable
if(varName == "NAME") if(varName == "NAME")
sysName = varValue; sysName = varValue;
else if(varName == "PATH") else if(varName == "PATH")
@ -155,21 +160,30 @@ std::vector<SystemData*> SystemData::loadConfig(std::string path)
//we have all our variables - create the system object //we have all our variables - create the system object
if(!sysName.empty() && !sysPath.empty() &&!sysExtension.empty() && !sysCommand.empty()) if(!sysName.empty() && !sysPath.empty() &&!sysExtension.empty() && !sysCommand.empty())
{ {
returnVec.push_back(new SystemData(sysName, sysPath, sysExtension, sysCommand)); sSystemVector.push_back(new SystemData(sysName, sysPath, sysExtension, sysCommand));
//reset the variables for the next block (should there be one) //reset the variables for the next block (should there be one)
sysName = ""; sysPath = ""; sysExtension = ""; sysName = ""; sysPath = ""; sysExtension = ""; sysCommand = "";
} }
}else{ }else{
std::cerr << "Error reading config file \"" << path << "\" - no equals sign found on line \"" << line << "\"!\n"; std::cerr << "Error reading config file \"" << path << "\" - no equals sign found on line \"" << line << "\"!\n";
return returnVec; return;
} }
} }
}else{ }else{
std::cerr << "Error - could not load config file \"" << path << "\"!\n"; std::cerr << "Error - could not load config file \"" << path << "\"!\n";
return returnVec; return;
} }
std::cout << "Finished loading config file - created " << returnVec.size() << " systems.\n"; std::cout << "Finished loading config file - created " << sSystemVector.size() << " systems.\n";
return returnVec; return;
}
void SystemData::deleteSystems()
{
for(unsigned int i = 0; i < sSystemVector.size(); i++)
{
delete sSystemVector.at(i);
}
sSystemVector.clear();
} }

View file

@ -18,7 +18,11 @@ public:
void buildGameList(); void buildGameList();
void launchGame(unsigned int i); void launchGame(unsigned int i);
static std::vector<SystemData*> loadConfig(std::string path); //static std::vector<SystemData*> loadConfig(std::string path);
static void deleteSystems();
static void loadConfig(std::string path);
static std::vector<SystemData*> sSystemVector;
private: private:
std::string mName; std::string mName;
std::string mStartPath; std::string mStartPath;

View file

@ -1,17 +1,16 @@
#include "GuiGameList.h" #include "GuiGameList.h"
#include "../InputManager.h" #include "../InputManager.h"
#include <iostream> #include <iostream>
#include <SDL/SDL.h>
GuiGameList::GuiGameList(SystemData* system) GuiGameList::GuiGameList()
{ {
mSystem = system; std::cout << "Creating GuiGameList\n";
mList = new GuiList(); mList = new GuiList();
updateList();
addChild(mList); addChild(mList);
setSystemId(0);
Renderer::registerComponent(this); Renderer::registerComponent(this);
InputManager::registerComponent(this); InputManager::registerComponent(this);
} }
@ -19,9 +18,25 @@ GuiGameList::GuiGameList(SystemData* system)
GuiGameList::~GuiGameList() GuiGameList::~GuiGameList()
{ {
Renderer::unregisterComponent(this); Renderer::unregisterComponent(this);
delete mList;
InputManager::unregisterComponent(this); InputManager::unregisterComponent(this);
} }
void GuiGameList::setSystemId(int id)
{
//make sure the id is within range
if(id >= (int)SystemData::sSystemVector.size())
id -= SystemData::sSystemVector.size();
if(id < 0)
id += SystemData::sSystemVector.size();
mSystemId = id;
mSystem = SystemData::sSystemVector.at(mSystemId);
updateList();
}
void GuiGameList::onRender() void GuiGameList::onRender()
{ {
Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0xFFFFFF); Renderer::drawRect(0, 0, Renderer::getScreenWidth(), Renderer::getScreenHeight(), 0xFFFFFF);
@ -31,11 +46,21 @@ void GuiGameList::onRender()
void GuiGameList::onInput(InputManager::InputButton button, bool keyDown) void GuiGameList::onInput(InputManager::InputButton button, bool keyDown)
{ {
if(button == InputManager::BUTTON1 && keyDown) if(button == InputManager::BUTTON1 && mSystem->getGameCount() > 0)
{ {
SDL_EnableKeyRepeat(0, 0); //SDL_EnableKeyRepeat(0, 0);
mSystem->launchGame(mList->getSelection()); if(!keyDown)
SDL_EnableKeyRepeat(500, 100); mSystem->launchGame(mList->getSelection());
//SDL_EnableKeyRepeat(500, 100);
}
if(button == InputManager::RIGHT && keyDown)
{
setSystemId(mSystemId + 1);
}
if(button == InputManager::LEFT && keyDown)
{
setSystemId(mSystemId - 1);
} }
} }
@ -46,6 +71,7 @@ void GuiGameList::updateList()
for(unsigned int i = 0; i < mSystem->getGameCount(); i++) for(unsigned int i = 0; i < mSystem->getGameCount(); i++)
{ {
GameData* game = mSystem->getGame(i); GameData* game = mSystem->getGame(i);
mList->addObject(game->getName(), game); mList->addObject(game->getName(), game);
} }
} }

View file

@ -10,15 +10,17 @@
class GuiGameList : GuiComponent class GuiGameList : GuiComponent
{ {
public: public:
GuiGameList(SystemData* system); GuiGameList();
~GuiGameList(); ~GuiGameList();
void updateList(); void updateList();
void setSystemId(int id);
void onRender(); void onRender();
void onInput(InputManager::InputButton button, bool keyDown); void onInput(InputManager::InputButton button, bool keyDown);
private: private:
SystemData* mSystem; SystemData* mSystem;
int mSystemId;
GuiList* mList; GuiList* mList;
}; };

View file

@ -17,16 +17,20 @@ void GuiList::onRender()
const int cutoff = 40; const int cutoff = 40;
const int entrySize = 40; const int entrySize = 40;
int startEntry = 0;
//number of entries that can fit on the screen simultaniously //number of entries that can fit on the screen simultaniously
int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize; int screenCount = (Renderer::getScreenHeight() - cutoff) / entrySize;
screenCount -= 1; screenCount -= 1;
int startEntry = mSelection - (screenCount * 0.5); if((int)mNameVector.size() >= screenCount)
if(startEntry < 0) {
startEntry = 0; startEntry = mSelection - (screenCount * 0.5);
if(startEntry >= (int)mNameVector.size() - screenCount) if(startEntry < 0)
startEntry = mNameVector.size() - screenCount; startEntry = 0;
if(startEntry >= (int)mNameVector.size() - screenCount)
startEntry = mNameVector.size() - screenCount;
}
int y = cutoff; int y = cutoff;
int color = 0xFF0000; int color = 0xFF0000;
@ -37,7 +41,11 @@ void GuiList::onRender()
return; return;
} }
for(int i = startEntry; i < startEntry + screenCount; i++) int listCutoff = startEntry + screenCount;
if(listCutoff > (int)mNameVector.size())
listCutoff = mNameVector.size();
for(int i = startEntry; i < listCutoff; i++)
{ {
if(mSelection == i) if(mSelection == i)
{ {
@ -77,6 +85,7 @@ void GuiList::clear()
{ {
mNameVector.clear(); mNameVector.clear();
mPointerVector.clear(); mPointerVector.clear();
mSelection = 0;
} }
std::string GuiList::getSelectedName() std::string GuiList::getSelectedName()

View file

@ -34,9 +34,8 @@ int main()
//GuiTitleScreen* testGui = new GuiTitleScreen(); //GuiTitleScreen* testGui = new GuiTitleScreen();
//test systemData SystemData::loadConfig("./systems.cfg");
SystemData* testSystem = SystemData::loadConfig("./systems.cfg").at(0); GuiGameList* testGui = new GuiGameList();
GuiGameList* testGui = new GuiGameList(testSystem);
bool running = true; bool running = true;
@ -65,7 +64,7 @@ int main()
} }
delete testGui; delete testGui;
delete testSystem; SystemData::deleteSystems();
std::cout << "EmulationStation cleanly shutting down...\n"; std::cout << "EmulationStation cleanly shutting down...\n";

View file

@ -2,3 +2,14 @@ NAME=Super Nintendo Entertainment System
PATH=./snes/ PATH=./snes/
EXTENSION=.smc EXTENSION=.smc
COMMAND=retroarch -L ~/libretro-pocketsnes.so %ROM% COMMAND=retroarch -L ~/libretro-pocketsnes.so %ROM%
NAME=MAME
PATH=./mame/
EXTENSION=.zip
COMMAND=echo %ROM%
# This is just a dud to test error handling. Also, comment support! Woo!
NAME=Fake System
PATH=./fakedir/
EXTENSION=.fake
COMMAND=this will never be called