BeControlLook: Implement DrawStatusBar

Fix drawing issue with DrawTextControlBorder().
Update text control border and status bar border colors
to match BeOS R5 better.

Fixes #17889

Change-Id: I3eeb9898b538456aec751f9b57d19b9910506325
Reviewed-on: https://review.haiku-os.org/c/haiku/+/6271
Tested-by: Automation <[email protected]>
Reviewed-by: John Scipione <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
John Scipione
2023-04-11 15:28:39 +00:00
committed by waddlesplash
parent fc5d11e9ab
commit 55d8d19ea9
2 changed files with 84 additions and 54 deletions
@@ -978,9 +978,38 @@ BeControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect,
view->PushState();
// draw background
view->SetHighColor(base);
view->FillRect(rect);
// draw frame around bar
DrawTextControlBorder(view, rect, updateRect, tint_color(base, B_DARKEN_1_TINT));
// filled and nonfilled rects
BRect filledRect(rect);
filledRect.right = progressPosition - 1;
BRect nonfilledRect(rect);
nonfilledRect.left = progressPosition;
bool drawFilled = filledRect.Width() > 0;
bool drawNonfilled = nonfilledRect.Width() > 0;
// filled
if (drawFilled) {
rgb_color light = tint_color(barColor, 0.6);
rgb_color dark = tint_color(barColor, 1.4);
_DrawFrame(view, filledRect, light, light, dark, dark);
view->SetHighColor(barColor);
view->FillRect(filledRect);
}
// nonfilled
if (drawNonfilled) {
view->SetHighColor(ui_color(B_CONTROL_BACKGROUND_COLOR));
view->FillRect(nonfilledRect);
}
view->PopState();
}
@@ -2108,74 +2137,30 @@ BeControlLook::DrawTextControlBorder(BView* view, BRect& rect,
BRegion clipping(updateRect);
view->ConstrainClippingRegion(&clipping);
rgb_color lighten1 = tint_color(base, B_LIGHTEN_1_TINT);
rgb_color lightenmax = tint_color(base, B_LIGHTEN_MAX_TINT);
rgb_color darken1 = tint_color(base, B_DARKEN_1_TINT);
rgb_color darken2 = tint_color(base, B_DARKEN_2_TINT);
rgb_color darken4 = tint_color(base, B_DARKEN_4_TINT);
bool isEnabled = (flags & B_DISABLED) == 0;
bool isFocused = (flags & B_FOCUSED) != 0;
rgb_color bevelShadow;
rgb_color bevelLight;
rgb_color dark;
rgb_color light;
// first bevel
// outer bevel
bevelShadow = isEnabled ? darken1 : base;
bevelLight = isEnabled ? lightenmax : lighten1;
dark = tint_color(base, (isEnabled ? B_DARKEN_1_TINT : B_DARKEN_2_TINT));
light = tint_color(base, (isEnabled ? B_LIGHTEN_MAX_TINT : B_LIGHTEN_2_TINT));
view->BeginLineArray(4);
if ((borders & B_LEFT_BORDER) != 0) {
view->AddLine(rect.LeftBottom(), rect.LeftTop(), bevelShadow);
rect.left++;
}
if ((borders & B_TOP_BORDER) != 0) {
view->AddLine(rect.LeftTop(), rect.RightTop(), bevelShadow);
rect.top++;
}
if ((borders & B_RIGHT_BORDER) != 0) {
view->AddLine(BPoint(rect.left + 1, rect.bottom), rect.RightBottom(),
bevelLight);
rect.right--;
}
if ((borders & B_BOTTOM_BORDER) != 0) {
view->AddLine(rect.RightBottom(), BPoint(rect.right, rect.top + 1),
bevelLight);
rect.bottom--;
}
view->EndLineArray();
_DrawFrame(view, rect, dark, dark, light, light);
// second bevel
// inner bevel
if (isEnabled && isFocused) {
view->SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR));
view->StrokeRect(rect);
rect.InsetBy(1, 1);
} else {
bevelShadow = isEnabled ? darken4 : darken2;
bevelLight = base;
dark = tint_color(base, (isEnabled ? B_DARKEN_4_TINT : B_LIGHTEN_2_TINT));
light = base;
view->BeginLineArray(4);
if ((borders & B_LEFT_BORDER) != 0) {
view->AddLine(rect.LeftBottom(), rect.LeftTop(), bevelShadow);
rect.left++;
}
if ((borders & B_TOP_BORDER) != 0) {
view->AddLine(rect.LeftTop(), rect.RightTop(), bevelShadow);
rect.top++;
}
if ((borders & B_RIGHT_BORDER) != 0) {
view->AddLine(BPoint(rect.left + 1, rect.bottom), rect.RightBottom(),
bevelLight);
rect.right--;
}
if ((borders & B_BOTTOM_BORDER) != 0) {
view->AddLine(rect.RightBottom(), BPoint(rect.right, rect.top + 1),
bevelLight);
rect.bottom--;
}
view->EndLineArray();
_DrawFrame(view, rect, dark, dark, light, light);
}
view->PopState();
@@ -3151,6 +3136,44 @@ BeControlLook::_DrawScrollBarKnobLine(BView* view,
}
}
void
BeControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
uint32 borders)
{
view->BeginLineArray(4);
// draw in reverse so that bottom and right corners cover top and left
if ((borders & B_BOTTOM_BORDER) != 0) {
view->AddLine(
BPoint(rect.left, rect.bottom),
BPoint(rect.right, rect.bottom), bottom);
rect.bottom--;
}
if ((borders & B_RIGHT_BORDER) != 0) {
view->AddLine(
BPoint(rect.right, rect.top),
BPoint(rect.right, rect.bottom), right);
rect.right--;
}
if ((borders & B_TOP_BORDER) != 0) {
view->AddLine(
BPoint(rect.left, rect.top),
BPoint(rect.right, rect.top), top);
rect.top++;
}
if ((borders & B_LEFT_BORDER) != 0) {
view->AddLine(
BPoint(rect.left, rect.bottom),
BPoint(rect.left, rect.top), left);
rect.left++;
}
view->EndLineArray();
}
} // namespace BPrivate
@@ -367,6 +367,13 @@ protected:
rgb_color dark, rgb_color light,
orientation orientation);
void _DrawFrame(BView* view, BRect& rect,
const rgb_color& left,
const rgb_color& top,
const rgb_color& right,
const rgb_color& bottom,
uint32 borders = B_ALL_BORDERS);
private:
bool fCachedOutline;
};