diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client/Makefile.am | 2 | ||||
-rw-r--r-- | src/client/mainmenu.cc | 3 | ||||
-rw-r--r-- | src/client/serverlistmenu.cc | 173 | ||||
-rw-r--r-- | src/client/serverlistmenu.h | 70 |
4 files changed, 247 insertions, 1 deletions
diff --git a/src/client/Makefile.am b/src/client/Makefile.am index 21704f4..fbb075f 100644 --- a/src/client/Makefile.am +++ b/src/client/Makefile.am @@ -43,6 +43,7 @@ noinst_HEADERS = \ playersettingsmenu.h \ reputationwindow.h \ savegamemenu.h \ + serverlistmenu.h \ soundext.h \ targeticonbutton.h \ targets.h \ @@ -85,6 +86,7 @@ libclient_la_SOURCES = \ playersettingsmenu.cc \ reputationwindow.cc \ savegamemenu.cc \ + serverlistmenu.cc \ soundext.cc \ targeticonbutton.cc \ targets.cc \ diff --git a/src/client/mainmenu.cc b/src/client/mainmenu.cc index 823ebfb..0e61655 100644 --- a/src/client/mainmenu.cc +++ b/src/client/mainmenu.cc @@ -11,6 +11,7 @@ #include "client/mainmenu.h" #include "client/playersettingsmenu.h" #include "client/savegamemenu.h" +#include "client/serverlistmenu.h" #include "core/core.h" #include "core/gameinterface.h" #include "core/application.h" @@ -218,7 +219,7 @@ void MainMenu::load() mainmenu_optionsmenu = 0; // menu to connect to remote servers - mainmenu_connectmenu = 0; + mainmenu_connectmenu = (ui::Widget *) new ServerListMenu(this, "connect"); // load game menu mainmenu_loadmenu = (ui::Widget *) new SaveGameMenu(this, "load", SaveGameMenu::Load); diff --git a/src/client/serverlistmenu.cc b/src/client/serverlistmenu.cc new file mode 100644 index 0000000..44bd302 --- /dev/null +++ b/src/client/serverlistmenu.cc @@ -0,0 +1,173 @@ +/* + client/serverlistmenu.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include "client/serverlistmenu.h" +#include "client/closeiconbutton.h" + +#include "ui/ui.h" + +#include "core/commandbuffer.h" + +#include "sys/sys.h" + + +namespace client +{ + +ServerListMenu::ServerListMenu(ui::Widget *parent, const char *label) : + ui::Window(parent) +{ + set_label(label); + set_border(true); + set_background(true); + set_font(ui::root()->font_small()); + + // window title + serverlistmenu_titlelabel = new ui::Label(this); + serverlistmenu_titlelabel->set_label("connect"); + serverlistmenu_titlelabel->set_text("CONNECT"); + serverlistmenu_titlelabel->set_background(false); + serverlistmenu_titlelabel->set_border(false); + serverlistmenu_titlelabel->set_font(ui::root()->font_large()); + serverlistmenu_titlelabel->set_alignment(ui::AlignCenter); + + // close button + serverlistmenu_closebutton = new CloseIconButton(serverlistmenu_titlelabel); + + // server listview + serverlistmenu_serverlistview = new ui::ListView(this); + serverlistmenu_serverlistview->set_label("files"); + + // save button + serverlistmenu_connectbutton = new ui::Button(this, "Connect"); + serverlistmenu_connectbutton->set_label("connect"); +} + +ServerListMenu::~ServerListMenu() +{ +} + +void ServerListMenu::resize() +{ + const float padding = ui::UI::padding; + + // resize title label + serverlistmenu_titlelabel->set_size(width() - padding * 2.0f, serverlistmenu_titlelabel->font()->height()); + serverlistmenu_titlelabel->set_location(padding, padding); + + // resize close button + serverlistmenu_closebutton->set_size(serverlistmenu_titlelabel->font()->height(), serverlistmenu_titlelabel->font()->height()); + serverlistmenu_closebutton->set_location(serverlistmenu_titlelabel->width() - serverlistmenu_closebutton->width(), 0); + + // resize files listview + serverlistmenu_serverlistview->set_size( + width() - padding * 2.0f, + height() - ui::UI::elementsize.height() - padding * 3.0f - serverlistmenu_titlelabel->bottom() + ); + serverlistmenu_serverlistview->set_location( + padding, + serverlistmenu_titlelabel->bottom() + padding + ); + + // resize connect button + serverlistmenu_connectbutton->set_size(ui::UI::elementsize); + serverlistmenu_connectbutton->set_location( + (width() - padding * 2.0f - serverlistmenu_connectbutton->width()) * 0.5f, + height() - padding - serverlistmenu_connectbutton->height() + ); +} + +void ServerListMenu::refresh() +{ + const float padding = ui::UI::padding; + + serverlistmenu_serverlistview->clear(); + serverlistmenu_connectbutton->show(); + serverlistmenu_connectbutton->disable(); + + // FIXME support custom port numbers + ui::ListItem *listitem = new ui::ListItem(serverlistmenu_serverlistview, "osirion.org development server"); + listitem->set_value("osirion.org"); + listitem->set_sortkey(""); + + listitem->set_font(ui::root()->font_tiny()); + listitem->set_height(listitem->font()->height() + padding); + + serverlistmenu_serverlistview->sort(false); + serverlistmenu_serverlistview->event_resize(); + +} + +void ServerListMenu::hide() +{ + Window::hide(); +} + +void ServerListMenu::show() +{ + Window::show(); + refresh(); +} + +void ServerListMenu::show_connect_info() +{ + if (!serverlistmenu_serverlistview->selected()) { + serverlistmenu_connectbutton->disable(); + } else { + serverlistmenu_connectbutton->enable(); + } +} + +void ServerListMenu::connect() +{ + if (serverlistmenu_serverlistview->selected()) { + std::stringstream str; + str << "connect " << serverlistmenu_serverlistview->selected()->value(); + core::CommandBuffer::exec(str.str()); + } +} + +bool ServerListMenu::on_keypress(const int key, const unsigned int modifier) +{ + if (key == SDLK_ESCAPE) { + if (visible()) { + // hide the parent mainwindow + parent()->hide(); + return true; + } + } + return false; +} + +bool ServerListMenu::on_emit(ui::Widget *sender, const ui::Widget::Event event, void *data) +{ + if (sender == serverlistmenu_closebutton) { + if (event == ui::Widget::EventButtonClicked) { + // hide the parent mainwindow + parent()->hide(); + return true; + } + } else if (sender == serverlistmenu_connectbutton) { + if (event == ui::Widget::EventButtonClicked) { + // do the actual connect and close the window + parent()->hide(); + connect(); + return true; + } + } else if (sender == serverlistmenu_serverlistview) { + if (event == ui::Widget::EventListViewChanged) { + show_connect_info(); + return true; + } + } + + return Window::on_emit(sender, event, data); +} + + +} // namespace client + + diff --git a/src/client/serverlistmenu.h b/src/client/serverlistmenu.h new file mode 100644 index 0000000..6638bd4 --- /dev/null +++ b/src/client/serverlistmenu.h @@ -0,0 +1,70 @@ +/* + client/serverlistmenu.h + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#ifndef __INCLUDED_CLIENT_SERVERLISTMENU_H__ +#define __INCLUDED_CLIENT_SERVERLISTMENU_H__ + +#include "ui/button.h" +#include "ui/iconbutton.h" +#include "ui/inputbox.h" +#include "ui/label.h" +#include "ui/listview.h" +#include "ui/window.h" + +namespace client +{ + +class ServerListMenu : public ui::Window +{ +public: + enum Mode { Save = 0, Load = 1 }; + + ServerListMenu(ui::Widget *parent = 0, const char *label = 0); + virtual ~ServerListMenu(); + +protected: + + /// called when the widget receives a key press + virtual bool on_keypress(const int key, const unsigned int modifier); + + /// called if the widget receives an emit evet + virtual bool on_emit(ui::Widget *sender, const ui::Widget::Event event, void *data); + + virtual void resize(); + + virtual void show(); + + virtual void hide(); + + void refresh(); + + /** + * @brief connect to the currently selected server + * */ + void connect(); + + /** + * @brief show information for the currently selected server + * */ + void show_connect_info(); + +private: + + ui::Label *serverlistmenu_titlelabel; + ui::IconButton *serverlistmenu_closebutton; + ui::ListView *serverlistmenu_serverlistview; + ui::Button *serverlistmenu_connectbutton; + + +}; // class ServerListMenu + + +} // namespace client + + +#endif // __INCLUDED_CLIENT_SERVERLISTMENU_H__ + + |