⛏️ index : haiku.git

/*
 * 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 <ControlLook.h>
#include <Bitmap.h>


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;
}