/*
* Copyright 2005, Jérôme Duval. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Inspired by SoundCapture from Be newsletter (Media Kit Basics: Consumers
* and Producers)
*/
#include "UpDownButton.h"
#include "icon_button.h"
UpDownButton::UpDownButton(BRect _rect, BMessage *msg, uint32 resizeFlags)
: BControl(_rect, "button", NULL, msg, resizeFlags, B_WILL_DRAW),
fLastValue(B_CONTROL_ON)
{
BRect rect = BRect(0, 0, kUpDownButtonWidth - 1, kUpDownButtonHeight - 1);
fBitmapUp = new BBitmap(rect, B_CMAP8);
fBitmapUp->SetBits(kButtonUpBits, kUpDownButtonWidth * kUpDownButtonHeight,
0, B_CMAP8);
fBitmapDown = new BBitmap(rect, B_CMAP8);
fBitmapDown->SetBits(kButtonDownBits, kUpDownButtonWidth
* kUpDownButtonHeight, 0, B_CMAP8);
fBitmapMiddle = new BBitmap(rect, B_CMAP8);
fBitmapMiddle->SetBits(kButtonMiddleBits, kUpDownButtonWidth
* kUpDownButtonHeight, 0, B_CMAP8);
}
UpDownButton::~UpDownButton()
{
delete fBitmapUp;
delete fBitmapDown;
delete fBitmapMiddle;
}
void
UpDownButton::Draw(BRect updateRect)
{
SetDrawingMode(B_OP_OVER);
if(IsTracking()) {
if((Bounds().top + Bounds().Height()/2) > (fTrackingY + 3))
DrawBitmap(fBitmapUp);
else if((Bounds().top + Bounds().Height()/2) < (fTrackingY - 3))
DrawBitmap(fBitmapDown);
else
DrawBitmap(fBitmapMiddle);
} else {
if(Value()==B_CONTROL_OFF)
DrawBitmap(fBitmapUp);
else
DrawBitmap(fBitmapDown);
}
SetDrawingMode(B_OP_COPY);
}
void
UpDownButton::MouseDown(BPoint point)
{
if(!IsEnabled())
return;
fLastValue = Value();
fTrackingY = (Bounds().top + Bounds().Height()/2);
SetTracking(true);
SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
SetValue(Value() == B_CONTROL_ON ? B_CONTROL_OFF : B_CONTROL_ON);
}
void
UpDownButton::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
{
if (!IsTracking())
return;
fTrackingY = point.y;
Draw(Bounds());
Flush();
}
void
UpDownButton::MouseUp(BPoint point)
{
if (!IsTracking())
return;
if((Bounds().top + Bounds().Height()/2) > (fTrackingY + 3))
SetValue(B_CONTROL_ON);
else if((Bounds().top + Bounds().Height()/2) < (fTrackingY - 3))
SetValue(B_CONTROL_OFF);
if(Value()!=fLastValue)
Invoke();
SetTracking(false);
Draw(Bounds());
Flush();
fLastValue = Value();
}
↑ V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fTrackingY.