void ResourcePanel::DoLayout() { AccordionPanel::DoLayout(); for (std::vector<std::pair<MeterType, StatisticIcon*> >::iterator it = m_meter_stats.begin(); it != m_meter_stats.end(); ++it) { DetachChild(it->second); } // detach / hide meter bars and large resource indicators DetachChild(m_multi_meter_status_bar); DetachChild(m_multi_icon_value_indicator); // update size of panel and position and visibility of widgets if (!s_expanded_map[m_rescenter_id]) { // position and reattach icons to be shown int n = 0; for (std::vector<std::pair<MeterType, StatisticIcon*> >::iterator it = m_meter_stats.begin(); it != m_meter_stats.end(); ++it) { GG::X x = MeterIconSize().x*n*7/2; if (x > Width() - m_expand_button->Width() - MeterIconSize().x*5/2) break; // ensure icon doesn't extend past right edge of panel StatisticIcon* icon = it->second; AttachChild(icon); GG::Pt icon_ul(x, GG::Y0); GG::Pt icon_lr = icon_ul + MeterIconSize(); icon->SizeMove(icon_ul, icon_lr); icon->Show(); n++; } Resize(GG::Pt(Width(), std::max(MeterIconSize().y, m_expand_button->Height()))); } else { // attach and show meter bars and large resource indicators GG::Y top = GG::Y0; AttachChild(m_multi_icon_value_indicator); m_multi_icon_value_indicator->MoveTo(GG::Pt(GG::X(EDGE_PAD), top)); m_multi_icon_value_indicator->Resize(GG::Pt(Width() - 2*EDGE_PAD, m_multi_icon_value_indicator->Height())); top += m_multi_icon_value_indicator->Height() + EDGE_PAD; AttachChild(m_multi_meter_status_bar); m_multi_meter_status_bar->MoveTo(GG::Pt(GG::X(EDGE_PAD), top)); m_multi_meter_status_bar->Resize(GG::Pt(Width() - 2*EDGE_PAD, m_multi_meter_status_bar->Height())); top += m_multi_icon_value_indicator->Height() + EDGE_PAD; MoveChildUp(m_expand_button); Resize(GG::Pt(Width(), top)); } m_expand_button->MoveTo(GG::Pt(Width() - m_expand_button->Width(), GG::Y0)); SetCollapsed(!s_expanded_map[m_rescenter_id]); }
void PopulationPanel::DoLayout() { AccordionPanel::DoLayout(); for (const std::pair<MeterType, StatisticIcon*>& meter_stat : m_meter_stats) { DetachChild(meter_stat.second); } // detach / hide meter bars and large resource indicators DetachChild(m_multi_meter_status_bar); DetachChild(m_multi_icon_value_indicator); // update size of panel and position and visibility of widgets if (!s_expanded_map[m_popcenter_id]) { // position and reattach icons to be shown int n = 0; GG::X stride = MeterIconSize().x * 7/2; for (const std::pair<MeterType, StatisticIcon*>& meter_stat : m_meter_stats) { GG::X x = n * stride; StatisticIcon* icon = meter_stat.second; GG::Pt icon_ul(x, GG::Y0); GG::Pt icon_lr = icon_ul + MeterIconSize(); icon->SizeMove(icon_ul, icon_lr); if (x + icon->MinUsableSize().x >= ClientWidth()) break; AttachChild(icon); icon->Show(); n++; } Resize(GG::Pt(Width(), std::max(MeterIconSize().y, m_expand_button->Height()))); } else { // attach and show meter bars and large resource indicators GG::Y top = Top(); AttachChild(m_multi_icon_value_indicator); m_multi_icon_value_indicator->MoveTo(GG::Pt(GG::X(EDGE_PAD), GG::Y(EDGE_PAD))); m_multi_icon_value_indicator->Resize(GG::Pt(Width() - 2*EDGE_PAD, m_multi_icon_value_indicator->Height())); AttachChild(m_multi_meter_status_bar); m_multi_meter_status_bar->MoveTo(GG::Pt(GG::X(EDGE_PAD), m_multi_icon_value_indicator->Bottom() + EDGE_PAD - top)); m_multi_meter_status_bar->Resize(GG::Pt(Width() - 2*EDGE_PAD, m_multi_meter_status_bar->Height())); MoveChildUp(m_expand_button); Resize(GG::Pt(Width(), m_multi_meter_status_bar->Bottom() + EDGE_PAD - top)); } SetCollapsed(!s_expanded_map[m_popcenter_id]); }
void SpecialsPanel::Update() { //std::cout << "SpecialsPanel::Update" << std::endl; for (std::map<std::string, StatisticIcon*>::iterator it = m_icons.begin(); it != m_icons.end(); ++it) DeleteChild(it->second); m_icons.clear(); // get specials to display TemporaryPtr<const UniverseObject> obj = GetUniverseObject(m_object_id); if (!obj) { ErrorLogger() << "SpecialsPanel::Update couldn't get object with id " << m_object_id; return; } const std::map<std::string, std::pair<int, float> >& specials = obj->Specials(); // get specials and use them to create specials icons // for specials with a nonzero for (std::map<std::string, std::pair<int, float> >::const_iterator it = specials.begin(); it != specials.end(); ++it) { const Special* special = GetSpecial(it->first); StatisticIcon* graphic = 0; if (it->second.second > 0.0f) graphic = new StatisticIcon(ClientUI::SpecialIcon(special->Name()), it->second.second, 2, false); else graphic = new StatisticIcon(ClientUI::SpecialIcon(special->Name())); graphic->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); std::string desc = UserString(special->Description()); if (it->second.second > 0.0f) desc += "\n" + boost::io::str(FlexibleFormat(UserString("SPECIAL_CAPACITY")) % DoubleToString(it->second.second, 2, false)); if (it->second.first > 0) desc += "\n" + boost::io::str(FlexibleFormat(UserString("ADDED_ON_TURN")) % boost::lexical_cast<std::string>(it->second.first)); else desc += "\n" + UserString("ADDED_ON_INITIAL_TURN"); if (GetOptionsDB().Get<bool>("UI.autogenerated-effects-descriptions") && !special->Effects().empty()) { desc += boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % EffectsDescription(special->Effects())); } graphic->SetBrowseInfoWnd(boost::shared_ptr<GG::BrowseInfoWnd>( new IconTextBrowseWnd(ClientUI::SpecialIcon(special->Name()), UserString(special->Name()), desc))); m_icons[it->first] = graphic; graphic->InstallEventFilter(this); } const GG::X AVAILABLE_WIDTH = Width() - EDGE_PAD; GG::X x(EDGE_PAD); GG::Y y(EDGE_PAD); for (std::map<std::string, StatisticIcon*>::iterator it = m_icons.begin(); it != m_icons.end(); ++it) { StatisticIcon* icon = it->second; icon->SizeMove(GG::Pt(x, y), GG::Pt(x,y) + GG::Pt(SPECIAL_ICON_WIDTH, SPECIAL_ICON_HEIGHT)); AttachChild(icon); x += SPECIAL_ICON_WIDTH + EDGE_PAD; if (x + SPECIAL_ICON_WIDTH + EDGE_PAD > AVAILABLE_WIDTH) { x = GG::X(EDGE_PAD); y += SPECIAL_ICON_HEIGHT + EDGE_PAD; } } if (m_icons.empty()) { Resize(GG::Pt(Width(), GG::Y0)); } else { Resize(GG::Pt(Width(), y + SPECIAL_ICON_HEIGHT + EDGE_PAD*2)); } }
void SpecialsPanel::Update() { //std::cout << "SpecialsPanel::Update" << std::endl; for (std::map<std::string, StatisticIcon*>::value_type& entry : m_icons) DeleteChild(entry.second); m_icons.clear(); // get specials to display std::shared_ptr<const UniverseObject> obj = GetUniverseObject(m_object_id); if (!obj) { ErrorLogger() << "SpecialsPanel::Update couldn't get object with id " << m_object_id; return; } // get specials and use them to create specials icons // for specials with a nonzero for (const std::map<std::string, std::pair<int, float>>::value_type& entry : obj->Specials()) { const Special* special = GetSpecial(entry.first); StatisticIcon* graphic = nullptr; if (entry.second.second > 0.0f) graphic = new StatisticIcon(ClientUI::SpecialIcon(special->Name()), entry.second.second, 2, false, SPECIAL_ICON_WIDTH, SPECIAL_ICON_HEIGHT); else graphic = new StatisticIcon(ClientUI::SpecialIcon(special->Name()), SPECIAL_ICON_WIDTH, SPECIAL_ICON_HEIGHT); graphic->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); std::string desc = special->Description(); if (entry.second.second > 0.0f) desc += "\n" + boost::io::str(FlexibleFormat(UserString("SPECIAL_CAPACITY")) % DoubleToString(entry.second.second, 2, false)); if (entry.second.first > 0) desc += "\n" + boost::io::str(FlexibleFormat(UserString("ADDED_ON_TURN")) % entry.second.first); else desc += "\n" + UserString("ADDED_ON_INITIAL_TURN"); if (GetOptionsDB().Get<bool>("UI.dump-effects-descriptions") && !special->Effects().empty()) { desc += "\n" + Dump(special->Effects()); } graphic->SetBrowseInfoWnd(std::make_shared<IconTextBrowseWnd>( ClientUI::SpecialIcon(special->Name()), UserString(special->Name()), desc)); m_icons[entry.first] = graphic; graphic->InstallEventFilter(this); } const GG::X AVAILABLE_WIDTH = Width() - EDGE_PAD; GG::X x(EDGE_PAD); GG::Y y(EDGE_PAD); for (std::map<std::string, StatisticIcon*>::value_type& entry : m_icons) { StatisticIcon* icon = entry.second; icon->SizeMove(GG::Pt(x, y), GG::Pt(x,y) + GG::Pt(SPECIAL_ICON_WIDTH, SPECIAL_ICON_HEIGHT)); AttachChild(icon); x += SPECIAL_ICON_WIDTH + EDGE_PAD; if (x + SPECIAL_ICON_WIDTH + EDGE_PAD > AVAILABLE_WIDTH) { x = GG::X(EDGE_PAD); y += SPECIAL_ICON_HEIGHT + EDGE_PAD; } } if (m_icons.empty()) { Resize(GG::Pt(Width(), GG::Y0)); } else { Resize(GG::Pt(Width(), y + SPECIAL_ICON_HEIGHT + EDGE_PAD*2)); } }