Add server message box support

This commit is contained in:
simon.kagstrom 2010-02-28 07:59:36 +00:00
parent fa26ae2980
commit 75385f566b
11 changed files with 124 additions and 10 deletions

View File

@ -37,7 +37,7 @@ CPP_SRCS=Src/C64_SC.cpp Src/main.cpp Src/Display.cpp Src/Prefs.cpp Src/SID.cpp \
Src/gui/dialogue_box.cpp Src/gui/widget.cpp \ Src/gui/dialogue_box.cpp Src/gui/widget.cpp \
Src/gui/game_info.cpp Src/gui/status_bar.cpp Src/gui/gui.cpp Src/gui/listener.cpp \ Src/gui/game_info.cpp Src/gui/status_bar.cpp Src/gui/gui.cpp Src/gui/listener.cpp \
Src/timer.cpp Src/utils.cpp Src/gui/virtual_keyboard.cpp Src/gui/menu.cpp \ Src/timer.cpp Src/utils.cpp Src/gui/virtual_keyboard.cpp Src/gui/menu.cpp \
Src/gui/file_browser.cpp Src/data_store.cpp Src/gui/file_browser.cpp Src/data_store.cpp Src/gui/network_server_messages.cpp
C_SRCS=Src/d64-read.c Src/gui/menu_messages.c C_SRCS=Src/d64-read.c Src/gui/menu_messages.c

View File

@ -67,7 +67,7 @@ CPPFILES := Display.cpp main.cpp Prefs.cpp SID.cpp REU.cpp IEC.cpp 1541fs.cpp \
Network.cpp gui/dialogue_box.cpp gui/widget.cpp utils.cpp \ Network.cpp gui/dialogue_box.cpp gui/widget.cpp utils.cpp \
gui/game_info.cpp gui/status_bar.cpp gui/gui.cpp gui/listener.cpp \ gui/game_info.cpp gui/status_bar.cpp gui/gui.cpp gui/listener.cpp \
timer.cpp utils.cpp gui/virtual_keyboard.cpp gui/menu.cpp \ timer.cpp utils.cpp gui/virtual_keyboard.cpp gui/menu.cpp \
gui/file_browser.cpp data_store.cpp gui/file_browser.cpp data_store.cpp Src/gui/network_server_messages.cpp
sFILES := sFILES :=
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))

View File

@ -30,6 +30,7 @@
#include "gui/gui.hh" #include "gui/gui.hh"
#include "gui/status_bar.hh" #include "gui/status_bar.hh"
#include "gui/network_user_menu.hh" #include "gui/network_user_menu.hh"
#include "gui/network_server_messages.hh"
#if defined(GEKKO) #if defined(GEKKO)
# include <wiiuse/wpad.h> # include <wiiuse/wpad.h>
@ -961,6 +962,9 @@ bool Network::DecodeUpdate(C64Display *display, uint8 *js, MOS6581 *dst)
NetworkUpdateTextMessage *tm = (NetworkUpdateTextMessage*)p->data; NetworkUpdateTextMessage *tm = (NetworkUpdateTextMessage*)p->data;
Gui::gui->status_bar->queueMessage((const char*)tm->data); Gui::gui->status_bar->queueMessage((const char*)tm->data);
/* Queue up text message */
if (tm->flags & NETWORK_UPDATE_TEXT_MESSAGE_BROADCAST)
Gui::gui->server_msgs->queueMessage((const char *)tm->data);
} break; } break;
case REGISTER_DATA: case REGISTER_DATA:
{ {

View File

@ -16,6 +16,8 @@
#include "sdl_ttf_font.hh" #include "sdl_ttf_font.hh"
#include "virtual_keyboard.hh" #include "virtual_keyboard.hh"
#include "network_server_messages.hh"
extern SDL_Surface *screen; extern SDL_Surface *screen;
#define THEME_ROOT_PATH "themes" #define THEME_ROOT_PATH "themes"
@ -135,6 +137,8 @@ Gui::~Gui()
if (this->status_bar) if (this->status_bar)
delete this->status_bar; delete this->status_bar;
if (this->server_msgs)
delete this->server_msgs;
if (this->dlg) if (this->dlg)
delete this->dlg; delete this->dlg;
@ -233,6 +237,7 @@ bool Gui::setTheme(const char *path)
if (!this->mv) if (!this->mv)
{ {
this->status_bar = new StatusBar(); this->status_bar = new StatusBar();
this->server_msgs = new NetworkServerMessages();
this->mv = new MainView(); this->mv = new MainView();
this->dv = new DiscView(); this->dv = new DiscView();
@ -262,6 +267,7 @@ void Gui::runLogic(void)
if (!this->is_active || !cur_view) if (!this->is_active || !cur_view)
return; return;
Gui::gui->server_msgs->runLogic();
if (this->dlg) if (this->dlg)
this->dlg->runLogic(); this->dlg->runLogic();
else else

View File

@ -15,6 +15,7 @@
class DialogueBox; class DialogueBox;
class StatusBar; class StatusBar;
class NetworkServerMessages;
class GameInfo; class GameInfo;
class MainView; class MainView;
@ -105,6 +106,7 @@ public:
VirtualKeyboard *kbd; VirtualKeyboard *kbd;
DialogueBox *dlg; DialogueBox *dlg;
StatusBar *status_bar; StatusBar *status_bar;
NetworkServerMessages *server_msgs;
MainView *mv; MainView *mv;
DiscView *dv; DiscView *dv;

View File

@ -190,11 +190,9 @@ public:
dst = (SDL_Rect){350,13,0,0}; dst = (SDL_Rect){350,13,0,0};
SDL_BlitSurface(Gui::gui->infobox, NULL, where, &dst); SDL_BlitSurface(Gui::gui->infobox, NULL, where, &dst);
dst = (SDL_Rect){350,242,0,0};
SDL_BlitSurface(Gui::gui->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); this->help->draw(where, 354, 24, 264, 210);
Gui::gui->server_msgs->draw(where);
} }
protected: protected:

View File

@ -186,11 +186,9 @@ public:
dst = (SDL_Rect){350,13,0,0}; dst = (SDL_Rect){350,13,0,0};
SDL_BlitSurface(Gui::gui->infobox, NULL, where, &dst); SDL_BlitSurface(Gui::gui->infobox, NULL, where, &dst);
dst = (SDL_Rect){350,242,0,0};
SDL_BlitSurface(Gui::gui->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); this->help->draw(where, 354, 24, 264, 210);
Gui::gui->server_msgs->draw(where);
} }
protected: protected:

