frodo-wii/gui.cpp

334 lines
7.0 KiB
C++
Raw Normal View History

2009-11-28 09:22:19 +01:00
#include <SDL_image.h>
#include <SDL_ttf.h>
2009-12-19 14:20:15 +01:00
#include <arpa/inet.h>
2009-11-28 09:22:19 +01:00
#include "menu.hh"
2009-12-06 10:11:04 +01:00
#include "gui.hh"
#include "menu_messages.hh"
#include "help_box.hh"
#include "dialogue_box.hh"
2009-11-28 09:22:19 +01:00
#include "sdl_ttf_font.hh"
#include "utils.hh"
#include "virtual_keyboard.hh"
2009-11-28 09:22:19 +01:00
extern SDL_Surface *screen;
#define THEME_ROOT_PATH "themes"
2009-12-19 14:20:15 +01:00
#define METADATA_ROOT_PATH "metadata"
#define GAME_ROOT_PATH "discs"
static const char *get_theme_path(const char *dir, const char *what)
{
static char buf[255];
memset(buf, 0, sizeof(buf));
snprintf(buf, 254, "%s/%s/%s",
THEME_ROOT_PATH, dir, what);
return buf;
}
2009-12-06 10:17:21 +01:00
/* These are a bit of special cases... */
#include "disc_menu.cpp"
2010-01-06 17:42:55 +01:00
#include "bind_keys_menu.cpp"
2010-01-05 16:23:19 +01:00
#include "theme_menu.cpp"
2009-12-28 13:38:41 +01:00
#include "options_menu.cpp"
2009-12-29 14:23:01 +01:00
#include "network_menu.cpp"
#include "game_info_menu.cpp"
2009-12-06 10:17:21 +01:00
#include "main_menu.cpp"
2009-12-13 09:59:06 +01:00
GuiView::GuiView()
{
}
void GuiView::updateTheme()
{
}
void GuiView::viewPushCallback()
{
}
void GuiView::viewPopCallback()
{
}
2009-11-28 09:22:19 +01:00
Gui::Gui()
{
this->np = NULL;
2009-11-28 09:22:19 +01:00
this->focus = NULL;
this->bg_left = NULL;
this->bg_middle = NULL;
this->bg_right = NULL;
this->bg_submenu_left = NULL;
this->bg_submenu_middle = NULL;
this->bg_submenu_right = NULL;
2009-11-28 09:43:37 +01:00
this->background = NULL;
2009-11-28 09:59:42 +01:00
this->main_menu_bg = NULL;
2009-12-04 18:55:25 +01:00
this->infobox = NULL;
this->textbox = NULL;
2010-01-16 10:08:54 +01:00
this->status_bar_bg = NULL;
this->default_font = NULL;
this->dialogue_bg = NULL;
2009-12-04 21:06:52 +01:00
this->small_font = NULL;
this->n_views = 0;
this->views = NULL;
this->timerController = new TimerController();
2009-11-28 09:22:19 +01:00
VirtualKeyboard::kbd = new VirtualKeyboard(NULL);
2009-12-19 14:20:15 +01:00
this->theme_base_path = THEME_ROOT_PATH;
this->metadata_base_path = METADATA_ROOT_PATH;
this->game_base_path = GAME_ROOT_PATH;
this->cur_gameInfo = new GameInfo();
this->dlg = NULL;
this->kbd = NULL;
2010-01-16 08:11:17 +01:00
this->mv = NULL;
this->dv = NULL;
this->ov = NULL;
this->nv = NULL;
this->tv = NULL;
this->giv = NULL;
2010-01-16 08:11:17 +01:00
this->bkv = NULL;
2009-11-28 09:22:19 +01:00
}
bool Gui::setTheme(const char *path)
{
this->bg_left = this->loadThemeImage(path, "bg_left.png");
this->bg_middle = this->loadThemeImage(path, "bg_middle.png");
this->bg_right = this->loadThemeImage(path, "bg_right.png");
this->bg_submenu_left = this->loadThemeImage(path, "bg_submenu_left.png");
this->bg_submenu_middle = this->loadThemeImage(path, "bg_submenu_middle.png");
this->bg_submenu_right = this->loadThemeImage(path, "bg_submenu_right.png");
2009-11-28 09:43:37 +01:00
this->background = this->loadThemeImage(path, "background.png");
2009-11-28 09:59:42 +01:00
this->main_menu_bg = this->loadThemeImage(path, "main_menu_bg.png");
2010-01-16 10:08:54 +01:00
this->status_bar_bg = this->loadThemeImage(path, "status_bar.png");
2009-12-04 18:55:25 +01:00
this->infobox = this->loadThemeImage(path, "infobox.png");
this->textbox = this->loadThemeImage(path, "textbox.png");
this->dialogue_bg = this->loadThemeImage(path, "dialogue_box.png");
2009-12-13 11:10:33 +01:00
this->disc_info = this->loadThemeImage(path, "disc_info.png");
2009-11-28 09:43:37 +01:00
2009-12-20 11:12:47 +01:00
this->highlighted_key = this->loadThemeImage(path, "highlighted_key.png");
this->selected_key = this->loadThemeImage(path, "selected_key.png");
2009-12-04 21:06:52 +01:00
this->default_font = this->loadThemeFont(path, "font.ttf", 18);
this->small_font = this->loadThemeFont(path, "font.ttf", 16);
2009-11-28 09:22:19 +01:00
if (!this->bg_left || !this->bg_right || !this->bg_middle ||
!this->bg_submenu_left || !this->bg_submenu_right ||
!this->bg_submenu_middle ||
!this->dialogue_bg ||
2009-12-13 11:10:33 +01:00
!this->disc_info ||
2009-12-20 11:12:47 +01:00
!this->selected_key ||
!this->highlighted_key ||
2010-01-16 10:08:54 +01:00
!this->status_bar_bg ||
2009-12-04 21:06:52 +01:00
!this->default_font ||
!this->small_font)
2009-11-28 09:22:19 +01:00
{
SDL_FreeSurface(this->bg_left);
SDL_FreeSurface(this->bg_middle);
SDL_FreeSurface(this->bg_right);
SDL_FreeSurface(this->bg_submenu_left);
SDL_FreeSurface(this->bg_submenu_middle);
SDL_FreeSurface(this->bg_submenu_right);
2009-11-28 09:43:37 +01:00
SDL_FreeSurface(this->background);
2009-11-28 09:59:42 +01:00
SDL_FreeSurface(this->main_menu_bg);
2009-12-04 18:55:25 +01:00
SDL_FreeSurface(this->infobox);
SDL_FreeSurface(this->dialogue_bg);
2009-12-13 11:10:33 +01:00
SDL_FreeSurface(this->disc_info);
2009-12-04 18:55:25 +01:00
SDL_FreeSurface(this->textbox);
2009-12-20 11:12:47 +01:00
SDL_FreeSurface(this->selected_key);
SDL_FreeSurface(this->highlighted_key);
2009-11-28 09:22:19 +01:00
if (this->default_font)
delete this->default_font;
2009-12-04 21:06:52 +01:00
if (this->small_font)
delete this->small_font;
2009-11-28 09:22:19 +01:00
return false;
}
2010-01-16 08:11:17 +01:00
/* Create the views */
if (!this->mv)
{
2010-01-16 10:08:54 +01:00
this->status_bar = new StatusBar();
2010-01-16 08:11:17 +01:00
this->mv = new MainView();
this->dv = new DiscView();
this->ov = new OptionsView();
this->nv = new NetworkView();
this->tv = new ThemeView();
this->bkv = new BindKeysView();
this->giv = new GameInfoView();
2010-01-16 08:11:17 +01:00
this->pushView(mv);
}
2009-11-28 09:22:19 +01:00
VirtualKeyboard::kbd->updateTheme();
2009-11-28 09:22:19 +01:00
return true;
}
void Gui::runLogic(void)
{
2009-12-05 10:33:58 +01:00
GuiView *cur_view = this->peekView();
2010-01-16 10:08:54 +01:00
this->status_bar->runLogic();
this->timerController->tick();
2009-12-05 10:33:58 +01:00
if (!this->is_active || !cur_view)
return;
if (this->dlg)
this->dlg->runLogic();
else if (this->kbd)
this->kbd->runLogic();
else
cur_view->runLogic();
2009-11-28 09:22:19 +01:00
}
2009-12-04 21:45:17 +01:00
void Gui::pushView(GuiView *view)
2009-11-28 09:22:19 +01:00
{
int cur = this->n_views;
2009-11-28 09:22:19 +01:00
this->n_views++;
this->views = (GuiView**)xrealloc(this->views,
sizeof(GuiView*) * this->n_views);
this->views[cur] = view;
view->viewPushCallback();
}
void Gui::pushDialogueBox(DialogueBox *dlg)
{
this->dlg = dlg;
}
DialogueBox *Gui::popDialogueBox()
{
DialogueBox *out = this->dlg;
this->dlg = NULL;
return out;
2009-11-28 09:22:19 +01:00
}
2009-12-04 21:45:17 +01:00
GuiView *Gui::popView()
{
2009-12-06 20:21:48 +01:00
GuiView *cur = this->peekView();
if (!cur)
return NULL;
cur->viewPopCallback();
2009-12-06 20:21:48 +01:00
2009-12-04 21:45:17 +01:00
this->n_views--;
if (this->n_views <= 0)
{
free(this->views);
2009-12-06 20:21:48 +01:00
this->views = NULL;
this->n_views = 0;
2009-12-13 10:21:27 +01:00
/* Deactivate when no views are left */
this->is_active = false;
2009-12-06 20:21:48 +01:00
2009-12-04 21:45:17 +01:00
return NULL;
}
this->views = (GuiView**)xrealloc(this->views,
sizeof(GuiView*) * this->n_views);
return cur;
2009-12-04 21:45:17 +01:00
}
2009-12-05 10:33:58 +01:00
void Gui::exitMenu()
2009-12-04 21:45:17 +01:00
{
2009-12-05 10:34:58 +01:00
printf("Exiting the menu system\n");
2009-12-06 20:21:48 +01:00
/* Pop all views */
while (this->popView())
;
2009-12-04 21:45:17 +01:00
}
2009-11-28 09:22:19 +01:00
void Gui::pushEvent(SDL_Event *ev)
{
2009-12-05 10:33:58 +01:00
GuiView *cur_view = this->peekView();
if (!this->is_active || !cur_view)
return;
if (this->dlg)
this->dlg->pushEvent(ev);
else if (this->kbd)
this->kbd->pushEvent(ev);
else
cur_view->pushEvent(ev);
2009-11-28 09:22:19 +01:00
}
void Gui::draw(SDL_Surface *where)
{
2009-12-05 10:33:58 +01:00
GuiView *cur_view = this->peekView();
if (!this->is_active || !cur_view)
2010-01-16 10:08:54 +01:00
{
this->status_bar->draw(where);
2009-11-28 09:22:19 +01:00
return;
2010-01-16 10:08:54 +01:00
}
2009-11-28 09:43:37 +01:00
SDL_BlitSurface(this->background, NULL, screen, NULL);
2009-12-05 10:33:58 +01:00
cur_view->draw(where);
if (this->kbd)
this->kbd->draw(where);
if (this->dlg)
this->dlg->draw(where);
2010-01-16 10:08:54 +01:00
this->status_bar->draw(where);
2009-11-28 09:43:37 +01:00
}
void Gui::activate()
{
this->is_active = true;
/* FIXME! TMP! TMP! */
this->np = new Prefs();
2009-11-28 09:43:37 +01:00
}
void Gui::deActivate()
{
/* FIXME! TMP! TMP! */
delete this->np;
2009-11-28 09:43:37 +01:00
this->is_active = false;
2009-11-28 09:22:19 +01:00
}
SDL_Surface *Gui::loadThemeImage(const char *dir, const char *what)
{
return IMG_Load(get_theme_path(dir, what));
2009-11-28 09:22:19 +01:00
}
2009-12-04 21:06:52 +01:00
Font *Gui::loadThemeFont(const char *dir, const char *what, int size)
2009-11-28 09:22:19 +01:00
{
TTF_Font *fnt;
2009-12-04 21:06:52 +01:00
fnt = read_and_alloc_font(get_theme_path(dir, what), size);
2009-11-28 09:22:19 +01:00
if (!fnt)
return NULL;
return new Font_TTF(fnt, 255,255,255);
}
void Gui::updateGameInfo(GameInfo *gi)
{
panic_if(!gi, "gi must be set\n");
delete this->cur_gameInfo;
this->cur_gameInfo = gi;
}
/* The singleton/factory stuff */
Gui *Gui::gui;
void Gui::init()
{
Gui::gui = new Gui();
/* Set the default theme */
panic_if(!Gui::gui->setTheme("default"),
"Setting default theme failed\n");
}