BButton: Add flat property
* Add methods SetFlat()/IsFlat(). A flat button doesn't draw its frame, unless the mouse is hovering over it or it is otherwise activated. * As a side effect this change also activates the hover glow that was already implemented in BControlLook, but not activated in BButton.
This commit is contained in:
parent
94c2eb2092
commit
a249edfbfc
@ -39,6 +39,9 @@ public:
|
|||||||
virtual void SetLabel(const char* string);
|
virtual void SetLabel(const char* string);
|
||||||
bool IsDefault() const;
|
bool IsDefault() const;
|
||||||
|
|
||||||
|
bool IsFlat() const;
|
||||||
|
void SetFlat(bool flat);
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* message);
|
virtual void MessageReceived(BMessage* message);
|
||||||
virtual void WindowActivated(bool active);
|
virtual void WindowActivated(bool active);
|
||||||
virtual void MouseMoved(BPoint point, uint32 transit,
|
virtual void MouseMoved(BPoint point, uint32 transit,
|
||||||
@ -79,7 +82,6 @@ private:
|
|||||||
virtual void _ReservedButton2();
|
virtual void _ReservedButton2();
|
||||||
virtual void _ReservedButton3();
|
virtual void _ReservedButton3();
|
||||||
|
|
||||||
private:
|
|
||||||
BButton& operator=(const BButton &);
|
BButton& operator=(const BButton &);
|
||||||
|
|
||||||
BSize _ValidatePreferredSize();
|
BSize _ValidatePreferredSize();
|
||||||
@ -87,9 +89,15 @@ private:
|
|||||||
BRect _DrawDefault(BRect bounds, bool enabled);
|
BRect _DrawDefault(BRect bounds, bool enabled);
|
||||||
void _DrawFocusLine(float x, float y, float width,
|
void _DrawFocusLine(float x, float y, float width,
|
||||||
bool bVisible);
|
bool bVisible);
|
||||||
|
|
||||||
|
inline bool _Flag(uint32 flag) const;
|
||||||
|
inline bool _SetFlag(uint32 flag, bool set);
|
||||||
|
|
||||||
|
private:
|
||||||
BSize fPreferredSize;
|
BSize fPreferredSize;
|
||||||
|
uint32 fFlags;
|
||||||
bool fDrawAsDefault;
|
bool fDrawAsDefault;
|
||||||
|
bool fFlat;
|
||||||
|
|
||||||
uint32 _reserved[2];
|
uint32 _reserved[2];
|
||||||
};
|
};
|
||||||
|
@ -82,6 +82,7 @@ public:
|
|||||||
B_DEFAULT_BUTTON = 1 << 5,
|
B_DEFAULT_BUTTON = 1 << 5,
|
||||||
B_IGNORE_OUTLINE = 1 << 6,
|
B_IGNORE_OUTLINE = 1 << 6,
|
||||||
B_PARTIALLY_ACTIVATED = 1 << 7, // like B_ACTIVATED, but for tri-state
|
B_PARTIALLY_ACTIVATED = 1 << 7, // like B_ACTIVATED, but for tri-state
|
||||||
|
B_FLAT = 1 << 8, // flat look (e.g. button background)
|
||||||
|
|
||||||
B_BLEND_FRAME = 1 << 16
|
B_BLEND_FRAME = 1 << 16
|
||||||
};
|
};
|
||||||
|
@ -26,6 +26,13 @@
|
|||||||
#include <binary_compatibility/Interface.h>
|
#include <binary_compatibility/Interface.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FLAG_DEFAULT = 0x01,
|
||||||
|
FLAG_FLAT = 0x02,
|
||||||
|
FLAG_INSIDE = 0x04,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static const float kLabelMargin = 3;
|
static const float kLabelMargin = 3;
|
||||||
|
|
||||||
|
|
||||||
@ -34,7 +41,7 @@ BButton::BButton(BRect frame, const char* name, const char* label,
|
|||||||
: BControl(frame, name, label, message, resizingMode,
|
: BControl(frame, name, label, message, resizingMode,
|
||||||
flags | B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
|
flags | B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
|
||||||
fPreferredSize(-1, -1),
|
fPreferredSize(-1, -1),
|
||||||
fDrawAsDefault(false)
|
fFlags(0)
|
||||||
{
|
{
|
||||||
// Resize to minimum height if needed
|
// Resize to minimum height if needed
|
||||||
font_height fh;
|
font_height fh;
|
||||||
@ -50,7 +57,7 @@ BButton::BButton(const char* name, const char* label, BMessage* message,
|
|||||||
: BControl(name, label, message,
|
: BControl(name, label, message,
|
||||||
flags | B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
|
flags | B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
|
||||||
fPreferredSize(-1, -1),
|
fPreferredSize(-1, -1),
|
||||||
fDrawAsDefault(false)
|
fFlags(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +66,7 @@ BButton::BButton(const char* label, BMessage* message)
|
|||||||
: BControl(NULL, label, message,
|
: BControl(NULL, label, message,
|
||||||
B_WILL_DRAW | B_NAVIGABLE | B_FULL_UPDATE_ON_RESIZE),
|
B_WILL_DRAW | B_NAVIGABLE | B_FULL_UPDATE_ON_RESIZE),
|
||||||
fPreferredSize(-1, -1),
|
fPreferredSize(-1, -1),
|
||||||
fDrawAsDefault(false)
|
fFlags(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,10 +78,12 @@ BButton::~BButton()
|
|||||||
|
|
||||||
BButton::BButton(BMessage* archive)
|
BButton::BButton(BMessage* archive)
|
||||||
: BControl(archive),
|
: BControl(archive),
|
||||||
fPreferredSize(-1, -1)
|
fPreferredSize(-1, -1),
|
||||||
|
fFlags(0)
|
||||||
{
|
{
|
||||||
if (archive->FindBool("_default", &fDrawAsDefault) != B_OK)
|
bool isDefault = false;
|
||||||
fDrawAsDefault = false;
|
if (archive->FindBool("_default", &isDefault) == B_OK && isDefault)
|
||||||
|
_SetFlag(FLAG_DEFAULT, true);
|
||||||
// NOTE: Default button state will be synchronized with the window
|
// NOTE: Default button state will be synchronized with the window
|
||||||
// in AttachedToWindow().
|
// in AttachedToWindow().
|
||||||
}
|
}
|
||||||
@ -112,8 +121,13 @@ BButton::Draw(BRect updateRect)
|
|||||||
rgb_color background = LowColor();
|
rgb_color background = LowColor();
|
||||||
rgb_color base = background;
|
rgb_color base = background;
|
||||||
uint32 flags = be_control_look->Flags(this);
|
uint32 flags = be_control_look->Flags(this);
|
||||||
if (IsDefault())
|
if (_Flag(FLAG_DEFAULT))
|
||||||
flags |= BControlLook::B_DEFAULT_BUTTON;
|
flags |= BControlLook::B_DEFAULT_BUTTON;
|
||||||
|
if (_Flag(FLAG_FLAT) && !IsTracking())
|
||||||
|
flags |= BControlLook::B_FLAT;
|
||||||
|
if (_Flag(FLAG_INSIDE))
|
||||||
|
flags |= BControlLook::B_HOVER;
|
||||||
|
|
||||||
be_control_look->DrawButtonFrame(this, rect, updateRect,
|
be_control_look->DrawButtonFrame(this, rect, updateRect,
|
||||||
base, background, flags);
|
base, background, flags);
|
||||||
be_control_look->DrawButtonBackground(this, rect, updateRect,
|
be_control_look->DrawButtonBackground(this, rect, updateRect,
|
||||||
@ -207,12 +221,10 @@ BButton::MakeDefault(bool flag)
|
|||||||
oldDefault = window->DefaultButton();
|
oldDefault = window->DefaultButton();
|
||||||
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
if (fDrawAsDefault && oldDefault == this)
|
if (_Flag(FLAG_DEFAULT) && oldDefault == this)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!fDrawAsDefault) {
|
if (_SetFlag(FLAG_DEFAULT, true)) {
|
||||||
fDrawAsDefault = true;
|
|
||||||
|
|
||||||
if ((Flags() & B_SUPPORTS_LAYOUT) != 0)
|
if ((Flags() & B_SUPPORTS_LAYOUT) != 0)
|
||||||
InvalidateLayout();
|
InvalidateLayout();
|
||||||
else {
|
else {
|
||||||
@ -224,11 +236,9 @@ BButton::MakeDefault(bool flag)
|
|||||||
if (window && oldDefault != this)
|
if (window && oldDefault != this)
|
||||||
window->SetDefaultButton(this);
|
window->SetDefaultButton(this);
|
||||||
} else {
|
} else {
|
||||||
if (!fDrawAsDefault)
|
if (!_SetFlag(FLAG_DEFAULT, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fDrawAsDefault = false;
|
|
||||||
|
|
||||||
if ((Flags() & B_SUPPORTS_LAYOUT) != 0)
|
if ((Flags() & B_SUPPORTS_LAYOUT) != 0)
|
||||||
InvalidateLayout();
|
InvalidateLayout();
|
||||||
else {
|
else {
|
||||||
@ -252,7 +262,22 @@ BButton::SetLabel(const char *string)
|
|||||||
bool
|
bool
|
||||||
BButton::IsDefault() const
|
BButton::IsDefault() const
|
||||||
{
|
{
|
||||||
return fDrawAsDefault;
|
return _Flag(FLAG_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
BButton::IsFlat() const
|
||||||
|
{
|
||||||
|
return _Flag(FLAG_FLAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
BButton::SetFlat(bool flat)
|
||||||
|
{
|
||||||
|
if (_SetFlag(FLAG_FLAT, flat))
|
||||||
|
Invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -273,11 +298,13 @@ BButton::WindowActivated(bool active)
|
|||||||
void
|
void
|
||||||
BButton::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
|
BButton::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
|
||||||
{
|
{
|
||||||
|
bool inside = Bounds().Contains(point);
|
||||||
|
if (_SetFlag(FLAG_INSIDE, inside))
|
||||||
|
Invalidate();
|
||||||
|
|
||||||
if (!IsTracking())
|
if (!IsTracking())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool inside = Bounds().Contains(point);
|
|
||||||
|
|
||||||
if ((Value() == B_CONTROL_ON) != inside)
|
if ((Value() == B_CONTROL_ON) != inside)
|
||||||
SetValue(inside ? B_CONTROL_ON : B_CONTROL_OFF);
|
SetValue(inside ? B_CONTROL_ON : B_CONTROL_OFF);
|
||||||
}
|
}
|
||||||
@ -291,6 +318,8 @@ BButton::MouseUp(BPoint point)
|
|||||||
|
|
||||||
if (Bounds().Contains(point))
|
if (Bounds().Contains(point))
|
||||||
Invoke();
|
Invoke();
|
||||||
|
else if (_Flag(FLAG_FLAT))
|
||||||
|
Invalidate();
|
||||||
|
|
||||||
SetTracking(false);
|
SetTracking(false);
|
||||||
}
|
}
|
||||||
@ -516,7 +545,7 @@ BButton::_ValidatePreferredSize()
|
|||||||
float left, top, right, bottom;
|
float left, top, right, bottom;
|
||||||
be_control_look->GetInsets(BControlLook::B_BUTTON_FRAME,
|
be_control_look->GetInsets(BControlLook::B_BUTTON_FRAME,
|
||||||
BControlLook::B_BUTTON_BACKGROUND,
|
BControlLook::B_BUTTON_BACKGROUND,
|
||||||
fDrawAsDefault ? BControlLook::B_DEFAULT_BUTTON : 0,
|
IsDefault() ? BControlLook::B_DEFAULT_BUTTON : 0,
|
||||||
left, top, right, bottom);
|
left, top, right, bottom);
|
||||||
|
|
||||||
// width
|
// width
|
||||||
@ -608,6 +637,28 @@ BButton::_DrawFocusLine(float x, float y, float width, bool visible)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
BButton::_Flag(uint32 flag) const
|
||||||
|
{
|
||||||
|
return (fFlags & flag) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
BButton::_SetFlag(uint32 flag, bool set)
|
||||||
|
{
|
||||||
|
if (((fFlags & flag) != 0) == set)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (set)
|
||||||
|
fFlags |= flag;
|
||||||
|
else
|
||||||
|
fFlags &= ~flag;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
B_IF_GCC_2(InvalidateLayout__7BButtonb, _ZN7BButton16InvalidateLayoutEb)(
|
B_IF_GCC_2(InvalidateLayout__7BButtonb, _ZN7BButton16InvalidateLayoutEb)(
|
||||||
BView* view, bool descendants)
|
BView* view, bool descendants)
|
||||||
|
@ -2046,6 +2046,20 @@ BControlLook::_DrawButtonFrame(BView* view, BRect& rect,
|
|||||||
BRegion clipping(updateRect);
|
BRegion clipping(updateRect);
|
||||||
view->ConstrainClippingRegion(&clipping);
|
view->ConstrainClippingRegion(&clipping);
|
||||||
|
|
||||||
|
// If the button is flat and neither activated nor otherwise highlighted
|
||||||
|
// (mouse hovering or focussed), draw it flat.
|
||||||
|
if ((flags & B_FLAT) != 0
|
||||||
|
&& (flags & (B_ACTIVATED | B_PARTIALLY_ACTIVATED)) == 0
|
||||||
|
&& ((flags & (B_HOVER | B_FOCUSED)) == 0
|
||||||
|
|| (flags & B_DISABLED) != 0)) {
|
||||||
|
_DrawFrame(view, rect, background, background, background,
|
||||||
|
background, borders);
|
||||||
|
_DrawFrame(view, rect, background, background, background,
|
||||||
|
background, borders);
|
||||||
|
view->PopState();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// outer edge colors
|
// outer edge colors
|
||||||
rgb_color edgeLightColor;
|
rgb_color edgeLightColor;
|
||||||
rgb_color edgeShadowColor;
|
rgb_color edgeShadowColor;
|
||||||
@ -2317,6 +2331,19 @@ BControlLook::_DrawButtonBackground(BView* view, BRect& rect,
|
|||||||
BRegion clipping(updateRect);
|
BRegion clipping(updateRect);
|
||||||
view->ConstrainClippingRegion(&clipping);
|
view->ConstrainClippingRegion(&clipping);
|
||||||
|
|
||||||
|
// If the button is flat and neither activated nor otherwise highlighted
|
||||||
|
// (mouse hovering or focussed), draw it flat.
|
||||||
|
if ((flags & B_FLAT) != 0
|
||||||
|
&& (flags & (B_ACTIVATED | B_PARTIALLY_ACTIVATED)) == 0
|
||||||
|
&& ((flags & (B_HOVER | B_FOCUSED)) == 0
|
||||||
|
|| (flags & B_DISABLED) != 0)) {
|
||||||
|
_DrawFrame(view, rect, base, base, base, base, borders);
|
||||||
|
view->SetHighColor(base);
|
||||||
|
view->FillRect(rect);
|
||||||
|
view->PopState();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// inner bevel colors
|
// inner bevel colors
|
||||||
rgb_color bevelLightColor = _BevelLightColor(base, flags);
|
rgb_color bevelLightColor = _BevelLightColor(base, flags);
|
||||||
rgb_color bevelShadowColor = _BevelShadowColor(base, flags);
|
rgb_color bevelShadowColor = _BevelShadowColor(base, flags);
|
||||||
|
Loading…
Reference in New Issue
Block a user