void TTeamMenuItem::GetContentSize(float* width, float* height) { BRect iconBounds; if (fIcon) iconBounds = fIcon->Bounds(); else iconBounds = BRect(0, 0, kMinimumIconSize - 1, kMinimumIconSize - 1); BMenuItem::GetContentSize(width, height); if (fOverrideWidth != -1.0f) *width = fOverrideWidth; else { *width = kHPad + iconBounds.Width() + kHPad; if (iconBounds.Width() <= 32 && fDrawLabel) *width += LabelWidth() + kHPad; } if (fOverrideHeight != -1.0f) *height = fOverrideHeight; else { if (fVertical) { *height = iconBounds.Height() + kVPad * 4; if (fDrawLabel && iconBounds.Width() > 32) *height += fLabelAscent + fLabelDescent; } else { *height = iconBounds.Height() - kVPad * 8; } } *height += 2; }
SystemResourceSummaryBrowseWnd::SystemResourceSummaryBrowseWnd(ResourceType resource_type, int system_id, int empire_id) : GG::BrowseInfoWnd(GG::X0, GG::Y0, LabelWidth() + ValueWidth(), GG::Y1), m_resource_type(resource_type), m_system_id(system_id), m_empire_id(empire_id), m_production_label(0), m_allocation_label(0), m_import_export_label(0), row_height(1), production_label_top(0), allocation_label_top(0), import_export_label_top(0) {}
void SystemResourceSummaryBrowseWnd::Initialize() { row_height = GG::Y(ClientUI::Pts() * 3/2); const GG::X TOTAL_WIDTH = LabelWidth() + ValueWidth(); GG::Y top = GG::Y0; production_label_top = top; m_production_label = new CUILabel("", GG::FORMAT_RIGHT); m_production_label->MoveTo(GG::Pt(GG::X0, production_label_top)); m_production_label->Resize(GG::Pt(TOTAL_WIDTH - EDGE_PAD, row_height)); m_production_label->SetFont(ClientUI::GetBoldFont()); AttachChild(m_production_label); top += row_height; UpdateProduction(top); allocation_label_top = top; m_allocation_label = new CUILabel("", GG::FORMAT_RIGHT); m_allocation_label->MoveTo(GG::Pt(GG::X0, allocation_label_top)); m_allocation_label->Resize(GG::Pt(TOTAL_WIDTH - EDGE_PAD, row_height)); m_allocation_label->SetFont(ClientUI::GetBoldFont()); AttachChild(m_allocation_label); top += row_height; UpdateAllocation(top); import_export_label_top = top; m_import_export_label = new CUILabel("", GG::FORMAT_RIGHT); m_import_export_label->MoveTo(GG::Pt(GG::X0, import_export_label_top)); m_import_export_label->Resize(GG::Pt(TOTAL_WIDTH - EDGE_PAD, row_height)); m_import_export_label->SetFont(ClientUI::GetBoldFont()); AttachChild(m_import_export_label); top += row_height; UpdateImportExport(top); Resize(GG::Pt(LabelWidth() + ValueWidth(), top)); }
// layoutprefs minimax PopupSlider::layoutprefs() { BFont font; GetFont(&font); font_height fh; font.GetHeight(&fh); float labelHeight = 2.0 + ceilf(fh.ascent + fh.descent) + 2.0; float sliderWidth, sliderHeight; SliderView::GetSliderButtonDimensions(Max(), FormatString(), &font, sliderWidth, sliderHeight); float height = labelHeight > sliderHeight + 2.0 ? labelHeight : sliderHeight + 2.0; float minLabelWidth = LabelWidth(); if (rolemodel) labelwidth = rolemodel->LabelWidth(); labelwidth = minLabelWidth > labelwidth ? minLabelWidth : labelwidth; fSliderButtonRect.left = labelwidth; fSliderButtonRect.right = fSliderButtonRect.left + sliderWidth + 2.0; fSliderButtonRect.top = floorf(height / 2.0 - (sliderHeight + 2.0) / 2.0); fSliderButtonRect.bottom = fSliderButtonRect.top + sliderHeight + 2.0; fSliderButtonRect.OffsetTo(Bounds().right - fSliderButtonRect.Width(), fSliderButtonRect.top); mpm.mini.x = labelwidth + fSliderButtonRect.Width() + 1.0; mpm.maxi.x = 10000.0; mpm.mini.y = mpm.maxi.y = height + 1.0; mpm.weight = 1.0; return mpm; }
void TTeamMenuItem::DrawContent() { BMenu* menu = Menu(); if (fIcon != NULL) { if (fIcon->ColorSpace() == B_RGBA32) { menu->SetDrawingMode(B_OP_ALPHA); menu->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); } else menu->SetDrawingMode(B_OP_OVER); BRect frame(Frame()); BRect iconBounds(fIcon->Bounds()); BRect dstRect(iconBounds); float extra = fVertical ? 0.0f : -1.0f; BPoint contLoc = ContentLocation(); BPoint drawLoc = contLoc + BPoint(kHPad, kVPad); if (!fDrawLabel || (fVertical && iconBounds.Width() > 32)) { float offsetx = contLoc.x + ((frame.Width() - iconBounds.Width()) / 2) + extra; float offsety = contLoc.y + 3.0f + extra; dstRect.OffsetTo(BPoint(offsetx, offsety)); menu->DrawBitmapAsync(fIcon, dstRect); drawLoc.x = ((frame.Width() - LabelWidth()) / 2); drawLoc.y = frame.top + iconBounds.Height() + 4.0f; } else { float offsetx = contLoc.x + kHPad; float offsety = contLoc.y + ((frame.Height() - iconBounds.Height()) / 2) + extra; dstRect.OffsetTo(BPoint(offsetx, offsety)); menu->DrawBitmapAsync(fIcon, dstRect); float labelHeight = fLabelAscent + fLabelDescent; drawLoc.x += iconBounds.Width() + kLabelOffset; drawLoc.y = frame.top + ((frame.Height() - labelHeight) / 2) + extra; } menu->MovePenTo(drawLoc); } // set the pen to black so that either method will draw in the same color // low color is set in inherited::DrawContent, override makes sure its // what we want if (fDrawLabel) { menu->SetDrawingMode(B_OP_OVER); menu->SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR)); // override the drawing of the content when the item is disabled // the wrong lowcolor is used when the item is disabled since the // text color does not change DrawContentLabel(); } // Draw the expandable icon. TBarView* barView = (static_cast<TBarApp*>(be_app))->BarView(); if (fVertical && static_cast<TBarApp*>(be_app)->Settings()->superExpando && barView->ExpandoState()) { BRect frame(Frame()); BRect rect(0, 0, kSwitchWidth, 10); rect.OffsetTo(BPoint(frame.right - rect.Width(), ContentLocation().y + ((frame.Height() - rect.Height()) / 2))); if (be_control_look != NULL) { uint32 arrowDirection = fExpanded ? BControlLook::B_UP_ARROW : BControlLook::B_DOWN_ARROW; be_control_look->DrawArrowShape(menu, rect, rect, menu->LowColor(), arrowDirection, 0, B_DARKEN_3_TINT); } else { rgb_color outlineColor = {80, 80, 80, 255}; rgb_color middleColor = {200, 200, 200, 255}; menu->SetDrawingMode(B_OP_OVER); if (!fExpanded) { menu->BeginLineArray(6); menu->AddLine(BPoint(rect.left + 3, rect.top + 1), BPoint(rect.left + 3, rect.bottom - 1), outlineColor); menu->AddLine(BPoint(rect.left + 3, rect.top + 1), BPoint(rect.left + 7, rect.top + 5), outlineColor); menu->AddLine(BPoint(rect.left + 7, rect.top + 5), BPoint(rect.left + 3, rect.bottom - 1), outlineColor); menu->AddLine(BPoint(rect.left + 4, rect.top + 3), BPoint(rect.left + 4, rect.bottom - 3), middleColor); menu->AddLine(BPoint(rect.left + 5, rect.top + 4), BPoint(rect.left + 5, rect.bottom - 4), middleColor); menu->AddLine(BPoint(rect.left + 5, rect.top + 5), BPoint(rect.left + 6, rect.top + 5), middleColor); menu->EndLineArray(); } else { // expanded state menu->BeginLineArray(6); menu->AddLine(BPoint(rect.left + 1, rect.top + 3), BPoint(rect.right - 3, rect.top + 3), outlineColor); menu->AddLine(BPoint(rect.left + 1, rect.top + 3), BPoint(rect.left + 5, rect.top + 7), outlineColor); menu->AddLine(BPoint(rect.left + 5, rect.top + 7), BPoint(rect.right - 3, rect.top + 3), outlineColor); menu->AddLine(BPoint(rect.left + 3, rect.top + 4), BPoint(rect.right - 5, rect.top + 4), middleColor); menu->AddLine(BPoint(rect.left + 4, rect.top + 5), BPoint(rect.right - 6, rect.top + 5), middleColor); menu->AddLine(BPoint(rect.left + 5, rect.top + 5), BPoint(rect.left + 5, rect.top + 6), middleColor); menu->EndLineArray(); } } } }
void SystemResourceSummaryBrowseWnd::UpdateImportExport(GG::Y& top) { m_import_export_label->SetText(UserString("IMPORT_EXPORT_TOOLTIP")); const Empire* empire = 0; // check for early exit cases... bool abort = false; if (m_empire_id == ALL_EMPIRES ||m_resource_type == RE_RESEARCH) { // multiple empires have complicated stockpiling which don't make sense to try to display. // Research use is nonlocalized, so importing / exporting doesn't make sense to display abort = true; } else { empire = GetEmpire(m_empire_id); if (!empire) abort = true; } std::string label_text = "", amount_text = ""; if (!abort) { double difference = m_production - m_allocation; switch (m_resource_type) { case RE_TRADE: case RE_INDUSTRY: if (difference > 0.0) { // show surplus label_text = UserString("RESOURCE_EXPORT"); amount_text = DoubleToString(difference, 3, false); } else if (difference < 0.0) { // show amount being imported label_text = UserString("RESOURCE_IMPORT"); amount_text = DoubleToString(std::abs(difference), 3, false); } else { // show self-sufficiency label_text = UserString("RESOURCE_SELF_SUFFICIENT"); amount_text = ""; } break; case RE_RESEARCH: default: // show nothing abort = true; break; } } if (abort) { label_text = UserString("NOT_APPLICABLE"); amount_text = ""; // no change } // add label and amount. may be "NOT APPLIABLE" and nothing if aborted above GG::Label* label = new CUILabel(label_text, GG::FORMAT_RIGHT); label->MoveTo(GG::Pt(GG::X0, top)); label->Resize(GG::Pt(LabelWidth(), row_height)); AttachChild(label); GG::Label* value = new CUILabel(amount_text); value->MoveTo(GG::Pt(LabelWidth(), top)); value->Resize(GG::Pt(ValueWidth(), row_height)); AttachChild(value); m_import_export_labels_and_amounts.push_back(std::pair<GG::Label*, GG::Label*>(label, value)); top += row_height; }
void SystemResourceSummaryBrowseWnd::UpdateAllocation(GG::Y& top) { // adds pairs of labels for allocation of resources in system, starting at vertical position \a top and // updates \a top to be the vertical position after the last entry for (unsigned int i = 0; i < m_allocation_labels_and_amounts.size(); ++i) { DeleteChild(m_allocation_labels_and_amounts[i].first); DeleteChild(m_allocation_labels_and_amounts[i].second); } m_allocation_labels_and_amounts.clear(); TemporaryPtr<const System> system = GetSystem(m_system_id); if (!system || m_resource_type == INVALID_RESOURCE_TYPE) return; m_allocation = 0.0; // add label-value pair for each resource-consuming object in system to indicate amount of resource consumed std::vector<TemporaryPtr<const UniverseObject> > objects = Objects().FindObjects<const UniverseObject>(system->ContainedObjectIDs()); for (std::vector<TemporaryPtr<const UniverseObject> >::const_iterator it = objects.begin(); it != objects.end(); ++it) { TemporaryPtr<const UniverseObject> obj = *it; // display information only for the requested player if (m_empire_id != ALL_EMPIRES && !obj->OwnedBy(m_empire_id)) continue; // if m_empire_id == ALL_EMPIRES, display resource production for all empires. otherwise, skip this resource production if it's not owned by the requested player std::string name = obj->Name(); double allocation = ObjectResourceConsumption(obj, m_resource_type, m_empire_id); // don't add summary entries for objects that consume no resource. (otherwise there would be a loooong pointless list of 0's if (allocation <= 0.0) { if (allocation < 0.0) ErrorLogger() << "object " << obj->Name() << " is reported having negative " << boost::lexical_cast<std::string>(m_resource_type) << " consumption"; continue; } m_allocation += allocation; std::string amount_text = DoubleToString(allocation, 3, false); GG::Label* label = new CUILabel(name, GG::FORMAT_RIGHT); label->MoveTo(GG::Pt(GG::X0, top)); label->Resize(GG::Pt(LabelWidth(), row_height)); AttachChild(label); GG::Label* value = new CUILabel(amount_text); value->MoveTo(GG::Pt(LabelWidth(), top)); value->Resize(GG::Pt(ValueWidth(), row_height)); AttachChild(value); m_allocation_labels_and_amounts.push_back(std::pair<GG::Label*, GG::Label*>(label, value)); top += row_height; } if (m_allocation_labels_and_amounts.empty()) { // add "blank" line to indicate no allocation GG::Label* label = new CUILabel(UserString("NOT_APPLICABLE"), GG::FORMAT_RIGHT); label->MoveTo(GG::Pt(GG::X0, top)); label->Resize(GG::Pt(LabelWidth(), row_height)); AttachChild(label); GG::Label* value = new CUILabel(""); value->MoveTo(GG::Pt(LabelWidth(), top)); value->Resize(GG::Pt(ValueWidth(), row_height)); AttachChild(value); m_allocation_labels_and_amounts.push_back(std::pair<GG::Label*, GG::Label*>(label, value)); top += row_height; } // set consumption / allocation label std::string resource_text = ""; switch (m_resource_type) { case RE_INDUSTRY: resource_text = UserString("INDUSTRY_CONSUMPTION"); break; case RE_RESEARCH: resource_text = UserString("RESEARCH_CONSUMPTION"); break; case RE_TRADE: resource_text = UserString("TRADE_CONSUMPTION"); break; default: resource_text = UserString("UNKNOWN_VALUE_SYMBOL"); break; } std::string system_allocation_text = DoubleToString(m_allocation, 3, false); // for research only, local allocation makes no sense if (m_resource_type == RE_RESEARCH && m_allocation == 0.0) system_allocation_text = UserString("NOT_APPLICABLE"); m_allocation_label->SetText(boost::io::str(FlexibleFormat(UserString("RESOURCE_ALLOCATION_TOOLTIP")) % resource_text % system_allocation_text)); // height of label already added to top outside this function }
void SystemResourceSummaryBrowseWnd::UpdateProduction(GG::Y& top) { // adds pairs of labels for ResourceCenter name and production of resource starting at vertical position \a top // and updates \a top to the vertical position after the last entry for (unsigned int i = 0; i < m_production_labels_and_amounts.size(); ++i) { DeleteChild(m_production_labels_and_amounts[i].first); DeleteChild(m_production_labels_and_amounts[i].second); } m_production_labels_and_amounts.clear(); TemporaryPtr<const System> system = GetSystem(m_system_id); if (!system || m_resource_type == INVALID_RESOURCE_TYPE) return; m_production = 0.0; // add label-value pair for each resource-producing object in system to indicate amount of resource produced std::vector<TemporaryPtr<const UniverseObject> > objects = Objects().FindObjects<const UniverseObject>(system->ContainedObjectIDs()); for (std::vector<TemporaryPtr<const UniverseObject> >::const_iterator it = objects.begin(); it != objects.end(); ++it) { TemporaryPtr<const UniverseObject> obj = *it; // display information only for the requested player if (m_empire_id != ALL_EMPIRES && !obj->OwnedBy(m_empire_id)) continue; // if m_empire_id == -1, display resource production for all empires. otherwise, skip this resource production if it's not owned by the requested player TemporaryPtr<const ResourceCenter> rc = boost::dynamic_pointer_cast<const ResourceCenter>(obj); if (!rc) continue; std::string name = obj->Name(); double production = rc->InitialMeterValue(ResourceToMeter(m_resource_type)); m_production += production; std::string amount_text = DoubleToString(production, 3, false); GG::Label* label = new CUILabel(name, GG::FORMAT_RIGHT); label->MoveTo(GG::Pt(GG::X0, top)); label->Resize(GG::Pt(LabelWidth(), row_height)); AttachChild(label); GG::Label* value = new CUILabel(amount_text); value->MoveTo(GG::Pt(LabelWidth(), top)); value->Resize(GG::Pt(ValueWidth(), row_height)); AttachChild(value); m_production_labels_and_amounts.push_back(std::pair<GG::Label*, GG::Label*>(label, value)); top += row_height; } if (m_production_labels_and_amounts.empty()) { // add "blank" line to indicate no production GG::Label* label = new CUILabel(UserString("NOT_APPLICABLE")); label->MoveTo(GG::Pt(GG::X0, top)); label->Resize(GG::Pt(LabelWidth(), row_height)); AttachChild(label); GG::Label* value = new CUILabel(""); value->MoveTo(GG::Pt(LabelWidth(), top)); value->Resize(GG::Pt(ValueWidth(), row_height)); AttachChild(value); m_production_labels_and_amounts.push_back(std::pair<GG::Label*, GG::Label*>(label, value)); top += row_height; } // set production label std::string resource_text = ""; switch (m_resource_type) { case RE_INDUSTRY: resource_text = UserString("INDUSTRY_PRODUCTION"); break; case RE_RESEARCH: resource_text = UserString("RESEARCH_PRODUCTION"); break; case RE_TRADE: resource_text = UserString("TRADE_PRODUCTION"); break; default: resource_text = UserString("UNKNOWN_VALUE_SYMBOL"); break; } m_production_label->SetText(boost::io::str(FlexibleFormat(UserString("RESOURCE_PRODUCTION_TOOLTIP")) % resource_text % DoubleToString(m_production, 3, false))); // height of label already added to top outside this function }