virtual void Draw(BRect updateRect) { BRect bounds(Bounds()); BRect iconBounds(0, 0, 15, 15); iconBounds.OffsetTo( floorf((bounds.left + bounds.right - (iconBounds.left + iconBounds.right)) / 2 + 0.5f), floorf((bounds.top + bounds.bottom - (iconBounds.top + iconBounds.bottom)) / 2 + 0.5f)); DrawBitmap(fIcon, fIcon->Bounds(), iconBounds, B_FILTER_BITMAP_BILINEAR); }
void WebTabView::DrawContents(BView* owner, BRect frame, const BRect& updateRect, bool isFirst, bool isLast, bool isFront) { if (fController->CloseButtonsAvailable()) _DrawCloseButton(owner, frame, updateRect, isFirst, isLast, isFront); if (fIcon) { BRect iconBounds(0, 0, kIconSize - 1, kIconSize - 1); // clip to icon bounds, if they are smaller if (iconBounds.Contains(fIcon->Bounds())) iconBounds = fIcon->Bounds(); else { // Try to scale down the icon by an even factor so the // final size is between 14 and 18 pixel size. If this fails, // the icon will simply be displayed at 18x18. float scale = 2; while ((fIcon->Bounds().Width() + 1) / scale > kIconSize) scale *= 2; if ((fIcon->Bounds().Width() + 1) / scale >= kIconSize - 4 && (fIcon->Bounds().Height() + 1) / scale >= kIconSize - 4 && (fIcon->Bounds().Height() + 1) / scale <= kIconSize) { iconBounds.right = (fIcon->Bounds().Width() + 1) / scale - 1; iconBounds.bottom = (fIcon->Bounds().Height() + 1) / scale - 1; } } BPoint iconPos(frame.left + kIconInset - 1, frame.top + floorf((frame.Height() - iconBounds.Height()) / 2)); iconBounds.OffsetTo(iconPos); owner->SetDrawingMode(B_OP_ALPHA); owner->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); owner->DrawBitmap(fIcon, fIcon->Bounds(), iconBounds, B_FILTER_BITMAP_BILINEAR); owner->SetDrawingMode(B_OP_COPY); frame.left = frame.left + kIconSize + kIconInset * 2; } TabView::DrawContents(owner, frame, updateRect, isFirst, isLast, isFront); }
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(); } } } }