12f86ba45SStephan Aßmus /* 22f86ba45SStephan Aßmus * Copyright 2009, Stephan Aßmus <superstippi@gmx.de> 32f86ba45SStephan Aßmus * Distributed under the terms of the MIT License. 42f86ba45SStephan Aßmus */ 52f86ba45SStephan Aßmus #include <ControlLook.h> 62f86ba45SStephan Aßmus 72f86ba45SStephan Aßmus #include <stdio.h> 82f86ba45SStephan Aßmus 92f86ba45SStephan Aßmus #include <Control.h> 102f86ba45SStephan Aßmus #include <GradientLinear.h> 112f86ba45SStephan Aßmus #include <Region.h> 122f86ba45SStephan Aßmus #include <Shape.h> 132f86ba45SStephan Aßmus #include <String.h> 142f86ba45SStephan Aßmus #include <View.h> 152f86ba45SStephan Aßmus 162f86ba45SStephan Aßmus namespace BPrivate { 172f86ba45SStephan Aßmus 182f86ba45SStephan Aßmus static const float kEdgeBevelLightTint = 0.59; 192f86ba45SStephan Aßmus static const float kEdgeBevelShadowTint = 1.0735; 202f86ba45SStephan Aßmus 212f86ba45SStephan Aßmus 222f86ba45SStephan Aßmus BControlLook::BControlLook() 232f86ba45SStephan Aßmus { 242f86ba45SStephan Aßmus } 252f86ba45SStephan Aßmus 262f86ba45SStephan Aßmus 272f86ba45SStephan Aßmus BControlLook::~BControlLook() 282f86ba45SStephan Aßmus { 292f86ba45SStephan Aßmus } 302f86ba45SStephan Aßmus 312f86ba45SStephan Aßmus 322f86ba45SStephan Aßmus BAlignment 332f86ba45SStephan Aßmus BControlLook::DefaultLabelAlignment() const 342f86ba45SStephan Aßmus { 352f86ba45SStephan Aßmus return BAlignment(B_ALIGN_LEFT, B_ALIGN_VERTICAL_CENTER); 362f86ba45SStephan Aßmus } 372f86ba45SStephan Aßmus 382f86ba45SStephan Aßmus 392f86ba45SStephan Aßmus float 402f86ba45SStephan Aßmus BControlLook::DefaultLabelSpacing() const 412f86ba45SStephan Aßmus { 422f86ba45SStephan Aßmus return 4.0;//ceilf(be_plain_font->Size() / 4.0); 432f86ba45SStephan Aßmus } 442f86ba45SStephan Aßmus 452f86ba45SStephan Aßmus 462f86ba45SStephan Aßmus uint32 472f86ba45SStephan Aßmus BControlLook::Flags(BControl* control) const 482f86ba45SStephan Aßmus { 492f86ba45SStephan Aßmus uint32 flags = 0; 502f86ba45SStephan Aßmus 512f86ba45SStephan Aßmus if (!control->IsEnabled()) 522f86ba45SStephan Aßmus flags |= B_DISABLED; 532f86ba45SStephan Aßmus 542f86ba45SStephan Aßmus if (control->IsFocus()) 552f86ba45SStephan Aßmus flags |= B_FOCUSED; 562f86ba45SStephan Aßmus 572f86ba45SStephan Aßmus if (control->Value() == B_CONTROL_ON) 582f86ba45SStephan Aßmus flags |= B_ACTIVATED; 592f86ba45SStephan Aßmus 602f86ba45SStephan Aßmus return flags; 612f86ba45SStephan Aßmus } 622f86ba45SStephan Aßmus 632f86ba45SStephan Aßmus 642f86ba45SStephan Aßmus // #pragma mark - 652f86ba45SStephan Aßmus 662f86ba45SStephan Aßmus 672f86ba45SStephan Aßmus void 682f86ba45SStephan Aßmus BControlLook::DrawButtonFrame(BView* view, BRect& rect, const BRect& updateRect, 692f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, uint32 borders) 702f86ba45SStephan Aßmus { 712f86ba45SStephan Aßmus // colors 722f86ba45SStephan Aßmus rgb_color dark1BorderColor; 732f86ba45SStephan Aßmus rgb_color dark2BorderColor; 742f86ba45SStephan Aßmus 752f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0) { 762f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.33); 772f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.45); 782f86ba45SStephan Aßmus 792f86ba45SStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 802f86ba45SStephan Aßmus dark2BorderColor = tint_color(dark1BorderColor, 1.5); 812f86ba45SStephan Aßmus dark1BorderColor = tint_color(dark1BorderColor, 1.35); 822f86ba45SStephan Aßmus } 832f86ba45SStephan Aßmus } else { 842f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.147); 852f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.24); 862f86ba45SStephan Aßmus 872f86ba45SStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 882f86ba45SStephan Aßmus dark1BorderColor = tint_color(dark1BorderColor, 1.12); 892f86ba45SStephan Aßmus dark2BorderColor = tint_color(dark1BorderColor, 1.16); 902f86ba45SStephan Aßmus } 912f86ba45SStephan Aßmus } 922f86ba45SStephan Aßmus 932f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 942f86ba45SStephan Aßmus rgb_color temp = dark2BorderColor; 952f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 962f86ba45SStephan Aßmus dark1BorderColor = temp; 972f86ba45SStephan Aßmus } 982f86ba45SStephan Aßmus 992f86ba45SStephan Aßmus // indicate focus by changing main button border 1002f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 1012f86ba45SStephan Aßmus dark1BorderColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 1022f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 1032f86ba45SStephan Aßmus } 1042f86ba45SStephan Aßmus 1052f86ba45SStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 1062f86ba45SStephan Aßmus float focusTint = 1.2; 1072f86ba45SStephan Aßmus if (flags & B_DISABLED) 1082f86ba45SStephan Aßmus focusTint = (B_NO_TINT + focusTint) / 2; 1092f86ba45SStephan Aßmus 1102f86ba45SStephan Aßmus rgb_color focusColor = tint_color(base, focusTint); 1112f86ba45SStephan Aßmus view->SetHighColor(base); 1122f86ba45SStephan Aßmus 1132f86ba45SStephan Aßmus view->StrokeRect(rect); 1142f86ba45SStephan Aßmus rect.InsetBy(1.0, 1.0); 1152f86ba45SStephan Aßmus 1162f86ba45SStephan Aßmus view->SetHighColor(focusColor); 1172f86ba45SStephan Aßmus view->StrokeRect(rect); 1182f86ba45SStephan Aßmus rect.InsetBy(1.0, 1.0); 1192f86ba45SStephan Aßmus view->StrokeRect(rect); 1202f86ba45SStephan Aßmus rect.InsetBy(1.0, 1.0); 1212f86ba45SStephan Aßmus 1222f86ba45SStephan Aßmus // bevel around external border 1232f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, focusColor, 1242f86ba45SStephan Aßmus (flags & B_DISABLED) ? 0.5 : 0.8, 0.9, borders); 1252f86ba45SStephan Aßmus } else { 1262f86ba45SStephan Aßmus // bevel around external border 1272f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 1282f86ba45SStephan Aßmus (flags & B_DISABLED) ? 0.0 : 1.0, 1.0, borders); 1292f86ba45SStephan Aßmus } 1302f86ba45SStephan Aßmus 1312f86ba45SStephan Aßmus _DrawFrame(view, rect, dark1BorderColor, dark1BorderColor, 1322f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 1332f86ba45SStephan Aßmus } 1342f86ba45SStephan Aßmus 1352f86ba45SStephan Aßmus 1362f86ba45SStephan Aßmus void 1372f86ba45SStephan Aßmus BControlLook::DrawButtonBackground(BView* view, BRect& rect, 1382f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 1392f86ba45SStephan Aßmus uint32 borders, enum orientation orientation) 1402f86ba45SStephan Aßmus { 1412f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 1422f86ba45SStephan Aßmus return; 1432f86ba45SStephan Aßmus 1442f86ba45SStephan Aßmus // the surface edges 1452f86ba45SStephan Aßmus 1462f86ba45SStephan Aßmus // colors 1472f86ba45SStephan Aßmus rgb_color buttonBgColor = tint_color(base, B_LIGHTEN_1_TINT); 1482f86ba45SStephan Aßmus rgb_color maxLightColor; 1492f86ba45SStephan Aßmus 1502f86ba45SStephan Aßmus rgb_color bevelColor1; 1512f86ba45SStephan Aßmus rgb_color bevelColor2; 1522f86ba45SStephan Aßmus 1532f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0) { 1542f86ba45SStephan Aßmus maxLightColor = tint_color(base, 0.2); 1552f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 1.08); 1562f86ba45SStephan Aßmus bevelColor2 = base; 1572f86ba45SStephan Aßmus } else { 1582f86ba45SStephan Aßmus maxLightColor = tint_color(base, 0.7); 1592f86ba45SStephan Aßmus bevelColor1 = base; 1602f86ba45SStephan Aßmus bevelColor2 = buttonBgColor; 1612f86ba45SStephan Aßmus buttonBgColor = maxLightColor; 1622f86ba45SStephan Aßmus } 1632f86ba45SStephan Aßmus 1642f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 1652f86ba45SStephan Aßmus view->BeginLineArray(4); 1662f86ba45SStephan Aßmus 1672f86ba45SStephan Aßmus bevelColor1 = tint_color(bevelColor1, B_DARKEN_1_TINT); 1682f86ba45SStephan Aßmus bevelColor2 = tint_color(bevelColor2, B_DARKEN_1_TINT); 1692f86ba45SStephan Aßmus 1702f86ba45SStephan Aßmus // shadow along left/top borders 1712f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 1722f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1732f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), bevelColor1); 1742f86ba45SStephan Aßmus rect.left++; 1752f86ba45SStephan Aßmus } 1762f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 1772f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1782f86ba45SStephan Aßmus BPoint(rect.right, rect.top), bevelColor1); 1792f86ba45SStephan Aßmus rect.top++; 1802f86ba45SStephan Aßmus } 1812f86ba45SStephan Aßmus 1822f86ba45SStephan Aßmus // softer shadow along left/top borders 1832f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 1842f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1852f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), bevelColor2); 1862f86ba45SStephan Aßmus rect.left++; 1872f86ba45SStephan Aßmus } 1882f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 1892f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1902f86ba45SStephan Aßmus BPoint(rect.right, rect.top), bevelColor2); 1912f86ba45SStephan Aßmus rect.top++; 1922f86ba45SStephan Aßmus } 1932f86ba45SStephan Aßmus 1942f86ba45SStephan Aßmus view->EndLineArray(); 1952f86ba45SStephan Aßmus } else { 1962f86ba45SStephan Aßmus _DrawFrame(view, rect, 1972f86ba45SStephan Aßmus maxLightColor, maxLightColor, 1982f86ba45SStephan Aßmus bevelColor1, bevelColor1, 1992f86ba45SStephan Aßmus buttonBgColor, buttonBgColor, borders); 2002f86ba45SStephan Aßmus } 2012f86ba45SStephan Aßmus 2022f86ba45SStephan Aßmus // the actual surface top 2032f86ba45SStephan Aßmus 2042f86ba45SStephan Aßmus float topTint = 0.49; 2052f86ba45SStephan Aßmus float middleTint1 = 0.62; 2062f86ba45SStephan Aßmus float middleTint2 = 0.76; 2072f86ba45SStephan Aßmus float bottomTint = 0.90; 2082f86ba45SStephan Aßmus 2092f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 2102f86ba45SStephan Aßmus topTint = 1.11; 2112f86ba45SStephan Aßmus bottomTint = 1.08; 2122f86ba45SStephan Aßmus } 2132f86ba45SStephan Aßmus 2142f86ba45SStephan Aßmus if (flags & B_DISABLED) { 2152f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 2162f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 2172f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 2182f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 2192f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 2202f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 2212f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 2222f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 2232f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 2242f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 2252f86ba45SStephan Aßmus } 2262f86ba45SStephan Aßmus 2272f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 2282f86ba45SStephan Aßmus _FillGradient(view, rect, base, topTint, bottomTint, orientation); 2292f86ba45SStephan Aßmus } else { 2302f86ba45SStephan Aßmus _FillGlossyGradient(view, rect, base, topTint, middleTint1, 2312f86ba45SStephan Aßmus middleTint2, bottomTint, orientation); 2322f86ba45SStephan Aßmus } 2332f86ba45SStephan Aßmus } 2342f86ba45SStephan Aßmus 2352f86ba45SStephan Aßmus 2362f86ba45SStephan Aßmus void 2372f86ba45SStephan Aßmus BControlLook::DrawMenuBarBackground(BView* view, BRect& rect, 2382f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 borders) 2392f86ba45SStephan Aßmus { 2402f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 2412f86ba45SStephan Aßmus return; 2422f86ba45SStephan Aßmus 2432f86ba45SStephan Aßmus // the surface edges 2442f86ba45SStephan Aßmus 2452f86ba45SStephan Aßmus // colors 2462f86ba45SStephan Aßmus rgb_color cornerColor = tint_color(base, 0.9); 2472f86ba45SStephan Aßmus rgb_color bevelColor1 = tint_color(base, 0.5); 2482f86ba45SStephan Aßmus rgb_color bevelColor2 = tint_color(base, 0.7); 2492f86ba45SStephan Aßmus rgb_color bevelColor3 = tint_color(base, 1.08); 2502f86ba45SStephan Aßmus 2512f86ba45SStephan Aßmus _DrawFrame(view, rect, 2522f86ba45SStephan Aßmus bevelColor2, bevelColor1, 2532f86ba45SStephan Aßmus bevelColor3, bevelColor3, 2542f86ba45SStephan Aßmus cornerColor, cornerColor, 2552f86ba45SStephan Aßmus borders); 2562f86ba45SStephan Aßmus 2572f86ba45SStephan Aßmus // the actual surface top 2582f86ba45SStephan Aßmus 2592f86ba45SStephan Aßmus float topTint = 0.69; 2602f86ba45SStephan Aßmus float bottomTint = 1.03; 2612f86ba45SStephan Aßmus 2622f86ba45SStephan Aßmus _FillGradient(view, rect, base, topTint, bottomTint); 2632f86ba45SStephan Aßmus } 2642f86ba45SStephan Aßmus 2652f86ba45SStephan Aßmus 2662f86ba45SStephan Aßmus void 2672f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect, 2682f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, bool popupIndicator, 2692f86ba45SStephan Aßmus uint32 flags) 2702f86ba45SStephan Aßmus { 2712f86ba45SStephan Aßmus if (popupIndicator) { 2722f86ba45SStephan Aßmus BRect leftRect(rect); 2732f86ba45SStephan Aßmus leftRect.right -= 10; 2742f86ba45SStephan Aßmus 2752f86ba45SStephan Aßmus BRect rightRect(rect); 2762f86ba45SStephan Aßmus rightRect.left = rightRect.right - 9; 2772f86ba45SStephan Aßmus 2782f86ba45SStephan Aßmus DrawMenuFieldBackground(view, leftRect, updateRect, base, flags, 2792f86ba45SStephan Aßmus B_LEFT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER); 2802f86ba45SStephan Aßmus 2812f86ba45SStephan Aßmus rgb_color indicatorBase; 2822f86ba45SStephan Aßmus rgb_color markColor; 2832f86ba45SStephan Aßmus if (flags & B_DISABLED) { 2842f86ba45SStephan Aßmus indicatorBase = tint_color(base, 1.05); 2852f86ba45SStephan Aßmus markColor = tint_color(base, B_DARKEN_3_TINT); 2862f86ba45SStephan Aßmus } else { 2872f86ba45SStephan Aßmus indicatorBase = tint_color(base, 1.09); 2882f86ba45SStephan Aßmus markColor = tint_color(base, B_DARKEN_4_TINT); 2892f86ba45SStephan Aßmus } 2902f86ba45SStephan Aßmus 2912f86ba45SStephan Aßmus DrawMenuFieldBackground(view, rightRect, updateRect, indicatorBase, 2922f86ba45SStephan Aßmus flags, B_RIGHT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER); 2932f86ba45SStephan Aßmus 2942f86ba45SStephan Aßmus // popup marker 2952f86ba45SStephan Aßmus BPoint center(roundf((rightRect.left + rightRect.right) / 2.0), 2962f86ba45SStephan Aßmus roundf((rightRect.top + rightRect.bottom) / 2.0)); 2972f86ba45SStephan Aßmus BPoint triangle[3]; 2982f86ba45SStephan Aßmus triangle[0] = center + BPoint(-2.5, -0.5); 2992f86ba45SStephan Aßmus triangle[1] = center + BPoint(2.5, -0.5); 3002f86ba45SStephan Aßmus triangle[2] = center + BPoint(0.0, 2.0); 3012f86ba45SStephan Aßmus 3022f86ba45SStephan Aßmus uint32 viewFlags = view->Flags(); 3032f86ba45SStephan Aßmus view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE); 3042f86ba45SStephan Aßmus 3052f86ba45SStephan Aßmus view->SetHighColor(markColor); 3062f86ba45SStephan Aßmus view->FillTriangle(triangle[0], triangle[1], triangle[2]); 3072f86ba45SStephan Aßmus 3082f86ba45SStephan Aßmus view->SetFlags(viewFlags); 3092f86ba45SStephan Aßmus 3102f86ba45SStephan Aßmus rect = leftRect; 3112f86ba45SStephan Aßmus } else { 3122f86ba45SStephan Aßmus DrawMenuFieldBackground(view, rect, updateRect, base, flags); 3132f86ba45SStephan Aßmus } 3142f86ba45SStephan Aßmus } 3152f86ba45SStephan Aßmus 3162f86ba45SStephan Aßmus void 3172f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect, 3182f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 3192f86ba45SStephan Aßmus uint32 borders) 3202f86ba45SStephan Aßmus { 3212f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 3222f86ba45SStephan Aßmus return; 3232f86ba45SStephan Aßmus 3242f86ba45SStephan Aßmus // the surface edges 3252f86ba45SStephan Aßmus 3262f86ba45SStephan Aßmus // colors 3272f86ba45SStephan Aßmus rgb_color cornerColor = tint_color(base, 0.85); 3282f86ba45SStephan Aßmus rgb_color bevelColor1 = tint_color(base, 0.3); 3292f86ba45SStephan Aßmus rgb_color bevelColor2 = tint_color(base, 0.5); 3302f86ba45SStephan Aßmus rgb_color bevelColor3 = tint_color(base, 1.03); 3312f86ba45SStephan Aßmus 3322f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3332f86ba45SStephan Aßmus cornerColor = tint_color(base, 0.8); 3342f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 0.7); 3352f86ba45SStephan Aßmus bevelColor2 = tint_color(base, 0.8); 3362f86ba45SStephan Aßmus bevelColor3 = tint_color(base, 1.01); 3372f86ba45SStephan Aßmus } else { 3382f86ba45SStephan Aßmus cornerColor = tint_color(base, 0.85); 3392f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 0.3); 3402f86ba45SStephan Aßmus bevelColor2 = tint_color(base, 0.5); 3412f86ba45SStephan Aßmus bevelColor3 = tint_color(base, 1.03); 3422f86ba45SStephan Aßmus } 3432f86ba45SStephan Aßmus 3442f86ba45SStephan Aßmus _DrawFrame(view, rect, 3452f86ba45SStephan Aßmus bevelColor2, bevelColor1, 3462f86ba45SStephan Aßmus bevelColor3, bevelColor3, 3472f86ba45SStephan Aßmus cornerColor, cornerColor, 3482f86ba45SStephan Aßmus borders); 3492f86ba45SStephan Aßmus 3502f86ba45SStephan Aßmus // the actual surface top 3512f86ba45SStephan Aßmus 3522f86ba45SStephan Aßmus float topTint = 0.49; 3532f86ba45SStephan Aßmus float middleTint1 = 0.62; 3542f86ba45SStephan Aßmus float middleTint2 = 0.76; 3552f86ba45SStephan Aßmus float bottomTint = 0.90; 3562f86ba45SStephan Aßmus 3572f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3582f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 3592f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 3602f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 3612f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 3622f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 3632f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 3642f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 3652f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 3662f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 3672f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 3682f86ba45SStephan Aßmus } 3692f86ba45SStephan Aßmus 3702f86ba45SStephan Aßmus _FillGlossyGradient(view, rect, base, topTint, middleTint1, 3712f86ba45SStephan Aßmus middleTint2, bottomTint); 3722f86ba45SStephan Aßmus } 3732f86ba45SStephan Aßmus 3742f86ba45SStephan Aßmus void 3752f86ba45SStephan Aßmus BControlLook::DrawMenuBackground(BView* view, BRect& rect, 3762f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 3772f86ba45SStephan Aßmus uint32 borders) 3782f86ba45SStephan Aßmus { 3792f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 3802f86ba45SStephan Aßmus return; 3812f86ba45SStephan Aßmus 3822f86ba45SStephan Aßmus // the surface edges 3832f86ba45SStephan Aßmus 3842f86ba45SStephan Aßmus rgb_color bevelLightColor; 3852f86ba45SStephan Aßmus rgb_color bevelShadowColor; 3862f86ba45SStephan Aßmus rgb_color background = tint_color(base, 0.75); 3872f86ba45SStephan Aßmus 3882f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3892f86ba45SStephan Aßmus bevelLightColor = tint_color(background, 0.80); 3902f86ba45SStephan Aßmus bevelShadowColor = tint_color(background, 1.07); 3912f86ba45SStephan Aßmus } else { 3922f86ba45SStephan Aßmus bevelLightColor = tint_color(background, 0.6); 3932f86ba45SStephan Aßmus bevelShadowColor = tint_color(background, 1.12); 3942f86ba45SStephan Aßmus } 3952f86ba45SStephan Aßmus 3962f86ba45SStephan Aßmus _DrawFrame(view, rect, 3972f86ba45SStephan Aßmus bevelLightColor, bevelLightColor, 3982f86ba45SStephan Aßmus bevelShadowColor, bevelShadowColor, 3992f86ba45SStephan Aßmus borders); 4002f86ba45SStephan Aßmus 4012f86ba45SStephan Aßmus // the actual surface top 4022f86ba45SStephan Aßmus 4032f86ba45SStephan Aßmus view->SetHighColor(background); 4042f86ba45SStephan Aßmus view->FillRect(rect); 4052f86ba45SStephan Aßmus } 4062f86ba45SStephan Aßmus 4072f86ba45SStephan Aßmus 4082f86ba45SStephan Aßmus void 4092f86ba45SStephan Aßmus BControlLook::DrawMenuItemBackground(BView* view, BRect& rect, 4102f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 4112f86ba45SStephan Aßmus uint32 borders) 4122f86ba45SStephan Aßmus { 4132f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 4142f86ba45SStephan Aßmus return; 4152f86ba45SStephan Aßmus 4162f86ba45SStephan Aßmus // the surface edges 4172f86ba45SStephan Aßmus 4182f86ba45SStephan Aßmus float topTint; 4192f86ba45SStephan Aßmus float bottomTint; 4202f86ba45SStephan Aßmus rgb_color selectedColor = base; 4212f86ba45SStephan Aßmus 4222f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 4232f86ba45SStephan Aßmus topTint = 0.9; 4242f86ba45SStephan Aßmus bottomTint = 1.05; 4252f86ba45SStephan Aßmus selectedColor = tint_color(base, 1.26); 4262f86ba45SStephan Aßmus } else if (flags & B_DISABLED) { 4272f86ba45SStephan Aßmus topTint = 0.80; 4282f86ba45SStephan Aßmus bottomTint = 1.07; 4292f86ba45SStephan Aßmus } else { 4302f86ba45SStephan Aßmus topTint = 0.6; 4312f86ba45SStephan Aßmus bottomTint = 1.12; 4322f86ba45SStephan Aßmus } 4332f86ba45SStephan Aßmus 4342f86ba45SStephan Aßmus rgb_color bevelLightColor = tint_color(selectedColor, topTint); 4352f86ba45SStephan Aßmus rgb_color bevelShadowColor = tint_color(selectedColor, bottomTint); 4362f86ba45SStephan Aßmus 4372f86ba45SStephan Aßmus _DrawFrame(view, rect, 4382f86ba45SStephan Aßmus bevelLightColor, bevelLightColor, 4392f86ba45SStephan Aßmus bevelShadowColor, bevelShadowColor, 4402f86ba45SStephan Aßmus borders); 4412f86ba45SStephan Aßmus 4422f86ba45SStephan Aßmus // the actual surface top 4432f86ba45SStephan Aßmus 4442f86ba45SStephan Aßmus view->SetLowColor(selectedColor); 4452f86ba45SStephan Aßmus // _FillGradient(view, rect, selectedColor, topTint, bottomTint); 4462f86ba45SStephan Aßmus _FillGradient(view, rect, selectedColor, bottomTint, topTint); 4472f86ba45SStephan Aßmus } 4482f86ba45SStephan Aßmus 4492f86ba45SStephan Aßmus 4502f86ba45SStephan Aßmus void 4512f86ba45SStephan Aßmus BControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect, 4522f86ba45SStephan Aßmus const rgb_color& base, const rgb_color& barColor, float progressPosition) 4532f86ba45SStephan Aßmus { 4542f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 4552f86ba45SStephan Aßmus return; 4562f86ba45SStephan Aßmus 4572f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6); 4582f86ba45SStephan Aßmus 4592f86ba45SStephan Aßmus // colors 4602f86ba45SStephan Aßmus rgb_color dark1BorderColor = tint_color(base, 1.3); 4612f86ba45SStephan Aßmus rgb_color dark2BorderColor = tint_color(base, 1.2); 4622f86ba45SStephan Aßmus rgb_color dark1FilledBorderColor = tint_color(barColor, 1.20); 4632f86ba45SStephan Aßmus rgb_color dark2FilledBorderColor = tint_color(barColor, 1.45); 4642f86ba45SStephan Aßmus 4652f86ba45SStephan Aßmus BRect filledRect(rect); 4662f86ba45SStephan Aßmus filledRect.right = progressPosition - 1; 4672f86ba45SStephan Aßmus 4682f86ba45SStephan Aßmus BRect nonfilledRect(rect); 4692f86ba45SStephan Aßmus nonfilledRect.left = progressPosition; 4702f86ba45SStephan Aßmus 4712f86ba45SStephan Aßmus bool filledSurface = filledRect.Width() > 0; 4722f86ba45SStephan Aßmus bool nonfilledSurface = nonfilledRect.Width() > 0; 4732f86ba45SStephan Aßmus 4742f86ba45SStephan Aßmus if (filledSurface) { 4752f86ba45SStephan Aßmus _DrawFrame(view, filledRect, 4762f86ba45SStephan Aßmus dark1FilledBorderColor, dark1FilledBorderColor, 4772f86ba45SStephan Aßmus dark2FilledBorderColor, dark2FilledBorderColor); 4782f86ba45SStephan Aßmus 4792f86ba45SStephan Aßmus _FillGlossyGradient(view, filledRect, barColor, 0.55, 0.68, 0.76, 0.90); 4802f86ba45SStephan Aßmus } 4812f86ba45SStephan Aßmus 4822f86ba45SStephan Aßmus if (nonfilledSurface) { 4832f86ba45SStephan Aßmus _DrawFrame(view, nonfilledRect, dark1BorderColor, dark1BorderColor, 4842f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, 4852f86ba45SStephan Aßmus B_TOP_BORDER | B_BOTTOM_BORDER | B_RIGHT_BORDER); 4862f86ba45SStephan Aßmus 4872f86ba45SStephan Aßmus if (nonfilledRect.left < nonfilledRect.right) { 4882f86ba45SStephan Aßmus // shadow from fill bar, or left border 4892f86ba45SStephan Aßmus rgb_color leftBorder = dark1BorderColor; 4902f86ba45SStephan Aßmus if (filledSurface) 4912f86ba45SStephan Aßmus leftBorder = tint_color(base, 0.50); 4922f86ba45SStephan Aßmus view->SetHighColor(leftBorder); 4932f86ba45SStephan Aßmus view->StrokeLine(nonfilledRect.LeftTop(), 4942f86ba45SStephan Aßmus nonfilledRect.LeftBottom()); 4952f86ba45SStephan Aßmus nonfilledRect.left++; 4962f86ba45SStephan Aßmus } 4972f86ba45SStephan Aßmus 4982f86ba45SStephan Aßmus _FillGradient(view, nonfilledRect, base, 0.25, 0.06); 4992f86ba45SStephan Aßmus } 5002f86ba45SStephan Aßmus } 5012f86ba45SStephan Aßmus 5022f86ba45SStephan Aßmus 5032f86ba45SStephan Aßmus void 5042f86ba45SStephan Aßmus BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect, 5052f86ba45SStephan Aßmus const rgb_color& base, uint32 flags) 5062f86ba45SStephan Aßmus { 5072f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 5082f86ba45SStephan Aßmus return; 5092f86ba45SStephan Aßmus 5102f86ba45SStephan Aßmus rgb_color dark1BorderColor; 5112f86ba45SStephan Aßmus rgb_color dark2BorderColor; 5122f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 5132f86ba45SStephan Aßmus 5142f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5152f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.0); 5162f86ba45SStephan Aßmus 5172f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.15); 5182f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.15); 5192f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 5202f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.50); 5212f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.48); 5222f86ba45SStephan Aßmus 5232f86ba45SStephan Aßmus _DrawFrame(view, rect, 5242f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 5252f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 5262f86ba45SStephan Aßmus 5272f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 5282f86ba45SStephan Aßmus } else { 5292f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6); 5302f86ba45SStephan Aßmus 5312f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.40); 5322f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.38); 5332f86ba45SStephan Aßmus } 5342f86ba45SStephan Aßmus 5352f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 5362f86ba45SStephan Aßmus dark1BorderColor = navigationColor; 5372f86ba45SStephan Aßmus dark2BorderColor = navigationColor; 5382f86ba45SStephan Aßmus } 5392f86ba45SStephan Aßmus 5402f86ba45SStephan Aßmus _DrawFrame(view, rect, 5412f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 5422f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 5432f86ba45SStephan Aßmus 5442f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5452f86ba45SStephan Aßmus _FillGradient(view, rect, base, 0.4, 0.2); 5462f86ba45SStephan Aßmus } else { 5472f86ba45SStephan Aßmus _FillGradient(view, rect, base, 0.15, 0.0); 5482f86ba45SStephan Aßmus } 5492f86ba45SStephan Aßmus 5502f86ba45SStephan Aßmus rgb_color markColor; 5512f86ba45SStephan Aßmus if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) { 5522f86ba45SStephan Aßmus view->SetHighColor(markColor); 5532f86ba45SStephan Aßmus 5542f86ba45SStephan Aßmus rect.InsetBy(2, 2); 5552f86ba45SStephan Aßmus view->SetPenSize(max_c(1.0, ceilf(rect.Width() / 3.5))); 5562f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_OVER); 5572f86ba45SStephan Aßmus 5582f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightBottom()); 5592f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightTop()); 5602f86ba45SStephan Aßmus } 5612f86ba45SStephan Aßmus } 5622f86ba45SStephan Aßmus 5632f86ba45SStephan Aßmus 5642f86ba45SStephan Aßmus void 5652f86ba45SStephan Aßmus BControlLook::DrawRadioButton(BView* view, BRect& rect, const BRect& updateRect, 5662f86ba45SStephan Aßmus const rgb_color& base, uint32 flags) 5672f86ba45SStephan Aßmus { 5682f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 5692f86ba45SStephan Aßmus return; 5702f86ba45SStephan Aßmus 5712f86ba45SStephan Aßmus rgb_color borderColor; 5722f86ba45SStephan Aßmus rgb_color bevelLight; 5732f86ba45SStephan Aßmus rgb_color bevelShadow; 5742f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 5752f86ba45SStephan Aßmus 5762f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5772f86ba45SStephan Aßmus borderColor = tint_color(base, 1.15); 5782f86ba45SStephan Aßmus bevelLight = base; 5792f86ba45SStephan Aßmus bevelShadow = base; 5802f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 5812f86ba45SStephan Aßmus borderColor = tint_color(base, 1.50); 5822f86ba45SStephan Aßmus bevelLight = borderColor; 5832f86ba45SStephan Aßmus bevelShadow = borderColor; 5842f86ba45SStephan Aßmus } else { 5852f86ba45SStephan Aßmus borderColor = tint_color(base, 1.45); 5862f86ba45SStephan Aßmus bevelLight = tint_color(base, 0.55); 5872f86ba45SStephan Aßmus bevelShadow = tint_color(base, 1.11); 5882f86ba45SStephan Aßmus } 5892f86ba45SStephan Aßmus 5902f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 5912f86ba45SStephan Aßmus borderColor = navigationColor; 5922f86ba45SStephan Aßmus } 5932f86ba45SStephan Aßmus 5942f86ba45SStephan Aßmus BGradientLinear bevelGradient; 5952f86ba45SStephan Aßmus bevelGradient.AddColor(bevelShadow, 0); 5962f86ba45SStephan Aßmus bevelGradient.AddColor(bevelLight, 255); 5972f86ba45SStephan Aßmus bevelGradient.SetStart(rect.LeftTop()); 5982f86ba45SStephan Aßmus bevelGradient.SetEnd(rect.RightBottom()); 5992f86ba45SStephan Aßmus 6002f86ba45SStephan Aßmus view->FillEllipse(rect, bevelGradient); 6012f86ba45SStephan Aßmus rect.InsetBy(1, 1); 6022f86ba45SStephan Aßmus 6032f86ba45SStephan Aßmus bevelGradient.MakeEmpty(); 6042f86ba45SStephan Aßmus bevelGradient.AddColor(borderColor, 0); 6052f86ba45SStephan Aßmus bevelGradient.AddColor(tint_color(borderColor, 0.8), 255); 6062f86ba45SStephan Aßmus view->FillEllipse(rect, bevelGradient); 6072f86ba45SStephan Aßmus rect.InsetBy(1, 1); 6082f86ba45SStephan Aßmus 6092f86ba45SStephan Aßmus float topTint; 6102f86ba45SStephan Aßmus float bottomTint; 6112f86ba45SStephan Aßmus if (flags & B_DISABLED) { 6122f86ba45SStephan Aßmus topTint = 0.4; 6132f86ba45SStephan Aßmus bottomTint = 0.2; 6142f86ba45SStephan Aßmus } else { 6152f86ba45SStephan Aßmus topTint = 0.15; 6162f86ba45SStephan Aßmus bottomTint = 0.0; 6172f86ba45SStephan Aßmus } 6182f86ba45SStephan Aßmus 6192f86ba45SStephan Aßmus BGradientLinear gradient; 6202f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint); 6212f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 6222f86ba45SStephan Aßmus 6232f86ba45SStephan Aßmus rgb_color markColor; 6242f86ba45SStephan Aßmus if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) { 6252f86ba45SStephan Aßmus view->SetHighColor(markColor); 6262f86ba45SStephan Aßmus rect.InsetBy(3, 3); 6272f86ba45SStephan Aßmus view->FillEllipse(rect); 6282f86ba45SStephan Aßmus } 6292f86ba45SStephan Aßmus } 6302f86ba45SStephan Aßmus 6312f86ba45SStephan Aßmus 6322f86ba45SStephan Aßmus void 6332f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect1, BRect& rect2, 6342f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 6352f86ba45SStephan Aßmus enum orientation orientation) 6362f86ba45SStephan Aßmus { 6372f86ba45SStephan Aßmus DrawScrollBarBackground(view, rect1, updateRect, base, flags, orientation); 6382f86ba45SStephan Aßmus DrawScrollBarBackground(view, rect2, updateRect, base, flags, orientation); 6392f86ba45SStephan Aßmus } 6402f86ba45SStephan Aßmus 6412f86ba45SStephan Aßmus void 6422f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect, 6432f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 6442f86ba45SStephan Aßmus enum orientation orientation) 6452f86ba45SStephan Aßmus { 6462f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 6472f86ba45SStephan Aßmus return; 6482f86ba45SStephan Aßmus 6492f86ba45SStephan Aßmus float gradient1Tint; 6502f86ba45SStephan Aßmus float gradient2Tint; 6512f86ba45SStephan Aßmus float darkEdge1Tint; 6522f86ba45SStephan Aßmus float darkEdge2Tint; 6532f86ba45SStephan Aßmus float shadowTint; 6542f86ba45SStephan Aßmus 6552f86ba45SStephan Aßmus if (flags & B_DISABLED) { 6562f86ba45SStephan Aßmus gradient1Tint = 0.9; 6572f86ba45SStephan Aßmus gradient2Tint = 0.8; 6582f86ba45SStephan Aßmus darkEdge1Tint = B_DARKEN_2_TINT; 6592f86ba45SStephan Aßmus darkEdge2Tint = B_DARKEN_2_TINT; 6602f86ba45SStephan Aßmus shadowTint = gradient1Tint; 6612f86ba45SStephan Aßmus } else { 6622f86ba45SStephan Aßmus gradient1Tint = 1.10; 6632f86ba45SStephan Aßmus gradient2Tint = 1.05; 6642f86ba45SStephan Aßmus darkEdge1Tint = B_DARKEN_3_TINT; 6652f86ba45SStephan Aßmus darkEdge2Tint = B_DARKEN_2_TINT; 6662f86ba45SStephan Aßmus shadowTint = gradient1Tint; 6672f86ba45SStephan Aßmus } 6682f86ba45SStephan Aßmus 6692f86ba45SStephan Aßmus rgb_color darkEdge1 = tint_color(base, darkEdge1Tint); 6702f86ba45SStephan Aßmus rgb_color darkEdge2 = tint_color(base, darkEdge2Tint); 6712f86ba45SStephan Aßmus rgb_color shadow = tint_color(base, shadowTint); 6722f86ba45SStephan Aßmus 6732f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 6742f86ba45SStephan Aßmus // dark vertical line on left edge 6752f86ba45SStephan Aßmus if (rect.Width() > 0) { 6762f86ba45SStephan Aßmus view->SetHighColor(darkEdge1); 6772f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 6782f86ba45SStephan Aßmus rect.left++; 6792f86ba45SStephan Aßmus } 6802f86ba45SStephan Aßmus // dark vertical line on right edge 6812f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6822f86ba45SStephan Aßmus view->SetHighColor(darkEdge2); 6832f86ba45SStephan Aßmus view->StrokeLine(rect.RightTop(), rect.RightBottom()); 6842f86ba45SStephan Aßmus rect.right--; 6852f86ba45SStephan Aßmus } 6862f86ba45SStephan Aßmus // vertical shadow line after left edge 6872f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6882f86ba45SStephan Aßmus view->SetHighColor(shadow); 6892f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 6902f86ba45SStephan Aßmus rect.left++; 6912f86ba45SStephan Aßmus } 6922f86ba45SStephan Aßmus // fill 6932f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6942f86ba45SStephan Aßmus _FillGradient(view, rect, base, gradient1Tint, gradient2Tint, 6952f86ba45SStephan Aßmus orientation); 6962f86ba45SStephan Aßmus } 6972f86ba45SStephan Aßmus } else { 6982f86ba45SStephan Aßmus // dark vertical line on top edge 6992f86ba45SStephan Aßmus if (rect.Height() > 0) { 7002f86ba45SStephan Aßmus view->SetHighColor(darkEdge1); 7012f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 7022f86ba45SStephan Aßmus rect.top++; 7032f86ba45SStephan Aßmus } 7042f86ba45SStephan Aßmus // dark vertical line on bottom edge 7052f86ba45SStephan Aßmus if (rect.Height() >= 0) { 7062f86ba45SStephan Aßmus view->SetHighColor(darkEdge2); 7072f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); 7082f86ba45SStephan Aßmus rect.bottom--; 7092f86ba45SStephan Aßmus } 7102f86ba45SStephan Aßmus // horizontal shadow line after top edge 7112f86ba45SStephan Aßmus if (rect.Height() >= 0) { 7122f86ba45SStephan Aßmus view->SetHighColor(shadow); 7132f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 7142f86ba45SStephan Aßmus rect.top++; 7152f86ba45SStephan Aßmus } 7162f86ba45SStephan Aßmus // fill 7172f86ba45SStephan Aßmus if (rect.Height() >= 0) { 7182f86ba45SStephan Aßmus _FillGradient(view, rect, base, gradient1Tint, gradient2Tint, 7192f86ba45SStephan Aßmus orientation); 7202f86ba45SStephan Aßmus } 7212f86ba45SStephan Aßmus } 7222f86ba45SStephan Aßmus } 7232f86ba45SStephan Aßmus 7242f86ba45SStephan Aßmus 7252f86ba45SStephan Aßmus rgb_color 7262f86ba45SStephan Aßmus BControlLook::SliderBarColor(const rgb_color& base) 7272f86ba45SStephan Aßmus { 7282f86ba45SStephan Aßmus return tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT); 7292f86ba45SStephan Aßmus } 7302f86ba45SStephan Aßmus 7312f86ba45SStephan Aßmus 7322f86ba45SStephan Aßmus void 7332f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect, 7342f86ba45SStephan Aßmus const rgb_color& base, rgb_color leftFillColor, rgb_color rightFillColor, 7352f86ba45SStephan Aßmus float sliderScale, uint32 flags, enum orientation orientation) 7362f86ba45SStephan Aßmus { 7372f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 7382f86ba45SStephan Aßmus return; 7392f86ba45SStephan Aßmus 7402f86ba45SStephan Aßmus // separate the bar in two sides 7412f86ba45SStephan Aßmus float sliderPosition; 7422f86ba45SStephan Aßmus BRect leftBarSide = rect; 7432f86ba45SStephan Aßmus BRect rightBarSide = rect; 7442f86ba45SStephan Aßmus 7452f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 7462f86ba45SStephan Aßmus sliderPosition = floorf(rect.left + 2 + (rect.Width() - 2) 7472f86ba45SStephan Aßmus * sliderScale); 7482f86ba45SStephan Aßmus leftBarSide.right = sliderPosition - 1; 7492f86ba45SStephan Aßmus rightBarSide.left = sliderPosition; 7502f86ba45SStephan Aßmus } else { 7512f86ba45SStephan Aßmus sliderPosition = floorf(rect.top + 2 + (rect.Height() - 2) 7522f86ba45SStephan Aßmus * sliderScale); 7532f86ba45SStephan Aßmus leftBarSide.bottom = sliderPosition - 1; 7542f86ba45SStephan Aßmus rightBarSide.top = sliderPosition; 7552f86ba45SStephan Aßmus } 7562f86ba45SStephan Aßmus 7572f86ba45SStephan Aßmus // fill the background for the corners, exclude the middle bar for now 7582f86ba45SStephan Aßmus BRegion region(rect); 7592f86ba45SStephan Aßmus region.Exclude(rightBarSide); 7602f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 7612f86ba45SStephan Aßmus 7622f86ba45SStephan Aßmus view->PushState(); 7632f86ba45SStephan Aßmus 7642f86ba45SStephan Aßmus DrawSliderBar(view, rect, updateRect, base, leftFillColor, flags, 7652f86ba45SStephan Aßmus orientation); 7662f86ba45SStephan Aßmus 7672f86ba45SStephan Aßmus view->PopState(); 7682f86ba45SStephan Aßmus 7692f86ba45SStephan Aßmus region.Set(rect); 7702f86ba45SStephan Aßmus region.Exclude(leftBarSide); 7712f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 7722f86ba45SStephan Aßmus 7732f86ba45SStephan Aßmus view->PushState(); 7742f86ba45SStephan Aßmus 7752f86ba45SStephan Aßmus DrawSliderBar(view, rect, updateRect, base, rightFillColor, flags, 7762f86ba45SStephan Aßmus orientation); 7772f86ba45SStephan Aßmus 7782f86ba45SStephan Aßmus view->PopState(); 7792f86ba45SStephan Aßmus 7802f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 7812f86ba45SStephan Aßmus } 7822f86ba45SStephan Aßmus 7832f86ba45SStephan Aßmus 7842f86ba45SStephan Aßmus void 7852f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect, 7862f86ba45SStephan Aßmus const rgb_color& base, rgb_color fillColor, uint32 flags, 7872f86ba45SStephan Aßmus enum orientation orientation) 7882f86ba45SStephan Aßmus { 7892f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 7902f86ba45SStephan Aßmus return; 7912f86ba45SStephan Aßmus 7922f86ba45SStephan Aßmus // separate the rect into corners 7932f86ba45SStephan Aßmus BRect leftCorner(rect); 7942f86ba45SStephan Aßmus BRect rightCorner(rect); 7952f86ba45SStephan Aßmus BRect barRect(rect); 7962f86ba45SStephan Aßmus 7972f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 7982f86ba45SStephan Aßmus leftCorner.right = leftCorner.left + leftCorner.Height(); 7992f86ba45SStephan Aßmus rightCorner.left = rightCorner.right - rightCorner.Height(); 8002f86ba45SStephan Aßmus barRect.left += ceilf(barRect.Height() / 2); 8012f86ba45SStephan Aßmus barRect.right -= ceilf(barRect.Height() / 2); 8022f86ba45SStephan Aßmus } else { 8032f86ba45SStephan Aßmus leftCorner.bottom = leftCorner.top + leftCorner.Width(); 8042f86ba45SStephan Aßmus rightCorner.top = rightCorner.bottom - rightCorner.Width(); 8052f86ba45SStephan Aßmus barRect.top += ceilf(barRect.Width() / 2); 8062f86ba45SStephan Aßmus barRect.bottom -= ceilf(barRect.Width() / 2); 8072f86ba45SStephan Aßmus } 8082f86ba45SStephan Aßmus 8092f86ba45SStephan Aßmus // fill the background for the corners, exclude the middle bar for now 8102f86ba45SStephan Aßmus BRegion region(rect); 8112f86ba45SStephan Aßmus region.Exclude(barRect); 8122f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 8132f86ba45SStephan Aßmus 8142f86ba45SStephan Aßmus view->SetHighColor(base); 8152f86ba45SStephan Aßmus view->FillRect(rect); 8162f86ba45SStephan Aßmus 8172f86ba45SStephan Aßmus // figure out the tints to be used 8182f86ba45SStephan Aßmus float edgeLightTint; 8192f86ba45SStephan Aßmus float edgeShadowTint; 8202f86ba45SStephan Aßmus float frameLightTint; 8212f86ba45SStephan Aßmus float frameShadowTint; 8222f86ba45SStephan Aßmus float fillLightTint; 8232f86ba45SStephan Aßmus float fillShadowTint; 8242f86ba45SStephan Aßmus 8252f86ba45SStephan Aßmus if (flags & B_DISABLED) { 8262f86ba45SStephan Aßmus edgeLightTint = 1.0; 8272f86ba45SStephan Aßmus edgeShadowTint = 1.0; 8282f86ba45SStephan Aßmus frameLightTint = 1.20; 8292f86ba45SStephan Aßmus frameShadowTint = 1.25; 8302f86ba45SStephan Aßmus fillLightTint = 0.9; 8312f86ba45SStephan Aßmus fillShadowTint = 1.05; 8322f86ba45SStephan Aßmus 8332f86ba45SStephan Aßmus fillColor.red = uint8(fillColor.red * 0.4 + base.red * 0.6); 8342f86ba45SStephan Aßmus fillColor.green = uint8(fillColor.green * 0.4 + base.green * 0.6); 8352f86ba45SStephan Aßmus fillColor.blue = uint8(fillColor.blue * 0.4 + base.blue * 0.6); 8362f86ba45SStephan Aßmus } else { 8372f86ba45SStephan Aßmus edgeLightTint = 0.65; 8382f86ba45SStephan Aßmus edgeShadowTint = 1.07; 8392f86ba45SStephan Aßmus frameLightTint = 1.40; 8402f86ba45SStephan Aßmus frameShadowTint = 1.50; 8412f86ba45SStephan Aßmus fillLightTint = 0.8; 8422f86ba45SStephan Aßmus fillShadowTint = 1.1; 8432f86ba45SStephan Aßmus } 8442f86ba45SStephan Aßmus 8452f86ba45SStephan Aßmus rgb_color edgeLightColor = tint_color(base, edgeLightTint); 8462f86ba45SStephan Aßmus rgb_color edgeShadowColor = tint_color(base, edgeShadowTint); 8472f86ba45SStephan Aßmus rgb_color frameLightColor = tint_color(fillColor, frameLightTint); 8482f86ba45SStephan Aßmus rgb_color frameShadowColor = tint_color(fillColor, frameShadowTint); 8492f86ba45SStephan Aßmus rgb_color fillLightColor = tint_color(fillColor, fillLightTint); 8502f86ba45SStephan Aßmus rgb_color fillShadowColor = tint_color(fillColor, fillShadowTint); 8512f86ba45SStephan Aßmus 8522f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 8532f86ba45SStephan Aßmus _DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor, 8542f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 8552f86ba45SStephan Aßmus fillShadowColor, 1.0, 1.0, 0.0, -1.0, orientation); 8562f86ba45SStephan Aßmus 8572f86ba45SStephan Aßmus _DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor, 8582f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 8592f86ba45SStephan Aßmus fillShadowColor, 0.0, 1.0, -1.0, -1.0, orientation); 8602f86ba45SStephan Aßmus } else { 8612f86ba45SStephan Aßmus _DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor, 8622f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 8632f86ba45SStephan Aßmus fillShadowColor, 1.0, 1.0, -1.0, 0.0, orientation); 8642f86ba45SStephan Aßmus 8652f86ba45SStephan Aßmus _DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor, 8662f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 8672f86ba45SStephan Aßmus fillShadowColor, 1.0, 0.0, -1.0, -1.0, orientation); 8682f86ba45SStephan Aßmus } 8692f86ba45SStephan Aßmus 8702f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 8712f86ba45SStephan Aßmus 8722f86ba45SStephan Aßmus view->BeginLineArray(4); 8732f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 8742f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.RightTop(), edgeShadowColor); 8752f86ba45SStephan Aßmus view->AddLine(barRect.LeftBottom(), barRect.RightBottom(), 8762f86ba45SStephan Aßmus edgeLightColor); 8772f86ba45SStephan Aßmus barRect.InsetBy(0, 1); 8782f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.RightTop(), frameShadowColor); 8792f86ba45SStephan Aßmus view->AddLine(barRect.LeftBottom(), barRect.RightBottom(), 8802f86ba45SStephan Aßmus frameLightColor); 8812f86ba45SStephan Aßmus barRect.InsetBy(0, 1); 8822f86ba45SStephan Aßmus } else { 8832f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), edgeShadowColor); 8842f86ba45SStephan Aßmus view->AddLine(barRect.RightTop(), barRect.RightBottom(), 8852f86ba45SStephan Aßmus edgeLightColor); 8862f86ba45SStephan Aßmus barRect.InsetBy(1, 0); 8872f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), frameShadowColor); 8882f86ba45SStephan Aßmus view->AddLine(barRect.RightTop(), barRect.RightBottom(), 8892f86ba45SStephan Aßmus frameLightColor); 8902f86ba45SStephan Aßmus barRect.InsetBy(1, 0); 8912f86ba45SStephan Aßmus } 8922f86ba45SStephan Aßmus view->EndLineArray(); 8932f86ba45SStephan Aßmus 8942f86ba45SStephan Aßmus _FillGradient(view, barRect, fillColor, fillShadowTint, fillLightTint, 8952f86ba45SStephan Aßmus orientation); 8962f86ba45SStephan Aßmus } 8972f86ba45SStephan Aßmus 8982f86ba45SStephan Aßmus 8992f86ba45SStephan Aßmus void 9002f86ba45SStephan Aßmus BControlLook::DrawSliderThumb(BView* view, BRect& rect, const BRect& updateRect, 9012f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, enum orientation orientation) 9022f86ba45SStephan Aßmus { 9032f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 9042f86ba45SStephan Aßmus return; 9052f86ba45SStephan Aßmus 9062f86ba45SStephan Aßmus // figure out frame color 9072f86ba45SStephan Aßmus rgb_color frameLightColor; 9082f86ba45SStephan Aßmus rgb_color frameShadowColor; 9092f86ba45SStephan Aßmus rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 }; 9102f86ba45SStephan Aßmus 9112f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 9122f86ba45SStephan Aßmus // focused 9132f86ba45SStephan Aßmus frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 9142f86ba45SStephan Aßmus frameShadowColor = frameLightColor; 9152f86ba45SStephan Aßmus } else { 9162f86ba45SStephan Aßmus // figure out the tints to be used 9172f86ba45SStephan Aßmus float frameLightTint; 9182f86ba45SStephan Aßmus float frameShadowTint; 9192f86ba45SStephan Aßmus 9202f86ba45SStephan Aßmus if (flags & B_DISABLED) { 9212f86ba45SStephan Aßmus frameLightTint = 1.30; 9222f86ba45SStephan Aßmus frameShadowTint = 1.35; 9232f86ba45SStephan Aßmus shadowColor.alpha = 30; 9242f86ba45SStephan Aßmus } else { 9252f86ba45SStephan Aßmus frameLightTint = 1.6; 9262f86ba45SStephan Aßmus frameShadowTint = 1.65; 9272f86ba45SStephan Aßmus } 9282f86ba45SStephan Aßmus 9292f86ba45SStephan Aßmus frameLightColor = tint_color(base, frameLightTint); 9302f86ba45SStephan Aßmus frameShadowColor = tint_color(base, frameShadowTint); 9312f86ba45SStephan Aßmus } 9322f86ba45SStephan Aßmus 9332f86ba45SStephan Aßmus BRect originalRect(rect); 9342f86ba45SStephan Aßmus rect.right--; 9352f86ba45SStephan Aßmus rect.bottom--; 9362f86ba45SStephan Aßmus 9372f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, 9382f86ba45SStephan Aßmus frameShadowColor, frameShadowColor); 9392f86ba45SStephan Aßmus 9402f86ba45SStephan Aßmus flags &= ~B_ACTIVATED; 9412f86ba45SStephan Aßmus DrawButtonBackground(view, rect, updateRect, base, flags); 9422f86ba45SStephan Aßmus 9432f86ba45SStephan Aßmus // thumb shadow 9442f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 9452f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 9462f86ba45SStephan Aßmus originalRect.left++; 9472f86ba45SStephan Aßmus originalRect.top++; 9482f86ba45SStephan Aßmus view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom()); 9492f86ba45SStephan Aßmus originalRect.bottom--; 9502f86ba45SStephan Aßmus view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom()); 9512f86ba45SStephan Aßmus 9522f86ba45SStephan Aßmus // thumb edge 9532f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 9542f86ba45SStephan Aßmus rect.InsetBy(0, floorf(rect.Height() / 4)); 9552f86ba45SStephan Aßmus rect.left = floorf((rect.left + rect.right) / 2); 9562f86ba45SStephan Aßmus rect.right = rect.left + 1; 9572f86ba45SStephan Aßmus shadowColor = tint_color(base, B_DARKEN_2_TINT); 9582f86ba45SStephan Aßmus shadowColor.alpha = 128; 9592f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 9602f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 9612f86ba45SStephan Aßmus rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 9622f86ba45SStephan Aßmus lightColor.alpha = 128; 9632f86ba45SStephan Aßmus view->SetHighColor(lightColor); 9642f86ba45SStephan Aßmus view->StrokeLine(rect.RightTop(), rect.RightBottom()); 9652f86ba45SStephan Aßmus } else { 9662f86ba45SStephan Aßmus rect.InsetBy(floorf(rect.Width() / 4), 0); 9672f86ba45SStephan Aßmus rect.top = floorf((rect.top + rect.bottom) / 2); 9682f86ba45SStephan Aßmus rect.bottom = rect.top + 1; 9692f86ba45SStephan Aßmus shadowColor = tint_color(base, B_DARKEN_2_TINT); 9702f86ba45SStephan Aßmus shadowColor.alpha = 128; 9712f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 9722f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 9732f86ba45SStephan Aßmus rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 9742f86ba45SStephan Aßmus lightColor.alpha = 128; 9752f86ba45SStephan Aßmus view->SetHighColor(lightColor); 9762f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); 9772f86ba45SStephan Aßmus } 9782f86ba45SStephan Aßmus 9792f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_COPY); 9802f86ba45SStephan Aßmus } 9812f86ba45SStephan Aßmus 9822f86ba45SStephan Aßmus 9832f86ba45SStephan Aßmus void 9842f86ba45SStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect, 9852f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 9862f86ba45SStephan Aßmus enum orientation orientation) 9872f86ba45SStephan Aßmus { 9882f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 9892f86ba45SStephan Aßmus return; 9902f86ba45SStephan Aßmus 9912f86ba45SStephan Aßmus // figure out frame color 9922f86ba45SStephan Aßmus rgb_color frameLightColor; 9932f86ba45SStephan Aßmus rgb_color frameShadowColor; 9942f86ba45SStephan Aßmus rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 }; 9952f86ba45SStephan Aßmus 9962f86ba45SStephan Aßmus float topTint = 0.49; 9972f86ba45SStephan Aßmus float middleTint1 = 0.62; 9982f86ba45SStephan Aßmus float middleTint2 = 0.76; 9992f86ba45SStephan Aßmus float bottomTint = 0.90; 10002f86ba45SStephan Aßmus 10012f86ba45SStephan Aßmus if (flags & B_DISABLED) { 10022f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 10032f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 10042f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 10052f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 10062f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 10072f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 10082f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 10092f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 10102f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 10112f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 10122f86ba45SStephan Aßmus } 10132f86ba45SStephan Aßmus 10142f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 10152f86ba45SStephan Aßmus // focused 10162f86ba45SStephan Aßmus frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 10172f86ba45SStephan Aßmus frameShadowColor = frameLightColor; 10182f86ba45SStephan Aßmus } else { 10192f86ba45SStephan Aßmus // figure out the tints to be used 10202f86ba45SStephan Aßmus float frameLightTint; 10212f86ba45SStephan Aßmus float frameShadowTint; 10222f86ba45SStephan Aßmus 10232f86ba45SStephan Aßmus if (flags & B_DISABLED) { 10242f86ba45SStephan Aßmus frameLightTint = 1.30; 10252f86ba45SStephan Aßmus frameShadowTint = 1.35; 10262f86ba45SStephan Aßmus shadowColor.alpha = 30; 10272f86ba45SStephan Aßmus } else { 10282f86ba45SStephan Aßmus frameLightTint = 1.6; 10292f86ba45SStephan Aßmus frameShadowTint = 1.65; 10302f86ba45SStephan Aßmus } 10312f86ba45SStephan Aßmus 10322f86ba45SStephan Aßmus frameLightColor = tint_color(base, frameLightTint); 10332f86ba45SStephan Aßmus frameShadowColor = tint_color(base, frameShadowTint); 10342f86ba45SStephan Aßmus } 10352f86ba45SStephan Aßmus 10362f86ba45SStephan Aßmus // BRect originalRect(rect); 10372f86ba45SStephan Aßmus // rect.right--; 10382f86ba45SStephan Aßmus // rect.bottom--; 10392f86ba45SStephan Aßmus 10402f86ba45SStephan Aßmus float center = (rect.left + rect.right) / 2; 10412f86ba45SStephan Aßmus 10422f86ba45SStephan Aßmus // BShape shape; 10432f86ba45SStephan Aßmus // shape.MoveTo(BPoint(rect.left + 0.5, rect.bottom + 0.5)); 10442f86ba45SStephan Aßmus // shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5)); 10452f86ba45SStephan Aßmus // shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5)); 10462f86ba45SStephan Aßmus // shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5)); 10472f86ba45SStephan Aßmus // shape.LineTo(BPoint(center + 0.5, rect.top + 0.5)); 10482f86ba45SStephan Aßmus // shape.LineTo(BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5)); 10492f86ba45SStephan Aßmus // shape.Close(); 10502f86ba45SStephan Aßmus // 10512f86ba45SStephan Aßmus // BGradientLinear gradient; 10522f86ba45SStephan Aßmus // gradient.AddColor(frameLightColor, 0); 10532f86ba45SStephan Aßmus // gradient.AddColor(frameShadowColor, 255); 10542f86ba45SStephan Aßmus // gradient.SetStart(rect.LeftTop()); 10552f86ba45SStephan Aßmus // gradient.SetEnd(rect.RightBottom()); 10562f86ba45SStephan Aßmus // 10572f86ba45SStephan Aßmus // view->SetHighColor(frameLightColor); 10582f86ba45SStephan Aßmus // view->StrokeShape(&shape); 10592f86ba45SStephan Aßmus // 10602f86ba45SStephan Aßmus // view->StrokeRect(rect); 10612f86ba45SStephan Aßmus 10622f86ba45SStephan Aßmus uint32 viewFlags = view->Flags(); 10632f86ba45SStephan Aßmus view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE); 10642f86ba45SStephan Aßmus view->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN); 10652f86ba45SStephan Aßmus 10662f86ba45SStephan Aßmus BPoint triangle[3]; 10672f86ba45SStephan Aßmus triangle[0] = BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5); 10682f86ba45SStephan Aßmus triangle[1] = BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5); 10692f86ba45SStephan Aßmus triangle[2] = BPoint(center + 0.5, rect.top + 0.5); 10702f86ba45SStephan Aßmus 10712f86ba45SStephan Aßmus view->SetHighColor(frameLightColor); 10722f86ba45SStephan Aßmus view->StrokeTriangle(triangle[0], triangle[1], triangle[2]); 10732f86ba45SStephan Aßmus view->StrokeLine(BPoint(rect.left, rect.bottom), 10742f86ba45SStephan Aßmus BPoint(rect.right + 1, rect.bottom)); 10752f86ba45SStephan Aßmus 10762f86ba45SStephan Aßmus rect.InsetBy(1, 1); 10772f86ba45SStephan Aßmus 10782f86ba45SStephan Aßmus triangle[0] = BPoint(rect.left, rect.bottom); 10792f86ba45SStephan Aßmus triangle[1] = BPoint(rect.right + 1, rect.bottom); 10802f86ba45SStephan Aßmus triangle[2] = BPoint(center, rect.top); 10812f86ba45SStephan Aßmus 10822f86ba45SStephan Aßmus BGradientLinear gradient; 10832f86ba45SStephan Aßmus if (flags & B_DISABLED) { 10842f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint); 10852f86ba45SStephan Aßmus } else { 10862f86ba45SStephan Aßmus _MakeGlossyGradient(gradient, rect, base, topTint, middleTint1, 10872f86ba45SStephan Aßmus middleTint2, bottomTint); 10882f86ba45SStephan Aßmus } 10892f86ba45SStephan Aßmus 10902f86ba45SStephan Aßmus view->FillTriangle(triangle[0], triangle[1], triangle[2], gradient); 10912f86ba45SStephan Aßmus 10922f86ba45SStephan Aßmus 10932f86ba45SStephan Aßmus // 10942f86ba45SStephan Aßmus // _DrawFrame(view, rect, frameLightColor, frameLightColor, 10952f86ba45SStephan Aßmus // frameShadowColor, frameShadowColor); 10962f86ba45SStephan Aßmus // 10972f86ba45SStephan Aßmus // flags &= ~B_ACTIVATED; 10982f86ba45SStephan Aßmus // DrawButtonBackground(view, rect, updateRect, base, flags); 10992f86ba45SStephan Aßmus // 11002f86ba45SStephan Aßmus // // thumb shadow 11012f86ba45SStephan Aßmus // view->SetDrawingMode(B_OP_ALPHA); 11022f86ba45SStephan Aßmus // view->SetHighColor(shadowColor); 11032f86ba45SStephan Aßmus // originalRect.left++; 11042f86ba45SStephan Aßmus // originalRect.top++; 11052f86ba45SStephan Aßmus // view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom()); 11062f86ba45SStephan Aßmus // originalRect.bottom--; 11072f86ba45SStephan Aßmus // view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom()); 11082f86ba45SStephan Aßmus // 11092f86ba45SStephan Aßmus // // thumb edge 11102f86ba45SStephan Aßmus // rect.InsetBy(0, 2); 11112f86ba45SStephan Aßmus // rect.left = floorf((rect.left + rect.right) / 2); 11122f86ba45SStephan Aßmus // rect.right = rect.left + 1; 11132f86ba45SStephan Aßmus // shadowColor = tint_color(base, B_DARKEN_2_TINT); 11142f86ba45SStephan Aßmus // shadowColor.alpha = 128; 11152f86ba45SStephan Aßmus // view->SetHighColor(shadowColor); 11162f86ba45SStephan Aßmus // view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 11172f86ba45SStephan Aßmus // rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 11182f86ba45SStephan Aßmus // lightColor.alpha = 128; 11192f86ba45SStephan Aßmus // view->SetHighColor(lightColor); 11202f86ba45SStephan Aßmus // view->StrokeLine(rect.RightTop(), rect.RightBottom()); 11212f86ba45SStephan Aßmus // 11222f86ba45SStephan Aßmus // view->SetDrawingMode(B_OP_COPY); 11232f86ba45SStephan Aßmus 11242f86ba45SStephan Aßmus view->SetFlags(viewFlags); 11252f86ba45SStephan Aßmus } 11262f86ba45SStephan Aßmus 11272f86ba45SStephan Aßmus 11282f86ba45SStephan Aßmus void 11292f86ba45SStephan Aßmus BControlLook::DrawSliderHashMarks(BView* view, BRect& rect, 11302f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, int32 count, 11312f86ba45SStephan Aßmus hash_mark_location location, uint32 flags, enum orientation orientation) 11322f86ba45SStephan Aßmus { 11332f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 11342f86ba45SStephan Aßmus return; 11352f86ba45SStephan Aßmus 11362f86ba45SStephan Aßmus rgb_color lightColor; 11372f86ba45SStephan Aßmus rgb_color darkColor; 11382f86ba45SStephan Aßmus 11392f86ba45SStephan Aßmus if (flags & B_DISABLED) { 11402f86ba45SStephan Aßmus lightColor = tint_color(base, 0.9); 11412f86ba45SStephan Aßmus darkColor = tint_color(base, 1.07); 11422f86ba45SStephan Aßmus } else { 11432f86ba45SStephan Aßmus lightColor = tint_color(base, 0.8); 11442f86ba45SStephan Aßmus darkColor = tint_color(base, 1.14); 11452f86ba45SStephan Aßmus } 11462f86ba45SStephan Aßmus 11472f86ba45SStephan Aßmus int32 hashMarkCount = max_c(count, 2); 11482f86ba45SStephan Aßmus // draw at least two hashmarks at min/max if 11492f86ba45SStephan Aßmus // fHashMarks != B_HASH_MARKS_NONE 11502f86ba45SStephan Aßmus float factor; 11512f86ba45SStephan Aßmus float startPos; 11522f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 11532f86ba45SStephan Aßmus factor = (rect.Width() - 2) / (hashMarkCount - 1); 11542f86ba45SStephan Aßmus startPos = rect.left + 1; 11552f86ba45SStephan Aßmus } else { 11562f86ba45SStephan Aßmus factor = (rect.Height() - 2) / (hashMarkCount - 1); 11572f86ba45SStephan Aßmus startPos = rect.top + 1; 11582f86ba45SStephan Aßmus } 11592f86ba45SStephan Aßmus 11602f86ba45SStephan Aßmus if (location & B_HASH_MARKS_TOP) { 11612f86ba45SStephan Aßmus view->BeginLineArray(hashMarkCount * 2); 11622f86ba45SStephan Aßmus 11632f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 11642f86ba45SStephan Aßmus float pos = startPos; 11652f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 11662f86ba45SStephan Aßmus view->AddLine(BPoint(pos, rect.top), 11672f86ba45SStephan Aßmus BPoint(pos, rect.top + 4), darkColor); 11682f86ba45SStephan Aßmus view->AddLine(BPoint(pos + 1, rect.top), 11692f86ba45SStephan Aßmus BPoint(pos + 1, rect.top + 4), lightColor); 11702f86ba45SStephan Aßmus 11712f86ba45SStephan Aßmus pos += factor; 11722f86ba45SStephan Aßmus } 11732f86ba45SStephan Aßmus } else { 11742f86ba45SStephan Aßmus float pos = startPos; 11752f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 11762f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, pos), 11772f86ba45SStephan Aßmus BPoint(rect.left + 4, pos), darkColor); 11782f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, pos + 1), 11792f86ba45SStephan Aßmus BPoint(rect.left + 4, pos + 1), lightColor); 11802f86ba45SStephan Aßmus 11812f86ba45SStephan Aßmus pos += factor; 11822f86ba45SStephan Aßmus } 11832f86ba45SStephan Aßmus } 11842f86ba45SStephan Aßmus 11852f86ba45SStephan Aßmus view->EndLineArray(); 11862f86ba45SStephan Aßmus } 11872f86ba45SStephan Aßmus 11882f86ba45SStephan Aßmus if (location & B_HASH_MARKS_BOTTOM) { 11892f86ba45SStephan Aßmus 11902f86ba45SStephan Aßmus view->BeginLineArray(hashMarkCount * 2); 11912f86ba45SStephan Aßmus 11922f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 11932f86ba45SStephan Aßmus float pos = startPos; 11942f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 11952f86ba45SStephan Aßmus view->AddLine(BPoint(pos, rect.bottom - 4), 11962f86ba45SStephan Aßmus BPoint(pos, rect.bottom), darkColor); 11972f86ba45SStephan Aßmus view->AddLine(BPoint(pos + 1, rect.bottom - 4), 11982f86ba45SStephan Aßmus BPoint(pos + 1, rect.bottom), lightColor); 11992f86ba45SStephan Aßmus 12002f86ba45SStephan Aßmus pos += factor; 12012f86ba45SStephan Aßmus } 12022f86ba45SStephan Aßmus } else { 12032f86ba45SStephan Aßmus float pos = startPos; 12042f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 12052f86ba45SStephan Aßmus view->AddLine(BPoint(rect.right - 4, pos), 12062f86ba45SStephan Aßmus BPoint(rect.right, pos), darkColor); 12072f86ba45SStephan Aßmus view->AddLine(BPoint(rect.right - 4, pos + 1), 12082f86ba45SStephan Aßmus BPoint(rect.right, pos + 1), lightColor); 12092f86ba45SStephan Aßmus 12102f86ba45SStephan Aßmus pos += factor; 12112f86ba45SStephan Aßmus } 12122f86ba45SStephan Aßmus } 12132f86ba45SStephan Aßmus 12142f86ba45SStephan Aßmus view->EndLineArray(); 12152f86ba45SStephan Aßmus } 12162f86ba45SStephan Aßmus } 12172f86ba45SStephan Aßmus 12182f86ba45SStephan Aßmus 12192f86ba45SStephan Aßmus void 12202f86ba45SStephan Aßmus BControlLook::DrawActiveTab(BView* view, BRect& rect, const BRect& updateRect, 12212f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, uint32 borders) 12222f86ba45SStephan Aßmus { 12232f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 12242f86ba45SStephan Aßmus return; 12252f86ba45SStephan Aßmus 12262f86ba45SStephan Aßmus rgb_color edgeShadowColor; 12272f86ba45SStephan Aßmus rgb_color edgeLightColor; 12282f86ba45SStephan Aßmus rgb_color frameShadowColor; 12292f86ba45SStephan Aßmus rgb_color frameLightColor; 12302f86ba45SStephan Aßmus rgb_color bevelShadowColor; 12312f86ba45SStephan Aßmus rgb_color bevelLightColor; 12322f86ba45SStephan Aßmus BGradientLinear fillGradient; 12332f86ba45SStephan Aßmus fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3)); 12342f86ba45SStephan Aßmus fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3)); 12352f86ba45SStephan Aßmus 12362f86ba45SStephan Aßmus if (flags & B_DISABLED) { 12372f86ba45SStephan Aßmus edgeShadowColor = base; 12382f86ba45SStephan Aßmus edgeLightColor = base; 12392f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 12402f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.25); 12412f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 12422f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.8); 12432f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.85), 0); 12442f86ba45SStephan Aßmus fillGradient.AddColor(base, 255); 12452f86ba45SStephan Aßmus } else { 12462f86ba45SStephan Aßmus edgeShadowColor = tint_color(base, 1.03); 12472f86ba45SStephan Aßmus edgeLightColor = tint_color(base, 0.80); 12482f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 12492f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.30); 12502f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 12512f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.6); 12522f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.75), 0); 12532f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.03), 255); 12542f86ba45SStephan Aßmus } 1255*12ea5a2cSStephan Aßmus 12562f86ba45SStephan Aßmus static const float kRoundCornerRadius = 4; 12572f86ba45SStephan Aßmus 12582f86ba45SStephan Aßmus // left/top corner 12592f86ba45SStephan Aßmus BRect cornerRect(rect); 12602f86ba45SStephan Aßmus cornerRect.right = cornerRect.left + kRoundCornerRadius; 12612f86ba45SStephan Aßmus cornerRect.bottom = cornerRect.top + kRoundCornerRadius; 12622f86ba45SStephan Aßmus 12632f86ba45SStephan Aßmus BRegion clipping(rect); 12642f86ba45SStephan Aßmus clipping.Exclude(cornerRect); 12652f86ba45SStephan Aßmus 12662f86ba45SStephan Aßmus _DrawRoundCornerLeftTop(view, cornerRect, updateRect, base, edgeShadowColor, 12672f86ba45SStephan Aßmus frameLightColor, bevelLightColor, fillGradient); 12682f86ba45SStephan Aßmus 12692f86ba45SStephan Aßmus // left/top corner 12702f86ba45SStephan Aßmus cornerRect.right = rect.right; 12712f86ba45SStephan Aßmus cornerRect.left = cornerRect.right - kRoundCornerRadius; 12722f86ba45SStephan Aßmus 12732f86ba45SStephan Aßmus clipping.Exclude(cornerRect); 12742f86ba45SStephan Aßmus 12752f86ba45SStephan Aßmus _DrawRoundCornerRightTop(view, cornerRect, updateRect, base, edgeShadowColor, 12762f86ba45SStephan Aßmus edgeLightColor, frameLightColor, frameShadowColor, bevelLightColor, 12772f86ba45SStephan Aßmus bevelShadowColor, fillGradient); 12782f86ba45SStephan Aßmus 12792f86ba45SStephan Aßmus // rest of frame and fill 12802f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 12812f86ba45SStephan Aßmus 12822f86ba45SStephan Aßmus _DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor, 12832f86ba45SStephan Aßmus edgeLightColor, 12842f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 12852f86ba45SStephan Aßmus if ((borders & B_LEFT_BORDER) == 0) 12862f86ba45SStephan Aßmus rect.left++; 12872f86ba45SStephan Aßmus if ((borders & B_RIGHT_BORDER) == 0) 12882f86ba45SStephan Aßmus rect.right--; 12892f86ba45SStephan Aßmus 12902f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor, 12912f86ba45SStephan Aßmus frameShadowColor, B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER); 12922f86ba45SStephan Aßmus 12932f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelLightColor, bevelLightColor, bevelShadowColor, 12942f86ba45SStephan Aßmus bevelShadowColor); 12952f86ba45SStephan Aßmus 12962f86ba45SStephan Aßmus view->FillRect(rect, fillGradient); 12972f86ba45SStephan Aßmus 12982f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 12992f86ba45SStephan Aßmus } 13002f86ba45SStephan Aßmus 13012f86ba45SStephan Aßmus 13022f86ba45SStephan Aßmus void 13032f86ba45SStephan Aßmus BControlLook::DrawInctiveTab(BView* view, BRect& rect, const BRect& updateRect, 13042f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, uint32 borders) 13052f86ba45SStephan Aßmus { 13062f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 13072f86ba45SStephan Aßmus return; 13082f86ba45SStephan Aßmus 13092f86ba45SStephan Aßmus rgb_color edgeShadowColor; 13102f86ba45SStephan Aßmus rgb_color edgeLightColor; 13112f86ba45SStephan Aßmus rgb_color frameShadowColor; 13122f86ba45SStephan Aßmus rgb_color frameLightColor; 13132f86ba45SStephan Aßmus rgb_color bevelShadowColor; 13142f86ba45SStephan Aßmus rgb_color bevelLightColor; 13152f86ba45SStephan Aßmus BGradientLinear fillGradient; 13162f86ba45SStephan Aßmus fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3)); 13172f86ba45SStephan Aßmus fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3)); 13182f86ba45SStephan Aßmus 13192f86ba45SStephan Aßmus if (flags & B_DISABLED) { 13202f86ba45SStephan Aßmus edgeShadowColor = base; 13212f86ba45SStephan Aßmus edgeLightColor = base; 13222f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 13232f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.25); 13242f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 13252f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.8); 13262f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.85), 0); 13272f86ba45SStephan Aßmus fillGradient.AddColor(base, 255); 13282f86ba45SStephan Aßmus } else { 13292f86ba45SStephan Aßmus edgeShadowColor = tint_color(base, 1.03); 13302f86ba45SStephan Aßmus edgeLightColor = tint_color(base, 0.80); 13312f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 13322f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.30); 1333*12ea5a2cSStephan Aßmus bevelShadowColor = tint_color(base, 1.17); 13342f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 1.10); 13352f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.12), 0); 13362f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.08), 255); 13372f86ba45SStephan Aßmus } 13382f86ba45SStephan Aßmus 13392f86ba45SStephan Aßmus // active tabs stand out at the top, but this is an inactive tab 13402f86ba45SStephan Aßmus view->SetHighColor(base); 13412f86ba45SStephan Aßmus view->FillRect(BRect(rect.left, rect.top, rect.right, rect.top + 4)); 13422f86ba45SStephan Aßmus rect.top += 4; 13432f86ba45SStephan Aßmus 13442f86ba45SStephan Aßmus // frame and fill 13452f86ba45SStephan Aßmus _DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor, 13462f86ba45SStephan Aßmus edgeLightColor, 13472f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 13482f86ba45SStephan Aßmus 13492f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor, 13502f86ba45SStephan Aßmus frameShadowColor, 13512f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 13522f86ba45SStephan Aßmus 1353*12ea5a2cSStephan Aßmus _DrawFrame(view, rect, bevelShadowColor, bevelShadowColor, bevelLightColor, 1354*12ea5a2cSStephan Aßmus bevelLightColor, B_LEFT_BORDER & ~borders); 13552f86ba45SStephan Aßmus 13562f86ba45SStephan Aßmus view->FillRect(rect, fillGradient); 13572f86ba45SStephan Aßmus } 13582f86ba45SStephan Aßmus 13592f86ba45SStephan Aßmus 13602f86ba45SStephan Aßmus // #pragma mark - 13612f86ba45SStephan Aßmus 13622f86ba45SStephan Aßmus 13632f86ba45SStephan Aßmus void 13642f86ba45SStephan Aßmus BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect, 13652f86ba45SStephan Aßmus const rgb_color& base, border_style border, uint32 flags, uint32 borders) 13662f86ba45SStephan Aßmus { 13672f86ba45SStephan Aßmus if (border == B_NO_BORDER) 13682f86ba45SStephan Aßmus return; 13692f86ba45SStephan Aßmus 13702f86ba45SStephan Aßmus rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT); 13712f86ba45SStephan Aßmus if (flags & B_FOCUSED) 13722f86ba45SStephan Aßmus scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 13732f86ba45SStephan Aßmus 13742f86ba45SStephan Aßmus if (border == B_FANCY_BORDER) 13752f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, borders); 13762f86ba45SStephan Aßmus 13772f86ba45SStephan Aßmus _DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor, 13782f86ba45SStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, borders); 13792f86ba45SStephan Aßmus } 13802f86ba45SStephan Aßmus 13812f86ba45SStephan Aßmus 13822f86ba45SStephan Aßmus void 13832f86ba45SStephan Aßmus BControlLook::DrawRaisedBorder(BView* view, BRect& rect, 13842f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 13852f86ba45SStephan Aßmus uint32 borders) 13862f86ba45SStephan Aßmus { 13872f86ba45SStephan Aßmus rgb_color lightColor; 13882f86ba45SStephan Aßmus rgb_color shadowColor; 13892f86ba45SStephan Aßmus 13902f86ba45SStephan Aßmus if (flags & B_DISABLED) { 13912f86ba45SStephan Aßmus lightColor = base; 13922f86ba45SStephan Aßmus shadowColor = base; 13932f86ba45SStephan Aßmus } else { 13942f86ba45SStephan Aßmus lightColor = tint_color(base, 0.85); 13952f86ba45SStephan Aßmus shadowColor = tint_color(base, 1.07); 13962f86ba45SStephan Aßmus } 13972f86ba45SStephan Aßmus 13982f86ba45SStephan Aßmus _DrawFrame(view, rect, lightColor, lightColor, shadowColor, shadowColor, 13992f86ba45SStephan Aßmus borders); 14002f86ba45SStephan Aßmus } 14012f86ba45SStephan Aßmus 14022f86ba45SStephan Aßmus 14032f86ba45SStephan Aßmus void 14042f86ba45SStephan Aßmus BControlLook::DrawTextControlBorder(BView* view, BRect& rect, 14052f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 14062f86ba45SStephan Aßmus uint32 borders) 14072f86ba45SStephan Aßmus { 14082f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 14092f86ba45SStephan Aßmus return; 14102f86ba45SStephan Aßmus 14112f86ba45SStephan Aßmus rgb_color dark1BorderColor; 14122f86ba45SStephan Aßmus rgb_color dark2BorderColor; 14132f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 14142f86ba45SStephan Aßmus 14152f86ba45SStephan Aßmus if (flags & B_DISABLED) { 14162f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, borders); 14172f86ba45SStephan Aßmus 14182f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.15); 14192f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.15); 14202f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 14212f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.50); 14222f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.49); 14232f86ba45SStephan Aßmus 14242f86ba45SStephan Aßmus _DrawFrame(view, rect, 14252f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 14262f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 14272f86ba45SStephan Aßmus 14282f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 14292f86ba45SStephan Aßmus } else { 14302f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, borders); 14312f86ba45SStephan Aßmus 14322f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.40); 14332f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.38); 14342f86ba45SStephan Aßmus } 14352f86ba45SStephan Aßmus 14362f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) { 14372f86ba45SStephan Aßmus dark1BorderColor = navigationColor; 14382f86ba45SStephan Aßmus dark2BorderColor = navigationColor; 14392f86ba45SStephan Aßmus } 14402f86ba45SStephan Aßmus 14412f86ba45SStephan Aßmus _DrawFrame(view, rect, 14422f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 14432f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 14442f86ba45SStephan Aßmus } 14452f86ba45SStephan Aßmus 14462f86ba45SStephan Aßmus 14472f86ba45SStephan Aßmus void 14482f86ba45SStephan Aßmus BControlLook::DrawGroupFrame(BView* view, BRect& rect, const BRect& updateRect, 14492f86ba45SStephan Aßmus const rgb_color& base, uint32 borders) 14502f86ba45SStephan Aßmus { 14512f86ba45SStephan Aßmus rgb_color frameColor = tint_color(base, 1.30); 14522f86ba45SStephan Aßmus rgb_color bevelLight = tint_color(base, 0.8); 14532f86ba45SStephan Aßmus rgb_color bevelShadow = tint_color(base, 1.03); 14542f86ba45SStephan Aßmus 14552f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelShadow, bevelShadow, bevelLight, bevelLight, 14562f86ba45SStephan Aßmus borders); 14572f86ba45SStephan Aßmus 14582f86ba45SStephan Aßmus _DrawFrame(view, rect, frameColor, frameColor, frameColor, frameColor, 14592f86ba45SStephan Aßmus borders); 14602f86ba45SStephan Aßmus 14612f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelLight, bevelLight, bevelShadow, bevelShadow, 14622f86ba45SStephan Aßmus borders); 14632f86ba45SStephan Aßmus } 14642f86ba45SStephan Aßmus 14652f86ba45SStephan Aßmus 14662f86ba45SStephan Aßmus void 14672f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect, 14682f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags) 14692f86ba45SStephan Aßmus { 14702f86ba45SStephan Aßmus DrawLabel(view, label, rect, updateRect, base, flags, 14712f86ba45SStephan Aßmus DefaultLabelAlignment()); 14722f86ba45SStephan Aßmus } 14732f86ba45SStephan Aßmus 14742f86ba45SStephan Aßmus 14752f86ba45SStephan Aßmus void 14762f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect, 14772f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 14782f86ba45SStephan Aßmus const BAlignment& alignment) 14792f86ba45SStephan Aßmus { 14802f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 14812f86ba45SStephan Aßmus return; 14822f86ba45SStephan Aßmus 14832f86ba45SStephan Aßmus // setup the text color 14842f86ba45SStephan Aßmus rgb_color color; 14852f86ba45SStephan Aßmus if (base.red + base.green + base.blue > 128 * 3) 14862f86ba45SStephan Aßmus color = tint_color(base, B_DARKEN_MAX_TINT); 14872f86ba45SStephan Aßmus else 14882f86ba45SStephan Aßmus color = tint_color(base, B_LIGHTEN_MAX_TINT); 14892f86ba45SStephan Aßmus 14902f86ba45SStephan Aßmus if (flags & B_DISABLED) { 14912f86ba45SStephan Aßmus color.red = (uint8)(((int32)base.red + color.red + 1) / 2); 14922f86ba45SStephan Aßmus color.green = (uint8)(((int32)base.green + color.green + 1) / 2); 14932f86ba45SStephan Aßmus color.blue = (uint8)(((int32)base.blue + color.blue + 1) / 2); 14942f86ba45SStephan Aßmus } 14952f86ba45SStephan Aßmus 14962f86ba45SStephan Aßmus view->SetHighColor(color); 14972f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_OVER); 14982f86ba45SStephan Aßmus 14992f86ba45SStephan Aßmus // truncate the label if necessary and get the width and height 15002f86ba45SStephan Aßmus BString truncatedLabel(label); 15012f86ba45SStephan Aßmus 15022f86ba45SStephan Aßmus BFont font; 15032f86ba45SStephan Aßmus view->GetFont(&font); 15042f86ba45SStephan Aßmus 15052f86ba45SStephan Aßmus float width = rect.Width(); 15062f86ba45SStephan Aßmus font.TruncateString(&truncatedLabel, B_TRUNCATE_END, width); 15072f86ba45SStephan Aßmus width = font.StringWidth(truncatedLabel.String()); 15082f86ba45SStephan Aßmus 15092f86ba45SStephan Aßmus font_height fontHeight; 15102f86ba45SStephan Aßmus font.GetHeight(&fontHeight); 15112f86ba45SStephan Aßmus float height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent); 15122f86ba45SStephan Aßmus 15132f86ba45SStephan Aßmus // handle alignment 15142f86ba45SStephan Aßmus BPoint location; 15152f86ba45SStephan Aßmus 15162f86ba45SStephan Aßmus switch (alignment.horizontal) { 15172f86ba45SStephan Aßmus default: 15182f86ba45SStephan Aßmus case B_ALIGN_LEFT: 15192f86ba45SStephan Aßmus location.x = rect.left; 15202f86ba45SStephan Aßmus break; 15212f86ba45SStephan Aßmus case B_ALIGN_RIGHT: 15222f86ba45SStephan Aßmus location.x = rect.right - width; 15232f86ba45SStephan Aßmus break; 15242f86ba45SStephan Aßmus case B_ALIGN_CENTER: 15252f86ba45SStephan Aßmus location.x = (rect.left + rect.right - width) / 2.0f; 15262f86ba45SStephan Aßmus break; 15272f86ba45SStephan Aßmus } 15282f86ba45SStephan Aßmus 15292f86ba45SStephan Aßmus switch (alignment.vertical) { 15302f86ba45SStephan Aßmus case B_ALIGN_TOP: 15312f86ba45SStephan Aßmus location.y = rect.top + ceilf(fontHeight.ascent); 15322f86ba45SStephan Aßmus break; 15332f86ba45SStephan Aßmus default: 15342f86ba45SStephan Aßmus case B_ALIGN_MIDDLE: 15352f86ba45SStephan Aßmus location.y = floorf((rect.top + rect.bottom - height) / 2.0f + 0.5f) 15362f86ba45SStephan Aßmus + ceilf(fontHeight.ascent); 15372f86ba45SStephan Aßmus break; 15382f86ba45SStephan Aßmus case B_ALIGN_BOTTOM: 15392f86ba45SStephan Aßmus location.y = rect.bottom - ceilf(fontHeight.descent); 15402f86ba45SStephan Aßmus break; 15412f86ba45SStephan Aßmus } 15422f86ba45SStephan Aßmus 15432f86ba45SStephan Aßmus view->DrawString(truncatedLabel.String(), location); 15442f86ba45SStephan Aßmus } 15452f86ba45SStephan Aßmus 15462f86ba45SStephan Aßmus 15472f86ba45SStephan Aßmus // #pragma mark - 15482f86ba45SStephan Aßmus 15492f86ba45SStephan Aßmus 15502f86ba45SStephan Aßmus void 15512f86ba45SStephan Aßmus BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect, 15522f86ba45SStephan Aßmus const rgb_color& base, float contrast, float brightness, uint32 borders) 15532f86ba45SStephan Aßmus { 15542f86ba45SStephan Aßmus // colors 15552f86ba45SStephan Aßmus float tintLight = kEdgeBevelLightTint; 15562f86ba45SStephan Aßmus float tintShadow = kEdgeBevelShadowTint; 15572f86ba45SStephan Aßmus 15582f86ba45SStephan Aßmus if (contrast == 0.0) { 15592f86ba45SStephan Aßmus tintLight = B_NO_TINT; 15602f86ba45SStephan Aßmus tintShadow = B_NO_TINT; 15612f86ba45SStephan Aßmus } else if (contrast != 1.0) { 15622f86ba45SStephan Aßmus tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast; 15632f86ba45SStephan Aßmus tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast; 15642f86ba45SStephan Aßmus } 15652f86ba45SStephan Aßmus 15662f86ba45SStephan Aßmus rgb_color borderBevelShadow = tint_color(base, tintShadow); 15672f86ba45SStephan Aßmus rgb_color borderBevelLight = tint_color(base, tintLight); 15682f86ba45SStephan Aßmus 15692f86ba45SStephan Aßmus if (brightness < 1.0) { 15702f86ba45SStephan Aßmus borderBevelShadow.red = uint8(borderBevelShadow.red * brightness); 15712f86ba45SStephan Aßmus borderBevelShadow.green = uint8(borderBevelShadow.green * brightness); 15722f86ba45SStephan Aßmus borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness); 15732f86ba45SStephan Aßmus borderBevelLight.red = uint8(borderBevelLight.red * brightness); 15742f86ba45SStephan Aßmus borderBevelLight.green = uint8(borderBevelLight.green * brightness); 15752f86ba45SStephan Aßmus borderBevelLight.blue = uint8(borderBevelLight.blue * brightness); 15762f86ba45SStephan Aßmus } 15772f86ba45SStephan Aßmus 15782f86ba45SStephan Aßmus _DrawFrame(view, rect, borderBevelShadow, borderBevelShadow, 15792f86ba45SStephan Aßmus borderBevelLight, borderBevelLight, borders); 15802f86ba45SStephan Aßmus } 15812f86ba45SStephan Aßmus 15822f86ba45SStephan Aßmus 15832f86ba45SStephan Aßmus void 15842f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left, 15852f86ba45SStephan Aßmus const rgb_color& top, const rgb_color& right, const rgb_color& bottom, 15862f86ba45SStephan Aßmus uint32 borders) 15872f86ba45SStephan Aßmus { 15882f86ba45SStephan Aßmus view->BeginLineArray(4); 15892f86ba45SStephan Aßmus 15902f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 15912f86ba45SStephan Aßmus view->AddLine( 15922f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 15932f86ba45SStephan Aßmus BPoint(rect.left, rect.top), left); 15942f86ba45SStephan Aßmus rect.left++; 15952f86ba45SStephan Aßmus } 15962f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 15972f86ba45SStephan Aßmus view->AddLine( 15982f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 15992f86ba45SStephan Aßmus BPoint(rect.right, rect.top), top); 16002f86ba45SStephan Aßmus rect.top++; 16012f86ba45SStephan Aßmus } 16022f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 16032f86ba45SStephan Aßmus view->AddLine( 16042f86ba45SStephan Aßmus BPoint(rect.right, rect.top), 16052f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), right); 16062f86ba45SStephan Aßmus rect.right--; 16072f86ba45SStephan Aßmus } 16082f86ba45SStephan Aßmus if (borders & B_BOTTOM_BORDER) { 16092f86ba45SStephan Aßmus view->AddLine( 16102f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 16112f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), bottom); 16122f86ba45SStephan Aßmus rect.bottom--; 16132f86ba45SStephan Aßmus } 16142f86ba45SStephan Aßmus 16152f86ba45SStephan Aßmus view->EndLineArray(); 16162f86ba45SStephan Aßmus } 16172f86ba45SStephan Aßmus 16182f86ba45SStephan Aßmus 16192f86ba45SStephan Aßmus void 16202f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left, 16212f86ba45SStephan Aßmus const rgb_color& top, const rgb_color& right, const rgb_color& bottom, 16222f86ba45SStephan Aßmus const rgb_color& rightTop, const rgb_color& leftBottom, uint32 borders) 16232f86ba45SStephan Aßmus { 16242f86ba45SStephan Aßmus view->BeginLineArray(6); 16252f86ba45SStephan Aßmus 16262f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 16272f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 16282f86ba45SStephan Aßmus view->AddLine( 16292f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 16302f86ba45SStephan Aßmus BPoint(rect.right - 1, rect.top), top); 16312f86ba45SStephan Aßmus view->AddLine( 16322f86ba45SStephan Aßmus BPoint(rect.right, rect.top), 16332f86ba45SStephan Aßmus BPoint(rect.right, rect.top), rightTop); 16342f86ba45SStephan Aßmus } else { 16352f86ba45SStephan Aßmus view->AddLine( 16362f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 16372f86ba45SStephan Aßmus BPoint(rect.right, rect.top), top); 16382f86ba45SStephan Aßmus } 16392f86ba45SStephan Aßmus rect.top++; 16402f86ba45SStephan Aßmus } 16412f86ba45SStephan Aßmus 16422f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 16432f86ba45SStephan Aßmus view->AddLine( 16442f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 16452f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom - 1), left); 16462f86ba45SStephan Aßmus view->AddLine( 16472f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 16482f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), leftBottom); 16492f86ba45SStephan Aßmus rect.left++; 16502f86ba45SStephan Aßmus } 16512f86ba45SStephan Aßmus 16522f86ba45SStephan Aßmus if (borders & B_BOTTOM_BORDER) { 16532f86ba45SStephan Aßmus view->AddLine( 16542f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 16552f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), bottom); 16562f86ba45SStephan Aßmus rect.bottom--; 16572f86ba45SStephan Aßmus } 16582f86ba45SStephan Aßmus 16592f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 16602f86ba45SStephan Aßmus view->AddLine( 16612f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), 16622f86ba45SStephan Aßmus BPoint(rect.right, rect.top), right); 16632f86ba45SStephan Aßmus rect.right--; 16642f86ba45SStephan Aßmus } 16652f86ba45SStephan Aßmus 16662f86ba45SStephan Aßmus view->EndLineArray(); 16672f86ba45SStephan Aßmus } 16682f86ba45SStephan Aßmus 16692f86ba45SStephan Aßmus 16702f86ba45SStephan Aßmus //void 16712f86ba45SStephan Aßmus //BControlLook::_DrawShadowFrame(BView* view, BRect& rect, const rgb_color& base, 16722f86ba45SStephan Aßmus // uint32 borders) 16732f86ba45SStephan Aßmus //{ 16742f86ba45SStephan Aßmus // view->BeginLineArray(4); 16752f86ba45SStephan Aßmus // 16762f86ba45SStephan Aßmus // bevelColor1 = tint_color(base, 1.2); 16772f86ba45SStephan Aßmus // bevelColor2 = tint_color(base, 1.1); 16782f86ba45SStephan Aßmus // 16792f86ba45SStephan Aßmus // // shadow along left/top borders 16802f86ba45SStephan Aßmus // if (rect.Height() > 0 && borders & B_LEFT_BORDER) { 16812f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 16822f86ba45SStephan Aßmus // BPoint(rect.left, rect.bottom), bevelColor1); 16832f86ba45SStephan Aßmus // rect.left++; 16842f86ba45SStephan Aßmus // } 16852f86ba45SStephan Aßmus // if (rect.Width() > 0 && borders & B_TOP_BORDER) { 16862f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 16872f86ba45SStephan Aßmus // BPoint(rect.right, rect.top), bevelColor1); 16882f86ba45SStephan Aßmus // rect.top++; 16892f86ba45SStephan Aßmus // } 16902f86ba45SStephan Aßmus // 16912f86ba45SStephan Aßmus // // softer shadow along left/top borders 16922f86ba45SStephan Aßmus // if (rect.Height() > 0 && borders & B_LEFT_BORDER) { 16932f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 16942f86ba45SStephan Aßmus // BPoint(rect.left, rect.bottom), bevelColor2); 16952f86ba45SStephan Aßmus // rect.left++; 16962f86ba45SStephan Aßmus // } 16972f86ba45SStephan Aßmus // if (rect.Width() > 0 && borders & B_TOP_BORDER) { 16982f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 16992f86ba45SStephan Aßmus // BPoint(rect.right, rect.top), bevelColor2); 17002f86ba45SStephan Aßmus // rect.top++; 17012f86ba45SStephan Aßmus // } 17022f86ba45SStephan Aßmus // 17032f86ba45SStephan Aßmus // view->EndLineArray(); 17042f86ba45SStephan Aßmus //} 17052f86ba45SStephan Aßmus 17062f86ba45SStephan Aßmus 17072f86ba45SStephan Aßmus void 17082f86ba45SStephan Aßmus BControlLook::_FillGradient(BView* view, const BRect& rect, 17092f86ba45SStephan Aßmus const rgb_color& base, float topTint, float bottomTint, 17102f86ba45SStephan Aßmus enum orientation orientation) 17112f86ba45SStephan Aßmus { 17122f86ba45SStephan Aßmus BGradientLinear gradient; 17132f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint, orientation); 17142f86ba45SStephan Aßmus view->FillRect(rect, gradient); 17152f86ba45SStephan Aßmus } 17162f86ba45SStephan Aßmus 17172f86ba45SStephan Aßmus 17182f86ba45SStephan Aßmus void 17192f86ba45SStephan Aßmus BControlLook::_FillGlossyGradient(BView* view, const BRect& rect, 17202f86ba45SStephan Aßmus const rgb_color& base, float topTint, float middle1Tint, 17212f86ba45SStephan Aßmus float middle2Tint, float bottomTint, enum orientation orientation) 17222f86ba45SStephan Aßmus { 17232f86ba45SStephan Aßmus BGradientLinear gradient; 17242f86ba45SStephan Aßmus _MakeGlossyGradient(gradient, rect, base, topTint, middle1Tint, 17252f86ba45SStephan Aßmus middle2Tint, bottomTint, orientation); 17262f86ba45SStephan Aßmus view->FillRect(rect, gradient); 17272f86ba45SStephan Aßmus } 17282f86ba45SStephan Aßmus 17292f86ba45SStephan Aßmus 17302f86ba45SStephan Aßmus void 17312f86ba45SStephan Aßmus BControlLook::_MakeGradient(BGradientLinear& gradient, const BRect& rect, 17322f86ba45SStephan Aßmus const rgb_color& base, float topTint, float bottomTint, 17332f86ba45SStephan Aßmus enum orientation orientation) const 17342f86ba45SStephan Aßmus { 17352f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, topTint), 0); 17362f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, bottomTint), 255); 17372f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 17382f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 17392f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 17402f86ba45SStephan Aßmus else 17412f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 17422f86ba45SStephan Aßmus } 17432f86ba45SStephan Aßmus 17442f86ba45SStephan Aßmus 17452f86ba45SStephan Aßmus void 17462f86ba45SStephan Aßmus BControlLook::_MakeGlossyGradient(BGradientLinear& gradient, const BRect& rect, 17472f86ba45SStephan Aßmus const rgb_color& base, float topTint, float middle1Tint, 17482f86ba45SStephan Aßmus float middle2Tint, float bottomTint, 17492f86ba45SStephan Aßmus enum orientation orientation) const 17502f86ba45SStephan Aßmus { 17512f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, topTint), 0); 17522f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, middle1Tint), 132); 17532f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, middle2Tint), 136); 17542f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, bottomTint), 255); 17552f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 17562f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 17572f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 17582f86ba45SStephan Aßmus else 17592f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 17602f86ba45SStephan Aßmus } 17612f86ba45SStephan Aßmus 17622f86ba45SStephan Aßmus 17632f86ba45SStephan Aßmus bool 17642f86ba45SStephan Aßmus BControlLook::_RadioButtonAndCheckBoxMarkColor(const rgb_color& base, 17652f86ba45SStephan Aßmus rgb_color& color, uint32 flags) const 17662f86ba45SStephan Aßmus { 17672f86ba45SStephan Aßmus if ((flags & (B_ACTIVATED | B_CLICKED)) == 0) { 17682f86ba45SStephan Aßmus // no mark to be drawn at all 17692f86ba45SStephan Aßmus return false; 17702f86ba45SStephan Aßmus } 17712f86ba45SStephan Aßmus 17722f86ba45SStephan Aßmus // TODO: Get from UI settings 17732f86ba45SStephan Aßmus color.red = 27; 17742f86ba45SStephan Aßmus color.green = 82; 17752f86ba45SStephan Aßmus color.blue = 140; 17762f86ba45SStephan Aßmus 17772f86ba45SStephan Aßmus float mix = 1.0; 17782f86ba45SStephan Aßmus 17792f86ba45SStephan Aßmus if (flags & B_DISABLED) { 17802f86ba45SStephan Aßmus // activated, but disabled 17812f86ba45SStephan Aßmus mix = 0.4; 17822f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 17832f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 17842f86ba45SStephan Aßmus // loosing activation 17852f86ba45SStephan Aßmus mix = 0.7; 17862f86ba45SStephan Aßmus } else { 17872f86ba45SStephan Aßmus // becoming activated 17882f86ba45SStephan Aßmus mix = 0.3; 17892f86ba45SStephan Aßmus } 17902f86ba45SStephan Aßmus } else { 17912f86ba45SStephan Aßmus // simply activated 17922f86ba45SStephan Aßmus } 17932f86ba45SStephan Aßmus 17942f86ba45SStephan Aßmus color.red = uint8(color.red * mix + base.red * (1.0 - mix)); 17952f86ba45SStephan Aßmus color.green = uint8(color.green * mix + base.green * (1.0 - mix)); 17962f86ba45SStephan Aßmus color.blue = uint8(color.blue * mix + base.blue * (1.0 - mix)); 17972f86ba45SStephan Aßmus 17982f86ba45SStephan Aßmus return true; 17992f86ba45SStephan Aßmus } 18002f86ba45SStephan Aßmus 18012f86ba45SStephan Aßmus 18022f86ba45SStephan Aßmus void 18032f86ba45SStephan Aßmus BControlLook::_DrawRoundBarCorner(BView* view, BRect& rect, 18042f86ba45SStephan Aßmus const BRect& updateRect, 18052f86ba45SStephan Aßmus const rgb_color& edgeLightColor, const rgb_color& edgeShadowColor, 18062f86ba45SStephan Aßmus const rgb_color& frameLightColor, const rgb_color& frameShadowColor, 18072f86ba45SStephan Aßmus const rgb_color& fillLightColor, const rgb_color& fillShadowColor, 18082f86ba45SStephan Aßmus float leftInset, float topInset, float rightInset, float bottomInset, 18092f86ba45SStephan Aßmus enum orientation orientation) 18102f86ba45SStephan Aßmus { 18112f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 18122f86ba45SStephan Aßmus return; 18132f86ba45SStephan Aßmus 18142f86ba45SStephan Aßmus BGradientLinear gradient; 18152f86ba45SStephan Aßmus gradient.AddColor(edgeShadowColor, 0); 18162f86ba45SStephan Aßmus gradient.AddColor(edgeLightColor, 255); 18172f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 18182f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 18192f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 18202f86ba45SStephan Aßmus else 18212f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 18222f86ba45SStephan Aßmus 18232f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 18242f86ba45SStephan Aßmus 18252f86ba45SStephan Aßmus rect.left += leftInset; 18262f86ba45SStephan Aßmus rect.top += topInset; 18272f86ba45SStephan Aßmus rect.right += rightInset; 18282f86ba45SStephan Aßmus rect.bottom += bottomInset; 18292f86ba45SStephan Aßmus 18302f86ba45SStephan Aßmus gradient.MakeEmpty(); 18312f86ba45SStephan Aßmus gradient.AddColor(frameShadowColor, 0); 18322f86ba45SStephan Aßmus gradient.AddColor(frameLightColor, 255); 18332f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 18342f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 18352f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 18362f86ba45SStephan Aßmus else 18372f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 18382f86ba45SStephan Aßmus 18392f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 18402f86ba45SStephan Aßmus 18412f86ba45SStephan Aßmus rect.left += leftInset; 18422f86ba45SStephan Aßmus rect.top += topInset; 18432f86ba45SStephan Aßmus rect.right += rightInset; 18442f86ba45SStephan Aßmus rect.bottom += bottomInset; 18452f86ba45SStephan Aßmus 18462f86ba45SStephan Aßmus gradient.MakeEmpty(); 18472f86ba45SStephan Aßmus gradient.AddColor(fillShadowColor, 0); 18482f86ba45SStephan Aßmus gradient.AddColor(fillLightColor, 255); 18492f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 18502f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 18512f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 18522f86ba45SStephan Aßmus else 18532f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 18542f86ba45SStephan Aßmus 18552f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 18562f86ba45SStephan Aßmus } 18572f86ba45SStephan Aßmus 18582f86ba45SStephan Aßmus 18592f86ba45SStephan Aßmus void 18602f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerLeftTop(BView* view, BRect& rect, 18612f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& edgeColor, 18622f86ba45SStephan Aßmus const rgb_color& frameColor, const rgb_color& bevelColor, 18632f86ba45SStephan Aßmus const BGradientLinear& fillGradient) 18642f86ba45SStephan Aßmus { 18652f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 18662f86ba45SStephan Aßmus return; 18672f86ba45SStephan Aßmus 18682f86ba45SStephan Aßmus BRegion clipping(rect); 18692f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 18702f86ba45SStephan Aßmus 18712f86ba45SStephan Aßmus // background 18722f86ba45SStephan Aßmus view->SetHighColor(base); 18732f86ba45SStephan Aßmus view->FillRect(rect); 18742f86ba45SStephan Aßmus 18752f86ba45SStephan Aßmus // outer edge 18762f86ba45SStephan Aßmus BRect ellipseRect(rect); 18772f86ba45SStephan Aßmus ellipseRect.right = ellipseRect.left + ellipseRect.Width() * 2; 18782f86ba45SStephan Aßmus ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2; 18792f86ba45SStephan Aßmus 18802f86ba45SStephan Aßmus view->SetHighColor(edgeColor); 18812f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 18822f86ba45SStephan Aßmus 18832f86ba45SStephan Aßmus // frame 18842f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 18852f86ba45SStephan Aßmus view->SetHighColor(frameColor); 18862f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 18872f86ba45SStephan Aßmus 18882f86ba45SStephan Aßmus // bevel 18892f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 18902f86ba45SStephan Aßmus view->SetHighColor(bevelColor); 18912f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 18922f86ba45SStephan Aßmus 18932f86ba45SStephan Aßmus // fill 18942f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 18952f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, fillGradient); 18962f86ba45SStephan Aßmus 18972f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 18982f86ba45SStephan Aßmus } 18992f86ba45SStephan Aßmus 19002f86ba45SStephan Aßmus void 19012f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerRightTop(BView* view, BRect& rect, 19022f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, 19032f86ba45SStephan Aßmus const rgb_color& edgeTopColor, const rgb_color& edgeRightColor, 19042f86ba45SStephan Aßmus const rgb_color& frameTopColor, const rgb_color& frameRightColor, 19052f86ba45SStephan Aßmus const rgb_color& bevelTopColor, const rgb_color& bevelRightColor, 19062f86ba45SStephan Aßmus const BGradientLinear& fillGradient) 19072f86ba45SStephan Aßmus { 19082f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 19092f86ba45SStephan Aßmus return; 19102f86ba45SStephan Aßmus 19112f86ba45SStephan Aßmus BRegion clipping(rect); 19122f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 19132f86ba45SStephan Aßmus 19142f86ba45SStephan Aßmus // background 19152f86ba45SStephan Aßmus view->SetHighColor(base); 19162f86ba45SStephan Aßmus view->FillRect(rect); 19172f86ba45SStephan Aßmus 19182f86ba45SStephan Aßmus // outer edge 19192f86ba45SStephan Aßmus BRect ellipseRect(rect); 19202f86ba45SStephan Aßmus ellipseRect.left = ellipseRect.right - ellipseRect.Width() * 2; 19212f86ba45SStephan Aßmus ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2; 19222f86ba45SStephan Aßmus 19232f86ba45SStephan Aßmus BGradientLinear gradient; 19242f86ba45SStephan Aßmus gradient.AddColor(edgeTopColor, 0); 19252f86ba45SStephan Aßmus gradient.AddColor(edgeRightColor, 255); 19262f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 19272f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 19282f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 19292f86ba45SStephan Aßmus 19302f86ba45SStephan Aßmus // frame 19312f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 19322f86ba45SStephan Aßmus rect.right--; 19332f86ba45SStephan Aßmus rect.top++; 19342f86ba45SStephan Aßmus if (frameTopColor == frameRightColor) { 19352f86ba45SStephan Aßmus view->SetHighColor(frameTopColor); 19362f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 19372f86ba45SStephan Aßmus } else { 19382f86ba45SStephan Aßmus gradient.SetColor(0, frameTopColor); 19392f86ba45SStephan Aßmus gradient.SetColor(1, frameRightColor); 19402f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 19412f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 19422f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 19432f86ba45SStephan Aßmus } 19442f86ba45SStephan Aßmus 19452f86ba45SStephan Aßmus // bevel 19462f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 19472f86ba45SStephan Aßmus rect.right--; 19482f86ba45SStephan Aßmus rect.top++; 19492f86ba45SStephan Aßmus gradient.SetColor(0, bevelTopColor); 19502f86ba45SStephan Aßmus gradient.SetColor(1, bevelRightColor); 19512f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 19522f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 19532f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 19542f86ba45SStephan Aßmus 19552f86ba45SStephan Aßmus // fill 19562f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 19572f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, fillGradient); 19582f86ba45SStephan Aßmus 19592f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 19602f86ba45SStephan Aßmus } 19612f86ba45SStephan Aßmus 19622f86ba45SStephan Aßmus 19632f86ba45SStephan Aßmus // NOTE: May come from a add-on in the future. Initialized in 19642f86ba45SStephan Aßmus // InterfaceDefs.cpp 19652f86ba45SStephan Aßmus BControlLook* be_control_look = NULL; 19662f86ba45SStephan Aßmus 19672f86ba45SStephan Aßmus } // namespace BPrivate 1968