diff options
Diffstat (limited to 'src/client/mapwindow.cc')
-rw-r--r-- | src/client/mapwindow.cc | 265 |
1 files changed, 192 insertions, 73 deletions
diff --git a/src/client/mapwindow.cc b/src/client/mapwindow.cc index ed88f88..1c429dd 100644 --- a/src/client/mapwindow.cc +++ b/src/client/mapwindow.cc @@ -41,14 +41,24 @@ MapWindow::MapWindow(ui::Widget *parent) : ui::Window(parent) mapwindow_mapwidget = new MapWidget(this); mapwindow_mapwidget->set_background(false); mapwindow_mapwidget->set_border(false); - - // map label (map widget child) - mapwindow_maplabel = new ui::Label(mapwindow_mapwidget); + + // 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"); @@ -56,7 +66,7 @@ MapWindow::MapWindow(ui::Widget *parent) : ui::Window(parent) mapwindow_modelview->set_border(false); // target title (modelview child) - mapwindow_targetlabel = new ui::Label(mapwindow_modelview); + mapwindow_targetlabel = new ui::Label(this); mapwindow_targetlabel->set_label("targetlabel"); mapwindow_targetlabel->set_background(false); mapwindow_targetlabel->set_border(false); @@ -68,7 +78,6 @@ MapWindow::MapWindow(ui::Widget *parent) : ui::Window(parent) mapwindow_scrollpane->set_border(false); mapwindow_scrollpane->set_alignment(ui::AlignTop); - set_target(0); hide(); } @@ -79,17 +88,32 @@ MapWindow::~MapWindow() void MapWindow::hide() { ui::Window::hide(); - mapwindow_target = 0; } 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()) { - set_target(core::localplayer()->view()); + mapwindow_mapwidget->set_target(core::localplayer()->view()); } else { - set_target(targets::current()); + 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() @@ -103,6 +127,7 @@ void MapWindow::toggle() 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()); @@ -112,32 +137,46 @@ void MapWindow::resize() 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 widget - mapwindow_mapwidget->set_size((width() - padding * 3.0f) * 0.5f, height() - mapwindow_titlelabel->bottom() - padding * 2.0f ); - mapwindow_mapwidget->set_location(padding, mapwindow_titlelabel->bottom() + padding); + // resize map label + mapwindow_maplabel->set_size((width() - padding * 3.0f) * 0.5f, padding ); + mapwindow_maplabel->set_location(padding, mapwindow_titlelabel->bottom() + padding); - // resize map label (map widget child) - mapwindow_maplabel->set_size(mapwindow_mapwidget->width(), mapwindow_maplabel->font()->height()); - mapwindow_maplabel->set_location(0, 0); + // 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); - // resize target modelview - mapwindow_modelview->set_size(width() - mapwindow_mapwidget->right() - padding * 2.0f, (height() - mapwindow_titlelabel->bottom() - padding * 3.0f) * 0.5f); - mapwindow_modelview->set_location(mapwindow_mapwidget->right() + padding, mapwindow_titlelabel->bottom() + padding); + // set galaxy map size equal to zone map size + mapwindow_galaxymapwidget->set_geometry(mapwindow_mapwidget->location(), mapwindow_mapwidget->size()); - // resize target label (modelview child) - mapwindow_targetlabel->set_size(mapwindow_modelview->width(), mapwindow_targetlabel->font()->height()); - mapwindow_targetlabel->set_location(0, 0); + // 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 infopane text - mapwindow_scrollpane->set_size(width() - mapwindow_mapwidget->right() - padding * 2.0f, height() - mapwindow_modelview->bottom() - padding * 2.0f); - mapwindow_scrollpane->set_location(mapwindow_mapwidget->right() + padding, mapwindow_modelview->bottom() + padding); + // 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); @@ -145,90 +184,109 @@ void MapWindow::draw() mapwindow_mapwidget->set_target(mapwindow_target); mapwindow_maplabel->set_text(core::localplayer()->zone()->name()); - if (mapwindow_target && mapwindow_target->info()) { - if (mapwindow_infotimestamp != mapwindow_target->info()->timestamp()) { + */ + if (mapwindow_inforecord) { + if (mapwindow_infotimestamp != mapwindow_inforecord->timestamp()) { // update info - set_target(mapwindow_target); + set_info(mapwindow_inforecord); } } + } -void MapWindow::set_target(const core::Entity *entity) { - - mapwindow_target = entity; +void MapWindow::set_info(const core::Info *info) +{ + mapwindow_inforecord = 0; mapwindow_infotimestamp = 0; - mapwindow_inforecord = 0; mapwindow_infotext.clear(); - if (mapwindow_target) { - // set title label to target name - mapwindow_targetlabel->set_text(mapwindow_target->name()); + 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 (mapwindow_target->info()) - mapwindow_inforecord = core::game()->request_info(mapwindow_target->info()->id()); - else - mapwindow_inforecord = 0; - - 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; - } - - if (mapwindow_target->model()) { + 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(mapwindow_target->model()->name()); - mapwindow_modelview->set_colors(mapwindow_target->color(), mapwindow_target->color_second()); + 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 (mapwindow_target->type() == core::Entity::Globe) { + } else if (entity->type() == core::Entity::Globe) { mapwindow_modelview->set_mode(ui::ModelView::Globe); - const core::EntityGlobe *globe = static_cast<const core::EntityGlobe *>(mapwindow_target); - mapwindow_modelview->set_colors(mapwindow_target->color(), mapwindow_target->color_second()); + const core::EntityGlobe *globe = static_cast<const core::EntityGlobe *>(entity); + mapwindow_modelview->set_colors(globe->color(), globe->color_second()); mapwindow_modelview->set_globetexturename( globe->texturename(), globe->flag_is_set(core::Entity::Bright), globe->coronaname() ); mapwindow_modelview->set_zoom(2.5f); - if (globe->flag_is_set(core::Entity::Bright)) + if (globe->flag_is_set(core::Entity::Bright)) { mapwindow_modelview->set_radius(0.5f); - else + } else { mapwindow_modelview->set_radius(1.0f); + } } else { - mapwindow_modelview->set_mode(ui::ModelView::Model); - const std::string empty; - mapwindow_modelview->set_modelname(empty); + mapwindow_modelview->clear(); } + mapwindow_targetlabel->set_text(entity->name()); + + set_info(entity->info()); mapwindow_modelview->show(); - mapwindow_scrollpane->show(); } else { - - mapwindow_modelview->hide(); - mapwindow_scrollpane->hide(); + set_info(0); + mapwindow_infotext.clear(); + mapwindow_targetlabel->clear(); + mapwindow_modelview->clear(); } } -bool MapWindow::on_keypress(const int key, const unsigned int modifier) +void MapWindow::show_zone_info(const core::Zone *zone) { - if (key == 512 + SDL_BUTTON_LEFT) { - if (mapwindow_mapwidget->has_mouse_focus() && mapwindow_mapwidget->hover()) { - core::Entity *target = core::localplayer()->zone()->find_entity(mapwindow_mapwidget->hover()); - if (targets::is_valid_map_target(target)) { - set_target(target); - targets::set_target(mapwindow_target); - } + if (zone) { + set_info(zone->info()); + + switch (mapwindow_mode) { + case ShowZone: + mapwindow_targetlabel->clear(); + break; + + case ShowWorld: + mapwindow_targetlabel->set_text(zone->name()); + break; } - return true; + } else { + set_info(0); + mapwindow_infotext.clear(); + mapwindow_targetlabel->clear(); + } + mapwindow_modelview->clear(); +} - } else if (key == SDLK_ESCAPE) { +bool MapWindow::on_keypress(const int key, const unsigned int modifier) +{ + if (key == SDLK_ESCAPE) { if (visible()) { hide(); return true; @@ -243,6 +301,67 @@ bool MapWindow::on_emit(ui::Widget *sender, const ui::Widget::Event event, void 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; } } |