void BChannelSlider::GetPreferredSize(float* width, float* height) { _UpdateFontDimens(); if (fIsVertical) { *width = 11.0 * CountChannels(); *width = max_c(*width, ceilf(StringWidth(Label()))); *width = max_c(*width, ceilf(StringWidth(MinLimitLabel()))); *width = max_c(*width, ceilf(StringWidth(MaxLimitLabel()))); *width += kPadding * 2.0; *height = (fLineFeed * 3.0) + (kPadding * 2.0) + 147.0; } else { *width = max_c(64.0, ceilf(StringWidth(Label()))); *width = max_c(*width, ceilf(StringWidth(MinLimitLabel())) + ceilf(StringWidth(MaxLimitLabel())) + 10.0); *width += kPadding * 2.0; *height = 11.0 * CountChannels() + (fLineFeed * 2.0) + (kPadding * 2.0); } }
void BChannelSlider::Draw(BRect updateRect) { _UpdateFontDimens(); _DrawThumbs(); BRect bounds(Bounds()); if (Label()) { float labelWidth = StringWidth(Label()); DrawString(Label(), BPoint((bounds.Width() - labelWidth) / 2.0, fBaseLine)); } if (MinLimitLabel()) { if (fIsVertical) { if (MinLimitLabel()) { float x = (bounds.Width() - StringWidth(MinLimitLabel())) / 2.0; DrawString(MinLimitLabel(), BPoint(x, bounds.bottom - kPadding)); } } else { if (MinLimitLabel()) { DrawString(MinLimitLabel(), BPoint(kPadding, bounds.bottom - kPadding)); } } } if (MaxLimitLabel()) { if (fIsVertical) { if (MaxLimitLabel()) { float x = (bounds.Width() - StringWidth(MaxLimitLabel())) / 2.0; DrawString(MaxLimitLabel(), BPoint(x, 2 * fLineFeed)); } } else { if (MaxLimitLabel()) { DrawString(MaxLimitLabel(), BPoint(bounds.right - kPadding - StringWidth(MaxLimitLabel()), bounds.bottom - kPadding)); } } } }
BSize BSlider::_ValidateMinSize() { if (fMinSize.width >= 0) { // the preferred size is up to date return fMinSize; } font_height fontHeight; GetFontHeight(&fontHeight); float width = 0.0; float height = 0.0; if (fMaxUpdateTextWidth < 0.0) fMaxUpdateTextWidth = MaxUpdateTextWidth(); if (Orientation() == B_HORIZONTAL) { height = 12.0 + fBarThickness; int32 rows = 0; float labelWidth = 0; int32 labelRows = 0; float labelSpacing = StringWidth("M") * 2; if (Label()) { labelWidth = StringWidth(Label()); labelRows = 1; } if (fMaxUpdateTextWidth > 0.0) { if (labelWidth > 0) labelWidth += labelSpacing; labelWidth += fMaxUpdateTextWidth; labelRows = 1; } rows += labelRows; if (MinLimitLabel()) width = StringWidth(MinLimitLabel()); if (MaxLimitLabel()) { // some space between the labels if (MinLimitLabel()) width += labelSpacing; width += StringWidth(MaxLimitLabel()); } if (labelWidth > width) width = labelWidth; if (width < 32.0) width = 32.0; if (MinLimitLabel() || MaxLimitLabel()) rows++; height += rows * (ceilf(fontHeight.ascent) + ceilf(fontHeight.descent) + 4.0); } else { // B_VERTICAL width = 12.0 + fBarThickness; height = 32.0; float lineHeightNoLeading = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent); float lineHeight = lineHeightNoLeading + ceilf(fontHeight.leading); // find largest label float labelWidth = 0; if (Label()) { labelWidth = StringWidth(Label()); height += lineHeightNoLeading; } if (MaxLimitLabel()) { labelWidth = max_c(labelWidth, StringWidth(MaxLimitLabel())); height += Label() ? lineHeight : lineHeightNoLeading; } if (MinLimitLabel()) { labelWidth = max_c(labelWidth, StringWidth(MinLimitLabel())); height += lineHeightNoLeading; } if (fMaxUpdateTextWidth > 0.0) { labelWidth = max_c(labelWidth, fMaxUpdateTextWidth); height += MinLimitLabel() ? lineHeight : lineHeightNoLeading; } width = max_c(labelWidth, width); } fMinSize.width = width; fMinSize.height = height; ResetLayoutInvalidation(); return fMinSize; }