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/messagebox.cc
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/messagebox.cc')
-rw-r--r--src/client/messagebox.cc150
1 files changed, 150 insertions, 0 deletions
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