mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-22 11:29:24 +01:00
84 lines
1.8 KiB
C++
84 lines
1.8 KiB
C++
#include "status_bar.hh"
|
|
#include "gui.hh"
|
|
#include "utils.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 *fmt, ...)
|
|
{
|
|
char buf[255];
|
|
va_list ap;
|
|
int r;
|
|
|
|
memset(buf, 0, sizeof(buf));
|
|
va_start(ap, fmt);
|
|
r = vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
|
|
va_end(ap);
|
|
|
|
/* Free the existing message if we are overwriting it */
|
|
free((void*)this->messages[this->head]);
|
|
|
|
this->messages[this->head] = xstrdup(buf);
|
|
|
|
/* If this is the first message, display it as soon as possible */
|
|
if (this->head == this->tail)
|
|
TimerController::controller->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->messages[this->tail] = NULL;
|
|
this->tail = (this->tail + 1) % N_STATUS_MESSAGES;
|
|
|
|
return out;
|
|
}
|
|
|
|
void StatusBar::timeoutCallback()
|
|
{
|
|
const char *text[2];
|
|
|
|
this->cur_message = this->dequeueMessage();
|
|
text[0] = this->cur_message;
|
|
text[1] = NULL;
|
|
|
|
if (this->cur_message)
|
|
this->setText(text);
|
|
else
|
|
this->setText(NULL);
|
|
TimerController::controller->arm(this, 2000);
|
|
free((void *)this->cur_message);
|
|
}
|
|
|
|
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);
|
|
}
|