Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2014-12-07 23:27:31 +0000
committerStijn Buys <ingar@osirion.org>2014-12-07 23:27:31 +0000
commit493e4317e19725e2de2d51753e5c1906bf9c64ba (patch)
treec46831d6d661a79b5da6580d4472d39a615fedea /src/client
parent941c64546ca22b87a9153d36e9e3fe59c18abafe (diff)
Implemented messageboxes and the ability for the game module to send them to remote clients,
send a messagebox if the player's ship is destroyed, this fixes having to press the respawn button twice. added messageboxes on network connection failures.
Diffstat (limited to 'src/client')
-rw-r--r--src/client/Makefile.am2
-rw-r--r--src/client/client.cc13
-rw-r--r--src/client/client.h5
-rw-r--r--src/client/mainwindow.cc2
-rw-r--r--src/client/messagebox.cc150
-rw-r--r--src/client/messagebox.h50
6 files changed, 221 insertions, 1 deletions
diff --git a/src/client/Makefile.am b/src/client/Makefile.am
index f6d447d..5577879 100644
--- a/src/client/Makefile.am
+++ b/src/client/Makefile.am
@@ -34,6 +34,7 @@ noinst_HEADERS = \
mainwindow.h \
mapwidget.h \
mapwindow.h \
+ messagebox.h \
notifications.h \
reputationwindow.h \
savegamemenu.h \
@@ -70,6 +71,7 @@ libclient_la_SOURCES = \
mainwindow.cc \
mapwidget.cc \
mapwindow.cc \
+ messagebox.cc \
notifications.cc \
reputationwindow.cc \
savegamemenu.cc \
diff --git a/src/client/client.cc b/src/client/client.cc
index 128ac7f..336baee 100644
--- a/src/client/client.cc
+++ b/src/client/client.cc
@@ -105,12 +105,18 @@ void Client::init(int count, char **arguments)
// initialize user interface
ui::init();
+ // main application window
client_mainwindow = new MainWindow(ui::root());
+ // messagebox window
+ client_messagebox = new Messagebox(ui::root());
+ client_messagebox->hide();
+
// FIXME needs to be a mainwindow child
client_testmodelwindow = new TestModelWindow(ui::root());
client_testmodelwindow->hide();
+
// Initialize the video subsystem
if (!video::init()) {
quit(1);
@@ -391,6 +397,13 @@ void Client::notify_message(const core::Message::Channel channel, const std::str
con_print << message << std::endl;
}
+void Client::notify_messagebox(const std::string & text, const std::string &label1, const std::string command1, const std::string &label2, const std::string command2)
+{
+ client_messagebox->set_text(text);
+ client_messagebox->set_buttons(label1, command1, label2, command2);
+ client_messagebox->show();
+}
+
void Client::notify_loader(const std::string &message)
{
video::set_loader_message(message.c_str());
diff --git a/src/client/client.h b/src/client/client.h
index f4bfcf3..2b0d187 100644
--- a/src/client/client.h
+++ b/src/client/client.h
@@ -14,6 +14,7 @@
#include "client/soundext.h"
#include "client/testmodelwindow.h"
#include "client/mainwindow.h"
+#include "client/messagebox.h"
#include "render/renderext.h"
/// client part of the engine
@@ -41,6 +42,9 @@ public:
/// text notifications from the core
virtual void notify_message(const core::Message::Channel channel, const std::string &message);
+
+ /// messagebox notifications
+ virtual void notify_messagebox(const std::string & text, const std::string &label1, const std::string command1, const std::string &label2, const std::string command2);
/// loading message notification
virtual void notify_loader(const std::string &message);
@@ -111,6 +115,7 @@ private:
MainWindow *client_mainwindow;
TestModelWindow *client_testmodelwindow;
+ Messagebox *client_messagebox;
unsigned long previous_timestamp;
};
diff --git a/src/client/mainwindow.cc b/src/client/mainwindow.cc
index 1d9f4ff..aa113a7 100644
--- a/src/client/mainwindow.cc
+++ b/src/client/mainwindow.cc
@@ -126,7 +126,7 @@ void MainWindow::draw()
} else if (core::localcontrol()->state() == core::Entity::Destroyed) {
mainwindow_gamewindow->hide();
- mainwindow_mainmenu->show_menu("respawn");
+ // game module sends a messagebox to take approriate action
} else if (mainwindow_gamewindow->hidden()) {
mainwindow_gamewindow->show();
diff --git a/src/client/messagebox.cc b/src/client/messagebox.cc
new file mode 100644
index 0000000..f0e449a
--- /dev/null
+++ b/src/client/messagebox.cc
@@ -0,0 +1,150 @@
+/*
+ client/messagebox.cc
+ This file is part of the Osirion project and is distributed under
+ the terms and conditions of the GNU General Public License version 2
+*/
+
+#include "audio/audio.h"
+#include "client/messagebox.h"
+#include "core/commandbuffer.h"
+#include "ui/ui.h"
+
+namespace client
+{
+
+Messagebox::Messagebox(ui::Widget * parent) :
+ ui::Window(parent)
+{
+ set_border(false);
+ set_background(false);
+ set_label("messagebox");
+
+ messagebox_frame = new ui::Window(this);
+ messagebox_frame->set_border(true);
+ messagebox_frame->set_background(true);
+
+ messagebox_label = new ui::Label(messagebox_frame);
+ messagebox_label->set_border(false);
+ messagebox_label->set_background(false);
+ messagebox_label->set_alignment(ui::AlignTop | ui::AlignHCenter);
+
+ messagebox_button1 = new ui::Button(messagebox_frame);
+ messagebox_button2 = new ui::Button(messagebox_frame);
+}
+
+Messagebox::~Messagebox()
+{
+}
+
+void Messagebox::set_text(const std::string &text)
+{
+ messagebox_label->set_text(text);
+}
+
+void Messagebox::set_buttons(const std::string &text1, const std::string &command1, const std::string &text2, const std::string &command2)
+{
+ if (text1.size()) {
+ messagebox_button1->set_text(text1);
+ } else {
+ messagebox_button1->set_text("Close");
+ }
+ if (command1.size()) {
+ messagebox_button1->set_command("remote " + command1);
+ } else {
+ messagebox_button1->set_command("");
+ }
+
+ messagebox_button2->set_text(text2);
+ if (command2.size()) {
+ messagebox_button2->set_command("remote " + command2);
+ } else {
+ messagebox_button2->set_command("");
+ }
+
+ if (text2.size()) {
+ messagebox_button2->show();
+ } else {
+ messagebox_button2->hide();
+ }
+}
+
+void Messagebox::resize()
+{
+ const float padding = ui::root()->font_large()->height();
+
+ set_size(parent()->size());
+
+ messagebox_frame->set_size(
+ ui::UI::elementsize.width() * 3.0f,
+ ui::UI::elementsize.width() * 1.5f
+ );
+ messagebox_frame->set_location(
+ (width() - messagebox_frame->width()) * 0.5f,
+ (height() - messagebox_frame->height()) * 0.5f
+ );
+
+ messagebox_label->set_size(messagebox_frame->width() - padding * 2.0f, messagebox_frame->height() - padding * 2.0f);
+ messagebox_label->set_location(padding, padding);
+
+ messagebox_button1->set_size(ui::UI::elementsize);
+ messagebox_button2->set_size(ui::UI::elementsize);
+
+ if (messagebox_button2->visible()) {
+ const float l = (messagebox_frame->width() - messagebox_button1->width() - messagebox_button2->width() - padding * 2.0f) * 0.5f;
+ messagebox_button1->set_location(l, messagebox_frame->height() - messagebox_button1->height() - padding);
+ messagebox_button2->set_location(messagebox_button1->right() + padding, messagebox_frame->height() - messagebox_button2->height() - padding);
+ } else {
+ messagebox_button1->set_location((messagebox_frame->width() - messagebox_button1->width()) * 0.5f, messagebox_frame->height() - messagebox_button1->height() - padding);
+ }
+}
+
+bool Messagebox::on_emit(Widget *sender, const Event event, void *data)
+{
+ if ((sender == messagebox_button1) || (sender == messagebox_button2)) {
+ if (event == Widget::EventButtonClicked) {
+ hide();
+ }
+ return true;
+ }
+
+ return false;
+}
+
+bool Messagebox::on_keypress(const int key, const unsigned int modifier)
+{
+ std::string command;
+
+ switch (key) {
+ case SDLK_RETURN:
+ case SDLK_KP_ENTER:
+ command.assign(messagebox_button1->command());
+ if (command.size()) {
+ core::cmd() << command << std::endl;
+ }
+ audio::play("ui/clicked");
+ hide();
+ return true;
+ break;
+
+ case SDLK_ESCAPE:
+ if (messagebox_button2->visible()) {
+ command.assign(messagebox_button2->command());
+ } else {
+ command.assign(messagebox_button1->command());
+ }
+ if (command.size()) {
+ core::cmd() << command << std::endl;
+ }
+ audio::play("ui/clicked");
+ hide();
+ return true;
+ break;
+
+ default:
+ break;
+ }
+
+ return Window::on_keypress(key, modifier);
+}
+
+} // namespace client
diff --git a/src/client/messagebox.h b/src/client/messagebox.h
new file mode 100644
index 0000000..ac1d46b
--- /dev/null
+++ b/src/client/messagebox.h
@@ -0,0 +1,50 @@
+/*
+ client/messagebox.h
+ This file is part of the Osirion project and is distributed under
+ the terms and conditions of the GNU General Public License version 2
+*/
+
+#ifndef __INCLUDED_CLIENT_MESSAGEBOX_H__
+#define __INCLUDED_CLIENT_MESSAGEBOX_H__
+
+#include "ui/window.h"
+#include "ui/button.h"
+#include "ui/label.h"
+
+namespace client
+{
+
+/**
+ * @brief a generic messagebox window class
+ * */
+class Messagebox : public ui::Window
+{
+public:
+ Messagebox(ui::Widget *parent = 0);
+ virtual ~Messagebox();
+
+ void set_text(const std::string &text);
+
+ void set_buttons(const std::string &text1, const std::string &command1, const std::string &text2, const std::string &command2);
+
+protected:
+ virtual void resize();
+
+ virtual bool on_keypress(const int key, const unsigned int modifier);
+
+ virtual bool on_emit(Widget *sender, const Event event, void *data);
+
+private:
+ /// the actual dialog widget
+ ui::Window *messagebox_frame;
+
+ ui::Label *messagebox_label;
+ ui::Button *messagebox_button1;
+ ui::Button *messagebox_button2;
+};
+
+}
+
+#endif // __INCLUDED_CLIENT_MESSAGEBOX_H__
+
+