/* client/mapwindow.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include "audio/audio.h" #include "core/application.h" #include "core/entity.h" #include "core/entityglobe.h" #include "client/mapwindow.h" #include "client/targets.h" #include "ui/ui.h" #include "ui/paint.h" #include "render/gl.h" #include "render/textures.h" #include "render/text.h" namespace client { MapWindow::MapWindow(ui::Widget *parent) : ui::Window(parent) { set_label("map"); set_border(true); set_background(true); set_font(ui::root()->font_small()); // window title mapwindow_titlelabel = new ui::Label(this); mapwindow_titlelabel->set_label("title"); mapwindow_titlelabel->set_background(false); mapwindow_titlelabel->set_border(false); mapwindow_titlelabel->set_font(ui::root()->font_large()); mapwindow_titlelabel->set_alignment(ui::AlignCenter); mapwindow_titlelabel->set_text("STAR CHART"); // close button mapwindow_closebutton = new ui::IconButton(mapwindow_titlelabel, "bitmaps/icons/window_close"); // map widget mapwindow_mapwidget = new MapWidget(this); mapwindow_mapwidget->set_background(false); mapwindow_mapwidget->set_border(false); // galaxy map widget mapwindow_galaxymapwidget = new GalaxyMapWidget(this); mapwindow_galaxymapwidget->set_background(false); mapwindow_galaxymapwidget->set_border(false); mapwindow_galaxymapwidget->hide(); // map label mapwindow_maplabel = new ui::Label(this); mapwindow_maplabel->set_label("maplabel"); mapwindow_maplabel->set_background(false); mapwindow_maplabel->set_border(false); mapwindow_maplabel->set_alignment(ui::AlignCenter); // map buttons mapwindow_zonebutton = new ui::IconButton(this, "bitmaps/icons/button_map"); mapwindow_galaxybutton = new ui::IconButton(this, "bitmaps/icons/button_galaxy"); // modelview mapwindow_modelview = new ui::ModelView(this); mapwindow_modelview->set_label("modelview"); mapwindow_modelview->set_background(false); mapwindow_modelview->set_border(false); // target title (modelview child) mapwindow_targetlabel = new ui::Label(this); mapwindow_targetlabel->set_label("targetlabel"); mapwindow_targetlabel->set_background(false); mapwindow_targetlabel->set_border(false); mapwindow_targetlabel->set_alignment(ui::AlignCenter); // target text mapwindow_scrollpane = new ui::ScrollPane(this, mapwindow_infotext); mapwindow_scrollpane->set_background(false); mapwindow_scrollpane->set_border(false); mapwindow_scrollpane->set_alignment(ui::AlignTop); hide(); } MapWindow::~MapWindow() { } void MapWindow::hide() { ui::Window::hide(); } void MapWindow::show() { ui::Window::show(); // show map widget mapwindow_mode = ShowZone; mapwindow_galaxymapwidget->hide(); mapwindow_mapwidget->show(); mapwindow_mapwidget->set_zone(core::localplayer()->zone()); mapwindow_maplabel->set_text(mapwindow_mapwidget->zone()->name()); // use current HUD target as default selection if (core::localplayer()->view()) { mapwindow_mapwidget->set_target(core::localplayer()->view()); } else { mapwindow_mapwidget->set_target(targets::current()); } // show target or zone info if (mapwindow_mapwidget->target()) { show_entity_info(mapwindow_mapwidget->target()); } else { show_zone_info(mapwindow_mapwidget->zone()); } } void MapWindow::toggle() { if (visible()) hide(); else show(); } void MapWindow::resize() { const float padding = ui::root()->font_large()->height(); const float icon_size = 24.0f; // small icons // resize title label mapwindow_titlelabel->set_size(width() - padding * 2.0f, mapwindow_titlelabel->font()->height()); mapwindow_titlelabel->set_location(padding, padding); // resize close button mapwindow_closebutton->set_size(mapwindow_titlelabel->font()->height(), mapwindow_titlelabel->font()->height()); mapwindow_closebutton->set_location(mapwindow_titlelabel->width() - mapwindow_closebutton->width(), 0); // resize map label mapwindow_maplabel->set_size((width() - padding * 3.0f) * 0.5f, padding ); mapwindow_maplabel->set_location(padding, mapwindow_titlelabel->bottom() + padding); // resize zone map widget mapwindow_mapwidget->set_size(mapwindow_maplabel->width(), mapwindow_zonebutton->top() - mapwindow_maplabel->bottom() - 2.0f * padding); mapwindow_mapwidget->set_location(mapwindow_maplabel->left(), mapwindow_maplabel->bottom() + padding); // set galaxy map size equal to zone map size mapwindow_galaxymapwidget->set_geometry(mapwindow_mapwidget->location(), mapwindow_mapwidget->size()); // resize map buttons float l = (mapwindow_mapwidget->width() - math::min(mapwindow_mapwidget->width(), mapwindow_mapwidget->height())) * 0.5f; mapwindow_zonebutton->set_size(icon_size, icon_size); mapwindow_zonebutton->set_location(mapwindow_maplabel->left() + l, height() - padding - mapwindow_zonebutton->height()); mapwindow_galaxybutton->set_size(icon_size, icon_size); mapwindow_galaxybutton->set_location(mapwindow_maplabel->right() - l - mapwindow_galaxybutton->width(), height() - padding - mapwindow_galaxybutton->height()); // resize target label mapwindow_targetlabel->set_size(width() - mapwindow_mapwidget->right() - padding * 2.0f, padding); mapwindow_targetlabel->set_location(mapwindow_maplabel->right() + padding, mapwindow_maplabel->top()); // resize target modelview mapwindow_modelview->set_size(mapwindow_targetlabel->width(), (height() - mapwindow_targetlabel->bottom() - padding * 3.0f) * 0.5f); mapwindow_modelview->set_location(mapwindow_mapwidget->right() + padding, mapwindow_targetlabel->bottom() + padding); // resize target infopane text mapwindow_scrollpane->set_size(mapwindow_modelview->size()); mapwindow_scrollpane->set_location(mapwindow_modelview->left(), mapwindow_modelview->bottom() + padding); } void MapWindow::draw() { ui::Window::draw(); /* // make sure the target still exists mapwindow_target = core::localplayer()->zone()->find_entity(mapwindow_target); mapwindow_mapwidget->set_zone(core::localplayer()->zone()); mapwindow_mapwidget->set_target(mapwindow_target); mapwindow_maplabel->set_text(core::localplayer()->zone()->name()); */ if (mapwindow_inforecord) { if (mapwindow_infotimestamp != mapwindow_inforecord->timestamp()) { // update info set_info(mapwindow_inforecord); } } } void MapWindow::set_info(const core::Info *info) { mapwindow_inforecord = 0; mapwindow_infotimestamp = 0; mapwindow_infotext.clear(); if (info) { mapwindow_inforecord = core::game()->request_info(info->id()); } if (mapwindow_inforecord) { for (core::Info::Text::const_iterator it = mapwindow_inforecord->text().begin(); it != mapwindow_inforecord->text().end(); it++) { mapwindow_infotext.push_back((*it)); } mapwindow_infotimestamp = mapwindow_inforecord->timestamp(); } else { mapwindow_infotext.push_back("Information is not available"); mapwindow_infotimestamp = 0; } } void MapWindow::show_entity_info(const core::Entity *entity) { if (core::localplayer()->zone() == entity->zone()) { targets::set_target(entity); } if (entity) { if (entity->model()) { mapwindow_modelview->set_mode(ui::ModelView::Model); mapwindow_modelview->set_modelname(entity->model()->name()); mapwindow_modelview->set_colors(entity->color(), entity->color_second()); mapwindow_modelview->set_zoom(2.5f); mapwindow_modelview->set_radius(2.0f); } else if (entity->type() == core::Entity::Globe) { mapwindow_modelview->set_mode(ui::ModelView::Globe); const core::EntityGlobe *globe = static_cast(entity); mapwindow_modelview->set_colors(globe->color(), globe->color_second()); mapwindow_modelview->set_globetexturename( globe->texturename(), globe->has_flag(core::Entity::Bright), globe->coronaname() ); mapwindow_modelview->set_zoom(2.5f); if (globe->has_flag(core::Entity::Bright)) { mapwindow_modelview->set_radius(0.5f); } else { mapwindow_modelview->set_radius(1.0f); } } else { mapwindow_modelview->clear(); } mapwindow_targetlabel->set_text(entity->name()); set_info(entity->info()); mapwindow_modelview->show(); } else { set_info(0); mapwindow_infotext.clear(); mapwindow_targetlabel->clear(); mapwindow_modelview->clear(); } } void MapWindow::show_zone_info(const core::Zone *zone) { if (zone) { set_info(zone->info()); switch (mapwindow_mode) { case ShowZone: mapwindow_targetlabel->clear(); break; case ShowWorld: mapwindow_targetlabel->set_text(zone->name()); break; } } else { set_info(0); mapwindow_infotext.clear(); mapwindow_targetlabel->clear(); } mapwindow_modelview->clear(); } bool MapWindow::on_keypress(const int key, const unsigned int modifier) { if (key == SDLK_ESCAPE) { if (visible()) { hide(); return true; } } return false; } bool MapWindow::on_emit(ui::Widget *sender, const ui::Widget::Event event, void *data) { if (sender == mapwindow_closebutton) { if (event == ui::Widget::EventButtonClicked) { hide(); } return true; } else if (sender == mapwindow_mapwidget) { if (event == ui::Widget::EventClicked) { if (mapwindow_mapwidget->target()) { show_entity_info(mapwindow_mapwidget->target()); } else { show_zone_info(mapwindow_mapwidget->zone()); } return true; } } else if (sender == mapwindow_galaxymapwidget) { if (event == ui::Widget::EventClicked) { show_zone_info(mapwindow_galaxymapwidget->zone()); return true; } else if (event == ui::Widget::EventDoubleClicked) { if (mapwindow_galaxymapwidget->zone()) { mapwindow_mode = ShowZone; mapwindow_galaxymapwidget->hide(); mapwindow_mapwidget->set_zone(mapwindow_galaxymapwidget->zone()); mapwindow_mapwidget->show(); mapwindow_maplabel->set_text(mapwindow_mapwidget->zone()->name()); show_zone_info(mapwindow_mapwidget->zone()); } return true; } } else if (sender == mapwindow_zonebutton) { if (event == ui::Widget::EventButtonClicked) { if (mapwindow_mode == ShowZone) { mapwindow_mapwidget->set_target(0); show_zone_info(mapwindow_mapwidget->zone()); } else { mapwindow_mode = ShowZone; if (mapwindow_galaxymapwidget->zone()) { mapwindow_mapwidget->set_zone(mapwindow_galaxymapwidget->zone()); } else { mapwindow_mapwidget->set_zone(core::localplayer()->zone()); } mapwindow_mapwidget->show(); mapwindow_galaxymapwidget->hide(); mapwindow_maplabel->set_text(mapwindow_mapwidget->zone()->name()); } return true; } } else if (sender == mapwindow_galaxybutton) { if (event == ui::Widget::EventButtonClicked) { if (mapwindow_mode == ShowWorld) { mapwindow_galaxymapwidget->set_zone(0); show_zone_info(0); } else { mapwindow_mode = ShowWorld; mapwindow_mapwidget->hide(); mapwindow_galaxymapwidget->show(); mapwindow_galaxymapwidget->set_zone(mapwindow_mapwidget->zone()); show_zone_info(mapwindow_galaxymapwidget->zone()); mapwindow_maplabel->set_text("Starsystems"); } return true; } } return Window::on_emit(sender, event, data); } }