Implemented help system (OK, has some memory corruption currently)

This commit is contained in:
simon.kagstrom 2009-12-04 19:10:49 +00:00
parent c749c39936
commit 80a058c872
6 changed files with 128 additions and 38 deletions

View File

@ -1,4 +1,4 @@
OBJS=menu.oo main.oo utils.oo frodo_menu.oo dialogue_box.oo OBJS=menu.oo main.oo utils.oo frodo_menu.oo dialogue_box.oo menu_messages.oo
all: menu all: menu

View File

@ -3,6 +3,7 @@
#include "menu.hh" #include "menu.hh"
#include "frodo_menu.hh" #include "frodo_menu.hh"
#include "menu_messages.hh"
#include "sdl_ttf_font.hh" #include "sdl_ttf_font.hh"
#include "utils.hh" #include "utils.hh"
@ -21,30 +22,40 @@ const char *get_theme_path(const char *dir, const char *what)
return buf; return buf;
} }
class HelpMenu : public Menu
{
public:
HelpMenu(Font *font, const char ***all_messages) : Menu(font)
{
this->all_messages = all_messages;
}
void updateHelpMessage(int which)
{
this->setText(this->all_messages[which]);
}
virtual void selectCallback(int which)
{
}
virtual void hoverCallback(int which)
{
}
virtual void escapeCallback(int which)
{
}
protected:
const char ***all_messages;
};
class MainMenu : public Menu class MainMenu : public Menu
{ {
public: public:
MainMenu(Font *font, GuiView *parent) : Menu(font) MainMenu(Font *font, HelpMenu *help, GuiView *parent) : Menu(font)
{ {
static const char *messages[] = {
/*00*/ "File",
/*01*/ "^|Insert|Start",
/*02*/ "States",
/*03*/ "^|Load|Save|Delete",
/*04*/ "Keyboard",
/*05*/ "^|Type|Macro|Bind",
/*06*/ " ",
/*07*/ "Reset the C=64",
/*08*/ "Networking",
/*09*/ "Options",
/*10*/ "Advanced Options",
/*11*/ "Help",
/*12*/ "Quit",
NULL
};
this->setText(messages);
this->parent = parent; this->parent = parent;
this->help = help;
} }
virtual void selectCallback(int which) virtual void selectCallback(int which)
@ -57,6 +68,7 @@ public:
virtual void hoverCallback(int which) virtual void hoverCallback(int which)
{ {
printf("entry %d hover over: %s\n", which, this->pp_msgs[which]); printf("entry %d hover over: %s\n", which, this->pp_msgs[which]);
this->help->updateHelpMessage(which);
} }
virtual void escapeCallback(int which) virtual void escapeCallback(int which)
@ -66,6 +78,7 @@ public:
private: private:
GuiView *parent; GuiView *parent;
HelpMenu *help;
}; };
@ -74,7 +87,9 @@ class MainView : public GuiView
public: public:
MainView(Gui *parent) : GuiView(parent) MainView(Gui *parent) : GuiView(parent)
{ {
this->menu = new MainMenu(NULL, this); this->help = new HelpMenu(NULL, main_menu_help);
this->menu = new MainMenu(NULL, this->help, this);
this->menu->setText(main_menu_messages);
this->bg = NULL; this->bg = NULL;
this->infobox = NULL; this->infobox = NULL;
this->textbox = NULL; this->textbox = NULL;
@ -87,6 +102,7 @@ public:
this->textbox = parent->textbox; this->textbox = parent->textbox;
this->menu->setFont(this->parent->default_font); this->menu->setFont(this->parent->default_font);
this->help->setFont(this->parent->default_font);
this->menu->setSelectedBackground(this->parent->bg_left, this->parent->bg_middle, this->menu->setSelectedBackground(this->parent->bg_left, this->parent->bg_middle,
this->parent->bg_right, this->parent->bg_submenu_left, this->parent->bg_right, this->parent->bg_submenu_left,
this->parent->bg_submenu_middle, this->parent->bg_submenu_right); this->parent->bg_submenu_middle, this->parent->bg_submenu_right);
@ -117,10 +133,12 @@ public:
SDL_BlitSurface(this->textbox, NULL, where, &dst); SDL_BlitSurface(this->textbox, NULL, where, &dst);
this->menu->draw(where, 50, 70, 300, 400); this->menu->draw(where, 50, 70, 300, 400);
this->help->draw(where, 354, 24, 264, 210);
} }
protected: protected:
MainMenu *menu; MainMenu *menu;
HelpMenu *help;
SDL_Surface *bg; SDL_Surface *bg;
SDL_Surface *infobox; SDL_Surface *infobox;
SDL_Surface *textbox; SDL_Surface *textbox;

View File

