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/Makefile.am | 2 + src/client/client.cc | 13 ++++ src/client/client.h | 5 ++ src/client/mainwindow.cc | 2 +- src/client/messagebox.cc | 150 +++++++++++++++++++++++++++++++++++++++++++++++ src/client/messagebox.h | 50 ++++++++++++++++ 6 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 src/client/messagebox.cc create mode 100644 src/client/messagebox.h (limited to 'src/client') 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__ + + -- cgit v1.2.3