float CheckBox::CalculateTextScale(const UIContext &dc, float availWidth) const { float actualWidth, actualHeight; Bounds availBounds(0, 0, availWidth, bounds_.h); dc.MeasureTextRect(dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), (int)text_.size(), availBounds, &actualWidth, &actualHeight, ALIGN_VCENTER); if (actualWidth > availWidth) { return std::max(MIN_TEXT_SCALE, availWidth / actualWidth); } return 1.0f; }
void TextView::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { Bounds bounds(0, 0, layoutParams_->width, layoutParams_->height); if (bounds.w < 0) { // If there's no size, let's grow as big as we want. bounds.w = horiz.size == 0 ? MAX_ITEM_SIZE : horiz.size; } if (bounds.h < 0) { bounds.h = vert.size == 0 ? MAX_ITEM_SIZE : vert.size; } ApplyBoundsBySpec(bounds, horiz, vert); dc.MeasureTextRect(small_ ? dc.theme->uiFontSmall : dc.theme->uiFont, 1.0f, 1.0f, text_.c_str(), (int)text_.length(), bounds, &w, &h, textAlign_); }
void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const { if (atlasImage_ != -1) { const AtlasImage &img = dc.Draw()->GetAtlas()->images[atlasImage_]; w = img.w; h = img.h; } else { const int paddingX = 12; float availWidth = horiz.size - paddingX * 2 - textPadding_.horiz(); if (availWidth < 0.0f) { // Let it have as much space as it needs. availWidth = MAX_ITEM_SIZE; } float scale = CalculateTextScale(dc, availWidth); Bounds availBounds(0, 0, availWidth, vert.size); dc.MeasureTextRect(dc.theme->uiFont, scale, scale, text_.c_str(), (int)text_.size(), availBounds, &w, &h, FLAG_WRAP_TEXT); } w += 24; h += 16; h = std::max(h, ITEM_HEIGHT); }
void CheckBox::GetContentDimensions(const UIContext &dc, float &w, float &h) const { int image = *toggle_ ? dc.theme->checkOn : dc.theme->checkOff; float imageW, imageH; dc.Draw()->MeasureImage(image, &imageW, &imageH); const int paddingX = 12; // Padding right of the checkbox image too. float availWidth = bounds_.w - paddingX * 2 - imageW - paddingX; if (availWidth < 0.0f) { // Let it have as much space as it needs. availWidth = MAX_ITEM_SIZE; } float scale = CalculateTextScale(dc, availWidth); float actualWidth, actualHeight; Bounds availBounds(0, 0, availWidth, bounds_.h); dc.MeasureTextRect(dc.theme->uiFont, scale, scale, text_.c_str(), (int)text_.size(), availBounds, &actualWidth, &actualHeight, ALIGN_VCENTER | FLAG_WRAP_TEXT); w = bounds_.w; h = std::max(actualHeight, ITEM_HEIGHT); }