View File

@ -0,0 +1,78 @@
#include "network_server_messages.hh"
#include "utils.hh"
NetworkServerMessages::NetworkServerMessages() : StatusBar()
{
unsigned i;
for (i = 0; i < ARRAY_SIZE(this->flowed_messages) - 1; i++)
this->flowed_messages[i] = (char *)xmalloc(28);
this->flowed_messages[i] = NULL;
}
NetworkServerMessages::~NetworkServerMessages()
{
for (unsigned i = 0; i < ARRAY_SIZE(this->flowed_messages) - 1; i++)
free(this->flowed_messages[i]);
}
void NetworkServerMessages::draw(SDL_Surface *where)
{
SDL_Rect dst;
int x = 350;
int y = 242;
int w = Gui::gui->textbox->w;
int h = Gui::gui->textbox->h;
dst = (SDL_Rect){x,y,0,0};
SDL_BlitSurface(Gui::gui->textbox, NULL, where, &dst);
Menu::draw(where, x+6, y+8, w-6, h-8);
}
void NetworkServerMessages::timeoutCallback()
{
const char *cur = this->messages[this->tail];
char *cpy = xstrdup(cur);
char *msgp;
char *p;
size_t line_len = 0;
size_t line = 0;
for (unsigned i = 0; i < ARRAY_SIZE(this->flowed_messages) - 1; i++)
this->flowed_messages[i][0] = '\0';
p = strtok_r(cpy, " ", &msgp);
while (p)
{
int word_len = strlen(p);
if (line_len + word_len > 24)
{
line++;
/* Too long! */
if (line >= ARRAY_SIZE(this->flowed_messages))
break;
line_len = 0;
}
strcat(this->flowed_messages[line], p);
strcat(this->flowed_messages[line], " ");
line_len += word_len + 1;
p = strtok_r(NULL, " ", &msgp);
}
for (line = line + 1; line < ARRAY_SIZE(this->flowed_messages) - 1; line++)
strcpy(this->flowed_messages[line], "#");
this->setText((const char **)this->flowed_messages);
while (1)
{
this->tail = (this->tail + 1) % N_STATUS_MESSAGES;
if (this->messages[this->tail])
break;
}
Gui::gui->timerController->arm(this, 5000);
free(cpy);
}

View File

@ -0,0 +1,24 @@
#ifndef NETWORK_SERVER_MESSAGES_HH
#define NETWORK_SERVER_MESSAGES_HH
#include <SDL.h>
#include "status_bar.hh"
class NetworkServerMessages : public StatusBar
{
public:
NetworkServerMessages();
~NetworkServerMessages();
virtual void draw(SDL_Surface *where);
protected:
virtual void timeoutCallback();
private:
char *flowed_messages[8];
};
#endif /* NETWORK_SERVER_MESSAGES_HH */

View File

@ -13,6 +13,9 @@ StatusBar::StatusBar() : Menu(Gui::gui->small_font), TimeoutHandler()
void StatusBar::queueMessage(const char *message) void StatusBar::queueMessage(const char *message)
{ {
/* Free the existing message if we are overwriting it */
free((void*)this->messages[this->head]);
this->messages[this->head] = xstrdup(message); this->messages[this->head] = xstrdup(message);
/* If this is the first message, display it as soon as possible */ /* If this is the first message, display it as soon as possible */
@ -30,6 +33,7 @@ const char *StatusBar::dequeueMessage()
if (this->head == this->tail) if (this->head == this->tail)
return NULL; return NULL;
this->messages[this->tail] = NULL;
this->tail = (this->tail + 1) % N_STATUS_MESSAGES; this->tail = (this->tail + 1) % N_STATUS_MESSAGES;
return out; return out;

View File

@ -6,9 +6,9 @@
#include "menu.hh" #include "menu.hh"
#include "gui.hh" #include "gui.hh"
#define N_STATUS_MESSAGES 8 #define N_STATUS_MESSAGES 10
class StatusBar : public Menu, TimeoutHandler class StatusBar : public Menu, public TimeoutHandler
{ {
public: public:
StatusBar(); StatusBar();