From 493e4317e19725e2de2d51753e5c1906bf9c64ba Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 7 Dec 2014 23:27:31 +0000 Subject: 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. --- src/client/messagebox.cc | 150 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/client/messagebox.cc (limited to 'src/client/messagebox.cc') 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 -- cgit v1.2.3