/* * Copyright 2000, Georges-Edouard Berenger. All rights reserved. * Copyright 2022, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #include "IconMenuItem.h" #include #include IconMenuItem::IconMenuItem(BBitmap* icon, const char* title, BMessage* msg, bool drawText, bool purge) : BMenuItem(title, msg), fIcon(icon), fDrawText(drawText), fPurge(purge) { } IconMenuItem::IconMenuItem(BBitmap* icon, BMenu* menu, bool drawText, bool purge) : BMenuItem(menu), fIcon(icon), fDrawText(drawText), fPurge(purge) { } IconMenuItem::~IconMenuItem() { if (fPurge) delete fIcon; } void IconMenuItem::Reset(BBitmap* icon, bool purge) { if (fPurge) delete fIcon; fPurge = purge; fIcon = icon; } void IconMenuItem::DrawContent() { DrawIcon(); if (fDrawText) { BPoint loc = ContentLocation(); loc.x += ceilf(be_control_look->DefaultLabelSpacing() * 3.3f); Menu()->MovePenTo(loc); BMenuItem::DrawContent(); } } void IconMenuItem::Highlight(bool hilited) { BMenuItem::Highlight(hilited); DrawIcon(); } void IconMenuItem::DrawIcon() { if (fIcon == NULL) return; BPoint loc = ContentLocation(); BRect frame = Frame(); loc.y = frame.top + (frame.bottom - frame.top - fIcon->Bounds().Height()) / 2; BMenu* menu = Menu(); if (fIcon->ColorSpace() == B_RGBA32) { menu->SetDrawingMode(B_OP_ALPHA); menu->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); } else menu->SetDrawingMode(B_OP_OVER); menu->DrawBitmap(fIcon, loc); menu->SetDrawingMode(B_OP_COPY); } void IconMenuItem::GetContentSize(float* width, float* height) { BMenuItem::GetContentSize(width, height); if (fIcon == NULL) return; const float limit = ceilf(fIcon->Bounds().Height() + (be_control_look->DefaultLabelSpacing() / 3.0f)); if (*height < limit) *height = limit; if (fDrawText) *width += fIcon->Bounds().Width() + be_control_look->DefaultLabelSpacing(); else *width = fIcon->Bounds().Width() + 1; }