diff --git a/disc_menu.cpp b/disc_menu.cpp index f05231e..4d04278 100644 --- a/disc_menu.cpp +++ b/disc_menu.cpp @@ -1,6 +1,7 @@ #include "menu.hh" #include "file_browser.hh" #include "game_info.hh" +#include "game_info_box.hh" static const char *game_exts[] = {".d64", ".D64", ".t64", ".T64", ".prg",".PRG", ".p00", ".P00", NULL}; @@ -67,85 +68,10 @@ public: virtual void escapeCallback(int which) { Gui::gui->timerController->disarm(this); + Gui::gui->popView(); } }; -class GameInfoBox : public Menu -{ -public: - GameInfoBox(Font *font) : Menu(font) - { - this->gi = NULL; - memset(this->gi_messages, 0, sizeof(this->gi_messages)); - this->setSelectedBackground(NULL, NULL, NULL, NULL, NULL, NULL); - } - - void loadGameInfo(const char *what) - { - this->setText(NULL); - memset(this->gi_messages, 0, sizeof(this->gi_messages)); - - /* Reset the current game info */ - if (this->gi) - { - delete this->gi; - this->gi = NULL; - } - - /* No need to do this for directories or the special "None" field */ - if (strcmp(what, "None") == 0 || - what[0] == '[') - return; - - size_t len = strlen(Gui::gui->metadata_base_path) + strlen(what) + 6; - char *tmp = (char*)xmalloc(len); - sprintf(tmp, "%s/%s.lra", Gui::gui->metadata_base_path, what); - - /* Might return NULL, but that's OK */ - this->gi = GameInfo::loadFromFile(tmp); - if (this->gi) - { - this->gi_messages[0] = "Game:"; - this->gi_messages[1] = this->gi->name; - this->gi_messages[2] = "Author:"; - this->gi_messages[3] = this->gi->author; - this->setText(this->gi_messages); - } - - free(tmp); - } - - virtual void selectCallback(int which) - { - } - virtual void hoverCallback(int which) - { - } - virtual void escapeCallback(int which) - { - } - - void draw(SDL_Surface *where, int x, int y, int w, int h) - { - if (!this->gi) - return; - if (!this->gi->screenshot) - return; - - SDL_Rect dst; - - /* Blit the backgrounds */ - dst = (SDL_Rect){x + w / 2 - this->gi->screenshot->w / 2, y, w, h}; - SDL_BlitSurface(this->gi->screenshot, NULL, where, &dst); - - Menu::draw(where, x, y + this->gi->screenshot->h + 10, - w, h - this->gi->screenshot->h - 10); - } - -private: - const char *gi_messages[6]; - GameInfo *gi; -}; DiscView::DiscView() : GuiView() { diff --git a/game_info.cpp b/game_info.cpp index d98f00e..65b6dde 100644 --- a/game_info.cpp +++ b/game_info.cpp @@ -19,6 +19,17 @@ GameInfo::GameInfo(const char *filename, this->screenshot = image; } +GameInfo::GameInfo(GameInfo *gi) +{ + this->name = xstrdup(gi->name); + this->author = xstrdup(gi->author); + this->filename = xstrdup(gi->filename); + this->screenshot = NULL; + + if (gi->screenshot) + this->screenshot = SDL_DisplayFormatAlpha(gi->screenshot); +} + GameInfo::~GameInfo() { this->resetDefaults(); diff --git a/game_info.hh b/game_info.hh index d55156d..1ef6bbb 100644 --- a/game_info.hh +++ b/game_info.hh @@ -22,6 +22,8 @@ public: const char *author = NULL, SDL_Surface *image = NULL); + GameInfo(GameInfo *gi); + ~GameInfo(); void resetDefaults(); diff --git a/game_info_box.hh b/game_info_box.hh new file mode 100644 index 0000000..b716497 --- /dev/null +++ b/game_info_box.hh @@ -0,0 +1,85 @@ +#include "menu.hh" +#include "game_info.hh" + +class GameInfoBox : public Menu +{ +public: + GameInfoBox(Font *font) : Menu(font) + { + this->gi = NULL; + memset(this->gi_messages, 0, sizeof(this->gi_messages)); + this->setSelectedBackground(NULL, NULL, NULL, NULL, NULL, NULL); + } + + void setGameInfo(GameInfo *gi) + { + /* Make a copy */ + this->gi = new GameInfo(gi); + } + + void loadGameInfo(const char *what) + { + this->setText(NULL); + memset(this->gi_messages, 0, sizeof(this->gi_messages)); + + /* Reset the current game info */ + if (this->gi) + { + delete this->gi; + this->gi = NULL; + } + + /* No need to do this for directories or the special "None" field */ + if (strcmp(what, "None") == 0 || + what[0] == '[') + return; + + size_t len = strlen(Gui::gui->metadata_base_path) + strlen(what) + 6; + char *tmp = (char*)xmalloc(len); + sprintf(tmp, "%s/%s.lra", Gui::gui->metadata_base_path, what); + + /* Might return NULL, but that's OK */ + this->gi = GameInfo::loadFromFile(tmp); + if (this->gi) + { + this->gi_messages[0] = "Game:"; + this->gi_messages[1] = this->gi->name; + this->gi_messages[2] = "Author:"; + this->gi_messages[3] = this->gi->author; + this->setText(this->gi_messages); + } + + free(tmp); + } + + virtual void selectCallback(int which) + { + } + virtual void hoverCallback(int which) + { + } + virtual void escapeCallback(int which) + { + } + + void draw(SDL_Surface *where, int x, int y, int w, int h) + { + if (!this->gi) + return; + if (!this->gi->screenshot) + return; + + SDL_Rect dst; + + /* Blit the backgrounds */ + dst = (SDL_Rect){x + w / 2 - this->gi->screenshot->w / 2, y, w, h}; + SDL_BlitSurface(this->gi->screenshot, NULL, where, &dst); + + Menu::draw(where, x, y + this->gi->screenshot->h + 10, + w, h - this->gi->screenshot->h - 10); + } + +private: + const char *gi_messages[6]; + GameInfo *gi; +};