Video menu.

This commit is contained in:
Andrea Orrù 2014-05-29 10:03:37 +02:00
parent 240793027f
commit 90bf26c018
4 changed files with 71 additions and 33 deletions

View file

@ -8,6 +8,11 @@
namespace GUI {
// Screen size:
const unsigned width = 256;
const unsigned height = 240;
const unsigned fontSz = 16;
// SDL structures:
SDL_Window* window;
SDL_Renderer* renderer;
@ -19,10 +24,27 @@ u8 const* keys;
Menu* menu;
Menu mainMenu;
Menu settingsMenu;
Menu videoMenu;
FileMenu* fileMenu;
bool pause = true;
/* Change the size of the window */
void set_size(int mul)
{
// Generate a new font:
TTF_CloseFont(font);
font = TTF_OpenFont("res/font.ttf", fontSz * mul);
// Set the new size:
SDL_SetWindowSize(window, 256 * mul, 240 * mul);
// Regenerate the menu entries:
mainMenu.regen();
settingsMenu.regen();
videoMenu.regen();
}
/* Initialize GUI */
void init()
{
@ -42,18 +64,22 @@ void init()
SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING,
width, height);
font = TTF_OpenFont("res/font.ttf", fontPt);
font = TTF_OpenFont("res/font.ttf", fontSz);
keys = SDL_GetKeyboardState(0);
signal(SIGINT, SIG_DFL); // CTRL+C kills the application.
// Menus:
mainMenu.add("Load ROM", []{ menu = fileMenu->reset(); });
mainMenu.add("Settings", []{ menu = settingsMenu.reset(); });
mainMenu.add("Exit" , []{ exit(0); });
settingsMenu.add("<", []{ menu = mainMenu.reset(); });
mainMenu.add ("Load ROM", []{ menu = fileMenu->reset(); });
mainMenu.add ("Settings", []{ menu = settingsMenu.reset(); });
mainMenu.add ("Exit", []{ exit(0); });
settingsMenu.add("<", []{ menu = mainMenu.reset(); });
settingsMenu.add("Video", []{ menu = videoMenu.reset(); });
settingsMenu.add("Controls");
settingsMenu.add("Video");
videoMenu.add ("<", []{ menu = settingsMenu.reset(); });
videoMenu.add ("Size 1x", []{ set_size(1); });
videoMenu.add ("Size 2x", []{ set_size(2); });
videoMenu.add ("Size 3x", []{ set_size(3); });
fileMenu = new FileMenu;
menu = &mainMenu;
}
@ -62,11 +88,15 @@ void init()
void render_texture(SDL_Texture* texture, int x, int y)
{
int w, h;
int winW, winH;
SDL_Rect dest;
SDL_GetWindowSize(window, &winW, &winH);
SDL_QueryTexture(texture, NULL, NULL, &dest.w, &dest.h);
dest.x = (x < 0) ? ((width / 2) - (dest.w / 2)) : x;
dest.y = (y < 0) ? ((height / 2) - (dest.h / 2)) : y;
dest.x = (x < 0) ? ((winW / 2) - (dest.w / 2)) : x;
dest.y = (y < 0) ? ((winH / 2) - (dest.h / 2)) : y;
SDL_RenderCopy(renderer, texture, NULL, &dest);
}

View file

@ -6,11 +6,6 @@
namespace GUI {
// Screen size:
const unsigned width = 256;
const unsigned height = 240;
const unsigned fontPt = 16; // Font size.
void init();
void toggle_pause();
void run();

View file

@ -9,23 +9,33 @@ namespace GUI {
using namespace std;
MenuEntry::MenuEntry(string label, function<void()> callback)
MenuEntry::MenuEntry(string label, function<void()> callback, int x)
{
this->label = label;
this->callback = callback;
this->x = x;
unselected = gen_text(label, white);
selected = gen_text(label, red);
}
MenuEntry::~MenuEntry()
{
SDL_DestroyTexture(selected);
SDL_DestroyTexture(unselected);
SDL_DestroyTexture(selected);
}
void Menu::add(string label, function<void()> callback)
void MenuEntry::regen()
{
entries.push_back(new MenuEntry(label, callback));
SDL_DestroyTexture(unselected);
SDL_DestroyTexture(selected);
unselected = gen_text(label, white);
selected = gen_text(label, red);
}
void Menu::add(string label, function<void()> callback, int x)
{
entries.push_back(new MenuEntry(label, callback, x));
}
void Menu::update(u8 const* keys)
@ -40,9 +50,17 @@ void Menu::update(u8 const* keys)
void Menu::render()
{
int h; SDL_QueryTexture(entries[0]->selected, NULL, NULL, NULL, &h);
for (int i = 0; i < entries.size(); i++)
render_texture(entries[i]->unselected, -1, i * fontPt);
render_texture(entries[cursor]->selected, -1, cursor * fontPt);
render_texture(entries[i]->unselected, entries[i]->x, i * h);
render_texture(entries[cursor]->selected, entries[cursor]->x, cursor * h);
}
void Menu::regen()
{
for (auto entry : entries)
entry->regen();
}
Menu* Menu::reset()
@ -69,20 +87,13 @@ void FileMenu::change_dir(string dir)
if (name[0] == '.' and name != "..") continue;
if (dirp->d_type == DT_DIR)
add(name + "/", [=]{ change_dir(path); });
else
add(name, [=]{ Cartridge::load(path.c_str()); toggle_pause(); });
add(name + "/", [=]{ change_dir(path); }, 10);
else if (name.size() > 4 and name.substr(name.size() - 4) == ".nes")
add(name, [=]{ Cartridge::load(path.c_str()); toggle_pause(); }, 10);
}
closedir(dp);
}
void FileMenu::render()
{
for (int i = 0; i < entries.size(); i++)
render_texture(entries[i]->unselected, 10, i * fontPt);
render_texture(entries[cursor]->selected, 10, cursor * fontPt);
}
Menu* FileMenu::reset()
{
change_dir(getwd(NULL));

View file

@ -12,14 +12,16 @@ struct MenuEntry
SDL_Color white = { 255, 255, 255 };
SDL_Color red = { 255, 0, 0 };
int x;
std::string label;
std::function<void()> callback;
SDL_Texture* selected;
SDL_Texture* unselected;
MenuEntry(std::string label, std::function<void()> callback);
MenuEntry(std::string label, std::function<void()> callback, int x);
~MenuEntry();
void regen();
};
class Menu
@ -29,9 +31,10 @@ class Menu
int cursor = 0;
public:
void add(std::string label, std::function<void()> callback = []{});
void add(std::string label, std::function<void()> callback = []{}, int x = -1);
void update(u8 const* keys);
virtual void render();
void render();
void regen();
virtual Menu* reset();
};
@ -40,7 +43,6 @@ class FileMenu : public Menu
void change_dir(std::string dir);
public:
void render();
Menu* reset();
FileMenu();
};