#include <ControlLook.h>
#include <InterfaceDefs.h>
#include <PopUpMenu.h>
#include <Window.h>
#include "MiniMenuField.h"
#include "Utilities.h"
MiniMenuField::MiniMenuField(BRect frame, const char* name, BPopUpMenu* menu,
uint32 resizeFlags, uint32 flags)
:
BView(frame, name, resizeFlags, flags),
fMenu(menu)
{
SetFont(be_plain_font, B_FONT_FAMILY_AND_STYLE | B_FONT_SIZE);
}
MiniMenuField::~MiniMenuField()
{
delete fMenu;
}
void
MiniMenuField::AttachedToWindow()
{
AdoptParentColors();
SetHighColor(0, 0, 0);
}
void
MiniMenuField::MakeFocus(bool on)
{
Invalidate();
BView::MakeFocus(on);
}
void
MiniMenuField::KeyDown(const char* bytes, int32 numBytes)
{
switch (bytes[0]) {
case B_SPACE:
case B_DOWN_ARROW:
case B_RIGHT_ARROW:
fMenu->Go(ConvertToScreen(BPoint(4, 4)), true, true);
break;
default:
BView::KeyDown(bytes, numBytes);
break;
}
}
void
MiniMenuField::Draw(BRect)
{
BRect bounds(Bounds());
bounds.OffsetBy(1, 2);
bounds.right--;
bounds.bottom -= 2;
if (IsFocus()) {
SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR));
StrokeRect(bounds);
}
bounds.right--;
bounds.bottom--;
BRect rect(bounds);
rect.InsetBy(1, 1);
rgb_color darkest = tint_color(kBlack, 0.6f);
rgb_color dark = tint_color(kBlack, 0.4f);
rgb_color medium = dark;
rgb_color light = tint_color(kBlack, 0.03f);
SetHighColor(medium);
BeginLineArray(10);
AddLine(rect.RightTop(), rect.RightBottom(), darkest);
AddLine(rect.RightBottom(), rect.LeftBottom(), darkest);
AddLine(rect.LeftBottom(), rect.LeftTop(), medium);
AddLine(rect.LeftTop(), rect.RightTop(), medium);
AddLine(bounds.LeftBottom() + BPoint(2, 0), bounds.RightBottom(), dark);
AddLine(bounds.RightTop() + BPoint(0, 1), bounds.RightBottom(), dark);
rect.InsetBy(1, 1);
AddLine(rect.RightTop(), rect.RightBottom(), medium);
AddLine(rect.RightBottom(), rect.LeftBottom(), medium);
AddLine(rect.LeftBottom(), rect.LeftTop(), light);
AddLine(rect.LeftTop(), rect.RightTop(), light);
EndLineArray();
rect = BRect(0, 0, 12, 12);
rect.OffsetBy(4, 4);
const rgb_color arrowColor = {150, 150, 150, 255};
float tint = Window()->IsActive() ? B_DARKEN_3_TINT : B_DARKEN_1_TINT;
SetDrawingMode(B_OP_COPY);
be_control_look->DrawArrowShape(this, rect, rect, arrowColor,
BControlLook::B_RIGHT_ARROW, 0, tint);
}
void
MiniMenuField::MouseDown(BPoint)
{
fMenu->Go(ConvertToScreen(BPoint(4, 4)), true);
}