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 ResourcePanel::DoLayout() { AccordionPanel::DoLayout(); for (auto& 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_rescenter_id]) { // position and reattach icons to be shown int n = 0; GG::X stride = MeterIconSize().x * 7/2; for (auto& meter_stat : m_meter_stats) { GG::X x = n * stride; auto& 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_rescenter_id]); }
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(); }
void ResourcePanel::CompleteConstruction() { AccordionPanel::CompleteConstruction(); SetName("ResourcePanel"); auto res = GetResCenter(); if (!res) throw std::invalid_argument("Attempted to construct a ResourcePanel with an UniverseObject that is not a ResourceCenter"); m_expand_button->LeftClickedSignal.connect( boost::bind(&ResourcePanel::ExpandCollapseButtonPressed, this)); const auto obj = GetUniverseObject(m_rescenter_id); if (!obj) { ErrorLogger() << "Invalid object id " << m_rescenter_id; return; } // meter and production indicators std::vector<std::pair<MeterType, MeterType>> meters; // small meter indicators - for use when panel is collapsed for (MeterType meter : {METER_INDUSTRY, METER_RESEARCH, METER_SUPPLY, METER_STOCKPILE}) { auto stat = GG::Wnd::Create<StatisticIcon>( ClientUI::MeterIcon(meter), obj->InitialMeterValue(meter), 3, false, MeterIconSize().x, MeterIconSize().y); stat->InstallEventFilter(shared_from_this()); AttachChild(stat); m_meter_stats.push_back({meter, stat}); meters.push_back({meter, AssociatedMeterType(meter)}); } // attach and show meter bars and large resource indicators m_multi_meter_status_bar = GG::Wnd::Create<MultiMeterStatusBar>(Width() - 2*EDGE_PAD, m_rescenter_id, meters); m_multi_icon_value_indicator = GG::Wnd::Create<MultiIconValueIndicator>(Width() - 2*EDGE_PAD, m_rescenter_id, meters); // determine if this panel has been created yet. auto it = s_expanded_map.find(m_rescenter_id); if (it == s_expanded_map.end()) s_expanded_map[m_rescenter_id] = false; // if not, default to collapsed state Refresh(); }
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 BuildingsPanel::DoLayout() { AccordionPanel::DoLayout(); int row = 0; int column = 0; const int padding = 5; // space around and between adjacent indicators const GG::X effective_width = Width() - padding * (m_columns + 1); // padding on either side and between const int indicator_size = static_cast<int>(Value(effective_width * 1.0 / m_columns)); GG::Y height; // update size of panel and position and visibility of widgets if (!s_expanded_map[m_planet_id]) { int n = 0; for (std::vector<BuildingIndicator*>::iterator it = m_building_indicators.begin(); it != m_building_indicators.end(); ++it) { BuildingIndicator* ind = *it; const GG::Pt ul = GG::Pt(MeterIconSize().x * n, GG::Y0); const GG::Pt lr = ul + MeterIconSize(); if (lr.x < Width() - m_expand_button->Width()) { ind->SizeMove(ul, lr); AttachChild(ind); } else { DetachChild(ind); } ++n; } height = m_expand_button->Height(); } else { for (std::vector<BuildingIndicator*>::iterator it = m_building_indicators.begin(); it != m_building_indicators.end(); ++it) { BuildingIndicator* ind = *it; const GG::Pt ul = GG::Pt(GG::X(padding * (column + 1) + indicator_size * column), GG::Y(padding * (row + 1) + indicator_size * row)); const GG::Pt lr = ul + GG::Pt(GG::X(indicator_size), GG::Y(indicator_size)); ind->SizeMove(ul, lr); AttachChild(ind); ind->Show(); ++column; if (column >= m_columns) { column = 0; ++row; } } if (column == 0) height = GG::Y(padding * (row + 1) + row * indicator_size); // if column is 0, then there are no buildings in the next row else height = GG::Y(padding * (row + 2) + (row + 1) * indicator_size); // if column != 0, there are buildings in the next row, so need to make space } if (m_building_indicators.empty()) { height = GG::Y(0); // hide if empty DetachChild(m_expand_button); } else { AttachChild(m_expand_button); m_expand_button->Show(); if (height < MeterIconSize().y) height = MeterIconSize().y; } Resize(GG::Pt(Width(), height)); Wnd::MoveChildUp(m_expand_button); m_expand_button->MoveTo(GG::Pt(Width() - m_expand_button->Width(), GG::Y0)); SetCollapsed(!s_expanded_map[m_planet_id]); }