mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-25 12:56:59 +01:00
Implement status bar
This commit is contained in:
parent
0eae47a65f
commit
5ec545ff11
13
gui.cpp
13
gui.cpp
@ -68,6 +68,7 @@ Gui::Gui()
|
||||
this->main_menu_bg = NULL;
|
||||
this->infobox = NULL;
|
||||
this->textbox = NULL;
|
||||
this->status_bar_bg = NULL;
|
||||
this->default_font = NULL;
|
||||
this->dialogue_bg = NULL;
|
||||
this->small_font = NULL;
|
||||
@ -104,6 +105,7 @@ bool Gui::setTheme(const char *path)
|
||||
|
||||
this->background = this->loadThemeImage(path, "background.png");
|
||||
this->main_menu_bg = this->loadThemeImage(path, "main_menu_bg.png");
|
||||
this->status_bar_bg = this->loadThemeImage(path, "status_bar.png");
|
||||
this->infobox = this->loadThemeImage(path, "infobox.png");
|
||||
this->textbox = this->loadThemeImage(path, "textbox.png");
|
||||
this->dialogue_bg = this->loadThemeImage(path, "dialogue_box.png");
|
||||
@ -122,6 +124,7 @@ bool Gui::setTheme(const char *path)
|
||||
!this->disc_info ||
|
||||
!this->selected_key ||
|
||||
!this->highlighted_key ||
|
||||
!this->status_bar_bg ||
|
||||
!this->default_font ||
|
||||
!this->small_font)
|
||||
{
|
||||
@ -151,6 +154,8 @@ bool Gui::setTheme(const char *path)
|
||||
/* Create the views */
|
||||
if (!this->mv)
|
||||
{
|
||||
this->status_bar = new StatusBar();
|
||||
|
||||
this->mv = new MainView();
|
||||
this->dv = new DiscView();
|
||||
this->ov = new OptionsView();
|
||||
@ -178,6 +183,9 @@ void Gui::runLogic(void)
|
||||
{
|
||||
GuiView *cur_view = this->peekView();
|
||||
|
||||
this->status_bar->runLogic();
|
||||
this->timerController->tick();
|
||||
|
||||
if (!this->is_active || !cur_view)
|
||||
return;
|
||||
if (this->dlg)
|
||||
@ -186,7 +194,6 @@ void Gui::runLogic(void)
|
||||
this->kbd->runLogic();
|
||||
else
|
||||
cur_view->runLogic();
|
||||
this->timerController->tick();
|
||||
}
|
||||
|
||||
void Gui::pushView(GuiView *view)
|
||||
@ -266,7 +273,10 @@ void Gui::draw(SDL_Surface *where)
|
||||
GuiView *cur_view = this->peekView();
|
||||
|
||||
if (!this->is_active || !cur_view)
|
||||
{
|
||||
this->status_bar->draw(where);
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_BlitSurface(this->background, NULL, screen, NULL);
|
||||
cur_view->draw(where);
|
||||
@ -274,6 +284,7 @@ void Gui::draw(SDL_Surface *where)
|
||||
this->kbd->draw(where);
|
||||
if (this->dlg)
|
||||
this->dlg->draw(where);
|
||||
this->status_bar->draw(where);
|
||||
}
|
||||
|
||||
void Gui::activate()
|
||||
|
3
gui.hh
3
gui.hh
@ -12,6 +12,7 @@
|
||||
#include <Prefs.h>
|
||||
|
||||
class DialogueBox;
|
||||
class StatusBar;
|
||||
|
||||
class MainView;
|
||||
class BindKeysView;
|
||||
@ -73,6 +74,7 @@ public:
|
||||
|
||||
SDL_Surface *background;
|
||||
SDL_Surface *main_menu_bg;
|
||||
SDL_Surface *status_bar_bg;
|
||||
SDL_Surface *infobox;
|
||||
SDL_Surface *textbox;
|
||||
SDL_Surface *dialogue_bg;
|
||||
@ -89,6 +91,7 @@ public:
|
||||
/* Handled specially */
|
||||
VirtualKeyboard *kbd;
|
||||
DialogueBox *dlg;
|
||||
StatusBar *status_bar;
|
||||
|
||||
MainView *mv;
|
||||
DiscView *dv;
|
||||
|
65
status_bar.cpp
Normal file
65
status_bar.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#include "status_bar.hh"
|
||||
#include "gui.hh"
|
||||
|
||||
StatusBar::StatusBar() : Menu(Gui::gui->small_font), TimeoutHandler()
|
||||
{
|
||||
memset(this->messages, 0, sizeof(this->messages));
|
||||
this->head = this->tail = 0;
|
||||
this->cur_message = NULL;
|
||||
this->setSelectedBackground(NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
void StatusBar::queueMessage(const char *message)
|
||||
{
|
||||
this->messages[this->head] = message;
|
||||
|
||||
/* If this is the first message, display it as soon as possible */
|
||||
if (this->head == this->tail)
|
||||
Gui::gui->timerController->arm(this, 1);
|
||||
|
||||
this->head = (this->head + 1) % N_STATUS_MESSAGES;
|
||||
if (this->head == this->tail)
|
||||
this->tail = (this->tail + 1) % N_STATUS_MESSAGES;
|
||||
}
|
||||
|
||||
const char *StatusBar::dequeueMessage()
|
||||
{
|
||||
const char *out = this->messages[this->tail];
|
||||
|
||||
if (this->head == this->tail)
|
||||
return NULL;
|
||||
this->tail = (this->tail + 1) % N_STATUS_MESSAGES;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
void StatusBar::timeoutCallback()
|
||||
{
|
||||
static const char *text[2];
|
||||
|
||||
this->cur_message = this->dequeueMessage();
|
||||
if (this->cur_message)
|
||||
Gui::gui->timerController->arm(this, 500);
|
||||
text[0] = this->cur_message;
|
||||
text[1] = NULL;
|
||||
this->setText(text);
|
||||
}
|
||||
|
||||
void StatusBar::draw(SDL_Surface *where)
|
||||
{
|
||||
SDL_Rect dst;
|
||||
int x = 130;
|
||||
int y = 12;
|
||||
int w = 496;
|
||||
int h = 56;
|
||||
|
||||
if (!this->cur_message)
|
||||
return;
|
||||
|
||||
/* Blit the backgrounds */
|
||||
dst = (SDL_Rect){x,y,0,0};
|
||||
SDL_BlitSurface(Gui::gui->status_bar_bg, NULL, where, &dst);
|
||||
|
||||
Menu::draw(where, x+4, y+4, w, h);
|
||||
}
|
37
status_bar.hh
Normal file
37
status_bar.hh
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef __STATUS_BAR_HH__
|
||||
#define __STATUS_BAR_HH__
|
||||
|
||||
#include "menu.hh"
|
||||
#include "gui.hh"
|
||||
#include "timer.hh"
|
||||
|
||||
#define N_STATUS_MESSAGES 8
|
||||
|
||||
class StatusBar : public Menu, TimeoutHandler
|
||||
{
|
||||
public:
|
||||
StatusBar();
|
||||
|
||||
void queueMessage(const char *message);
|
||||
|
||||
virtual void draw(SDL_Surface *where);
|
||||
|
||||
virtual void hoverCallback(int which) {};
|
||||
|
||||
virtual void selectCallback(int which) {};
|
||||
|
||||
virtual void escapeCallback(int which) {};
|
||||
|
||||
protected:
|
||||
virtual void timeoutCallback();
|
||||
|
||||
const char *dequeueMessage();
|
||||
|
||||
const char *messages[N_STATUS_MESSAGES];
|
||||
const char *cur_message;
|
||||
int head, tail;
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
#endif /* __DIALOGUE_BOX_HH__ */
|
Loading…
Reference in New Issue
Block a user