diff options
Diffstat (limited to 'src/client')
-rw-r--r-- | src/client/Makefile.am | 2 | ||||
-rw-r--r-- | src/client/galaxymapwidget.cc | 39 | ||||
-rw-r--r-- | src/client/mainmenu.cc | 3 | ||||
-rw-r--r-- | src/client/mapwidget.cc | 49 | ||||
-rw-r--r-- | src/client/savegamemenu.cc | 28 | ||||
-rw-r--r-- | src/client/serverlistmenu.cc | 173 | ||||
-rw-r--r-- | src/client/serverlistmenu.h | 70 | ||||
-rw-r--r-- | src/client/video.cc | 2 |
8 files changed, 349 insertions, 17 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/galaxymapwidget.cc b/src/client/galaxymapwidget.cc index 25460b8..4bcf7c5 100644 --- a/src/client/galaxymapwidget.cc +++ b/src/client/galaxymapwidget.cc @@ -19,6 +19,9 @@ GalaxyMapWidget::GalaxyMapWidget(ui::Widget *parent) : ui::Widget(parent) galaxymapwidget_zone = 0; galaxymapwidget_hover_id = 0; galaxymapwidget_zoom = 1.0f; + + // make sure the map has a tooltip + set_tooltip(); } GalaxyMapWidget::~GalaxyMapWidget() @@ -112,11 +115,13 @@ void GalaxyMapWidget::draw() // global mouse cursor location const math::Vector2f cursor(ui::root()->global_mouse_coords()); galaxymapwidget_hover_id = 0; + set_tooltip(); // map center //math::Vector2f map_center(map_location[0] + map_size / 2.0f, map_location[1] + map_size / 2.0f); math::Vector2f icon_location; - const float r = 12.0f; // radius of map icons + const float r = 12.0f; // radius of map icons + const float rt = 24.0f; // radius of target icons float scale = 1024.0f; // galaxy size (in zone location units) math::Color color(1.0f, 1.0f, 1.0f, 1.0f); const core::Zone *zone = 0; @@ -149,6 +154,7 @@ void GalaxyMapWidget::draw() if (math::distancesquared(cursor, icon_location) < (r*r)) { galaxymapwidget_hover_id = zone->id(); + set_tooltip(zone->name()); } if (zone == galaxymapwidget_zone) @@ -180,6 +186,37 @@ void GalaxyMapWidget::draw() } gl::end(); + + if (galaxymapwidget_zone) + { + icon_location.assign(map_location); + icon_location[0] += map_size / scale * galaxymapwidget_zone->location().x(); + icon_location[1] += map_size - map_size / scale * galaxymapwidget_zone->location().y(); // flip vertically + + // draw target icon + const size_t texture_target = render::Textures::load("bitmaps/icons/map_target"); + render::Textures::bind(texture_target); + + gl::begin(gl::Quads); + + math::Color color(1.0); + gl::color(color); + + glTexCoord2f(0.0f, 0.0f); + gl::vertex(icon_location.x() - rt, icon_location.y() - rt); + + glTexCoord2f(1.0f, 0.0f); + gl::vertex(icon_location.x() + rt, icon_location.y() - rt); + + glTexCoord2f(1.0f, 1.0f); + gl::vertex(icon_location.x() + rt, icon_location.y() + rt); + + glTexCoord2f(0.0f, 1.0f); + gl::vertex(icon_location.x() - rt, icon_location.y() + rt); + + gl::end(); + } + gl::disable(GL_TEXTURE_2D); // if (has_mouse_focus()) { 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/mapwidget.cc b/src/client/mapwidget.cc index 20bb979..49100b2 100644 --- a/src/client/mapwidget.cc +++ b/src/client/mapwidget.cc @@ -24,6 +24,9 @@ MapWidget::MapWidget(ui::Widget *parent) : ui::Widget(parent) mapwidget_target = 0; mapwidget_hover_id = 0; mapwidget_zoom = 1.0f; + + // make sure the map has a tooltip + set_tooltip(); } MapWidget::~MapWidget() @@ -43,6 +46,12 @@ void MapWidget::set_target(const core::Entity *entity) void MapWidget::set_zone(core::Zone *zone) { mapwidget_zone = zone; + + // verify current target + if (mapwidget_target && (mapwidget_zone != mapwidget_target->zone())) + { + mapwidget_target = nullptr; + } } bool MapWidget::on_mousepress(const unsigned int button) @@ -124,11 +133,13 @@ void MapWidget::draw() // global mouse cursor location const math::Vector2f cursor(ui::root()->global_mouse_coords()); mapwidget_hover_id = 0; + set_tooltip(); // map center math::Vector2f map_center(map_location[0] + map_size / 2.0f, map_location[1] + map_size / 2.0f); math::Vector2f icon_location; const float r = 12.0f; // radius of map icons + const float rt = 24.0f; // radius of target icons float scale = 4096.0f; // map size in game units math::Color color; @@ -154,6 +165,7 @@ void MapWidget::draw() if (math::distancesquared(cursor, icon_location) < (r*r)) { mapwidget_hover_id = entity->id(); + set_tooltip(entity->name()); } if (entity == mapwidget_target) @@ -264,6 +276,43 @@ void MapWidget::draw() } gl::end(); + + if (mapwidget_target) + { + // draw target icon + size_t texture_target = 0; + if (mapwidget_target->has_flag(core::Entity::Dockable)) + { + texture_target = render::Textures::load("bitmaps/icons/map_dockable"); + } else { + texture_target = render::Textures::load("bitmaps/icons/map_target"); + } + + icon_location.assign(map_center); + icon_location[0] -= map_size / scale * mapwidget_target->location().y(); + icon_location[1] -= map_size / scale * mapwidget_target->location().x(); + + texture_current = render::Textures::bind(texture_target); + + gl::begin(gl::Quads); + + math::Color color(1.0); + gl::color(color); + + glTexCoord2f(0.0f, 0.0f); + gl::vertex(icon_location.x() - rt, icon_location.y() - rt); + + glTexCoord2f(1.0f, 0.0f); + gl::vertex(icon_location.x() + rt, icon_location.y() - rt); + + glTexCoord2f(1.0f, 1.0f); + gl::vertex(icon_location.x() + rt, icon_location.y() + rt); + + glTexCoord2f(0.0f, 1.0f); + gl::vertex(icon_location.x() - rt, icon_location.y() + rt); + + gl::end(); + } // draw localcontrol icon // TODO draw a ship icon diff --git a/src/client/savegamemenu.cc b/src/client/savegamemenu.cc index d7b8293..aa43087 100644 --- a/src/client/savegamemenu.cc +++ b/src/client/savegamemenu.cc @@ -81,14 +81,14 @@ SaveGameMenu::SaveGameMenu(ui::Widget *parent, const char *label, const Mode mod savegamemenu_descrlabel->set_background(true); savegamemenu_descrlabel->set_border(true); + // delete button is a child of description label + savegamemenu_deletebutton = new ui::IconButton(savegamemenu_descrlabel, "bitmaps/icons/button_delete", "Delete"); + savegamemenu_deletebutton->set_label("delete"); + // save button savegamemenu_savebutton = new ui::Button(this, "Save"); savegamemenu_savebutton->set_label("save"); - // delete button - savegamemenu_deletebutton = new ui::IconButton(this, "bitmaps/icons/button_delete", "Delete"); - savegamemenu_deletebutton->set_label("delete"); - // cancel save/load/overwrite button savegamemenu_cancelbutton = new ui::Button(this, "Cancel"); savegamemenu_cancelbutton->set_label("cancel"); @@ -114,7 +114,7 @@ SaveGameMenu::~SaveGameMenu() void SaveGameMenu::resize() { const float padding = ui::UI::padding; - const float icon_size = 24.0f; // small icons + const float icon_size = ui::UI::icon_small; // resize title label savegamemenu_titlelabel->set_size(width() - padding * 2.0f, savegamemenu_titlelabel->font()->height()); @@ -127,20 +127,13 @@ void SaveGameMenu::resize() // resize files listview savegamemenu_filelistview->set_size( ui::UI::elementsize.width(), - height() - icon_size - padding * 3.0f - savegamemenu_titlelabel->bottom() + height() - 2.0f * padding - savegamemenu_titlelabel->bottom() ); savegamemenu_filelistview->set_location( padding, savegamemenu_titlelabel->bottom() + padding ); - // resize delete button - savegamemenu_deletebutton->set_size(icon_size, icon_size); - savegamemenu_deletebutton->set_location( - savegamemenu_filelistview->left(), - savegamemenu_filelistview->bottom() + padding - ); - // resize description title savegamemenu_descrtitle->set_size( width() - savegamemenu_filelistview->right() - 2.0f * padding, @@ -154,13 +147,20 @@ void SaveGameMenu::resize() // resize description label savegamemenu_descrlabel->set_size( savegamemenu_descrtitle->width(), - savegamemenu_filelistview->bottom() - savegamemenu_descrtitle->bottom() - padding + savegamemenu_filelistview->bottom() - savegamemenu_descrtitle->bottom() - 2.0f * padding - ui::UI::elementsize.height() ); savegamemenu_descrlabel->set_location( savegamemenu_filelistview->right() + padding, savegamemenu_descrtitle->bottom() + padding ); + // resize delete button + savegamemenu_deletebutton->set_size(icon_size, icon_size); + savegamemenu_deletebutton->set_location( + savegamemenu_descrtitle->width() - savegamemenu_deletebutton->width() - padding, + padding + ); + // resize screenshot const model::Material *screenshotmaterial = model::Material::find("ui/screenshot"); if (screenshotmaterial) { 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__ + + diff --git a/src/client/video.cc b/src/client/video.cc index 5f8c14d..15f1c04 100644 --- a/src/client/video.cc +++ b/src/client/video.cc @@ -260,7 +260,7 @@ void restart() shutdown(); // clear models and materials - /* resetting the rednder subsystem will force a reload of all materials + /* resetting the render subsystem will force a reload of all materials */ model::Model::clear(); |