mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-26 05:24:21 +01:00
Implement and add dialogue boxes as well (for exit currently)
This commit is contained in:
parent
70a954461e
commit
453db84014
2
Makefile
2
Makefile
@ -7,7 +7,7 @@ all: menu
|
|||||||
|
|
||||||
menu.oo: menu.cpp menu.hh utils.hh font.hh Makefile
|
menu.oo: menu.cpp menu.hh utils.hh font.hh Makefile
|
||||||
|
|
||||||
frodo_menu.oo: frodo_menu.cpp frodo_menu.hh font.hh menu.hh Makefile
|
frodo_menu.oo: frodo_menu.cpp frodo_menu.hh font.hh menu.hh sdl_ttf_font.hh dialogue_box.hh Makefile
|
||||||
|
|
||||||
utils.oo: utils.cpp utils.hh Makefile
|
utils.oo: utils.cpp utils.hh Makefile
|
||||||
|
|
||||||
|
@ -6,6 +6,16 @@ DialogueBox::DialogueBox(Font *font, const char *msgs[], int cancel) : Menu(font
|
|||||||
this->m_cancel = cancel;
|
this->m_cancel = cancel;
|
||||||
|
|
||||||
this->setText(msgs, NULL);
|
this->setText(msgs, NULL);
|
||||||
|
/* Place on the second to last entry */
|
||||||
|
this->cur_sel = this->n_entries - 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DialogueBox::selectNext(event_t ev)
|
||||||
|
{
|
||||||
|
/* No up/down movement please! */
|
||||||
|
if (ev == KEY_UP || ev == KEY_DOWN)
|
||||||
|
return this->cur_sel;
|
||||||
|
return Menu::selectNext(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DialogueBox::selectCallback(int which)
|
void DialogueBox::selectCallback(int which)
|
||||||
@ -13,6 +23,10 @@ void DialogueBox::selectCallback(int which)
|
|||||||
this->m_selected = this->p_submenus[0].sel;
|
this->m_selected = this->p_submenus[0].sel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DialogueBox::hoverCallback(int which)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DialogueBox::escapeCallback(int which)
|
void DialogueBox::escapeCallback(int which)
|
||||||
{
|
{
|
||||||
this->m_selected = this->m_cancel;
|
this->m_selected = this->m_cancel;
|
||||||
|
@ -5,18 +5,23 @@
|
|||||||
|
|
||||||
class DialogueBox : public Menu
|
class DialogueBox : public Menu
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
DialogueBox(Font *font, const char *msgs[], int cancel = 1);
|
DialogueBox(Font *font, const char *msgs[], int cancel = 1);
|
||||||
|
|
||||||
virtual void selectCallback(int which);
|
virtual void selectCallback(int which);
|
||||||
|
|
||||||
virtual void escapeCallback(int which);
|
virtual void escapeCallback(int which);
|
||||||
|
|
||||||
|
virtual void hoverCallback(int which);
|
||||||
|
|
||||||
|
virtual int selectNext(event_t ev);
|
||||||
|
|
||||||
int selected()
|
int selected()
|
||||||
{
|
{
|
||||||
return this->m_selected;
|
return this->m_selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
int m_selected;
|
int m_selected;
|
||||||
int m_cancel;
|
int m_cancel;
|
||||||
};
|
};
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "menu.hh"
|
#include "menu.hh"
|
||||||
#include "frodo_menu.hh"
|
#include "frodo_menu.hh"
|
||||||
#include "menu_messages.hh"
|
#include "menu_messages.hh"
|
||||||
|
#include "dialogue_box.hh"
|
||||||
#include "sdl_ttf_font.hh"
|
#include "sdl_ttf_font.hh"
|
||||||
#include "utils.hh"
|
#include "utils.hh"
|
||||||
|
|
||||||
@ -49,20 +50,78 @@ protected:
|
|||||||
const char ***all_messages;
|
const char ***all_messages;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MainView;
|
||||||
class MainMenu : public Menu
|
class MainMenu : public Menu
|
||||||
{
|
{
|
||||||
|
friend class MainView;
|
||||||
|
|
||||||
|
class ExitDialogue : public DialogueBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ExitDialogue(Font *font) : DialogueBox(font, exit_dialogue_messages, 1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectCallback(int which)
|
||||||
|
{
|
||||||
|
this->m_selected = this->p_submenus[0].sel;
|
||||||
|
/* Do the exit */
|
||||||
|
if (this->m_selected != this->m_cancel)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MainMenu(Font *font, HelpMenu *help, GuiView *parent) : Menu(font)
|
MainMenu(Font *font, HelpMenu *help, GuiView *parent) : Menu(font)
|
||||||
{
|
{
|
||||||
this->parent = parent;
|
this->parent = parent;
|
||||||
this->help = help;
|
this->help = help;
|
||||||
|
/* The dialogue box is only present when needed */
|
||||||
|
this->dialogue = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
~MainMenu()
|
||||||
|
{
|
||||||
|
if (this->dialogue)
|
||||||
|
delete this->dialogue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void runLogic()
|
||||||
|
{
|
||||||
|
if (this->dialogue)
|
||||||
|
{
|
||||||
|
this->dialogue->runLogic();
|
||||||
|
if (this->dialogue->selected() >= 0)
|
||||||
|
{
|
||||||
|
delete this->dialogue;
|
||||||
|
this->dialogue = NULL;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
((Menu*)this)->runLogic();
|
||||||
|
}
|
||||||
|
|
||||||
|
void pushEvent(SDL_Event *ev)
|
||||||
|
{
|
||||||
|
if (this->dialogue)
|
||||||
|
this->dialogue->pushEvent(ev);
|
||||||
|
else
|
||||||
|
((Menu*)this)->pushEvent(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void selectCallback(int which)
|
virtual void selectCallback(int which)
|
||||||
{
|
{
|
||||||
printf("entry %d selected: %s\n", which, this->pp_msgs[which]);
|
printf("entry %d selected: %s\n", which, this->pp_msgs[which]);
|
||||||
if (which == 11)
|
switch (which)
|
||||||
exit(0);
|
{
|
||||||
|
case 11:
|
||||||
|
this->dialogue = new ExitDialogue(this->font);
|
||||||
|
this->dialogue->setSelectedBackground(NULL, NULL, NULL,
|
||||||
|
this->submenu_bg_left, this->submenu_bg_middle,
|
||||||
|
this->submenu_bg_right);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void hoverCallback(int which)
|
virtual void hoverCallback(int which)
|
||||||
@ -76,6 +135,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
DialogueBox *dialogue;
|
||||||
GuiView *parent;
|
GuiView *parent;
|
||||||
HelpMenu *help;
|
HelpMenu *help;
|
||||||
};
|
};
|
||||||
@ -92,6 +152,7 @@ public:
|
|||||||
this->bg = NULL;
|
this->bg = NULL;
|
||||||
this->infobox = NULL;
|
this->infobox = NULL;
|
||||||
this->textbox = NULL;
|
this->textbox = NULL;
|
||||||
|
this->dialogue_bg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateTheme()
|
void updateTheme()
|
||||||
@ -99,6 +160,7 @@ public:
|
|||||||
this->bg = parent->main_menu_bg;
|
this->bg = parent->main_menu_bg;
|
||||||
this->infobox = parent->infobox;
|
this->infobox = parent->infobox;
|
||||||
this->textbox = parent->textbox;
|
this->textbox = parent->textbox;
|
||||||
|
this->dialogue_bg = parent->dialogue_bg;
|
||||||
|
|
||||||
this->menu->setFont(this->parent->default_font);
|
this->menu->setFont(this->parent->default_font);
|
||||||
this->help->setFont(this->parent->small_font);
|
this->help->setFont(this->parent->small_font);
|
||||||
@ -133,6 +195,16 @@ public:
|
|||||||
|
|
||||||
this->menu->draw(where, 50, 70, 300, 400);
|
this->menu->draw(where, 50, 70, 300, 400);
|
||||||
this->help->draw(where, 354, 24, 264, 210);
|
this->help->draw(where, 354, 24, 264, 210);
|
||||||
|
if (this->menu->dialogue) {
|
||||||
|
int d_x = where->w / 2 - this->dialogue_bg->w / 2;
|
||||||
|
int d_y = where->h / 2 - this->dialogue_bg->h / 2;
|
||||||
|
|
||||||
|
dst = (SDL_Rect){d_x, d_y, this->dialogue_bg->w, this->dialogue_bg->h};
|
||||||
|
SDL_BlitSurface(this->dialogue_bg, NULL, where, &dst);
|
||||||
|
|
||||||
|
this->menu->dialogue->draw(where, d_x + 10, d_y + 10,
|
||||||
|
this->dialogue_bg->w - 10, this->dialogue_bg->h - 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -141,6 +213,7 @@ protected:
|
|||||||
SDL_Surface *bg;
|
SDL_Surface *bg;
|
||||||
SDL_Surface *infobox;
|
SDL_Surface *infobox;
|
||||||
SDL_Surface *textbox;
|
SDL_Surface *textbox;
|
||||||
|
SDL_Surface *dialogue_bg;
|
||||||
};
|
};
|
||||||
|
|
||||||
Gui::Gui()
|
Gui::Gui()
|
||||||
@ -158,6 +231,7 @@ Gui::Gui()
|
|||||||
this->infobox = NULL;
|
this->infobox = NULL;
|
||||||
this->textbox = NULL;
|
this->textbox = NULL;
|
||||||
this->default_font = NULL;
|
this->default_font = NULL;
|
||||||
|
this->dialogue_bg = NULL;
|
||||||
this->small_font = NULL;
|
this->small_font = NULL;
|
||||||
|
|
||||||
this->n_views = 0;
|
this->n_views = 0;
|
||||||
@ -182,6 +256,7 @@ bool Gui::setTheme(const char *path)
|
|||||||
this->main_menu_bg = this->loadThemeImage(path, "main_menu_bg.png");
|
this->main_menu_bg = this->loadThemeImage(path, "main_menu_bg.png");
|
||||||
this->infobox = this->loadThemeImage(path, "infobox.png");
|
this->infobox = this->loadThemeImage(path, "infobox.png");
|
||||||
this->textbox = this->loadThemeImage(path, "textbox.png");
|
this->textbox = this->loadThemeImage(path, "textbox.png");
|
||||||
|
this->dialogue_bg = this->loadThemeImage(path, "dialogue_box.png");
|
||||||
|
|
||||||
this->default_font = this->loadThemeFont(path, "font.ttf", 18);
|
this->default_font = this->loadThemeFont(path, "font.ttf", 18);
|
||||||
this->small_font = this->loadThemeFont(path, "font.ttf", 16);
|
this->small_font = this->loadThemeFont(path, "font.ttf", 16);
|
||||||
@ -189,6 +264,7 @@ bool Gui::setTheme(const char *path)
|
|||||||
if (!this->bg_left || !this->bg_right || !this->bg_middle ||
|
if (!this->bg_left || !this->bg_right || !this->bg_middle ||
|
||||||
!this->bg_submenu_left || !this->bg_submenu_right ||
|
!this->bg_submenu_left || !this->bg_submenu_right ||
|
||||||
!this->bg_submenu_middle ||
|
!this->bg_submenu_middle ||
|
||||||
|
!this->dialogue_bg ||
|
||||||
!this->default_font ||
|
!this->default_font ||
|
||||||
!this->small_font)
|
!this->small_font)
|
||||||
{
|
{
|
||||||
@ -201,6 +277,7 @@ bool Gui::setTheme(const char *path)
|
|||||||
SDL_FreeSurface(this->background);
|
SDL_FreeSurface(this->background);
|
||||||
SDL_FreeSurface(this->main_menu_bg);
|
SDL_FreeSurface(this->main_menu_bg);
|
||||||
SDL_FreeSurface(this->infobox);
|
SDL_FreeSurface(this->infobox);
|
||||||
|
SDL_FreeSurface(this->dialogue_bg);
|
||||||
SDL_FreeSurface(this->textbox);
|
SDL_FreeSurface(this->textbox);
|
||||||
|
|
||||||
if (this->default_font)
|
if (this->default_font)
|
||||||
|
@ -74,6 +74,7 @@ public:
|
|||||||
SDL_Surface *main_menu_bg;
|
SDL_Surface *main_menu_bg;
|
||||||
SDL_Surface *infobox;
|
SDL_Surface *infobox;
|
||||||
SDL_Surface *textbox;
|
SDL_Surface *textbox;
|
||||||
|
SDL_Surface *dialogue_bg;
|
||||||
SDL_Surface *bg_left, *bg_right, *bg_middle,
|
SDL_Surface *bg_left, *bg_right, *bg_middle,
|
||||||
*bg_submenu_left, *bg_submenu_right, *bg_submenu_middle;
|
*bg_submenu_left, *bg_submenu_right, *bg_submenu_middle;
|
||||||
|
|
||||||
|
3
menu.cpp
3
menu.cpp
@ -17,6 +17,7 @@
|
|||||||
#include "utils.hh"
|
#include "utils.hh"
|
||||||
|
|
||||||
#define IS_SUBMENU(p_msg) ( (p_msg)[0] == '^' )
|
#define IS_SUBMENU(p_msg) ( (p_msg)[0] == '^' )
|
||||||
|
#define IS_EMPTY(p_msg) ( (p_msg)[0] == '#' )
|
||||||
|
|
||||||
void Menu::printText(SDL_Surface *where, const char *msg, SDL_Color clr,
|
void Menu::printText(SDL_Surface *where, const char *msg, SDL_Color clr,
|
||||||
int x, int y, int w, int h)
|
int x, int y, int w, int h)
|
||||||
@ -52,6 +53,8 @@ void Menu::printText(SDL_Surface *where, const char *msg, SDL_Color clr,
|
|||||||
if (buf[i] == '^' || buf[i] == '|')
|
if (buf[i] == '^' || buf[i] == '|')
|
||||||
buf[i] = ' ';
|
buf[i] = ' ';
|
||||||
}
|
}
|
||||||
|
if (IS_EMPTY(buf))
|
||||||
|
buf[0] = ' ';
|
||||||
|
|
||||||
this->font->draw(where, buf, x, y, w, h);
|
this->font->draw(where, buf, x, y, w, h);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
13
menu.hh
13
menu.hh
@ -92,18 +92,21 @@ protected:
|
|||||||
|
|
||||||
submenu_t *findSubmenu(int index);
|
submenu_t *findSubmenu(int index);
|
||||||
|
|
||||||
int getNextEntry(int dy);
|
public:
|
||||||
|
virtual int getNextEntry(int dy);
|
||||||
|
|
||||||
int selectOne(int which);
|
virtual int selectOne(int which);
|
||||||
|
|
||||||
int selectNext(int dx, int dy);
|
virtual int selectNext(int dx, int dy);
|
||||||
|
|
||||||
int selectNext(event_t ev);
|
virtual int selectNext(event_t ev);
|
||||||
|
|
||||||
void pushEvent(event_t ev);
|
virtual void pushEvent(event_t ev);
|
||||||
|
|
||||||
event_t popEvent();
|
event_t popEvent();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
const char **pp_msgs;
|
const char **pp_msgs;
|
||||||
Font *font;
|
Font *font;
|
||||||
SDL_Color text_color;
|
SDL_Color text_color;
|
||||||
|
@ -2,6 +2,16 @@
|
|||||||
|
|
||||||
#include "menu_messages.hh"
|
#include "menu_messages.hh"
|
||||||
|
|
||||||
|
const char **exit_dialogue_messages = (const char*[]){
|
||||||
|
/*00*/ "Do you really want to exit",
|
||||||
|
/*01*/ "Frodo?",
|
||||||
|
/*02*/ "#", /* Empty line */
|
||||||
|
/*03*/ "#",
|
||||||
|
/*04*/ "#",
|
||||||
|
/*06*/ "^|Yes|Cancel",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
const char **main_menu_messages = (const char*[]){
|
const char **main_menu_messages = (const char*[]){
|
||||||
/*00*/ "File",
|
/*00*/ "File",
|
||||||
/*01*/ "^|Insert|Start",
|
/*01*/ "^|Insert|Start",
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define MENU_MESSAGES_HH
|
#define MENU_MESSAGES_HH
|
||||||
|
|
||||||
extern const char **main_menu_messages;
|
extern const char **main_menu_messages;
|
||||||
|
extern const char **exit_dialogue_messages;
|
||||||
extern const char **main_menu_help[];
|
extern const char **main_menu_help[];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
BIN
themes/default/dialogue_box.png
Normal file
BIN
themes/default/dialogue_box.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
Loading…
Reference in New Issue
Block a user