void PopulationPanel::Update() { // remove any old browse wnds for (std::vector<std::pair<MeterType, StatisticIcon*> >::iterator it = m_meter_stats.begin(); it != m_meter_stats.end(); ++it) { it->second->ClearBrowseInfoWnd(); m_multi_icon_value_indicator->ClearToolTip(it->first); } TemporaryPtr<const PopCenter> pop = GetPopCenter(); if (!pop) { ErrorLogger() << "PopulationPanel::Update couldn't get PopCenter or couldn't get UniverseObject"; return; } // meter bar displays population stats m_multi_meter_status_bar->Update(); m_multi_icon_value_indicator->Update(); // tooltips boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd; for (std::vector<std::pair<MeterType, StatisticIcon*> >::iterator it = m_meter_stats.begin(); it != m_meter_stats.end(); ++it) { it->second->SetValue(pop->InitialMeterValue(it->first)); browse_wnd = boost::shared_ptr<GG::BrowseInfoWnd>(new MeterBrowseWnd(m_popcenter_id, it->first, AssociatedMeterType(it->first))); it->second->SetBrowseInfoWnd(browse_wnd); m_multi_icon_value_indicator->SetToolTip(it->first, browse_wnd); } }
MultiIconValueIndicator::MultiIconValueIndicator(GG::X w, const std::vector<int>& object_ids, const std::vector<std::pair<MeterType, MeterType>>& meter_types) : GG::Wnd(GG::X0, GG::Y0, w, GG::Y1, GG::INTERACTIVE), m_icons(), m_meter_types(meter_types), m_object_ids(object_ids) { SetName("MultiIconValueIndicator"); GG::X x(EDGE_PAD); for (const std::pair<MeterType, MeterType>& meter_type : m_meter_types) { const MeterType PRIMARY_METER_TYPE = meter_type.first; // get icon texture. std::shared_ptr<GG::Texture> texture = ClientUI::MeterIcon(PRIMARY_METER_TYPE); // special case for population meter for an indicator showing only a // single popcenter: icon is species icon, rather than generic pop icon if (PRIMARY_METER_TYPE == METER_POPULATION && m_object_ids.size() == 1) { if (std::shared_ptr<const PopCenter> pc = GetPopCenter(*m_object_ids.begin())) texture = ClientUI::SpeciesIcon(pc->SpeciesName()); } m_icons.push_back(new StatisticIcon(texture, 0.0, 3, false, GG::X0, GG::Y0, IconWidth(), IconHeight())); GG::Pt icon_ul(x, GG::Y(EDGE_PAD)); GG::Pt icon_lr = icon_ul + GG::Pt(IconWidth(), IconHeight() + ClientUI::Pts()*3/2); m_icons.back()->SizeMove(icon_ul, icon_lr); m_icons.back()->InstallEventFilter(this); AttachChild(m_icons.back()); x += IconWidth() + IconSpacing(); } if (!m_icons.empty()) Resize(GG::Pt(Width(), EDGE_PAD + IconHeight() + ClientUI::Pts()*3/2)); Update(); }
bool PopulationPanel::EventFilter(GG::Wnd* w, const GG::WndEvent& event) { if (event.Type() != GG::WndEvent::RClick) return false; const GG::Pt& pt = event.Point(); TemporaryPtr<const PopCenter> pc = GetPopCenter(); if (!pc) return false; const std::string& species_name = pc->SpeciesName(); if (species_name.empty()) return false; if (m_meter_stats[0].second != w) return false; GG::MenuItem menu_contents; std::string popup_label = boost::io::str(FlexibleFormat(UserString("ENC_LOOKUP")) % UserString(species_name)); menu_contents.next_level.push_back(GG::MenuItem(popup_label, 1, false, false)); CUIPopupMenu popup(pt.x, pt.y, menu_contents); if (!popup.Run() || popup.MenuID() != 1) return false; ClientUI::GetClientUI()->ZoomToSpecies(species_name); return true; }
void PopulationPanel::Update() { // remove any old browse wnds for (std::pair<MeterType, StatisticIcon*>& meter_stat : m_meter_stats) { meter_stat.second->ClearBrowseInfoWnd(); m_multi_icon_value_indicator->ClearToolTip(meter_stat.first); } std::shared_ptr<const PopCenter> pop = GetPopCenter(); if (!pop) { ErrorLogger() << "PopulationPanel::Update couldn't get PopCenter or couldn't get UniverseObject"; return; } // meter bar displays population stats m_multi_meter_status_bar->Update(); m_multi_icon_value_indicator->Update(); // tooltips std::shared_ptr<GG::BrowseInfoWnd> browse_wnd; for (std::pair<MeterType, StatisticIcon*>& meter_stat : m_meter_stats) { meter_stat.second->SetValue(pop->InitialMeterValue(meter_stat.first)); browse_wnd = std::make_shared<MeterBrowseWnd>(m_popcenter_id, meter_stat.first, AssociatedMeterType(meter_stat.first)); meter_stat.second->SetBrowseInfoWnd(browse_wnd); m_multi_icon_value_indicator->SetToolTip(meter_stat.first, browse_wnd); } }
void PopulationPanel::Update() { // remove any old browse wnds for (auto& meter_stat : m_meter_stats) { meter_stat.second->ClearBrowseInfoWnd(); m_multi_icon_value_indicator->ClearToolTip(meter_stat.first); } auto pop = GetPopCenter(); if (!pop) { ErrorLogger() << "PopulationPanel::Update couldn't get PopCenter or couldn't get UniverseObject"; return; } // meter bar displays population stats m_multi_meter_status_bar->Update(); m_multi_icon_value_indicator->Update(); // tooltips for (auto& meter_stat : m_meter_stats) { meter_stat.second->SetValue(pop->InitialMeterValue(meter_stat.first)); auto browse_wnd = GG::Wnd::Create<MeterBrowseWnd>(m_popcenter_id, meter_stat.first, AssociatedMeterType(meter_stat.first)); meter_stat.second->SetBrowseInfoWnd(browse_wnd); m_multi_icon_value_indicator->SetToolTip(meter_stat.first, browse_wnd); } }
PopulationPanel::PopulationPanel(GG::X w, int object_id) : AccordionPanel(w, GG::Y(ClientUI::Pts()*2)), m_popcenter_id(object_id), m_meter_stats(), m_multi_icon_value_indicator(nullptr), m_multi_meter_status_bar(nullptr) { SetName("PopulationPanel"); std::shared_ptr<const PopCenter> pop = GetPopCenter(); if (!pop) throw std::invalid_argument("Attempted to construct a PopulationPanel with an object id is not a PopCenter"); m_expand_button->LeftClickedSignal.connect( boost::bind(&PopulationPanel::ExpandCollapseButtonPressed, this)); const auto obj = GetUniverseObject(m_popcenter_id); if (!obj) { ErrorLogger() << "Invalid object id " << m_popcenter_id; return; } // small meter indicators - for use when panel is collapsed m_meter_stats.push_back( std::make_pair(METER_POPULATION, new StatisticIcon(ClientUI::SpeciesIcon(pop->SpeciesName()), obj->InitialMeterValue(METER_POPULATION), 3, false, MeterIconSize().x, MeterIconSize().y))); m_meter_stats.push_back( std::make_pair(METER_HAPPINESS, new StatisticIcon(ClientUI::MeterIcon(METER_HAPPINESS), obj->InitialMeterValue(METER_HAPPINESS), 3, false, MeterIconSize().x, MeterIconSize().y))); m_meter_stats.push_back( std::make_pair(METER_CONSTRUCTION, new StatisticIcon(ClientUI::MeterIcon(METER_CONSTRUCTION), obj->InitialMeterValue(METER_CONSTRUCTION), 3, false, MeterIconSize().x, MeterIconSize().y))); // meter and production indicators std::vector<std::pair<MeterType, MeterType>> meters; for (std::pair<MeterType, StatisticIcon*>& meter_stat : m_meter_stats) { meter_stat.second->InstallEventFilter(this); AttachChild(meter_stat.second); meters.push_back(std::make_pair(meter_stat.first, AssociatedMeterType(meter_stat.first))); } // attach and show meter bars and large resource indicators m_multi_icon_value_indicator = new MultiIconValueIndicator(Width() - 2*EDGE_PAD, m_popcenter_id, meters); m_multi_meter_status_bar = new MultiMeterStatusBar(Width() - 2*EDGE_PAD, m_popcenter_id, meters); // determine if this panel has been created yet. std::map<int, bool>::iterator it = s_expanded_map.find(m_popcenter_id); if (it == s_expanded_map.end()) s_expanded_map[m_popcenter_id] = false; // if not, default to collapsed state Refresh(); }
void PopulationPool::Update() { m_population = 0.0f; float future_population = 0.0f; // sum population from all PopCenters in this pool for (std::vector<int>::const_iterator it = m_pop_center_ids.begin(); it != m_pop_center_ids.end(); ++it) { if (TemporaryPtr<const PopCenter> center = GetPopCenter(*it)) { m_population += center->CurrentMeterValue(METER_POPULATION); future_population += center->NextTurnCurrentMeterValue(METER_POPULATION); } } m_growth = future_population - m_population; ChangedSignal(); }
void PopulationPool::Update() { m_population = 0.0f; float future_population = 0.0f; // sum population from all PopCenters in this pool for (int pop_center_id : m_pop_center_ids) { if (std::shared_ptr<const PopCenter> center = GetPopCenter(pop_center_id)) { m_population += center->CurrentMeterValue(METER_POPULATION); future_population += center->NextTurnCurrentMeterValue(METER_POPULATION); } } m_growth = future_population - m_population; ChangedSignal(); }
PopulationPanel::PopulationPanel(GG::X w, int object_id) : AccordionPanel(w, GG::Y(ClientUI::Pts()*2)), m_popcenter_id(object_id), m_meter_stats(), m_multi_icon_value_indicator(0), m_multi_meter_status_bar(0) { SetName("PopulationPanel"); TemporaryPtr<const PopCenter> pop = GetPopCenter(); if (!pop) throw std::invalid_argument("Attempted to construct a PopulationPanel with an object id is not a PopCenter"); GG::Connect(m_expand_button->LeftClickedSignal, &PopulationPanel::ExpandCollapseButtonPressed, this); // small meter indicators - for use when panel is collapsed m_meter_stats.push_back( std::make_pair(METER_POPULATION, new StatisticIcon(ClientUI::SpeciesIcon(pop->SpeciesName()), 0, 3, false, GG::X0, GG::Y0, MeterIconSize().x, MeterIconSize().y))); m_meter_stats.push_back( std::make_pair(METER_HAPPINESS, new StatisticIcon(ClientUI::MeterIcon(METER_HAPPINESS), 0, 3, false, GG::X0, GG::Y0, MeterIconSize().x, MeterIconSize().y))); m_meter_stats.push_back( std::make_pair(METER_CONSTRUCTION, new StatisticIcon(ClientUI::MeterIcon(METER_CONSTRUCTION), 0, 3, false, GG::X0, GG::Y0, MeterIconSize().x, MeterIconSize().y))); // meter and production indicators std::vector<std::pair<MeterType, MeterType> > meters; for (std::vector<std::pair<MeterType, StatisticIcon*> >::iterator it = m_meter_stats.begin(); it != m_meter_stats.end(); ++it) { AttachChild(it->second); meters.push_back(std::make_pair(it->first, AssociatedMeterType(it->first))); } // attach and show meter bars and large resource indicators m_multi_icon_value_indicator = new MultiIconValueIndicator(Width() - 2*EDGE_PAD, m_popcenter_id, meters); m_multi_meter_status_bar = new MultiMeterStatusBar(Width() - 2*EDGE_PAD, m_popcenter_id, meters); m_meter_stats[0].second->InstallEventFilter(this); // determine if this panel has been created yet. std::map<int, bool>::iterator it = s_expanded_map.find(m_popcenter_id); if (it == s_expanded_map.end()) s_expanded_map[m_popcenter_id] = false; // if not, default to collapsed state Refresh(); }
bool PopulationPanel::EventFilter(GG::Wnd* w, const GG::WndEvent& event) { if (event.Type() != GG::WndEvent::RClick) return false; const GG::Pt& pt = event.Point(); MeterType meter_type = INVALID_METER_TYPE; for (const std::pair<MeterType, StatisticIcon*>& meter_stat : m_meter_stats) { if (meter_stat.second == w) { meter_type = meter_stat.first; break; } } if (meter_type == INVALID_METER_TYPE) return false; std::string meter_string = boost::lexical_cast<std::string>(meter_type); std::string meter_title; if (UserStringExists(meter_string)) meter_title = UserString(meter_string); std::string species_name; bool retval = false; CUIPopupMenu popup(pt.x, pt.y); std::shared_ptr<const PopCenter> pc = GetPopCenter(); if (meter_type == METER_POPULATION && pc) { species_name = pc->SpeciesName(); if (!species_name.empty()) { auto zoom_species_action = [&retval, &species_name]() { retval = ClientUI::GetClientUI()->ZoomToSpecies(species_name); }; std::string species_label = boost::io::str(FlexibleFormat(UserString("ENC_LOOKUP")) % UserString(species_name)); popup.AddMenuItem(GG::MenuItem(species_label, false, false, zoom_species_action)); } } if (!meter_title.empty()) { auto pedia_meter_type_action = [&retval, &meter_string]() { retval = ClientUI::GetClientUI()->ZoomToMeterTypeArticle(meter_string); }; std::string popup_label = boost::io::str(FlexibleFormat(UserString("ENC_LOOKUP")) % meter_title); popup.AddMenuItem(GG::MenuItem(popup_label, false, false, pedia_meter_type_action)); } popup.Run(); return retval; }
bool MultiIconValueIndicator::EventFilter(GG::Wnd* w, const GG::WndEvent& event) { if (event.Type() != GG::WndEvent::RClick) return false; const GG::Pt& pt = event.Point(); MeterType meter_type = INVALID_METER_TYPE; for (unsigned int i = 0; i < m_icons.size(); ++i) { try { if (m_icons.at(i) == w) { meter_type = m_meter_types.at(i).first; break; } } catch(std::out_of_range &e) { ErrorLogger() << e.what(); return false; } } if (meter_type == INVALID_METER_TYPE) return false; std::string meter_string = boost::lexical_cast<std::string>(meter_type); std::string meter_title; if (UserStringExists(meter_string)) meter_title = UserString(meter_string); GG::MenuItem menu_contents; std::string species_name; std::shared_ptr<const PopCenter> pc = GetPopCenter(*m_object_ids.begin()); if (meter_type == METER_POPULATION && pc && m_object_ids.size() == 1) { species_name = pc->SpeciesName(); if (!species_name.empty()) { std::string species_label = boost::io::str(FlexibleFormat(UserString("ENC_LOOKUP")) % UserString(species_name)); menu_contents.next_level.push_back(GG::MenuItem(species_label, 1, false, false)); } } if (!meter_title.empty()) { std::string popup_label = boost::io::str(FlexibleFormat(UserString("ENC_LOOKUP")) % meter_title); menu_contents.next_level.push_back(GG::MenuItem(popup_label, 2, false, false)); } CUIPopupMenu popup(pt.x, pt.y, menu_contents); bool retval = false; if (popup.Run()) { switch (popup.MenuID()) { case 1: { retval = ClientUI::GetClientUI()->ZoomToSpecies(species_name); break; } case 2: { retval = ClientUI::GetClientUI()->ZoomToMeterTypeArticle(meter_string); break; } default: break; } } return retval; }