@ -35,9 +35,6 @@ void Menu::printText(SDL_Surface *where, const char *msg, SDL_Color clr,
int last_char = w / pixels_per_char; int last_char = w / pixels_per_char;
/* FIXME! Handle some corner cases here (short strings etc) */ /* FIXME! Handle some corner cases here (short strings etc) */
panic_if((unsigned)last_char > strlen(msg),
"last character (%d) is after the string length (%d)\n",
last_char, strlen(msg));
if (last_char > 3) if (last_char > 3)
{ {
buf[last_char - 2] = '.'; buf[last_char - 2] = '.';
@ -101,7 +98,9 @@ void Menu::draw(SDL_Surface *where, int x, int y, int w, int h)
int entries_visible = h / line_height - 2; int entries_visible = h / line_height - 2;
int start_entry_visible = 0; int start_entry_visible = 0;
panic_if(!this->pp_msgs, "Set the messages before drawing, thank you\n"); /* No messages - nothing to draw */
if (!this->pp_msgs)
return;
if (this->cur_sel - start_entry_visible > entries_visible) if (this->cur_sel - start_entry_visible > entries_visible)
{ {
@ -215,6 +214,9 @@ submenu_t *Menu::findSubmenu(int index)
int Menu::selectOne(int which) int Menu::selectOne(int which)
{ {
panic_if(!this->pp_msgs,
"Can't select a message without any messages!");
if (which >= this->n_entries) if (which >= this->n_entries)
which = 0; which = 0;
this->cur_sel = which; this->cur_sel = which;
@ -222,6 +224,7 @@ int Menu::selectOne(int which)
if (this->pp_msgs[this->cur_sel][0] == ' ' || if (this->pp_msgs[this->cur_sel][0] == ' ' ||
IS_SUBMENU(this->pp_msgs[this->cur_sel])) IS_SUBMENU(this->pp_msgs[this->cur_sel]))
this->selectNext(0, 1); this->selectNext(0, 1);
this->hoverCallback(this->cur_sel);
return this->cur_sel; return this->cur_sel;
} }
@ -230,6 +233,9 @@ int Menu::selectNext(int dx, int dy)
{ {
int next; int next;
panic_if(!this->pp_msgs,
"Can't select the next message without any messages!");
this->cur_sel = this->getNextEntry(dy); this->cur_sel = this->getNextEntry(dy);
next = this->getNextEntry(dy + 1); next = this->getNextEntry(dy + 1);
@ -254,20 +260,26 @@ int Menu::selectNext(int dx, int dy)
int Menu::selectNext(event_t ev) int Menu::selectNext(event_t ev)
{ {
int now = this->cur_sel;
int next;
switch (ev) switch (ev)
{ {
case KEY_UP: case KEY_UP:
this->selectNext(0, -1); break; next = this->selectNext(0, -1); break;
case KEY_DOWN: case KEY_DOWN:
this->selectNext(0, 1); break; next = this->selectNext(0, 1); break;
case KEY_LEFT: case KEY_LEFT:
this->selectNext(-1, 0); break; next = this->selectNext(-1, 0); break;
case KEY_RIGHT: case KEY_RIGHT:
this->selectNext(1, 0); break; next = this->selectNext(1, 0); break;
default: default:
panic("selectNext(ev) called with event %d\n", ev); panic("selectNext(ev) called with event %d\n", ev);
} }
if (now != next)
this->hoverCallback(this->cur_sel);
return this->cur_sel; return this->cur_sel;
} }
@ -283,14 +295,8 @@ void Menu::runLogic()
case KEY_DOWN: case KEY_DOWN:
case KEY_LEFT: case KEY_LEFT:
case KEY_RIGHT: case KEY_RIGHT:
{ this->selectNext(ev);
int now = this->cur_sel; break;
int next;
next = this->selectNext(ev);
if (now != next)
this->hoverCallback(this->cur_sel);
} break;
case KEY_SELECT: case KEY_SELECT:
this->selectCallback(this->cur_sel); break; this->selectCallback(this->cur_sel); break;
case KEY_ESCAPE: case KEY_ESCAPE:
@ -376,6 +382,12 @@ void Menu::setText(const char **messages, int *submenu_defaults)
free(this->p_submenus); free(this->p_submenus);
free(this->pp_msgs); free(this->pp_msgs);
/* Empty messages are allowed */
this->p_submenus = NULL;
this->pp_msgs = NULL;
if (!messages)
return;
for (this->n_entries = 0; messages[this->n_entries]; this->n_entries++) for (this->n_entries = 0; messages[this->n_entries]; this->n_entries++)
{ {
/* Is this a submenu? */ /* Is this a submenu? */

View File

@ -104,7 +104,6 @@ protected:
event_t popEvent(); event_t popEvent();
const char *title;
const char **pp_msgs; const char **pp_msgs;
Font *font; Font *font;
SDL_Color text_color; SDL_Color text_color;

54
menu_messages.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <stdlib.h>
#include "menu_messages.hh"
const char **main_menu_messages = (const char*[]){
/*00*/ "File",
/*01*/ "^|Insert|Start",
/*02*/ "States",
/*03*/ "^|Load|Save|Delete",
/*04*/ "Keyboard",
/*05*/ "^|Type|Macro|Bind",
/*06*/ " ",
/*07*/ "Reset the C=64",
/*08*/ "Networking",
/*09*/ "Options",
/*10*/ "Help",
/*11*/ "Quit",
NULL
};
const char **main_menu_help[] = {
(const char*[]){
"Insert a disc/tape or",
"start it",
NULL,
},
NULL,
(const char*[]){
"Load/save or delete game",
"states",
NULL,
},
NULL,
(const char*[]){
"Bind keyboard keys to the",
"joysticks, use pre-defined",
"macros, or type with the",
"virtual keyboard",
NULL,
},
NULL,
NULL,
NULL,
(const char*[]){
"Networking menu for playing",
"C64 games online.",
NULL,
},
(const char*[]){
"Configure Frodo",
NULL,
},
NULL,
};

7
menu_messages.hh Normal file
View File

@ -0,0 +1,7 @@
#ifndef MENU_MESSAGES_HH
#define MENU_MESSAGES_HH
extern const char **main_menu_messages;
extern const char **main_menu_help[];
#endif