1/*
2 * Copyright 2010 Stephan A��mus <superstippi@gmx.de>. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include "BitmapButton.h"
7
8#include <string.h>
9
10#include <Bitmap.h>
11#include <ControlLook.h>
12#include <TranslationUtils.h>
13
14
15static const float kFrameInset = 2;
16
17
18BBitmapButton::BBitmapButton(const char* resourceName, BMessage* message)
19	:
20	BButton("", message),
21	fBitmap(BTranslationUtils::GetBitmap(resourceName)),
22	fBackgroundMode(BUTTON_BACKGROUND)
23{
24}
25
26
27BBitmapButton::BBitmapButton(const uint8* bits, uint32 width, uint32 height,
28		color_space format, BMessage* message)
29	:
30	BButton("", message),
31	fBitmap(new BBitmap(BRect(0, 0, width - 1, height - 1), 0, format)),
32	fBackgroundMode(BUTTON_BACKGROUND)
33{
34	memcpy(fBitmap->Bits(), bits, fBitmap->BitsLength());
35}
36
37
38BBitmapButton::~BBitmapButton()
39{
40	delete fBitmap;
41}
42
43
44BSize
45BBitmapButton::MinSize()
46{
47	BSize min(0, 0);
48	if (fBitmap) {
49		min.width = fBitmap->Bounds().Width();
50		min.height = fBitmap->Bounds().Height();
51	}
52	min.width += kFrameInset * 2;
53	min.height += kFrameInset * 2;
54	return min;
55}
56
57
58BSize
59BBitmapButton::MaxSize()
60{
61	return BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED);
62}
63
64
65BSize
66BBitmapButton::PreferredSize()
67{
68	return MinSize();
69}
70
71
72void
73BBitmapButton::Draw(BRect updateRect)
74{
75	BRect bounds(Bounds());
76	rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
77	uint32 flags = be_control_look->Flags(this);
78
79	if (fBackgroundMode == BUTTON_BACKGROUND || Value() == B_CONTROL_ON) {
80		be_control_look->DrawButtonBackground(this, bounds, updateRect, base,
81			flags);
82	} else {
83		SetHighColor(tint_color(base, B_DARKEN_2_TINT));
84		StrokeLine(bounds.LeftBottom(), bounds.RightBottom());
85		bounds.bottom--;
86		be_control_look->DrawMenuBarBackground(this, bounds, updateRect, base,
87			flags);
88	}
89
90	if (fBitmap == NULL)
91		return;
92
93	SetDrawingMode(B_OP_ALPHA);
94
95	if (!IsEnabled()) {
96		SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
97		SetHighColor(0, 0, 0, 120);
98	}
99
100	BRect bitmapBounds(fBitmap->Bounds());
101	BPoint bitmapLocation(
102		floorf((bounds.left + bounds.right
103			- (bitmapBounds.left + bitmapBounds.right)) / 2 + 0.5f),
104		floorf((bounds.top + bounds.bottom
105			- (bitmapBounds.top + bitmapBounds.bottom)) / 2 + 0.5f));
106
107	DrawBitmap(fBitmap, bitmapLocation);
108}
109
110
111void
112BBitmapButton::SetBackgroundMode(uint32 mode)
113{
114	if (fBackgroundMode != mode) {
115		fBackgroundMode = mode;
116		Invalidate();
117	}
118}
119
120