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, 69681c2e44SStephan Aßmus const rgb_color& base, const rgb_color& background, uint32 flags, 70681c2e44SStephan Aßmus uint32 borders) 712f86ba45SStephan Aßmus { 72681c2e44SStephan Aßmus _DrawButtonFrame(view, rect, updateRect, base, background, 1.0, 1.0, flags, 73681c2e44SStephan Aßmus borders); 742f86ba45SStephan Aßmus } 752f86ba45SStephan Aßmus 762f86ba45SStephan Aßmus 772f86ba45SStephan Aßmus void 782f86ba45SStephan Aßmus BControlLook::DrawButtonBackground(BView* view, BRect& rect, 792f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 802f86ba45SStephan Aßmus uint32 borders, enum orientation orientation) 812f86ba45SStephan Aßmus { 822f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 832f86ba45SStephan Aßmus return; 842f86ba45SStephan Aßmus 852f86ba45SStephan Aßmus // the surface edges 862f86ba45SStephan Aßmus 872f86ba45SStephan Aßmus // colors 882f86ba45SStephan Aßmus rgb_color buttonBgColor = tint_color(base, B_LIGHTEN_1_TINT); 892f86ba45SStephan Aßmus rgb_color maxLightColor; 902f86ba45SStephan Aßmus 912f86ba45SStephan Aßmus rgb_color bevelColor1; 922f86ba45SStephan Aßmus rgb_color bevelColor2; 932f86ba45SStephan Aßmus 942f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0) { 952f86ba45SStephan Aßmus maxLightColor = tint_color(base, 0.2); 962f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 1.08); 972f86ba45SStephan Aßmus bevelColor2 = base; 982f86ba45SStephan Aßmus } else { 992f86ba45SStephan Aßmus maxLightColor = tint_color(base, 0.7); 1002f86ba45SStephan Aßmus bevelColor1 = base; 1012f86ba45SStephan Aßmus bevelColor2 = buttonBgColor; 1022f86ba45SStephan Aßmus buttonBgColor = maxLightColor; 1032f86ba45SStephan Aßmus } 1042f86ba45SStephan Aßmus 1052f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 1062f86ba45SStephan Aßmus view->BeginLineArray(4); 1072f86ba45SStephan Aßmus 1082f86ba45SStephan Aßmus bevelColor1 = tint_color(bevelColor1, B_DARKEN_1_TINT); 1092f86ba45SStephan Aßmus bevelColor2 = tint_color(bevelColor2, B_DARKEN_1_TINT); 1102f86ba45SStephan Aßmus 1112f86ba45SStephan Aßmus // shadow along left/top borders 1122f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 1132f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1142f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), bevelColor1); 1152f86ba45SStephan Aßmus rect.left++; 1162f86ba45SStephan Aßmus } 1172f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 1182f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1192f86ba45SStephan Aßmus BPoint(rect.right, rect.top), bevelColor1); 1202f86ba45SStephan Aßmus rect.top++; 1212f86ba45SStephan Aßmus } 1222f86ba45SStephan Aßmus 1232f86ba45SStephan Aßmus // softer shadow along left/top borders 1242f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 1252f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1262f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), bevelColor2); 1272f86ba45SStephan Aßmus rect.left++; 1282f86ba45SStephan Aßmus } 1292f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 1302f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1312f86ba45SStephan Aßmus BPoint(rect.right, rect.top), bevelColor2); 1322f86ba45SStephan Aßmus rect.top++; 1332f86ba45SStephan Aßmus } 1342f86ba45SStephan Aßmus 1352f86ba45SStephan Aßmus view->EndLineArray(); 1362f86ba45SStephan Aßmus } else { 1372f86ba45SStephan Aßmus _DrawFrame(view, rect, 1382f86ba45SStephan Aßmus maxLightColor, maxLightColor, 1392f86ba45SStephan Aßmus bevelColor1, bevelColor1, 1402f86ba45SStephan Aßmus buttonBgColor, buttonBgColor, borders); 1412f86ba45SStephan Aßmus } 1422f86ba45SStephan Aßmus 1432f86ba45SStephan Aßmus // the actual surface top 1442f86ba45SStephan Aßmus 1452f86ba45SStephan Aßmus float topTint = 0.49; 1462f86ba45SStephan Aßmus float middleTint1 = 0.62; 1472f86ba45SStephan Aßmus float middleTint2 = 0.76; 1482f86ba45SStephan Aßmus float bottomTint = 0.90; 1492f86ba45SStephan Aßmus 1502f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 1512f86ba45SStephan Aßmus topTint = 1.11; 1522f86ba45SStephan Aßmus bottomTint = 1.08; 1532f86ba45SStephan Aßmus } 1542f86ba45SStephan Aßmus 1552f86ba45SStephan Aßmus if (flags & B_DISABLED) { 1562f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 1572f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 1582f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 1592f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 1602f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 1612f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 1622f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 1632f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 1642f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 1652f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 1662f86ba45SStephan Aßmus } 1672f86ba45SStephan Aßmus 1682f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 1692f86ba45SStephan Aßmus _FillGradient(view, rect, base, topTint, bottomTint, orientation); 1702f86ba45SStephan Aßmus } else { 1712f86ba45SStephan Aßmus _FillGlossyGradient(view, rect, base, topTint, middleTint1, 1722f86ba45SStephan Aßmus middleTint2, bottomTint, orientation); 1732f86ba45SStephan Aßmus } 1742f86ba45SStephan Aßmus } 1752f86ba45SStephan Aßmus 1762f86ba45SStephan Aßmus 1772f86ba45SStephan Aßmus void 1782f86ba45SStephan Aßmus BControlLook::DrawMenuBarBackground(BView* view, BRect& rect, 1791a72cb41SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 1801a72cb41SStephan Aßmus uint32 borders) 1812f86ba45SStephan Aßmus { 1822f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 1832f86ba45SStephan Aßmus return; 1842f86ba45SStephan Aßmus 1852f86ba45SStephan Aßmus // the surface edges 1862f86ba45SStephan Aßmus 1872f86ba45SStephan Aßmus // colors 1881a72cb41SStephan Aßmus float topTint; 1891a72cb41SStephan Aßmus float bottomTint; 1901a72cb41SStephan Aßmus 1911a72cb41SStephan Aßmus if (flags & B_ACTIVATED) { 1921a72cb41SStephan Aßmus rgb_color bevelColor1 = tint_color(base, 1.40); 1931a72cb41SStephan Aßmus rgb_color bevelColor2 = tint_color(base, 1.25); 1941a72cb41SStephan Aßmus 1951a72cb41SStephan Aßmus topTint = 1.25; 1961a72cb41SStephan Aßmus bottomTint = 1.20; 1972f86ba45SStephan Aßmus 1982f86ba45SStephan Aßmus _DrawFrame(view, rect, 1991a72cb41SStephan Aßmus bevelColor1, bevelColor1, 2001a72cb41SStephan Aßmus bevelColor2, bevelColor2, 2011a72cb41SStephan Aßmus borders & B_TOP_BORDER); 2021a72cb41SStephan Aßmus } else { 2031a72cb41SStephan Aßmus rgb_color cornerColor = tint_color(base, 0.9); 2041a72cb41SStephan Aßmus rgb_color bevelColorTop = tint_color(base, 0.5); 2051a72cb41SStephan Aßmus rgb_color bevelColorLeft = tint_color(base, 0.7); 2061a72cb41SStephan Aßmus rgb_color bevelColorRightBottom = tint_color(base, 1.08); 2071a72cb41SStephan Aßmus 2081a72cb41SStephan Aßmus topTint = 0.69; 2091a72cb41SStephan Aßmus bottomTint = 1.03; 2101a72cb41SStephan Aßmus 2111a72cb41SStephan Aßmus _DrawFrame(view, rect, 2121a72cb41SStephan Aßmus bevelColorLeft, bevelColorTop, 2131a72cb41SStephan Aßmus bevelColorRightBottom, bevelColorRightBottom, 2142f86ba45SStephan Aßmus cornerColor, cornerColor, 2152f86ba45SStephan Aßmus borders); 2161a72cb41SStephan Aßmus } 2172f86ba45SStephan Aßmus 2182f86ba45SStephan Aßmus // the actual surface top 2192f86ba45SStephan Aßmus 2202f86ba45SStephan Aßmus _FillGradient(view, rect, base, topTint, bottomTint); 2212f86ba45SStephan Aßmus } 2222f86ba45SStephan Aßmus 2232f86ba45SStephan Aßmus 2242f86ba45SStephan Aßmus void 225681c2e44SStephan Aßmus BControlLook::DrawMenuFieldFrame(BView* view, BRect& rect, 226681c2e44SStephan Aßmus const BRect& updateRect, const rgb_color& base, 227681c2e44SStephan Aßmus const rgb_color& background, uint32 flags, uint32 borders) 22813cd46dfSStephan Aßmus { 229681c2e44SStephan Aßmus _DrawButtonFrame(view, rect, updateRect, base, background, 0.6, 1.0, flags, 230681c2e44SStephan Aßmus borders); 23113cd46dfSStephan Aßmus } 23213cd46dfSStephan Aßmus 23313cd46dfSStephan Aßmus 23413cd46dfSStephan Aßmus void 2352f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect, 2362f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, bool popupIndicator, 2372f86ba45SStephan Aßmus uint32 flags) 2382f86ba45SStephan Aßmus { 2392f86ba45SStephan Aßmus if (popupIndicator) { 2402f86ba45SStephan Aßmus BRect leftRect(rect); 2412f86ba45SStephan Aßmus leftRect.right -= 10; 2422f86ba45SStephan Aßmus 2432f86ba45SStephan Aßmus BRect rightRect(rect); 2442f86ba45SStephan Aßmus rightRect.left = rightRect.right - 9; 2452f86ba45SStephan Aßmus 2462f86ba45SStephan Aßmus DrawMenuFieldBackground(view, leftRect, updateRect, base, flags, 2472f86ba45SStephan Aßmus B_LEFT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER); 2482f86ba45SStephan Aßmus 2492f86ba45SStephan Aßmus rgb_color indicatorBase; 2502f86ba45SStephan Aßmus rgb_color markColor; 2512f86ba45SStephan Aßmus if (flags & B_DISABLED) { 2522f86ba45SStephan Aßmus indicatorBase = tint_color(base, 1.05); 25313cd46dfSStephan Aßmus markColor = tint_color(base, 1.35); 2542f86ba45SStephan Aßmus } else { 25513cd46dfSStephan Aßmus indicatorBase = tint_color(base, 1.12); 25613cd46dfSStephan Aßmus markColor = tint_color(base, 1.65); 2572f86ba45SStephan Aßmus } 2582f86ba45SStephan Aßmus 2592f86ba45SStephan Aßmus DrawMenuFieldBackground(view, rightRect, updateRect, indicatorBase, 2602f86ba45SStephan Aßmus flags, B_RIGHT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER); 2612f86ba45SStephan Aßmus 2622f86ba45SStephan Aßmus // popup marker 2632f86ba45SStephan Aßmus BPoint center(roundf((rightRect.left + rightRect.right) / 2.0), 2642f86ba45SStephan Aßmus roundf((rightRect.top + rightRect.bottom) / 2.0)); 2652f86ba45SStephan Aßmus BPoint triangle[3]; 2662f86ba45SStephan Aßmus triangle[0] = center + BPoint(-2.5, -0.5); 2672f86ba45SStephan Aßmus triangle[1] = center + BPoint(2.5, -0.5); 2682f86ba45SStephan Aßmus triangle[2] = center + BPoint(0.0, 2.0); 2692f86ba45SStephan Aßmus 2702f86ba45SStephan Aßmus uint32 viewFlags = view->Flags(); 2712f86ba45SStephan Aßmus view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE); 2722f86ba45SStephan Aßmus 2732f86ba45SStephan Aßmus view->SetHighColor(markColor); 2742f86ba45SStephan Aßmus view->FillTriangle(triangle[0], triangle[1], triangle[2]); 2752f86ba45SStephan Aßmus 2762f86ba45SStephan Aßmus view->SetFlags(viewFlags); 2772f86ba45SStephan Aßmus 2782f86ba45SStephan Aßmus rect = leftRect; 2792f86ba45SStephan Aßmus } else { 2802f86ba45SStephan Aßmus DrawMenuFieldBackground(view, rect, updateRect, base, flags); 2812f86ba45SStephan Aßmus } 2822f86ba45SStephan Aßmus } 2832f86ba45SStephan Aßmus 2842f86ba45SStephan Aßmus void 2852f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect, 2862f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 2872f86ba45SStephan Aßmus uint32 borders) 2882f86ba45SStephan Aßmus { 2892f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 2902f86ba45SStephan Aßmus return; 2912f86ba45SStephan Aßmus 2922f86ba45SStephan Aßmus // the surface edges 2932f86ba45SStephan Aßmus 2942f86ba45SStephan Aßmus // colors 2952f86ba45SStephan Aßmus rgb_color cornerColor = tint_color(base, 0.85); 2962f86ba45SStephan Aßmus rgb_color bevelColor1 = tint_color(base, 0.3); 2972f86ba45SStephan Aßmus rgb_color bevelColor2 = tint_color(base, 0.5); 2982f86ba45SStephan Aßmus rgb_color bevelColor3 = tint_color(base, 1.03); 2992f86ba45SStephan Aßmus 3002f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3012f86ba45SStephan Aßmus cornerColor = tint_color(base, 0.8); 3022f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 0.7); 3032f86ba45SStephan Aßmus bevelColor2 = tint_color(base, 0.8); 3042f86ba45SStephan Aßmus bevelColor3 = tint_color(base, 1.01); 3052f86ba45SStephan Aßmus } else { 3062f86ba45SStephan Aßmus cornerColor = tint_color(base, 0.85); 3072f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 0.3); 3082f86ba45SStephan Aßmus bevelColor2 = tint_color(base, 0.5); 3092f86ba45SStephan Aßmus bevelColor3 = tint_color(base, 1.03); 3102f86ba45SStephan Aßmus } 3112f86ba45SStephan Aßmus 3122f86ba45SStephan Aßmus _DrawFrame(view, rect, 3132f86ba45SStephan Aßmus bevelColor2, bevelColor1, 3142f86ba45SStephan Aßmus bevelColor3, bevelColor3, 3152f86ba45SStephan Aßmus cornerColor, cornerColor, 3162f86ba45SStephan Aßmus borders); 3172f86ba45SStephan Aßmus 3182f86ba45SStephan Aßmus // the actual surface top 3192f86ba45SStephan Aßmus 3202f86ba45SStephan Aßmus float topTint = 0.49; 3212f86ba45SStephan Aßmus float middleTint1 = 0.62; 3222f86ba45SStephan Aßmus float middleTint2 = 0.76; 3232f86ba45SStephan Aßmus float bottomTint = 0.90; 3242f86ba45SStephan Aßmus 3252f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3262f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 3272f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 3282f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 3292f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 3302f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 3312f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 3322f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 3332f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 3342f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 3352f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 3362f86ba45SStephan Aßmus } 3372f86ba45SStephan Aßmus 3382f86ba45SStephan Aßmus _FillGlossyGradient(view, rect, base, topTint, middleTint1, 3392f86ba45SStephan Aßmus middleTint2, bottomTint); 3402f86ba45SStephan Aßmus } 3412f86ba45SStephan Aßmus 3422f86ba45SStephan Aßmus void 3432f86ba45SStephan Aßmus BControlLook::DrawMenuBackground(BView* view, BRect& rect, 3442f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 3452f86ba45SStephan Aßmus uint32 borders) 3462f86ba45SStephan Aßmus { 3472f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 3482f86ba45SStephan Aßmus return; 3492f86ba45SStephan Aßmus 3502f86ba45SStephan Aßmus // the surface edges 3512f86ba45SStephan Aßmus 3522f86ba45SStephan Aßmus rgb_color bevelLightColor; 3532f86ba45SStephan Aßmus rgb_color bevelShadowColor; 3542f86ba45SStephan Aßmus rgb_color background = tint_color(base, 0.75); 3552f86ba45SStephan Aßmus 3562f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3572f86ba45SStephan Aßmus bevelLightColor = tint_color(background, 0.80); 3582f86ba45SStephan Aßmus bevelShadowColor = tint_color(background, 1.07); 3592f86ba45SStephan Aßmus } else { 3602f86ba45SStephan Aßmus bevelLightColor = tint_color(background, 0.6); 3612f86ba45SStephan Aßmus bevelShadowColor = tint_color(background, 1.12); 3622f86ba45SStephan Aßmus } 3632f86ba45SStephan Aßmus 3642f86ba45SStephan Aßmus _DrawFrame(view, rect, 3652f86ba45SStephan Aßmus bevelLightColor, bevelLightColor, 3662f86ba45SStephan Aßmus bevelShadowColor, bevelShadowColor, 3672f86ba45SStephan Aßmus borders); 3682f86ba45SStephan Aßmus 3692f86ba45SStephan Aßmus // the actual surface top 3702f86ba45SStephan Aßmus 3712f86ba45SStephan Aßmus view->SetHighColor(background); 3722f86ba45SStephan Aßmus view->FillRect(rect); 3732f86ba45SStephan Aßmus } 3742f86ba45SStephan Aßmus 3752f86ba45SStephan Aßmus 3762f86ba45SStephan Aßmus void 3772f86ba45SStephan Aßmus BControlLook::DrawMenuItemBackground(BView* view, BRect& rect, 3782f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 3792f86ba45SStephan Aßmus uint32 borders) 3802f86ba45SStephan Aßmus { 3812f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 3822f86ba45SStephan Aßmus return; 3832f86ba45SStephan Aßmus 3842f86ba45SStephan Aßmus // the surface edges 3852f86ba45SStephan Aßmus 3862f86ba45SStephan Aßmus float topTint; 3872f86ba45SStephan Aßmus float bottomTint; 3882f86ba45SStephan Aßmus rgb_color selectedColor = base; 3892f86ba45SStephan Aßmus 3902f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 3912f86ba45SStephan Aßmus topTint = 0.9; 3922f86ba45SStephan Aßmus bottomTint = 1.05; 3932f86ba45SStephan Aßmus selectedColor = tint_color(base, 1.26); 3942f86ba45SStephan Aßmus } else if (flags & B_DISABLED) { 3952f86ba45SStephan Aßmus topTint = 0.80; 3962f86ba45SStephan Aßmus bottomTint = 1.07; 3972f86ba45SStephan Aßmus } else { 3982f86ba45SStephan Aßmus topTint = 0.6; 3992f86ba45SStephan Aßmus bottomTint = 1.12; 4002f86ba45SStephan Aßmus } 4012f86ba45SStephan Aßmus 4022f86ba45SStephan Aßmus rgb_color bevelLightColor = tint_color(selectedColor, topTint); 4032f86ba45SStephan Aßmus rgb_color bevelShadowColor = tint_color(selectedColor, bottomTint); 4042f86ba45SStephan Aßmus 4052f86ba45SStephan Aßmus _DrawFrame(view, rect, 4062f86ba45SStephan Aßmus bevelLightColor, bevelLightColor, 4072f86ba45SStephan Aßmus bevelShadowColor, bevelShadowColor, 4082f86ba45SStephan Aßmus borders); 4092f86ba45SStephan Aßmus 4102f86ba45SStephan Aßmus // the actual surface top 4112f86ba45SStephan Aßmus 4122f86ba45SStephan Aßmus view->SetLowColor(selectedColor); 4132f86ba45SStephan Aßmus // _FillGradient(view, rect, selectedColor, topTint, bottomTint); 4142f86ba45SStephan Aßmus _FillGradient(view, rect, selectedColor, bottomTint, topTint); 4152f86ba45SStephan Aßmus } 4162f86ba45SStephan Aßmus 4172f86ba45SStephan Aßmus 4182f86ba45SStephan Aßmus void 4192f86ba45SStephan Aßmus BControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect, 4202f86ba45SStephan Aßmus const rgb_color& base, const rgb_color& barColor, float progressPosition) 4212f86ba45SStephan Aßmus { 4222f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 4232f86ba45SStephan Aßmus return; 4242f86ba45SStephan Aßmus 4252f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6); 4262f86ba45SStephan Aßmus 4272f86ba45SStephan Aßmus // colors 4282f86ba45SStephan Aßmus rgb_color dark1BorderColor = tint_color(base, 1.3); 4292f86ba45SStephan Aßmus rgb_color dark2BorderColor = tint_color(base, 1.2); 4302f86ba45SStephan Aßmus rgb_color dark1FilledBorderColor = tint_color(barColor, 1.20); 4312f86ba45SStephan Aßmus rgb_color dark2FilledBorderColor = tint_color(barColor, 1.45); 4322f86ba45SStephan Aßmus 4332f86ba45SStephan Aßmus BRect filledRect(rect); 4342f86ba45SStephan Aßmus filledRect.right = progressPosition - 1; 4352f86ba45SStephan Aßmus 4362f86ba45SStephan Aßmus BRect nonfilledRect(rect); 4372f86ba45SStephan Aßmus nonfilledRect.left = progressPosition; 4382f86ba45SStephan Aßmus 4392f86ba45SStephan Aßmus bool filledSurface = filledRect.Width() > 0; 4402f86ba45SStephan Aßmus bool nonfilledSurface = nonfilledRect.Width() > 0; 4412f86ba45SStephan Aßmus 4422f86ba45SStephan Aßmus if (filledSurface) { 4432f86ba45SStephan Aßmus _DrawFrame(view, filledRect, 4442f86ba45SStephan Aßmus dark1FilledBorderColor, dark1FilledBorderColor, 4452f86ba45SStephan Aßmus dark2FilledBorderColor, dark2FilledBorderColor); 4462f86ba45SStephan Aßmus 4472f86ba45SStephan Aßmus _FillGlossyGradient(view, filledRect, barColor, 0.55, 0.68, 0.76, 0.90); 4482f86ba45SStephan Aßmus } 4492f86ba45SStephan Aßmus 4502f86ba45SStephan Aßmus if (nonfilledSurface) { 4512f86ba45SStephan Aßmus _DrawFrame(view, nonfilledRect, dark1BorderColor, dark1BorderColor, 4522f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, 4532f86ba45SStephan Aßmus B_TOP_BORDER | B_BOTTOM_BORDER | B_RIGHT_BORDER); 4542f86ba45SStephan Aßmus 4552f86ba45SStephan Aßmus if (nonfilledRect.left < nonfilledRect.right) { 4562f86ba45SStephan Aßmus // shadow from fill bar, or left border 4572f86ba45SStephan Aßmus rgb_color leftBorder = dark1BorderColor; 4582f86ba45SStephan Aßmus if (filledSurface) 4592f86ba45SStephan Aßmus leftBorder = tint_color(base, 0.50); 4602f86ba45SStephan Aßmus view->SetHighColor(leftBorder); 4612f86ba45SStephan Aßmus view->StrokeLine(nonfilledRect.LeftTop(), 4622f86ba45SStephan Aßmus nonfilledRect.LeftBottom()); 4632f86ba45SStephan Aßmus nonfilledRect.left++; 4642f86ba45SStephan Aßmus } 4652f86ba45SStephan Aßmus 4662f86ba45SStephan Aßmus _FillGradient(view, nonfilledRect, base, 0.25, 0.06); 4672f86ba45SStephan Aßmus } 4682f86ba45SStephan Aßmus } 4692f86ba45SStephan Aßmus 4702f86ba45SStephan Aßmus 4712f86ba45SStephan Aßmus void 4722f86ba45SStephan Aßmus BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect, 4732f86ba45SStephan Aßmus const rgb_color& base, uint32 flags) 4742f86ba45SStephan Aßmus { 4752f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 4762f86ba45SStephan Aßmus return; 4772f86ba45SStephan Aßmus 4782f86ba45SStephan Aßmus rgb_color dark1BorderColor; 4792f86ba45SStephan Aßmus rgb_color dark2BorderColor; 4802f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 4812f86ba45SStephan Aßmus 4822f86ba45SStephan Aßmus if (flags & B_DISABLED) { 4834f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags); 4842f86ba45SStephan Aßmus 4852f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.15); 4862f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.15); 4872f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 4882f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.50); 4892f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.48); 4902f86ba45SStephan Aßmus 4912f86ba45SStephan Aßmus _DrawFrame(view, rect, 4922f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 4932f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 4942f86ba45SStephan Aßmus 4952f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 4962f86ba45SStephan Aßmus } else { 4974f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags); 4982f86ba45SStephan Aßmus 4992f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.40); 5002f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.38); 5012f86ba45SStephan Aßmus } 5022f86ba45SStephan Aßmus 5032f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 5042f86ba45SStephan Aßmus dark1BorderColor = navigationColor; 5052f86ba45SStephan Aßmus dark2BorderColor = navigationColor; 5062f86ba45SStephan Aßmus } 5072f86ba45SStephan Aßmus 5082f86ba45SStephan Aßmus _DrawFrame(view, rect, 5092f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 5102f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 5112f86ba45SStephan Aßmus 5122f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5132f86ba45SStephan Aßmus _FillGradient(view, rect, base, 0.4, 0.2); 5142f86ba45SStephan Aßmus } else { 5152f86ba45SStephan Aßmus _FillGradient(view, rect, base, 0.15, 0.0); 5162f86ba45SStephan Aßmus } 5172f86ba45SStephan Aßmus 5182f86ba45SStephan Aßmus rgb_color markColor; 5192f86ba45SStephan Aßmus if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) { 5202f86ba45SStephan Aßmus view->SetHighColor(markColor); 5212f86ba45SStephan Aßmus 5222f86ba45SStephan Aßmus rect.InsetBy(2, 2); 5232f86ba45SStephan Aßmus view->SetPenSize(max_c(1.0, ceilf(rect.Width() / 3.5))); 5242f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_OVER); 5252f86ba45SStephan Aßmus 5262f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightBottom()); 5272f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightTop()); 5282f86ba45SStephan Aßmus } 5292f86ba45SStephan Aßmus } 5302f86ba45SStephan Aßmus 5312f86ba45SStephan Aßmus 5322f86ba45SStephan Aßmus void 5332f86ba45SStephan Aßmus BControlLook::DrawRadioButton(BView* view, BRect& rect, const BRect& updateRect, 5342f86ba45SStephan Aßmus const rgb_color& base, uint32 flags) 5352f86ba45SStephan Aßmus { 5362f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 5372f86ba45SStephan Aßmus return; 5382f86ba45SStephan Aßmus 5392f86ba45SStephan Aßmus rgb_color borderColor; 5402f86ba45SStephan Aßmus rgb_color bevelLight; 5412f86ba45SStephan Aßmus rgb_color bevelShadow; 5422f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 5432f86ba45SStephan Aßmus 5442f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5452f86ba45SStephan Aßmus borderColor = tint_color(base, 1.15); 5462f86ba45SStephan Aßmus bevelLight = base; 5472f86ba45SStephan Aßmus bevelShadow = base; 5482f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 5492f86ba45SStephan Aßmus borderColor = tint_color(base, 1.50); 5502f86ba45SStephan Aßmus bevelLight = borderColor; 5512f86ba45SStephan Aßmus bevelShadow = borderColor; 5522f86ba45SStephan Aßmus } else { 5532f86ba45SStephan Aßmus borderColor = tint_color(base, 1.45); 5542f86ba45SStephan Aßmus bevelLight = tint_color(base, 0.55); 5552f86ba45SStephan Aßmus bevelShadow = tint_color(base, 1.11); 5562f86ba45SStephan Aßmus } 5572f86ba45SStephan Aßmus 5582f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 5592f86ba45SStephan Aßmus borderColor = navigationColor; 5602f86ba45SStephan Aßmus } 5612f86ba45SStephan Aßmus 5622f86ba45SStephan Aßmus BGradientLinear bevelGradient; 5632f86ba45SStephan Aßmus bevelGradient.AddColor(bevelShadow, 0); 5642f86ba45SStephan Aßmus bevelGradient.AddColor(bevelLight, 255); 5652f86ba45SStephan Aßmus bevelGradient.SetStart(rect.LeftTop()); 5662f86ba45SStephan Aßmus bevelGradient.SetEnd(rect.RightBottom()); 5672f86ba45SStephan Aßmus 5682f86ba45SStephan Aßmus view->FillEllipse(rect, bevelGradient); 5692f86ba45SStephan Aßmus rect.InsetBy(1, 1); 5702f86ba45SStephan Aßmus 5712f86ba45SStephan Aßmus bevelGradient.MakeEmpty(); 5722f86ba45SStephan Aßmus bevelGradient.AddColor(borderColor, 0); 5732f86ba45SStephan Aßmus bevelGradient.AddColor(tint_color(borderColor, 0.8), 255); 5742f86ba45SStephan Aßmus view->FillEllipse(rect, bevelGradient); 5752f86ba45SStephan Aßmus rect.InsetBy(1, 1); 5762f86ba45SStephan Aßmus 5772f86ba45SStephan Aßmus float topTint; 5782f86ba45SStephan Aßmus float bottomTint; 5792f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5802f86ba45SStephan Aßmus topTint = 0.4; 5812f86ba45SStephan Aßmus bottomTint = 0.2; 5822f86ba45SStephan Aßmus } else { 5832f86ba45SStephan Aßmus topTint = 0.15; 5842f86ba45SStephan Aßmus bottomTint = 0.0; 5852f86ba45SStephan Aßmus } 5862f86ba45SStephan Aßmus 5872f86ba45SStephan Aßmus BGradientLinear gradient; 5882f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint); 5892f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 5902f86ba45SStephan Aßmus 5912f86ba45SStephan Aßmus rgb_color markColor; 5922f86ba45SStephan Aßmus if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) { 5932f86ba45SStephan Aßmus view->SetHighColor(markColor); 5942f86ba45SStephan Aßmus rect.InsetBy(3, 3); 5952f86ba45SStephan Aßmus view->FillEllipse(rect); 5962f86ba45SStephan Aßmus } 5972f86ba45SStephan Aßmus } 5982f86ba45SStephan Aßmus 5992f86ba45SStephan Aßmus 6002f86ba45SStephan Aßmus void 6012f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect1, BRect& rect2, 6022f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 6032f86ba45SStephan Aßmus enum orientation orientation) 6042f86ba45SStephan Aßmus { 6052f86ba45SStephan Aßmus DrawScrollBarBackground(view, rect1, updateRect, base, flags, orientation); 6062f86ba45SStephan Aßmus DrawScrollBarBackground(view, rect2, updateRect, base, flags, orientation); 6072f86ba45SStephan Aßmus } 6082f86ba45SStephan Aßmus 6092f86ba45SStephan Aßmus void 6102f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect, 6112f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 6122f86ba45SStephan Aßmus enum orientation orientation) 6132f86ba45SStephan Aßmus { 6142f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 6152f86ba45SStephan Aßmus return; 6162f86ba45SStephan Aßmus 6172f86ba45SStephan Aßmus float gradient1Tint; 6182f86ba45SStephan Aßmus float gradient2Tint; 6192f86ba45SStephan Aßmus float darkEdge1Tint; 6202f86ba45SStephan Aßmus float darkEdge2Tint; 6212f86ba45SStephan Aßmus float shadowTint; 6222f86ba45SStephan Aßmus 6232f86ba45SStephan Aßmus if (flags & B_DISABLED) { 6242f86ba45SStephan Aßmus gradient1Tint = 0.9; 6252f86ba45SStephan Aßmus gradient2Tint = 0.8; 6262f86ba45SStephan Aßmus darkEdge1Tint = B_DARKEN_2_TINT; 6272f86ba45SStephan Aßmus darkEdge2Tint = B_DARKEN_2_TINT; 6282f86ba45SStephan Aßmus shadowTint = gradient1Tint; 6292f86ba45SStephan Aßmus } else { 6302f86ba45SStephan Aßmus gradient1Tint = 1.10; 6312f86ba45SStephan Aßmus gradient2Tint = 1.05; 6322f86ba45SStephan Aßmus darkEdge1Tint = B_DARKEN_3_TINT; 6332f86ba45SStephan Aßmus darkEdge2Tint = B_DARKEN_2_TINT; 6342f86ba45SStephan Aßmus shadowTint = gradient1Tint; 6352f86ba45SStephan Aßmus } 6362f86ba45SStephan Aßmus 6372f86ba45SStephan Aßmus rgb_color darkEdge1 = tint_color(base, darkEdge1Tint); 6382f86ba45SStephan Aßmus rgb_color darkEdge2 = tint_color(base, darkEdge2Tint); 6392f86ba45SStephan Aßmus rgb_color shadow = tint_color(base, shadowTint); 6402f86ba45SStephan Aßmus 6412f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 6422f86ba45SStephan Aßmus // dark vertical line on left edge 6432f86ba45SStephan Aßmus if (rect.Width() > 0) { 6442f86ba45SStephan Aßmus view->SetHighColor(darkEdge1); 6452f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 6462f86ba45SStephan Aßmus rect.left++; 6472f86ba45SStephan Aßmus } 6482f86ba45SStephan Aßmus // dark vertical line on right edge 6492f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6502f86ba45SStephan Aßmus view->SetHighColor(darkEdge2); 6512f86ba45SStephan Aßmus view->StrokeLine(rect.RightTop(), rect.RightBottom()); 6522f86ba45SStephan Aßmus rect.right--; 6532f86ba45SStephan Aßmus } 6542f86ba45SStephan Aßmus // vertical shadow line after left edge 6552f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6562f86ba45SStephan Aßmus view->SetHighColor(shadow); 6572f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 6582f86ba45SStephan Aßmus rect.left++; 6592f86ba45SStephan Aßmus } 6602f86ba45SStephan Aßmus // fill 6612f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6622f86ba45SStephan Aßmus _FillGradient(view, rect, base, gradient1Tint, gradient2Tint, 6632f86ba45SStephan Aßmus orientation); 6642f86ba45SStephan Aßmus } 6652f86ba45SStephan Aßmus } else { 6662f86ba45SStephan Aßmus // dark vertical line on top edge 6672f86ba45SStephan Aßmus if (rect.Height() > 0) { 6682f86ba45SStephan Aßmus view->SetHighColor(darkEdge1); 6692f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 6702f86ba45SStephan Aßmus rect.top++; 6712f86ba45SStephan Aßmus } 6722f86ba45SStephan Aßmus // dark vertical line on bottom edge 6732f86ba45SStephan Aßmus if (rect.Height() >= 0) { 6742f86ba45SStephan Aßmus view->SetHighColor(darkEdge2); 6752f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); 6762f86ba45SStephan Aßmus rect.bottom--; 6772f86ba45SStephan Aßmus } 6782f86ba45SStephan Aßmus // horizontal shadow line after top edge 6792f86ba45SStephan Aßmus if (rect.Height() >= 0) { 6802f86ba45SStephan Aßmus view->SetHighColor(shadow); 6812f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 6822f86ba45SStephan Aßmus rect.top++; 6832f86ba45SStephan Aßmus } 6842f86ba45SStephan Aßmus // fill 6852f86ba45SStephan Aßmus if (rect.Height() >= 0) { 6862f86ba45SStephan Aßmus _FillGradient(view, rect, base, gradient1Tint, gradient2Tint, 6872f86ba45SStephan Aßmus orientation); 6882f86ba45SStephan Aßmus } 6892f86ba45SStephan Aßmus } 6902f86ba45SStephan Aßmus } 6912f86ba45SStephan Aßmus 6922f86ba45SStephan Aßmus 69340a10e1cSStephan Aßmus void 69474bb70aeSStephan Aßmus BControlLook::DrawScrollViewFrame(BView* view, BRect& rect, 69574bb70aeSStephan Aßmus const BRect& updateRect, BRect verticalScrollBarFrame, 69674bb70aeSStephan Aßmus BRect horizontalScrollBarFrame, const rgb_color& base, 69774bb70aeSStephan Aßmus border_style border, uint32 flags, uint32 _borders) 69874bb70aeSStephan Aßmus { 699ce955579SStephan Aßmus // calculate scroll corner rect before messing with the "rect" 700ce955579SStephan Aßmus BRect scrollCornerFillRect(rect.right, rect.bottom, 701ce955579SStephan Aßmus rect.right, rect.bottom); 702ce955579SStephan Aßmus if (horizontalScrollBarFrame.IsValid()) 703ce955579SStephan Aßmus scrollCornerFillRect.left = horizontalScrollBarFrame.right + 1; 704ce955579SStephan Aßmus if (verticalScrollBarFrame.IsValid()) 705ce955579SStephan Aßmus scrollCornerFillRect.top = verticalScrollBarFrame.bottom + 1; 706ce955579SStephan Aßmus 707c44aa833SStephan Aßmus if (border == B_NO_BORDER) { 708c44aa833SStephan Aßmus if (scrollCornerFillRect.IsValid()) { 709c44aa833SStephan Aßmus view->SetHighColor(base); 710c44aa833SStephan Aßmus view->FillRect(scrollCornerFillRect); 711c44aa833SStephan Aßmus } 712c44aa833SStephan Aßmus return; 713c44aa833SStephan Aßmus } 714c44aa833SStephan Aßmus 715c44aa833SStephan Aßmus bool excludeScrollCorner = border == B_FANCY_BORDER 716c44aa833SStephan Aßmus && horizontalScrollBarFrame.IsValid() 717c44aa833SStephan Aßmus && verticalScrollBarFrame.IsValid(); 718c44aa833SStephan Aßmus 71974bb70aeSStephan Aßmus uint32 borders = _borders; 72074bb70aeSStephan Aßmus if (excludeScrollCorner) { 72174bb70aeSStephan Aßmus rect.bottom = horizontalScrollBarFrame.top; 72274bb70aeSStephan Aßmus rect.right = verticalScrollBarFrame.left; 72374bb70aeSStephan Aßmus borders &= ~(B_RIGHT_BORDER | B_BOTTOM_BORDER); 72474bb70aeSStephan Aßmus } 72574bb70aeSStephan Aßmus 72674bb70aeSStephan Aßmus rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT); 72774bb70aeSStephan Aßmus 72874bb70aeSStephan Aßmus if (border == B_FANCY_BORDER) 7294f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders); 73074bb70aeSStephan Aßmus 73174bb70aeSStephan Aßmus if (flags & B_FOCUSED) { 73274bb70aeSStephan Aßmus rgb_color focusColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 73374bb70aeSStephan Aßmus _DrawFrame(view, rect, focusColor, focusColor, focusColor, focusColor, 73474bb70aeSStephan Aßmus borders); 73574bb70aeSStephan Aßmus } else { 73674bb70aeSStephan Aßmus _DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor, 73774bb70aeSStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, borders); 73874bb70aeSStephan Aßmus } 73974bb70aeSStephan Aßmus 74074bb70aeSStephan Aßmus if (excludeScrollCorner) { 74174bb70aeSStephan Aßmus horizontalScrollBarFrame.InsetBy(-1, -1); 74274bb70aeSStephan Aßmus // do not overdraw the top edge 74374bb70aeSStephan Aßmus horizontalScrollBarFrame.top += 2; 74474bb70aeSStephan Aßmus borders = _borders; 74574bb70aeSStephan Aßmus borders &= ~B_TOP_BORDER; 74674bb70aeSStephan Aßmus _DrawOuterResessedFrame(view, horizontalScrollBarFrame, base, 7474f579098SStephan Aßmus 1.0, 1.0, flags, borders); 74874bb70aeSStephan Aßmus _DrawFrame(view, horizontalScrollBarFrame, scrollbarFrameColor, 74974bb70aeSStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, 75074bb70aeSStephan Aßmus borders); 75174bb70aeSStephan Aßmus 75274bb70aeSStephan Aßmus 75374bb70aeSStephan Aßmus verticalScrollBarFrame.InsetBy(-1, -1); 75474bb70aeSStephan Aßmus // do not overdraw the left edge 75574bb70aeSStephan Aßmus verticalScrollBarFrame.left += 2; 75674bb70aeSStephan Aßmus borders = _borders; 75774bb70aeSStephan Aßmus borders &= ~B_LEFT_BORDER; 75874bb70aeSStephan Aßmus _DrawOuterResessedFrame(view, verticalScrollBarFrame, base, 7594f579098SStephan Aßmus 1.0, 1.0, flags, borders); 76074bb70aeSStephan Aßmus _DrawFrame(view, verticalScrollBarFrame, scrollbarFrameColor, 76174bb70aeSStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, 76274bb70aeSStephan Aßmus borders); 763ce955579SStephan Aßmus 764ce955579SStephan Aßmus // exclude recessed frame 765ce955579SStephan Aßmus scrollCornerFillRect.top++; 766ce955579SStephan Aßmus scrollCornerFillRect.left++; 767ce955579SStephan Aßmus } 768ce955579SStephan Aßmus 769ce955579SStephan Aßmus if (scrollCornerFillRect.IsValid()) { 770ce955579SStephan Aßmus view->SetHighColor(base); 771ce955579SStephan Aßmus view->FillRect(scrollCornerFillRect); 77274bb70aeSStephan Aßmus } 77374bb70aeSStephan Aßmus } 77474bb70aeSStephan Aßmus 77574bb70aeSStephan Aßmus 77674bb70aeSStephan Aßmus void 77740a10e1cSStephan Aßmus BControlLook::DrawArrowShape(BView* view, BRect& rect, const BRect& updateRect, 77840a10e1cSStephan Aßmus const rgb_color& base, uint32 direction, uint32 flags, float tint) 77940a10e1cSStephan Aßmus { 78040a10e1cSStephan Aßmus BPoint tri1, tri2, tri3; 78140a10e1cSStephan Aßmus float hInset = rect.Width() / 3; 78240a10e1cSStephan Aßmus float vInset = rect.Height() / 3; 78340a10e1cSStephan Aßmus rect.InsetBy(hInset, vInset); 78440a10e1cSStephan Aßmus 78540a10e1cSStephan Aßmus switch (direction) { 78640a10e1cSStephan Aßmus case B_LEFT_ARROW: 78740a10e1cSStephan Aßmus tri1.Set(rect.right, rect.top); 78840a10e1cSStephan Aßmus tri2.Set(rect.right - rect.Width() / 1.33, 78940a10e1cSStephan Aßmus (rect.top + rect.bottom + 1) /2 ); 79040a10e1cSStephan Aßmus tri3.Set(rect.right, rect.bottom + 1); 79140a10e1cSStephan Aßmus break; 79240a10e1cSStephan Aßmus case B_RIGHT_ARROW: 79340a10e1cSStephan Aßmus tri1.Set(rect.left, rect.bottom + 1); 79440a10e1cSStephan Aßmus tri2.Set(rect.left + rect.Width() / 1.33, 79540a10e1cSStephan Aßmus (rect.top + rect.bottom + 1) / 2); 79640a10e1cSStephan Aßmus tri3.Set(rect.left, rect.top); 79740a10e1cSStephan Aßmus break; 79840a10e1cSStephan Aßmus case B_UP_ARROW: 79940a10e1cSStephan Aßmus tri1.Set(rect.left, rect.bottom); 80040a10e1cSStephan Aßmus tri2.Set((rect.left + rect.right + 1) / 2, 80140a10e1cSStephan Aßmus rect.bottom - rect.Height() / 1.33); 80240a10e1cSStephan Aßmus tri3.Set(rect.right + 1, rect.bottom); 80340a10e1cSStephan Aßmus break; 80440a10e1cSStephan Aßmus case B_DOWN_ARROW: 80540a10e1cSStephan Aßmus default: 80640a10e1cSStephan Aßmus tri1.Set(rect.left, rect.top); 80740a10e1cSStephan Aßmus tri2.Set((rect.left + rect.right + 1) / 2, 80840a10e1cSStephan Aßmus rect.top + rect.Height() / 1.33); 80940a10e1cSStephan Aßmus tri3.Set(rect.right + 1, rect.top); 81040a10e1cSStephan Aßmus break; 81140a10e1cSStephan Aßmus } 81240a10e1cSStephan Aßmus // offset triangle if down 81340a10e1cSStephan Aßmus if (flags & B_ACTIVATED) 81440a10e1cSStephan Aßmus view->MovePenTo(BPoint(1, 1)); 81540a10e1cSStephan Aßmus else 81640a10e1cSStephan Aßmus view->MovePenTo(BPoint(0, 0)); 81740a10e1cSStephan Aßmus 81840a10e1cSStephan Aßmus BShape arrowShape; 81940a10e1cSStephan Aßmus arrowShape.MoveTo(tri1); 82040a10e1cSStephan Aßmus arrowShape.LineTo(tri2); 82140a10e1cSStephan Aßmus arrowShape.LineTo(tri3); 82240a10e1cSStephan Aßmus 82340a10e1cSStephan Aßmus if (flags & B_DISABLED) 82440a10e1cSStephan Aßmus tint = (tint + B_NO_TINT + B_NO_TINT) / 3; 82540a10e1cSStephan Aßmus 82640a10e1cSStephan Aßmus view->SetHighColor(tint_color(base, tint)); 82740a10e1cSStephan Aßmus 82840a10e1cSStephan Aßmus float penSize = view->PenSize(); 82940a10e1cSStephan Aßmus drawing_mode mode = view->DrawingMode(); 83040a10e1cSStephan Aßmus 83140a10e1cSStephan Aßmus view->SetPenSize(ceilf(hInset / 2.0)); 83240a10e1cSStephan Aßmus view->SetDrawingMode(B_OP_OVER); 83340a10e1cSStephan Aßmus view->StrokeShape(&arrowShape); 83440a10e1cSStephan Aßmus 83540a10e1cSStephan Aßmus view->SetPenSize(penSize); 83640a10e1cSStephan Aßmus view->SetDrawingMode(mode); 83740a10e1cSStephan Aßmus } 83840a10e1cSStephan Aßmus 83940a10e1cSStephan Aßmus 8402f86ba45SStephan Aßmus rgb_color 8412f86ba45SStephan Aßmus BControlLook::SliderBarColor(const rgb_color& base) 8422f86ba45SStephan Aßmus { 8432f86ba45SStephan Aßmus return tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT); 8442f86ba45SStephan Aßmus } 8452f86ba45SStephan Aßmus 8462f86ba45SStephan Aßmus 8472f86ba45SStephan Aßmus void 8482f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect, 8492f86ba45SStephan Aßmus const rgb_color& base, rgb_color leftFillColor, rgb_color rightFillColor, 8502f86ba45SStephan Aßmus float sliderScale, uint32 flags, enum orientation orientation) 8512f86ba45SStephan Aßmus { 8522f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 8532f86ba45SStephan Aßmus return; 8542f86ba45SStephan Aßmus 8552f86ba45SStephan Aßmus // separate the bar in two sides 8562f86ba45SStephan Aßmus float sliderPosition; 8572f86ba45SStephan Aßmus BRect leftBarSide = rect; 8582f86ba45SStephan Aßmus BRect rightBarSide = rect; 8592f86ba45SStephan Aßmus 8602f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 8612f86ba45SStephan Aßmus sliderPosition = floorf(rect.left + 2 + (rect.Width() - 2) 8622f86ba45SStephan Aßmus * sliderScale); 8632f86ba45SStephan Aßmus leftBarSide.right = sliderPosition - 1; 8642f86ba45SStephan Aßmus rightBarSide.left = sliderPosition; 8652f86ba45SStephan Aßmus } else { 8662f86ba45SStephan Aßmus sliderPosition = floorf(rect.top + 2 + (rect.Height() - 2) 8672f86ba45SStephan Aßmus * sliderScale); 8682f86ba45SStephan Aßmus leftBarSide.bottom = sliderPosition - 1; 8692f86ba45SStephan Aßmus rightBarSide.top = sliderPosition; 8702f86ba45SStephan Aßmus } 8712f86ba45SStephan Aßmus 8722f86ba45SStephan Aßmus // fill the background for the corners, exclude the middle bar for now 8732f86ba45SStephan Aßmus BRegion region(rect); 8742f86ba45SStephan Aßmus region.Exclude(rightBarSide); 8752f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 8762f86ba45SStephan Aßmus 8772f86ba45SStephan Aßmus view->PushState(); 8782f86ba45SStephan Aßmus 8792f86ba45SStephan Aßmus DrawSliderBar(view, rect, updateRect, base, leftFillColor, flags, 8802f86ba45SStephan Aßmus orientation); 8812f86ba45SStephan Aßmus 8822f86ba45SStephan Aßmus view->PopState(); 8832f86ba45SStephan Aßmus 8842f86ba45SStephan Aßmus region.Set(rect); 8852f86ba45SStephan Aßmus region.Exclude(leftBarSide); 8862f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 8872f86ba45SStephan Aßmus 8882f86ba45SStephan Aßmus view->PushState(); 8892f86ba45SStephan Aßmus 8902f86ba45SStephan Aßmus DrawSliderBar(view, rect, updateRect, base, rightFillColor, flags, 8912f86ba45SStephan Aßmus orientation); 8922f86ba45SStephan Aßmus 8932f86ba45SStephan Aßmus view->PopState(); 8942f86ba45SStephan Aßmus 8952f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 8962f86ba45SStephan Aßmus } 8972f86ba45SStephan Aßmus 8982f86ba45SStephan Aßmus 8992f86ba45SStephan Aßmus void 9002f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect, 9012f86ba45SStephan Aßmus const rgb_color& base, rgb_color fillColor, uint32 flags, 9022f86ba45SStephan Aßmus enum orientation orientation) 9032f86ba45SStephan Aßmus { 9042f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 9052f86ba45SStephan Aßmus return; 9062f86ba45SStephan Aßmus 9072f86ba45SStephan Aßmus // separate the rect into corners 9082f86ba45SStephan Aßmus BRect leftCorner(rect); 9092f86ba45SStephan Aßmus BRect rightCorner(rect); 9102f86ba45SStephan Aßmus BRect barRect(rect); 9112f86ba45SStephan Aßmus 9122f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 9132f86ba45SStephan Aßmus leftCorner.right = leftCorner.left + leftCorner.Height(); 9142f86ba45SStephan Aßmus rightCorner.left = rightCorner.right - rightCorner.Height(); 9152f86ba45SStephan Aßmus barRect.left += ceilf(barRect.Height() / 2); 9162f86ba45SStephan Aßmus barRect.right -= ceilf(barRect.Height() / 2); 9172f86ba45SStephan Aßmus } else { 9182f86ba45SStephan Aßmus leftCorner.bottom = leftCorner.top + leftCorner.Width(); 9192f86ba45SStephan Aßmus rightCorner.top = rightCorner.bottom - rightCorner.Width(); 9202f86ba45SStephan Aßmus barRect.top += ceilf(barRect.Width() / 2); 9212f86ba45SStephan Aßmus barRect.bottom -= ceilf(barRect.Width() / 2); 9222f86ba45SStephan Aßmus } 9232f86ba45SStephan Aßmus 9242f86ba45SStephan Aßmus // fill the background for the corners, exclude the middle bar for now 9252f86ba45SStephan Aßmus BRegion region(rect); 9262f86ba45SStephan Aßmus region.Exclude(barRect); 9272f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 9282f86ba45SStephan Aßmus 9292f86ba45SStephan Aßmus view->SetHighColor(base); 9302f86ba45SStephan Aßmus view->FillRect(rect); 9312f86ba45SStephan Aßmus 9322f86ba45SStephan Aßmus // figure out the tints to be used 9332f86ba45SStephan Aßmus float edgeLightTint; 9342f86ba45SStephan Aßmus float edgeShadowTint; 9352f86ba45SStephan Aßmus float frameLightTint; 9362f86ba45SStephan Aßmus float frameShadowTint; 9372f86ba45SStephan Aßmus float fillLightTint; 9382f86ba45SStephan Aßmus float fillShadowTint; 9392f86ba45SStephan Aßmus 9402f86ba45SStephan Aßmus if (flags & B_DISABLED) { 9412f86ba45SStephan Aßmus edgeLightTint = 1.0; 9422f86ba45SStephan Aßmus edgeShadowTint = 1.0; 9432f86ba45SStephan Aßmus frameLightTint = 1.20; 9442f86ba45SStephan Aßmus frameShadowTint = 1.25; 9452f86ba45SStephan Aßmus fillLightTint = 0.9; 9462f86ba45SStephan Aßmus fillShadowTint = 1.05; 9472f86ba45SStephan Aßmus 9482f86ba45SStephan Aßmus fillColor.red = uint8(fillColor.red * 0.4 + base.red * 0.6); 9492f86ba45SStephan Aßmus fillColor.green = uint8(fillColor.green * 0.4 + base.green * 0.6); 9502f86ba45SStephan Aßmus fillColor.blue = uint8(fillColor.blue * 0.4 + base.blue * 0.6); 9512f86ba45SStephan Aßmus } else { 9522f86ba45SStephan Aßmus edgeLightTint = 0.65; 9532f86ba45SStephan Aßmus edgeShadowTint = 1.07; 9542f86ba45SStephan Aßmus frameLightTint = 1.40; 9552f86ba45SStephan Aßmus frameShadowTint = 1.50; 9562f86ba45SStephan Aßmus fillLightTint = 0.8; 9572f86ba45SStephan Aßmus fillShadowTint = 1.1; 9582f86ba45SStephan Aßmus } 9592f86ba45SStephan Aßmus 9602f86ba45SStephan Aßmus rgb_color edgeLightColor = tint_color(base, edgeLightTint); 9612f86ba45SStephan Aßmus rgb_color edgeShadowColor = tint_color(base, edgeShadowTint); 9622f86ba45SStephan Aßmus rgb_color frameLightColor = tint_color(fillColor, frameLightTint); 9632f86ba45SStephan Aßmus rgb_color frameShadowColor = tint_color(fillColor, frameShadowTint); 9642f86ba45SStephan Aßmus rgb_color fillLightColor = tint_color(fillColor, fillLightTint); 9652f86ba45SStephan Aßmus rgb_color fillShadowColor = tint_color(fillColor, fillShadowTint); 9662f86ba45SStephan Aßmus 9672f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 9682f86ba45SStephan Aßmus _DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor, 9692f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 9702f86ba45SStephan Aßmus fillShadowColor, 1.0, 1.0, 0.0, -1.0, orientation); 9712f86ba45SStephan Aßmus 9722f86ba45SStephan Aßmus _DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor, 9732f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 9742f86ba45SStephan Aßmus fillShadowColor, 0.0, 1.0, -1.0, -1.0, orientation); 9752f86ba45SStephan Aßmus } else { 9762f86ba45SStephan Aßmus _DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor, 9772f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 9782f86ba45SStephan Aßmus fillShadowColor, 1.0, 1.0, -1.0, 0.0, orientation); 9792f86ba45SStephan Aßmus 9802f86ba45SStephan Aßmus _DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor, 9812f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 9822f86ba45SStephan Aßmus fillShadowColor, 1.0, 0.0, -1.0, -1.0, orientation); 9832f86ba45SStephan Aßmus } 9842f86ba45SStephan Aßmus 9852f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 9862f86ba45SStephan Aßmus 9872f86ba45SStephan Aßmus view->BeginLineArray(4); 9882f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 9892f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.RightTop(), edgeShadowColor); 9902f86ba45SStephan Aßmus view->AddLine(barRect.LeftBottom(), barRect.RightBottom(), 9912f86ba45SStephan Aßmus edgeLightColor); 9922f86ba45SStephan Aßmus barRect.InsetBy(0, 1); 9932f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.RightTop(), frameShadowColor); 9942f86ba45SStephan Aßmus view->AddLine(barRect.LeftBottom(), barRect.RightBottom(), 9952f86ba45SStephan Aßmus frameLightColor); 9962f86ba45SStephan Aßmus barRect.InsetBy(0, 1); 9972f86ba45SStephan Aßmus } else { 9982f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), edgeShadowColor); 9992f86ba45SStephan Aßmus view->AddLine(barRect.RightTop(), barRect.RightBottom(), 10002f86ba45SStephan Aßmus edgeLightColor); 10012f86ba45SStephan Aßmus barRect.InsetBy(1, 0); 10022f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), frameShadowColor); 10032f86ba45SStephan Aßmus view->AddLine(barRect.RightTop(), barRect.RightBottom(), 10042f86ba45SStephan Aßmus frameLightColor); 10052f86ba45SStephan Aßmus barRect.InsetBy(1, 0); 10062f86ba45SStephan Aßmus } 10072f86ba45SStephan Aßmus view->EndLineArray(); 10082f86ba45SStephan Aßmus 10092f86ba45SStephan Aßmus _FillGradient(view, barRect, fillColor, fillShadowTint, fillLightTint, 10102f86ba45SStephan Aßmus orientation); 10112f86ba45SStephan Aßmus } 10122f86ba45SStephan Aßmus 10132f86ba45SStephan Aßmus 10142f86ba45SStephan Aßmus void 10152f86ba45SStephan Aßmus BControlLook::DrawSliderThumb(BView* view, BRect& rect, const BRect& updateRect, 10162f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, enum orientation orientation) 10172f86ba45SStephan Aßmus { 10182f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 10192f86ba45SStephan Aßmus return; 10202f86ba45SStephan Aßmus 10212f86ba45SStephan Aßmus // figure out frame color 10222f86ba45SStephan Aßmus rgb_color frameLightColor; 10232f86ba45SStephan Aßmus rgb_color frameShadowColor; 10242f86ba45SStephan Aßmus rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 }; 10252f86ba45SStephan Aßmus 10262f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 10272f86ba45SStephan Aßmus // focused 10282f86ba45SStephan Aßmus frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 10292f86ba45SStephan Aßmus frameShadowColor = frameLightColor; 10302f86ba45SStephan Aßmus } else { 10312f86ba45SStephan Aßmus // figure out the tints to be used 10322f86ba45SStephan Aßmus float frameLightTint; 10332f86ba45SStephan Aßmus float frameShadowTint; 10342f86ba45SStephan Aßmus 10352f86ba45SStephan Aßmus if (flags & B_DISABLED) { 10362f86ba45SStephan Aßmus frameLightTint = 1.30; 10372f86ba45SStephan Aßmus frameShadowTint = 1.35; 10382f86ba45SStephan Aßmus shadowColor.alpha = 30; 10392f86ba45SStephan Aßmus } else { 10402f86ba45SStephan Aßmus frameLightTint = 1.6; 10412f86ba45SStephan Aßmus frameShadowTint = 1.65; 10422f86ba45SStephan Aßmus } 10432f86ba45SStephan Aßmus 10442f86ba45SStephan Aßmus frameLightColor = tint_color(base, frameLightTint); 10452f86ba45SStephan Aßmus frameShadowColor = tint_color(base, frameShadowTint); 10462f86ba45SStephan Aßmus } 10472f86ba45SStephan Aßmus 10482f86ba45SStephan Aßmus BRect originalRect(rect); 10492f86ba45SStephan Aßmus rect.right--; 10502f86ba45SStephan Aßmus rect.bottom--; 10512f86ba45SStephan Aßmus 10522f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, 10532f86ba45SStephan Aßmus frameShadowColor, frameShadowColor); 10542f86ba45SStephan Aßmus 10552f86ba45SStephan Aßmus flags &= ~B_ACTIVATED; 10562f86ba45SStephan Aßmus DrawButtonBackground(view, rect, updateRect, base, flags); 10572f86ba45SStephan Aßmus 10582f86ba45SStephan Aßmus // thumb shadow 10592f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 10602f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 10612f86ba45SStephan Aßmus originalRect.left++; 10622f86ba45SStephan Aßmus originalRect.top++; 10632f86ba45SStephan Aßmus view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom()); 10642f86ba45SStephan Aßmus originalRect.bottom--; 10652f86ba45SStephan Aßmus view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom()); 10662f86ba45SStephan Aßmus 10672f86ba45SStephan Aßmus // thumb edge 10682f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 10692f86ba45SStephan Aßmus rect.InsetBy(0, floorf(rect.Height() / 4)); 10702f86ba45SStephan Aßmus rect.left = floorf((rect.left + rect.right) / 2); 10712f86ba45SStephan Aßmus rect.right = rect.left + 1; 10722f86ba45SStephan Aßmus shadowColor = tint_color(base, B_DARKEN_2_TINT); 10732f86ba45SStephan Aßmus shadowColor.alpha = 128; 10742f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 10752f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 10762f86ba45SStephan Aßmus rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 10772f86ba45SStephan Aßmus lightColor.alpha = 128; 10782f86ba45SStephan Aßmus view->SetHighColor(lightColor); 10792f86ba45SStephan Aßmus view->StrokeLine(rect.RightTop(), rect.RightBottom()); 10802f86ba45SStephan Aßmus } else { 10812f86ba45SStephan Aßmus rect.InsetBy(floorf(rect.Width() / 4), 0); 10822f86ba45SStephan Aßmus rect.top = floorf((rect.top + rect.bottom) / 2); 10832f86ba45SStephan Aßmus rect.bottom = rect.top + 1; 10842f86ba45SStephan Aßmus shadowColor = tint_color(base, B_DARKEN_2_TINT); 10852f86ba45SStephan Aßmus shadowColor.alpha = 128; 10862f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 10872f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 10882f86ba45SStephan Aßmus rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 10892f86ba45SStephan Aßmus lightColor.alpha = 128; 10902f86ba45SStephan Aßmus view->SetHighColor(lightColor); 10912f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); 10922f86ba45SStephan Aßmus } 10932f86ba45SStephan Aßmus 10942f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_COPY); 10952f86ba45SStephan Aßmus } 10962f86ba45SStephan Aßmus 10972f86ba45SStephan Aßmus 10982f86ba45SStephan Aßmus void 10992f86ba45SStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect, 11002f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 11012f86ba45SStephan Aßmus enum orientation orientation) 11022f86ba45SStephan Aßmus { 11038ee9217eSStephan Aßmus DrawSliderTriangle(view, rect, updateRect, base, base, flags, orientation); 11048ee9217eSStephan Aßmus } 11058ee9217eSStephan Aßmus 11068ee9217eSStephan Aßmus 11078ee9217eSStephan Aßmus void 11088ee9217eSStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect, 11098ee9217eSStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& fill, 11108ee9217eSStephan Aßmus uint32 flags, enum orientation orientation) 11118ee9217eSStephan Aßmus { 11122f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 11132f86ba45SStephan Aßmus return; 11142f86ba45SStephan Aßmus 11152f86ba45SStephan Aßmus // figure out frame color 11162f86ba45SStephan Aßmus rgb_color frameLightColor; 11172f86ba45SStephan Aßmus rgb_color frameShadowColor; 11182f86ba45SStephan Aßmus rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 }; 11192f86ba45SStephan Aßmus 11202f86ba45SStephan Aßmus float topTint = 0.49; 11212f86ba45SStephan Aßmus float middleTint1 = 0.62; 11222f86ba45SStephan Aßmus float middleTint2 = 0.76; 11232f86ba45SStephan Aßmus float bottomTint = 0.90; 11242f86ba45SStephan Aßmus 11252f86ba45SStephan Aßmus if (flags & B_DISABLED) { 11262f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 11272f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 11282f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 11292f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 11302f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 11312f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 11322f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 11332f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 11342f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 11352f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 11362f86ba45SStephan Aßmus } 11372f86ba45SStephan Aßmus 11382f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 11392f86ba45SStephan Aßmus // focused 11402f86ba45SStephan Aßmus frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 11412f86ba45SStephan Aßmus frameShadowColor = frameLightColor; 11422f86ba45SStephan Aßmus } else { 11432f86ba45SStephan Aßmus // figure out the tints to be used 11442f86ba45SStephan Aßmus float frameLightTint; 11452f86ba45SStephan Aßmus float frameShadowTint; 11462f86ba45SStephan Aßmus 11472f86ba45SStephan Aßmus if (flags & B_DISABLED) { 11482f86ba45SStephan Aßmus frameLightTint = 1.30; 11492f86ba45SStephan Aßmus frameShadowTint = 1.35; 11502f86ba45SStephan Aßmus shadowColor.alpha = 30; 11512f86ba45SStephan Aßmus } else { 11522f86ba45SStephan Aßmus frameLightTint = 1.6; 11532f86ba45SStephan Aßmus frameShadowTint = 1.65; 11542f86ba45SStephan Aßmus } 11552f86ba45SStephan Aßmus 11562f86ba45SStephan Aßmus frameLightColor = tint_color(base, frameLightTint); 11572f86ba45SStephan Aßmus frameShadowColor = tint_color(base, frameShadowTint); 11582f86ba45SStephan Aßmus } 11592f86ba45SStephan Aßmus 11608ee9217eSStephan Aßmus // make room for the shadow 11618ee9217eSStephan Aßmus rect.right--; 11628ee9217eSStephan Aßmus rect.bottom--; 11632f86ba45SStephan Aßmus 11642f86ba45SStephan Aßmus uint32 viewFlags = view->Flags(); 11652f86ba45SStephan Aßmus view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE); 11662f86ba45SStephan Aßmus view->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN); 11672f86ba45SStephan Aßmus 11688ee9217eSStephan Aßmus float center = (rect.left + rect.right) / 2; 11692f86ba45SStephan Aßmus 11708ee9217eSStephan Aßmus BShape shape; 11718ee9217eSStephan Aßmus shape.MoveTo(BPoint(rect.left + 0.5, rect.bottom + 0.5)); 11728ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5)); 11738ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5)); 11748ee9217eSStephan Aßmus shape.LineTo(BPoint(center + 0.5, rect.top + 0.5)); 11758ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5)); 11768ee9217eSStephan Aßmus shape.Close(); 11778ee9217eSStephan Aßmus 11788ee9217eSStephan Aßmus view->MovePenTo(BPoint(1, 1)); 11798ee9217eSStephan Aßmus 11808ee9217eSStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 11818ee9217eSStephan Aßmus view->SetHighColor(shadowColor); 11828ee9217eSStephan Aßmus view->StrokeShape(&shape); 11838ee9217eSStephan Aßmus 11848ee9217eSStephan Aßmus view->MovePenTo(B_ORIGIN); 11858ee9217eSStephan Aßmus 11868ee9217eSStephan Aßmus view->SetDrawingMode(B_OP_COPY); 11872f86ba45SStephan Aßmus view->SetHighColor(frameLightColor); 11888ee9217eSStephan Aßmus view->StrokeShape(&shape); 11892f86ba45SStephan Aßmus 11902f86ba45SStephan Aßmus rect.InsetBy(1, 1); 11918ee9217eSStephan Aßmus shape.Clear(); 11928ee9217eSStephan Aßmus shape.MoveTo(BPoint(rect.left, rect.bottom + 1)); 11938ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.right + 1, rect.bottom + 1)); 11948ee9217eSStephan Aßmus shape.LineTo(BPoint(center + 0.5, rect.top)); 11958ee9217eSStephan Aßmus shape.Close(); 11962f86ba45SStephan Aßmus 11972f86ba45SStephan Aßmus BGradientLinear gradient; 11982f86ba45SStephan Aßmus if (flags & B_DISABLED) { 11998ee9217eSStephan Aßmus _MakeGradient(gradient, rect, fill, topTint, bottomTint); 12002f86ba45SStephan Aßmus } else { 12018ee9217eSStephan Aßmus _MakeGlossyGradient(gradient, rect, fill, topTint, middleTint1, 12022f86ba45SStephan Aßmus middleTint2, bottomTint); 12032f86ba45SStephan Aßmus } 12042f86ba45SStephan Aßmus 12058ee9217eSStephan Aßmus view->FillShape(&shape, gradient); 12062f86ba45SStephan Aßmus 12072f86ba45SStephan Aßmus view->SetFlags(viewFlags); 12082f86ba45SStephan Aßmus } 12092f86ba45SStephan Aßmus 12102f86ba45SStephan Aßmus 12112f86ba45SStephan Aßmus void 12122f86ba45SStephan Aßmus BControlLook::DrawSliderHashMarks(BView* view, BRect& rect, 12132f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, int32 count, 12142f86ba45SStephan Aßmus hash_mark_location location, uint32 flags, enum orientation orientation) 12152f86ba45SStephan Aßmus { 12162f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 12172f86ba45SStephan Aßmus return; 12182f86ba45SStephan Aßmus 12192f86ba45SStephan Aßmus rgb_color lightColor; 12202f86ba45SStephan Aßmus rgb_color darkColor; 12212f86ba45SStephan Aßmus 12222f86ba45SStephan Aßmus if (flags & B_DISABLED) { 12232f86ba45SStephan Aßmus lightColor = tint_color(base, 0.9); 12242f86ba45SStephan Aßmus darkColor = tint_color(base, 1.07); 12252f86ba45SStephan Aßmus } else { 12262f86ba45SStephan Aßmus lightColor = tint_color(base, 0.8); 12272f86ba45SStephan Aßmus darkColor = tint_color(base, 1.14); 12282f86ba45SStephan Aßmus } 12292f86ba45SStephan Aßmus 12302f86ba45SStephan Aßmus int32 hashMarkCount = max_c(count, 2); 12312f86ba45SStephan Aßmus // draw at least two hashmarks at min/max if 12322f86ba45SStephan Aßmus // fHashMarks != B_HASH_MARKS_NONE 12332f86ba45SStephan Aßmus float factor; 12342f86ba45SStephan Aßmus float startPos; 12352f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 12362f86ba45SStephan Aßmus factor = (rect.Width() - 2) / (hashMarkCount - 1); 12372f86ba45SStephan Aßmus startPos = rect.left + 1; 12382f86ba45SStephan Aßmus } else { 12392f86ba45SStephan Aßmus factor = (rect.Height() - 2) / (hashMarkCount - 1); 12402f86ba45SStephan Aßmus startPos = rect.top + 1; 12412f86ba45SStephan Aßmus } 12422f86ba45SStephan Aßmus 12432f86ba45SStephan Aßmus if (location & B_HASH_MARKS_TOP) { 12442f86ba45SStephan Aßmus view->BeginLineArray(hashMarkCount * 2); 12452f86ba45SStephan Aßmus 12462f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 12472f86ba45SStephan Aßmus float pos = startPos; 12482f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 12492f86ba45SStephan Aßmus view->AddLine(BPoint(pos, rect.top), 12502f86ba45SStephan Aßmus BPoint(pos, rect.top + 4), darkColor); 12512f86ba45SStephan Aßmus view->AddLine(BPoint(pos + 1, rect.top), 12522f86ba45SStephan Aßmus BPoint(pos + 1, rect.top + 4), lightColor); 12532f86ba45SStephan Aßmus 12542f86ba45SStephan Aßmus pos += factor; 12552f86ba45SStephan Aßmus } 12562f86ba45SStephan Aßmus } else { 12572f86ba45SStephan Aßmus float pos = startPos; 12582f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 12592f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, pos), 12602f86ba45SStephan Aßmus BPoint(rect.left + 4, pos), darkColor); 12612f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, pos + 1), 12622f86ba45SStephan Aßmus BPoint(rect.left + 4, pos + 1), lightColor); 12632f86ba45SStephan Aßmus 12642f86ba45SStephan Aßmus pos += factor; 12652f86ba45SStephan Aßmus } 12662f86ba45SStephan Aßmus } 12672f86ba45SStephan Aßmus 12682f86ba45SStephan Aßmus view->EndLineArray(); 12692f86ba45SStephan Aßmus } 12702f86ba45SStephan Aßmus 12712f86ba45SStephan Aßmus if (location & B_HASH_MARKS_BOTTOM) { 12722f86ba45SStephan Aßmus 12732f86ba45SStephan Aßmus view->BeginLineArray(hashMarkCount * 2); 12742f86ba45SStephan Aßmus 12752f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 12762f86ba45SStephan Aßmus float pos = startPos; 12772f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 12782f86ba45SStephan Aßmus view->AddLine(BPoint(pos, rect.bottom - 4), 12792f86ba45SStephan Aßmus BPoint(pos, rect.bottom), darkColor); 12802f86ba45SStephan Aßmus view->AddLine(BPoint(pos + 1, rect.bottom - 4), 12812f86ba45SStephan Aßmus BPoint(pos + 1, rect.bottom), lightColor); 12822f86ba45SStephan Aßmus 12832f86ba45SStephan Aßmus pos += factor; 12842f86ba45SStephan Aßmus } 12852f86ba45SStephan Aßmus } else { 12862f86ba45SStephan Aßmus float pos = startPos; 12872f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 12882f86ba45SStephan Aßmus view->AddLine(BPoint(rect.right - 4, pos), 12892f86ba45SStephan Aßmus BPoint(rect.right, pos), darkColor); 12902f86ba45SStephan Aßmus view->AddLine(BPoint(rect.right - 4, pos + 1), 12912f86ba45SStephan Aßmus BPoint(rect.right, pos + 1), lightColor); 12922f86ba45SStephan Aßmus 12932f86ba45SStephan Aßmus pos += factor; 12942f86ba45SStephan Aßmus } 12952f86ba45SStephan Aßmus } 12962f86ba45SStephan Aßmus 12972f86ba45SStephan Aßmus view->EndLineArray(); 12982f86ba45SStephan Aßmus } 12992f86ba45SStephan Aßmus } 13002f86ba45SStephan Aßmus 13012f86ba45SStephan Aßmus 13022f86ba45SStephan Aßmus void 13032f86ba45SStephan Aßmus BControlLook::DrawActiveTab(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); 13332f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 13342f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.6); 13352f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.75), 0); 13362f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.03), 255); 13372f86ba45SStephan Aßmus } 133812ea5a2cSStephan Aßmus 13392f86ba45SStephan Aßmus static const float kRoundCornerRadius = 4; 13402f86ba45SStephan Aßmus 13412f86ba45SStephan Aßmus // left/top corner 13422f86ba45SStephan Aßmus BRect cornerRect(rect); 13432f86ba45SStephan Aßmus cornerRect.right = cornerRect.left + kRoundCornerRadius; 13442f86ba45SStephan Aßmus cornerRect.bottom = cornerRect.top + kRoundCornerRadius; 13452f86ba45SStephan Aßmus 13462f86ba45SStephan Aßmus BRegion clipping(rect); 13472f86ba45SStephan Aßmus clipping.Exclude(cornerRect); 13482f86ba45SStephan Aßmus 13492f86ba45SStephan Aßmus _DrawRoundCornerLeftTop(view, cornerRect, updateRect, base, edgeShadowColor, 13502f86ba45SStephan Aßmus frameLightColor, bevelLightColor, fillGradient); 13512f86ba45SStephan Aßmus 13522f86ba45SStephan Aßmus // left/top corner 13532f86ba45SStephan Aßmus cornerRect.right = rect.right; 13542f86ba45SStephan Aßmus cornerRect.left = cornerRect.right - kRoundCornerRadius; 13552f86ba45SStephan Aßmus 13562f86ba45SStephan Aßmus clipping.Exclude(cornerRect); 13572f86ba45SStephan Aßmus 13582f86ba45SStephan Aßmus _DrawRoundCornerRightTop(view, cornerRect, updateRect, base, edgeShadowColor, 13592f86ba45SStephan Aßmus edgeLightColor, frameLightColor, frameShadowColor, bevelLightColor, 13602f86ba45SStephan Aßmus bevelShadowColor, fillGradient); 13612f86ba45SStephan Aßmus 13622f86ba45SStephan Aßmus // rest of frame and fill 13632f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 13642f86ba45SStephan Aßmus 13652f86ba45SStephan Aßmus _DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor, 13662f86ba45SStephan Aßmus edgeLightColor, 13672f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 13682f86ba45SStephan Aßmus if ((borders & B_LEFT_BORDER) == 0) 13692f86ba45SStephan Aßmus rect.left++; 13702f86ba45SStephan Aßmus if ((borders & B_RIGHT_BORDER) == 0) 13712f86ba45SStephan Aßmus rect.right--; 13722f86ba45SStephan Aßmus 13732f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor, 13742f86ba45SStephan Aßmus frameShadowColor, B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER); 13752f86ba45SStephan Aßmus 13762f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelLightColor, bevelLightColor, bevelShadowColor, 13772f86ba45SStephan Aßmus bevelShadowColor); 13782f86ba45SStephan Aßmus 13792f86ba45SStephan Aßmus view->FillRect(rect, fillGradient); 13802f86ba45SStephan Aßmus 13812f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 13822f86ba45SStephan Aßmus } 13832f86ba45SStephan Aßmus 13842f86ba45SStephan Aßmus 13852f86ba45SStephan Aßmus void 138683aff015SPhilippe Houdoin BControlLook::DrawInactiveTab(BView* view, BRect& rect, const BRect& updateRect, 13872f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, uint32 borders) 13882f86ba45SStephan Aßmus { 13892f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 13902f86ba45SStephan Aßmus return; 13912f86ba45SStephan Aßmus 13922f86ba45SStephan Aßmus rgb_color edgeShadowColor; 13932f86ba45SStephan Aßmus rgb_color edgeLightColor; 13942f86ba45SStephan Aßmus rgb_color frameShadowColor; 13952f86ba45SStephan Aßmus rgb_color frameLightColor; 13962f86ba45SStephan Aßmus rgb_color bevelShadowColor; 13972f86ba45SStephan Aßmus rgb_color bevelLightColor; 13982f86ba45SStephan Aßmus BGradientLinear fillGradient; 13992f86ba45SStephan Aßmus fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3)); 14002f86ba45SStephan Aßmus fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3)); 14012f86ba45SStephan Aßmus 14022f86ba45SStephan Aßmus if (flags & B_DISABLED) { 14032f86ba45SStephan Aßmus edgeShadowColor = base; 14042f86ba45SStephan Aßmus edgeLightColor = base; 14052f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 14062f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.25); 14072f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 14082f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.8); 14092f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.85), 0); 14102f86ba45SStephan Aßmus fillGradient.AddColor(base, 255); 14112f86ba45SStephan Aßmus } else { 14122f86ba45SStephan Aßmus edgeShadowColor = tint_color(base, 1.03); 14132f86ba45SStephan Aßmus edgeLightColor = tint_color(base, 0.80); 14142f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 14152f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.30); 141612ea5a2cSStephan Aßmus bevelShadowColor = tint_color(base, 1.17); 14172f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 1.10); 14182f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.12), 0); 14192f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.08), 255); 14202f86ba45SStephan Aßmus } 14212f86ba45SStephan Aßmus 14222f86ba45SStephan Aßmus // active tabs stand out at the top, but this is an inactive tab 14232f86ba45SStephan Aßmus view->SetHighColor(base); 14242f86ba45SStephan Aßmus view->FillRect(BRect(rect.left, rect.top, rect.right, rect.top + 4)); 14252f86ba45SStephan Aßmus rect.top += 4; 14262f86ba45SStephan Aßmus 14272f86ba45SStephan Aßmus // frame and fill 14282f86ba45SStephan Aßmus _DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor, 14292f86ba45SStephan Aßmus edgeLightColor, 14302f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 14312f86ba45SStephan Aßmus 14322f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor, 14332f86ba45SStephan Aßmus frameShadowColor, 14342f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 14352f86ba45SStephan Aßmus 143612ea5a2cSStephan Aßmus _DrawFrame(view, rect, bevelShadowColor, bevelShadowColor, bevelLightColor, 143712ea5a2cSStephan Aßmus bevelLightColor, B_LEFT_BORDER & ~borders); 14382f86ba45SStephan Aßmus 14392f86ba45SStephan Aßmus view->FillRect(rect, fillGradient); 14402f86ba45SStephan Aßmus } 14412f86ba45SStephan Aßmus 14422f86ba45SStephan Aßmus 1443*1f9fd6d8SStephan Aßmus void 1444*1f9fd6d8SStephan Aßmus BControlLook::DrawSplitter(BView* view, BRect& rect, const BRect& updateRect, 1445*1f9fd6d8SStephan Aßmus const rgb_color& base, enum orientation orientation, uint32 flags, 1446*1f9fd6d8SStephan Aßmus uint32 borders) 1447*1f9fd6d8SStephan Aßmus { 1448*1f9fd6d8SStephan Aßmus rgb_color background; 1449*1f9fd6d8SStephan Aßmus if ((flags & (B_CLICKED | B_ACTIVATED)) != 0) 1450*1f9fd6d8SStephan Aßmus background = tint_color(base, B_DARKEN_1_TINT); 1451*1f9fd6d8SStephan Aßmus else 1452*1f9fd6d8SStephan Aßmus background = base; 1453*1f9fd6d8SStephan Aßmus 1454*1f9fd6d8SStephan Aßmus rgb_color light = tint_color(background, 0.6); 1455*1f9fd6d8SStephan Aßmus rgb_color shadow = tint_color(background, 1.21); 1456*1f9fd6d8SStephan Aßmus 1457*1f9fd6d8SStephan Aßmus // frame 1458*1f9fd6d8SStephan Aßmus if (borders != 0 && rect.Width() > 3 && rect.Height() > 3) 1459*1f9fd6d8SStephan Aßmus DrawRaisedBorder(view, rect, updateRect, background, flags, borders); 1460*1f9fd6d8SStephan Aßmus 1461*1f9fd6d8SStephan Aßmus // dots and rest of background 1462*1f9fd6d8SStephan Aßmus if (orientation == B_HORIZONTAL) { 1463*1f9fd6d8SStephan Aßmus if (rect.Width() > 2) { 1464*1f9fd6d8SStephan Aßmus // background on left/right 1465*1f9fd6d8SStephan Aßmus BRegion region(rect); 1466*1f9fd6d8SStephan Aßmus rect.left = floorf((rect.left + rect.right) / 2.0 - 0.5); 1467*1f9fd6d8SStephan Aßmus rect.right = rect.left + 1; 1468*1f9fd6d8SStephan Aßmus region.Exclude(rect); 1469*1f9fd6d8SStephan Aßmus view->SetHighColor(background); 1470*1f9fd6d8SStephan Aßmus view->FillRegion(®ion); 1471*1f9fd6d8SStephan Aßmus } 1472*1f9fd6d8SStephan Aßmus 1473*1f9fd6d8SStephan Aßmus BPoint dot = rect.LeftTop(); 1474*1f9fd6d8SStephan Aßmus BPoint stop = rect.LeftBottom(); 1475*1f9fd6d8SStephan Aßmus int32 num = 1; 1476*1f9fd6d8SStephan Aßmus while (dot.y <= stop.y) { 1477*1f9fd6d8SStephan Aßmus rgb_color col1; 1478*1f9fd6d8SStephan Aßmus rgb_color col2; 1479*1f9fd6d8SStephan Aßmus switch (num) { 1480*1f9fd6d8SStephan Aßmus case 1: 1481*1f9fd6d8SStephan Aßmus col1 = background; 1482*1f9fd6d8SStephan Aßmus col2 = background; 1483*1f9fd6d8SStephan Aßmus break; 1484*1f9fd6d8SStephan Aßmus case 2: 1485*1f9fd6d8SStephan Aßmus col1 = shadow; 1486*1f9fd6d8SStephan Aßmus col2 = background; 1487*1f9fd6d8SStephan Aßmus break; 1488*1f9fd6d8SStephan Aßmus case 3: 1489*1f9fd6d8SStephan Aßmus col1 = background; 1490*1f9fd6d8SStephan Aßmus col2 = light; 1491*1f9fd6d8SStephan Aßmus num = 0; 1492*1f9fd6d8SStephan Aßmus break; 1493*1f9fd6d8SStephan Aßmus } 1494*1f9fd6d8SStephan Aßmus view->SetHighColor(col1); 1495*1f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 1496*1f9fd6d8SStephan Aßmus view->SetHighColor(col2); 1497*1f9fd6d8SStephan Aßmus dot.x++; 1498*1f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 1499*1f9fd6d8SStephan Aßmus dot.x -= 1.0; 1500*1f9fd6d8SStephan Aßmus // next pixel 1501*1f9fd6d8SStephan Aßmus num++; 1502*1f9fd6d8SStephan Aßmus dot.y++; 1503*1f9fd6d8SStephan Aßmus } 1504*1f9fd6d8SStephan Aßmus } else { 1505*1f9fd6d8SStephan Aßmus if (rect.Height() > 2) { 1506*1f9fd6d8SStephan Aßmus // background on left/right 1507*1f9fd6d8SStephan Aßmus BRegion region(rect); 1508*1f9fd6d8SStephan Aßmus rect.top = floorf((rect.top + rect.bottom) / 2.0 - 0.5); 1509*1f9fd6d8SStephan Aßmus rect.bottom = rect.top + 1; 1510*1f9fd6d8SStephan Aßmus region.Exclude(rect); 1511*1f9fd6d8SStephan Aßmus view->SetHighColor(background); 1512*1f9fd6d8SStephan Aßmus view->FillRegion(®ion); 1513*1f9fd6d8SStephan Aßmus } 1514*1f9fd6d8SStephan Aßmus 1515*1f9fd6d8SStephan Aßmus BPoint dot = rect.LeftTop(); 1516*1f9fd6d8SStephan Aßmus BPoint stop = rect.RightTop(); 1517*1f9fd6d8SStephan Aßmus int32 num = 1; 1518*1f9fd6d8SStephan Aßmus while (dot.x <= stop.x) { 1519*1f9fd6d8SStephan Aßmus rgb_color col1; 1520*1f9fd6d8SStephan Aßmus rgb_color col2; 1521*1f9fd6d8SStephan Aßmus switch (num) { 1522*1f9fd6d8SStephan Aßmus case 1: 1523*1f9fd6d8SStephan Aßmus col1 = background; 1524*1f9fd6d8SStephan Aßmus col2 = background; 1525*1f9fd6d8SStephan Aßmus break; 1526*1f9fd6d8SStephan Aßmus case 2: 1527*1f9fd6d8SStephan Aßmus col1 = shadow; 1528*1f9fd6d8SStephan Aßmus col2 = background; 1529*1f9fd6d8SStephan Aßmus break; 1530*1f9fd6d8SStephan Aßmus case 3: 1531*1f9fd6d8SStephan Aßmus col1 = background; 1532*1f9fd6d8SStephan Aßmus col2 = light; 1533*1f9fd6d8SStephan Aßmus num = 0; 1534*1f9fd6d8SStephan Aßmus break; 1535*1f9fd6d8SStephan Aßmus } 1536*1f9fd6d8SStephan Aßmus view->SetHighColor(col1); 1537*1f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 1538*1f9fd6d8SStephan Aßmus view->SetHighColor(col2); 1539*1f9fd6d8SStephan Aßmus dot.y++; 1540*1f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 1541*1f9fd6d8SStephan Aßmus dot.y -= 1.0; 1542*1f9fd6d8SStephan Aßmus // next pixel 1543*1f9fd6d8SStephan Aßmus num++; 1544*1f9fd6d8SStephan Aßmus dot.x++; 1545*1f9fd6d8SStephan Aßmus } 1546*1f9fd6d8SStephan Aßmus } 1547*1f9fd6d8SStephan Aßmus } 1548*1f9fd6d8SStephan Aßmus 1549*1f9fd6d8SStephan Aßmus 15502f86ba45SStephan Aßmus // #pragma mark - 15512f86ba45SStephan Aßmus 15522f86ba45SStephan Aßmus 15532f86ba45SStephan Aßmus void 15542f86ba45SStephan Aßmus BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect, 15552f86ba45SStephan Aßmus const rgb_color& base, border_style border, uint32 flags, uint32 borders) 15562f86ba45SStephan Aßmus { 15572f86ba45SStephan Aßmus if (border == B_NO_BORDER) 15582f86ba45SStephan Aßmus return; 15592f86ba45SStephan Aßmus 15602f86ba45SStephan Aßmus rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT); 15612f86ba45SStephan Aßmus if (flags & B_FOCUSED) 15622f86ba45SStephan Aßmus scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 15632f86ba45SStephan Aßmus 15642f86ba45SStephan Aßmus if (border == B_FANCY_BORDER) 15654f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders); 15662f86ba45SStephan Aßmus 15672f86ba45SStephan Aßmus _DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor, 15682f86ba45SStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, borders); 15692f86ba45SStephan Aßmus } 15702f86ba45SStephan Aßmus 15712f86ba45SStephan Aßmus 15722f86ba45SStephan Aßmus void 15732f86ba45SStephan Aßmus BControlLook::DrawRaisedBorder(BView* view, BRect& rect, 15742f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 15752f86ba45SStephan Aßmus uint32 borders) 15762f86ba45SStephan Aßmus { 15772f86ba45SStephan Aßmus rgb_color lightColor; 15782f86ba45SStephan Aßmus rgb_color shadowColor; 15792f86ba45SStephan Aßmus 15802f86ba45SStephan Aßmus if (flags & B_DISABLED) { 15812f86ba45SStephan Aßmus lightColor = base; 15822f86ba45SStephan Aßmus shadowColor = base; 15832f86ba45SStephan Aßmus } else { 15842f86ba45SStephan Aßmus lightColor = tint_color(base, 0.85); 15852f86ba45SStephan Aßmus shadowColor = tint_color(base, 1.07); 15862f86ba45SStephan Aßmus } 15872f86ba45SStephan Aßmus 15882f86ba45SStephan Aßmus _DrawFrame(view, rect, lightColor, lightColor, shadowColor, shadowColor, 15892f86ba45SStephan Aßmus borders); 15902f86ba45SStephan Aßmus } 15912f86ba45SStephan Aßmus 15922f86ba45SStephan Aßmus 15932f86ba45SStephan Aßmus void 15942f86ba45SStephan Aßmus BControlLook::DrawTextControlBorder(BView* view, BRect& rect, 15952f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 15962f86ba45SStephan Aßmus uint32 borders) 15972f86ba45SStephan Aßmus { 15982f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 15992f86ba45SStephan Aßmus return; 16002f86ba45SStephan Aßmus 16012f86ba45SStephan Aßmus rgb_color dark1BorderColor; 16022f86ba45SStephan Aßmus rgb_color dark2BorderColor; 16032f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 16042f86ba45SStephan Aßmus 16052f86ba45SStephan Aßmus if (flags & B_DISABLED) { 16064f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags, borders); 16072f86ba45SStephan Aßmus 16084f579098SStephan Aßmus if (flags & B_BLEND_FRAME) 16094f579098SStephan Aßmus dark1BorderColor = (rgb_color){ 0, 0, 0, 40 }; 16104f579098SStephan Aßmus else 16112f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.15); 16124f579098SStephan Aßmus dark2BorderColor = dark1BorderColor; 16132f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 16142f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.50); 16152f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.49); 16162f86ba45SStephan Aßmus 16174f579098SStephan Aßmus // BCheckBox uses this to indicate the clicked state... 16182f86ba45SStephan Aßmus _DrawFrame(view, rect, 16192f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 16202f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 16212f86ba45SStephan Aßmus 16222f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 16232f86ba45SStephan Aßmus } else { 16244f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags, borders); 16252f86ba45SStephan Aßmus 16264f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 16274f579098SStephan Aßmus dark1BorderColor = (rgb_color){ 0, 0, 0, 102 }; 16284f579098SStephan Aßmus dark2BorderColor = (rgb_color){ 0, 0, 0, 97 }; 16294f579098SStephan Aßmus } else { 16302f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.40); 16312f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.38); 16322f86ba45SStephan Aßmus } 16334f579098SStephan Aßmus } 16342f86ba45SStephan Aßmus 16352f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) { 16362f86ba45SStephan Aßmus dark1BorderColor = navigationColor; 16372f86ba45SStephan Aßmus dark2BorderColor = navigationColor; 16382f86ba45SStephan Aßmus } 16392f86ba45SStephan Aßmus 16404f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 16414f579098SStephan Aßmus drawing_mode oldMode = view->DrawingMode(); 16424f579098SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 16434f579098SStephan Aßmus 16442f86ba45SStephan Aßmus _DrawFrame(view, rect, 16452f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 16462f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 16474f579098SStephan Aßmus 16484f579098SStephan Aßmus view->SetDrawingMode(oldMode); 16494f579098SStephan Aßmus } else { 16504f579098SStephan Aßmus _DrawFrame(view, rect, 16514f579098SStephan Aßmus dark1BorderColor, dark1BorderColor, 16524f579098SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 16534f579098SStephan Aßmus } 16542f86ba45SStephan Aßmus } 16552f86ba45SStephan Aßmus 16562f86ba45SStephan Aßmus 16572f86ba45SStephan Aßmus void 16582f86ba45SStephan Aßmus BControlLook::DrawGroupFrame(BView* view, BRect& rect, const BRect& updateRect, 16592f86ba45SStephan Aßmus const rgb_color& base, uint32 borders) 16602f86ba45SStephan Aßmus { 16612f86ba45SStephan Aßmus rgb_color frameColor = tint_color(base, 1.30); 16622f86ba45SStephan Aßmus rgb_color bevelLight = tint_color(base, 0.8); 16632f86ba45SStephan Aßmus rgb_color bevelShadow = tint_color(base, 1.03); 16642f86ba45SStephan Aßmus 16652f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelShadow, bevelShadow, bevelLight, bevelLight, 16662f86ba45SStephan Aßmus borders); 16672f86ba45SStephan Aßmus 16682f86ba45SStephan Aßmus _DrawFrame(view, rect, frameColor, frameColor, frameColor, frameColor, 16692f86ba45SStephan Aßmus borders); 16702f86ba45SStephan Aßmus 16712f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelLight, bevelLight, bevelShadow, bevelShadow, 16722f86ba45SStephan Aßmus borders); 16732f86ba45SStephan Aßmus } 16742f86ba45SStephan Aßmus 16752f86ba45SStephan Aßmus 16762f86ba45SStephan Aßmus void 16772f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect, 16782f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags) 16792f86ba45SStephan Aßmus { 16802f86ba45SStephan Aßmus DrawLabel(view, label, rect, updateRect, base, flags, 16812f86ba45SStephan Aßmus DefaultLabelAlignment()); 16822f86ba45SStephan Aßmus } 16832f86ba45SStephan Aßmus 16842f86ba45SStephan Aßmus 16852f86ba45SStephan Aßmus void 16862f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect, 16872f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 16882f86ba45SStephan Aßmus const BAlignment& alignment) 16892f86ba45SStephan Aßmus { 16902f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 16912f86ba45SStephan Aßmus return; 16922f86ba45SStephan Aßmus 16932f86ba45SStephan Aßmus // setup the text color 16942f86ba45SStephan Aßmus rgb_color color; 16952f86ba45SStephan Aßmus if (base.red + base.green + base.blue > 128 * 3) 16962f86ba45SStephan Aßmus color = tint_color(base, B_DARKEN_MAX_TINT); 16972f86ba45SStephan Aßmus else 16982f86ba45SStephan Aßmus color = tint_color(base, B_LIGHTEN_MAX_TINT); 16992f86ba45SStephan Aßmus 17002f86ba45SStephan Aßmus if (flags & B_DISABLED) { 17012f86ba45SStephan Aßmus color.red = (uint8)(((int32)base.red + color.red + 1) / 2); 17022f86ba45SStephan Aßmus color.green = (uint8)(((int32)base.green + color.green + 1) / 2); 17032f86ba45SStephan Aßmus color.blue = (uint8)(((int32)base.blue + color.blue + 1) / 2); 17042f86ba45SStephan Aßmus } 17052f86ba45SStephan Aßmus 17062f86ba45SStephan Aßmus view->SetHighColor(color); 17072f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_OVER); 17082f86ba45SStephan Aßmus 17092f86ba45SStephan Aßmus // truncate the label if necessary and get the width and height 17102f86ba45SStephan Aßmus BString truncatedLabel(label); 17112f86ba45SStephan Aßmus 17122f86ba45SStephan Aßmus BFont font; 17132f86ba45SStephan Aßmus view->GetFont(&font); 17142f86ba45SStephan Aßmus 17152f86ba45SStephan Aßmus float width = rect.Width(); 17162f86ba45SStephan Aßmus font.TruncateString(&truncatedLabel, B_TRUNCATE_END, width); 17172f86ba45SStephan Aßmus width = font.StringWidth(truncatedLabel.String()); 17182f86ba45SStephan Aßmus 17192f86ba45SStephan Aßmus font_height fontHeight; 17202f86ba45SStephan Aßmus font.GetHeight(&fontHeight); 17212f86ba45SStephan Aßmus float height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent); 17222f86ba45SStephan Aßmus 17232f86ba45SStephan Aßmus // handle alignment 17242f86ba45SStephan Aßmus BPoint location; 17252f86ba45SStephan Aßmus 17262f86ba45SStephan Aßmus switch (alignment.horizontal) { 17272f86ba45SStephan Aßmus default: 17282f86ba45SStephan Aßmus case B_ALIGN_LEFT: 17292f86ba45SStephan Aßmus location.x = rect.left; 17302f86ba45SStephan Aßmus break; 17312f86ba45SStephan Aßmus case B_ALIGN_RIGHT: 17322f86ba45SStephan Aßmus location.x = rect.right - width; 17332f86ba45SStephan Aßmus break; 17342f86ba45SStephan Aßmus case B_ALIGN_CENTER: 17352f86ba45SStephan Aßmus location.x = (rect.left + rect.right - width) / 2.0f; 17362f86ba45SStephan Aßmus break; 17372f86ba45SStephan Aßmus } 17382f86ba45SStephan Aßmus 17392f86ba45SStephan Aßmus switch (alignment.vertical) { 17402f86ba45SStephan Aßmus case B_ALIGN_TOP: 17412f86ba45SStephan Aßmus location.y = rect.top + ceilf(fontHeight.ascent); 17422f86ba45SStephan Aßmus break; 17432f86ba45SStephan Aßmus default: 17442f86ba45SStephan Aßmus case B_ALIGN_MIDDLE: 17452f86ba45SStephan Aßmus location.y = floorf((rect.top + rect.bottom - height) / 2.0f + 0.5f) 17462f86ba45SStephan Aßmus + ceilf(fontHeight.ascent); 17472f86ba45SStephan Aßmus break; 17482f86ba45SStephan Aßmus case B_ALIGN_BOTTOM: 17492f86ba45SStephan Aßmus location.y = rect.bottom - ceilf(fontHeight.descent); 17502f86ba45SStephan Aßmus break; 17512f86ba45SStephan Aßmus } 17522f86ba45SStephan Aßmus 17532f86ba45SStephan Aßmus view->DrawString(truncatedLabel.String(), location); 17542f86ba45SStephan Aßmus } 17552f86ba45SStephan Aßmus 17562f86ba45SStephan Aßmus 17572f86ba45SStephan Aßmus // #pragma mark - 17582f86ba45SStephan Aßmus 17592f86ba45SStephan Aßmus 17602f86ba45SStephan Aßmus void 176113cd46dfSStephan Aßmus BControlLook::_DrawButtonFrame(BView* view, BRect& rect, 1762681c2e44SStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& background, 176313cd46dfSStephan Aßmus float contrast, float brightness, uint32 flags, uint32 borders) 176413cd46dfSStephan Aßmus { 176513cd46dfSStephan Aßmus // colors 176613cd46dfSStephan Aßmus rgb_color dark1BorderColor; 176713cd46dfSStephan Aßmus rgb_color dark2BorderColor; 176813cd46dfSStephan Aßmus 176913cd46dfSStephan Aßmus if ((flags & B_DISABLED) == 0) { 17704f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 17714f579098SStephan Aßmus dark1BorderColor = (rgb_color){ 0, 0, 0, 75 }; 17724f579098SStephan Aßmus dark2BorderColor = (rgb_color){ 0, 0, 0, 95 }; 17734f579098SStephan Aßmus } else { 177413cd46dfSStephan Aßmus dark1BorderColor = tint_color(base, 1.33); 177513cd46dfSStephan Aßmus dark2BorderColor = tint_color(base, 1.45); 17764f579098SStephan Aßmus } 177713cd46dfSStephan Aßmus 177813cd46dfSStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 17794f579098SStephan Aßmus // TODO: B_BLEND_FRAME 178013cd46dfSStephan Aßmus dark2BorderColor = tint_color(dark1BorderColor, 1.5); 178113cd46dfSStephan Aßmus dark1BorderColor = tint_color(dark1BorderColor, 1.35); 178213cd46dfSStephan Aßmus } 178313cd46dfSStephan Aßmus } else { 17844f579098SStephan Aßmus // TODO: B_BLEND_FRAME 178513cd46dfSStephan Aßmus dark1BorderColor = tint_color(base, 1.147); 178613cd46dfSStephan Aßmus dark2BorderColor = tint_color(base, 1.24); 178713cd46dfSStephan Aßmus 178813cd46dfSStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 178974bb70aeSStephan Aßmus dark1BorderColor = tint_color(dark1BorderColor, 1.14); 179074bb70aeSStephan Aßmus dark2BorderColor = tint_color(dark1BorderColor, 1.12); 179113cd46dfSStephan Aßmus } 179213cd46dfSStephan Aßmus } 179313cd46dfSStephan Aßmus 179413cd46dfSStephan Aßmus if (flags & B_ACTIVATED) { 179513cd46dfSStephan Aßmus rgb_color temp = dark2BorderColor; 179613cd46dfSStephan Aßmus dark2BorderColor = dark1BorderColor; 179713cd46dfSStephan Aßmus dark1BorderColor = temp; 179813cd46dfSStephan Aßmus } 179913cd46dfSStephan Aßmus 180013cd46dfSStephan Aßmus // indicate focus by changing main button border 180113cd46dfSStephan Aßmus if (flags & B_FOCUSED) { 180213cd46dfSStephan Aßmus dark1BorderColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 180313cd46dfSStephan Aßmus dark2BorderColor = dark1BorderColor; 180413cd46dfSStephan Aßmus } 180513cd46dfSStephan Aßmus 180613cd46dfSStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 18074f579098SStephan Aßmus // TODO: B_BLEND_FRAME 180813cd46dfSStephan Aßmus float focusTint = 1.2; 180913cd46dfSStephan Aßmus if (flags & B_DISABLED) 181013cd46dfSStephan Aßmus focusTint = (B_NO_TINT + focusTint) / 2; 181113cd46dfSStephan Aßmus 181213cd46dfSStephan Aßmus rgb_color focusColor = tint_color(base, focusTint); 181313cd46dfSStephan Aßmus view->SetHighColor(base); 181413cd46dfSStephan Aßmus 181513cd46dfSStephan Aßmus view->StrokeRect(rect); 181613cd46dfSStephan Aßmus rect.InsetBy(1.0, 1.0); 181713cd46dfSStephan Aßmus 181813cd46dfSStephan Aßmus view->SetHighColor(focusColor); 181913cd46dfSStephan Aßmus view->StrokeRect(rect); 182013cd46dfSStephan Aßmus rect.InsetBy(1.0, 1.0); 182113cd46dfSStephan Aßmus view->StrokeRect(rect); 182213cd46dfSStephan Aßmus rect.InsetBy(1.0, 1.0); 182313cd46dfSStephan Aßmus 182413cd46dfSStephan Aßmus // bevel around external border 182513cd46dfSStephan Aßmus _DrawOuterResessedFrame(view, rect, focusColor, 182674bb70aeSStephan Aßmus contrast * (((flags & B_DISABLED) ? 0.3 : 0.8)), 182774bb70aeSStephan Aßmus brightness * (((flags & B_DISABLED) ? 1.0 : 0.9)), 18284f579098SStephan Aßmus flags, borders); 182913cd46dfSStephan Aßmus } else { 183013cd46dfSStephan Aßmus // bevel around external border 1831681c2e44SStephan Aßmus _DrawOuterResessedFrame(view, rect, background, 183213cd46dfSStephan Aßmus contrast * ((flags & B_DISABLED) ? 0.0 : 1.0), brightness * 1.0, 18334f579098SStephan Aßmus flags, borders); 183413cd46dfSStephan Aßmus } 183513cd46dfSStephan Aßmus 18364f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 18374f579098SStephan Aßmus drawing_mode oldDrawingMode = view->DrawingMode(); 18384f579098SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 18394f579098SStephan Aßmus 184013cd46dfSStephan Aßmus _DrawFrame(view, rect, dark1BorderColor, dark1BorderColor, 184113cd46dfSStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 18424f579098SStephan Aßmus 18434f579098SStephan Aßmus view->SetDrawingMode(oldDrawingMode); 18444f579098SStephan Aßmus } else { 18454f579098SStephan Aßmus _DrawFrame(view, rect, dark1BorderColor, dark1BorderColor, 18464f579098SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 18474f579098SStephan Aßmus } 184813cd46dfSStephan Aßmus } 184913cd46dfSStephan Aßmus 185013cd46dfSStephan Aßmus 185113cd46dfSStephan Aßmus void 18522f86ba45SStephan Aßmus BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect, 18534f579098SStephan Aßmus const rgb_color& base, float contrast, float brightness, uint32 flags, 18544f579098SStephan Aßmus uint32 borders) 18552f86ba45SStephan Aßmus { 18564f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 18574f579098SStephan Aßmus // assumes the background has already been painted 18584f579098SStephan Aßmus drawing_mode oldDrawingMode = view->DrawingMode(); 18594f579098SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 18604f579098SStephan Aßmus 18614f579098SStephan Aßmus uint8 alpha = uint8(20 * contrast); 18624f579098SStephan Aßmus uint32 white = uint8(255 * brightness); 18634f579098SStephan Aßmus 18644f579098SStephan Aßmus rgb_color borderBevelShadow = (rgb_color){ 0, 0, 0, alpha }; 18654f579098SStephan Aßmus rgb_color borderBevelLight = (rgb_color){ white, white, white, alpha }; 18664f579098SStephan Aßmus 18674f579098SStephan Aßmus _DrawFrame(view, rect, borderBevelShadow, borderBevelShadow, 18684f579098SStephan Aßmus borderBevelLight, borderBevelLight, borders); 18694f579098SStephan Aßmus 18704f579098SStephan Aßmus view->SetDrawingMode(oldDrawingMode); 18714f579098SStephan Aßmus } else { 18722f86ba45SStephan Aßmus // colors 18732f86ba45SStephan Aßmus float tintLight = kEdgeBevelLightTint; 18742f86ba45SStephan Aßmus float tintShadow = kEdgeBevelShadowTint; 18752f86ba45SStephan Aßmus 18762f86ba45SStephan Aßmus if (contrast == 0.0) { 18772f86ba45SStephan Aßmus tintLight = B_NO_TINT; 18782f86ba45SStephan Aßmus tintShadow = B_NO_TINT; 18792f86ba45SStephan Aßmus } else if (contrast != 1.0) { 18802f86ba45SStephan Aßmus tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast; 18812f86ba45SStephan Aßmus tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast; 18822f86ba45SStephan Aßmus } 18832f86ba45SStephan Aßmus 18842f86ba45SStephan Aßmus rgb_color borderBevelShadow = tint_color(base, tintShadow); 18852f86ba45SStephan Aßmus rgb_color borderBevelLight = tint_color(base, tintLight); 18862f86ba45SStephan Aßmus 18872f86ba45SStephan Aßmus if (brightness < 1.0) { 18882f86ba45SStephan Aßmus borderBevelShadow.red = uint8(borderBevelShadow.red * brightness); 18892f86ba45SStephan Aßmus borderBevelShadow.green = uint8(borderBevelShadow.green * brightness); 18902f86ba45SStephan Aßmus borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness); 18912f86ba45SStephan Aßmus borderBevelLight.red = uint8(borderBevelLight.red * brightness); 18922f86ba45SStephan Aßmus borderBevelLight.green = uint8(borderBevelLight.green * brightness); 18932f86ba45SStephan Aßmus borderBevelLight.blue = uint8(borderBevelLight.blue * brightness); 18942f86ba45SStephan Aßmus } 18952f86ba45SStephan Aßmus 18962f86ba45SStephan Aßmus _DrawFrame(view, rect, borderBevelShadow, borderBevelShadow, 18972f86ba45SStephan Aßmus borderBevelLight, borderBevelLight, borders); 18982f86ba45SStephan Aßmus } 18994f579098SStephan Aßmus } 19002f86ba45SStephan Aßmus 19012f86ba45SStephan Aßmus 19022f86ba45SStephan Aßmus void 19032f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left, 19042f86ba45SStephan Aßmus const rgb_color& top, const rgb_color& right, const rgb_color& bottom, 19052f86ba45SStephan Aßmus uint32 borders) 19062f86ba45SStephan Aßmus { 19072f86ba45SStephan Aßmus view->BeginLineArray(4); 19082f86ba45SStephan Aßmus 19092f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 19102f86ba45SStephan Aßmus view->AddLine( 19112f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 19122f86ba45SStephan Aßmus BPoint(rect.left, rect.top), left); 19132f86ba45SStephan Aßmus rect.left++; 19142f86ba45SStephan Aßmus } 19152f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 19162f86ba45SStephan Aßmus view->AddLine( 19172f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 19182f86ba45SStephan Aßmus BPoint(rect.right, rect.top), top); 19192f86ba45SStephan Aßmus rect.top++; 19202f86ba45SStephan Aßmus } 19212f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 19222f86ba45SStephan Aßmus view->AddLine( 19232f86ba45SStephan Aßmus BPoint(rect.right, rect.top), 19242f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), right); 19252f86ba45SStephan Aßmus rect.right--; 19262f86ba45SStephan Aßmus } 19272f86ba45SStephan Aßmus if (borders & B_BOTTOM_BORDER) { 19282f86ba45SStephan Aßmus view->AddLine( 19292f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 19302f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), bottom); 19312f86ba45SStephan Aßmus rect.bottom--; 19322f86ba45SStephan Aßmus } 19332f86ba45SStephan Aßmus 19342f86ba45SStephan Aßmus view->EndLineArray(); 19352f86ba45SStephan Aßmus } 19362f86ba45SStephan Aßmus 19372f86ba45SStephan Aßmus 19382f86ba45SStephan Aßmus void 19392f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left, 19402f86ba45SStephan Aßmus const rgb_color& top, const rgb_color& right, const rgb_color& bottom, 19412f86ba45SStephan Aßmus const rgb_color& rightTop, const rgb_color& leftBottom, uint32 borders) 19422f86ba45SStephan Aßmus { 19432f86ba45SStephan Aßmus view->BeginLineArray(6); 19442f86ba45SStephan Aßmus 19452f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 19462f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 19472f86ba45SStephan Aßmus view->AddLine( 19482f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 19492f86ba45SStephan Aßmus BPoint(rect.right - 1, rect.top), top); 19502f86ba45SStephan Aßmus view->AddLine( 19512f86ba45SStephan Aßmus BPoint(rect.right, rect.top), 19522f86ba45SStephan Aßmus BPoint(rect.right, rect.top), rightTop); 19532f86ba45SStephan Aßmus } else { 19542f86ba45SStephan Aßmus view->AddLine( 19552f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 19562f86ba45SStephan Aßmus BPoint(rect.right, rect.top), top); 19572f86ba45SStephan Aßmus } 19582f86ba45SStephan Aßmus rect.top++; 19592f86ba45SStephan Aßmus } 19602f86ba45SStephan Aßmus 19612f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 19622f86ba45SStephan Aßmus view->AddLine( 19632f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 19642f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom - 1), left); 19652f86ba45SStephan Aßmus view->AddLine( 19662f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 19672f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), leftBottom); 19682f86ba45SStephan Aßmus rect.left++; 19692f86ba45SStephan Aßmus } 19702f86ba45SStephan Aßmus 19712f86ba45SStephan Aßmus if (borders & B_BOTTOM_BORDER) { 19722f86ba45SStephan Aßmus view->AddLine( 19732f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 19742f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), bottom); 19752f86ba45SStephan Aßmus rect.bottom--; 19762f86ba45SStephan Aßmus } 19772f86ba45SStephan Aßmus 19782f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 19792f86ba45SStephan Aßmus view->AddLine( 19802f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), 19812f86ba45SStephan Aßmus BPoint(rect.right, rect.top), right); 19822f86ba45SStephan Aßmus rect.right--; 19832f86ba45SStephan Aßmus } 19842f86ba45SStephan Aßmus 19852f86ba45SStephan Aßmus view->EndLineArray(); 19862f86ba45SStephan Aßmus } 19872f86ba45SStephan Aßmus 19882f86ba45SStephan Aßmus 19892f86ba45SStephan Aßmus //void 19902f86ba45SStephan Aßmus //BControlLook::_DrawShadowFrame(BView* view, BRect& rect, const rgb_color& base, 19912f86ba45SStephan Aßmus // uint32 borders) 19922f86ba45SStephan Aßmus //{ 19932f86ba45SStephan Aßmus // view->BeginLineArray(4); 19942f86ba45SStephan Aßmus // 19952f86ba45SStephan Aßmus // bevelColor1 = tint_color(base, 1.2); 19962f86ba45SStephan Aßmus // bevelColor2 = tint_color(base, 1.1); 19972f86ba45SStephan Aßmus // 19982f86ba45SStephan Aßmus // // shadow along left/top borders 19992f86ba45SStephan Aßmus // if (rect.Height() > 0 && borders & B_LEFT_BORDER) { 20002f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 20012f86ba45SStephan Aßmus // BPoint(rect.left, rect.bottom), bevelColor1); 20022f86ba45SStephan Aßmus // rect.left++; 20032f86ba45SStephan Aßmus // } 20042f86ba45SStephan Aßmus // if (rect.Width() > 0 && borders & B_TOP_BORDER) { 20052f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 20062f86ba45SStephan Aßmus // BPoint(rect.right, rect.top), bevelColor1); 20072f86ba45SStephan Aßmus // rect.top++; 20082f86ba45SStephan Aßmus // } 20092f86ba45SStephan Aßmus // 20102f86ba45SStephan Aßmus // // softer shadow along left/top borders 20112f86ba45SStephan Aßmus // if (rect.Height() > 0 && borders & B_LEFT_BORDER) { 20122f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 20132f86ba45SStephan Aßmus // BPoint(rect.left, rect.bottom), bevelColor2); 20142f86ba45SStephan Aßmus // rect.left++; 20152f86ba45SStephan Aßmus // } 20162f86ba45SStephan Aßmus // if (rect.Width() > 0 && borders & B_TOP_BORDER) { 20172f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 20182f86ba45SStephan Aßmus // BPoint(rect.right, rect.top), bevelColor2); 20192f86ba45SStephan Aßmus // rect.top++; 20202f86ba45SStephan Aßmus // } 20212f86ba45SStephan Aßmus // 20222f86ba45SStephan Aßmus // view->EndLineArray(); 20232f86ba45SStephan Aßmus //} 20242f86ba45SStephan Aßmus 20252f86ba45SStephan Aßmus 20262f86ba45SStephan Aßmus void 20272f86ba45SStephan Aßmus BControlLook::_FillGradient(BView* view, const BRect& rect, 20282f86ba45SStephan Aßmus const rgb_color& base, float topTint, float bottomTint, 20292f86ba45SStephan Aßmus enum orientation orientation) 20302f86ba45SStephan Aßmus { 20312f86ba45SStephan Aßmus BGradientLinear gradient; 20322f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint, orientation); 20332f86ba45SStephan Aßmus view->FillRect(rect, gradient); 20342f86ba45SStephan Aßmus } 20352f86ba45SStephan Aßmus 20362f86ba45SStephan Aßmus 20372f86ba45SStephan Aßmus void 20382f86ba45SStephan Aßmus BControlLook::_FillGlossyGradient(BView* view, const BRect& rect, 20392f86ba45SStephan Aßmus const rgb_color& base, float topTint, float middle1Tint, 20402f86ba45SStephan Aßmus float middle2Tint, float bottomTint, enum orientation orientation) 20412f86ba45SStephan Aßmus { 20422f86ba45SStephan Aßmus BGradientLinear gradient; 20432f86ba45SStephan Aßmus _MakeGlossyGradient(gradient, rect, base, topTint, middle1Tint, 20442f86ba45SStephan Aßmus middle2Tint, bottomTint, orientation); 20452f86ba45SStephan Aßmus view->FillRect(rect, gradient); 20462f86ba45SStephan Aßmus } 20472f86ba45SStephan Aßmus 20482f86ba45SStephan Aßmus 20492f86ba45SStephan Aßmus void 20502f86ba45SStephan Aßmus BControlLook::_MakeGradient(BGradientLinear& gradient, const BRect& rect, 20512f86ba45SStephan Aßmus const rgb_color& base, float topTint, float bottomTint, 20522f86ba45SStephan Aßmus enum orientation orientation) const 20532f86ba45SStephan Aßmus { 20542f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, topTint), 0); 20552f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, bottomTint), 255); 20562f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 20572f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 20582f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 20592f86ba45SStephan Aßmus else 20602f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 20612f86ba45SStephan Aßmus } 20622f86ba45SStephan Aßmus 20632f86ba45SStephan Aßmus 20642f86ba45SStephan Aßmus void 20652f86ba45SStephan Aßmus BControlLook::_MakeGlossyGradient(BGradientLinear& gradient, const BRect& rect, 20662f86ba45SStephan Aßmus const rgb_color& base, float topTint, float middle1Tint, 20672f86ba45SStephan Aßmus float middle2Tint, float bottomTint, 20682f86ba45SStephan Aßmus enum orientation orientation) const 20692f86ba45SStephan Aßmus { 20702f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, topTint), 0); 20712f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, middle1Tint), 132); 20722f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, middle2Tint), 136); 20732f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, bottomTint), 255); 20742f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 20752f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 20762f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 20772f86ba45SStephan Aßmus else 20782f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 20792f86ba45SStephan Aßmus } 20802f86ba45SStephan Aßmus 20812f86ba45SStephan Aßmus 20822f86ba45SStephan Aßmus bool 20832f86ba45SStephan Aßmus BControlLook::_RadioButtonAndCheckBoxMarkColor(const rgb_color& base, 20842f86ba45SStephan Aßmus rgb_color& color, uint32 flags) const 20852f86ba45SStephan Aßmus { 20862f86ba45SStephan Aßmus if ((flags & (B_ACTIVATED | B_CLICKED)) == 0) { 20872f86ba45SStephan Aßmus // no mark to be drawn at all 20882f86ba45SStephan Aßmus return false; 20892f86ba45SStephan Aßmus } 20902f86ba45SStephan Aßmus 20912f86ba45SStephan Aßmus // TODO: Get from UI settings 20922f86ba45SStephan Aßmus color.red = 27; 20932f86ba45SStephan Aßmus color.green = 82; 20942f86ba45SStephan Aßmus color.blue = 140; 20952f86ba45SStephan Aßmus 20962f86ba45SStephan Aßmus float mix = 1.0; 20972f86ba45SStephan Aßmus 20982f86ba45SStephan Aßmus if (flags & B_DISABLED) { 20992f86ba45SStephan Aßmus // activated, but disabled 21002f86ba45SStephan Aßmus mix = 0.4; 21012f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 21022f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 21032f86ba45SStephan Aßmus // loosing activation 21042f86ba45SStephan Aßmus mix = 0.7; 21052f86ba45SStephan Aßmus } else { 21062f86ba45SStephan Aßmus // becoming activated 21072f86ba45SStephan Aßmus mix = 0.3; 21082f86ba45SStephan Aßmus } 21092f86ba45SStephan Aßmus } else { 21102f86ba45SStephan Aßmus // simply activated 21112f86ba45SStephan Aßmus } 21122f86ba45SStephan Aßmus 21132f86ba45SStephan Aßmus color.red = uint8(color.red * mix + base.red * (1.0 - mix)); 21142f86ba45SStephan Aßmus color.green = uint8(color.green * mix + base.green * (1.0 - mix)); 21152f86ba45SStephan Aßmus color.blue = uint8(color.blue * mix + base.blue * (1.0 - mix)); 21162f86ba45SStephan Aßmus 21172f86ba45SStephan Aßmus return true; 21182f86ba45SStephan Aßmus } 21192f86ba45SStephan Aßmus 21202f86ba45SStephan Aßmus 21212f86ba45SStephan Aßmus void 21222f86ba45SStephan Aßmus BControlLook::_DrawRoundBarCorner(BView* view, BRect& rect, 21232f86ba45SStephan Aßmus const BRect& updateRect, 21242f86ba45SStephan Aßmus const rgb_color& edgeLightColor, const rgb_color& edgeShadowColor, 21252f86ba45SStephan Aßmus const rgb_color& frameLightColor, const rgb_color& frameShadowColor, 21262f86ba45SStephan Aßmus const rgb_color& fillLightColor, const rgb_color& fillShadowColor, 21272f86ba45SStephan Aßmus float leftInset, float topInset, float rightInset, float bottomInset, 21282f86ba45SStephan Aßmus enum orientation orientation) 21292f86ba45SStephan Aßmus { 21302f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 21312f86ba45SStephan Aßmus return; 21322f86ba45SStephan Aßmus 21332f86ba45SStephan Aßmus BGradientLinear gradient; 21342f86ba45SStephan Aßmus gradient.AddColor(edgeShadowColor, 0); 21352f86ba45SStephan Aßmus gradient.AddColor(edgeLightColor, 255); 21362f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 21372f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 21382f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 21392f86ba45SStephan Aßmus else 21402f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 21412f86ba45SStephan Aßmus 21422f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 21432f86ba45SStephan Aßmus 21442f86ba45SStephan Aßmus rect.left += leftInset; 21452f86ba45SStephan Aßmus rect.top += topInset; 21462f86ba45SStephan Aßmus rect.right += rightInset; 21472f86ba45SStephan Aßmus rect.bottom += bottomInset; 21482f86ba45SStephan Aßmus 21492f86ba45SStephan Aßmus gradient.MakeEmpty(); 21502f86ba45SStephan Aßmus gradient.AddColor(frameShadowColor, 0); 21512f86ba45SStephan Aßmus gradient.AddColor(frameLightColor, 255); 21522f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 21532f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 21542f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 21552f86ba45SStephan Aßmus else 21562f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 21572f86ba45SStephan Aßmus 21582f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 21592f86ba45SStephan Aßmus 21602f86ba45SStephan Aßmus rect.left += leftInset; 21612f86ba45SStephan Aßmus rect.top += topInset; 21622f86ba45SStephan Aßmus rect.right += rightInset; 21632f86ba45SStephan Aßmus rect.bottom += bottomInset; 21642f86ba45SStephan Aßmus 21652f86ba45SStephan Aßmus gradient.MakeEmpty(); 21662f86ba45SStephan Aßmus gradient.AddColor(fillShadowColor, 0); 21672f86ba45SStephan Aßmus gradient.AddColor(fillLightColor, 255); 21682f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 21692f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 21702f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 21712f86ba45SStephan Aßmus else 21722f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 21732f86ba45SStephan Aßmus 21742f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 21752f86ba45SStephan Aßmus } 21762f86ba45SStephan Aßmus 21772f86ba45SStephan Aßmus 21782f86ba45SStephan Aßmus void 21792f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerLeftTop(BView* view, BRect& rect, 21802f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& edgeColor, 21812f86ba45SStephan Aßmus const rgb_color& frameColor, const rgb_color& bevelColor, 21822f86ba45SStephan Aßmus const BGradientLinear& fillGradient) 21832f86ba45SStephan Aßmus { 21842f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 21852f86ba45SStephan Aßmus return; 21862f86ba45SStephan Aßmus 21872f86ba45SStephan Aßmus BRegion clipping(rect); 21882f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 21892f86ba45SStephan Aßmus 21902f86ba45SStephan Aßmus // background 21912f86ba45SStephan Aßmus view->SetHighColor(base); 21922f86ba45SStephan Aßmus view->FillRect(rect); 21932f86ba45SStephan Aßmus 21942f86ba45SStephan Aßmus // outer edge 21952f86ba45SStephan Aßmus BRect ellipseRect(rect); 21962f86ba45SStephan Aßmus ellipseRect.right = ellipseRect.left + ellipseRect.Width() * 2; 21972f86ba45SStephan Aßmus ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2; 21982f86ba45SStephan Aßmus 21992f86ba45SStephan Aßmus view->SetHighColor(edgeColor); 22002f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 22012f86ba45SStephan Aßmus 22022f86ba45SStephan Aßmus // frame 22032f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 22042f86ba45SStephan Aßmus view->SetHighColor(frameColor); 22052f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 22062f86ba45SStephan Aßmus 22072f86ba45SStephan Aßmus // bevel 22082f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 22092f86ba45SStephan Aßmus view->SetHighColor(bevelColor); 22102f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 22112f86ba45SStephan Aßmus 22122f86ba45SStephan Aßmus // fill 22132f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 22142f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, fillGradient); 22152f86ba45SStephan Aßmus 22162f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 22172f86ba45SStephan Aßmus } 22182f86ba45SStephan Aßmus 22192f86ba45SStephan Aßmus void 22202f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerRightTop(BView* view, BRect& rect, 22212f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, 22222f86ba45SStephan Aßmus const rgb_color& edgeTopColor, const rgb_color& edgeRightColor, 22232f86ba45SStephan Aßmus const rgb_color& frameTopColor, const rgb_color& frameRightColor, 22242f86ba45SStephan Aßmus const rgb_color& bevelTopColor, const rgb_color& bevelRightColor, 22252f86ba45SStephan Aßmus const BGradientLinear& fillGradient) 22262f86ba45SStephan Aßmus { 22272f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 22282f86ba45SStephan Aßmus return; 22292f86ba45SStephan Aßmus 22302f86ba45SStephan Aßmus BRegion clipping(rect); 22312f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 22322f86ba45SStephan Aßmus 22332f86ba45SStephan Aßmus // background 22342f86ba45SStephan Aßmus view->SetHighColor(base); 22352f86ba45SStephan Aßmus view->FillRect(rect); 22362f86ba45SStephan Aßmus 22372f86ba45SStephan Aßmus // outer edge 22382f86ba45SStephan Aßmus BRect ellipseRect(rect); 22392f86ba45SStephan Aßmus ellipseRect.left = ellipseRect.right - ellipseRect.Width() * 2; 22402f86ba45SStephan Aßmus ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2; 22412f86ba45SStephan Aßmus 22422f86ba45SStephan Aßmus BGradientLinear gradient; 22432f86ba45SStephan Aßmus gradient.AddColor(edgeTopColor, 0); 22442f86ba45SStephan Aßmus gradient.AddColor(edgeRightColor, 255); 22452f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 22462f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 22472f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 22482f86ba45SStephan Aßmus 22492f86ba45SStephan Aßmus // frame 22502f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 22512f86ba45SStephan Aßmus rect.right--; 22522f86ba45SStephan Aßmus rect.top++; 22532f86ba45SStephan Aßmus if (frameTopColor == frameRightColor) { 22542f86ba45SStephan Aßmus view->SetHighColor(frameTopColor); 22552f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 22562f86ba45SStephan Aßmus } else { 22572f86ba45SStephan Aßmus gradient.SetColor(0, frameTopColor); 22582f86ba45SStephan Aßmus gradient.SetColor(1, frameRightColor); 22592f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 22602f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 22612f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 22622f86ba45SStephan Aßmus } 22632f86ba45SStephan Aßmus 22642f86ba45SStephan Aßmus // bevel 22652f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 22662f86ba45SStephan Aßmus rect.right--; 22672f86ba45SStephan Aßmus rect.top++; 22682f86ba45SStephan Aßmus gradient.SetColor(0, bevelTopColor); 22692f86ba45SStephan Aßmus gradient.SetColor(1, bevelRightColor); 22702f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 22712f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 22722f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 22732f86ba45SStephan Aßmus 22742f86ba45SStephan Aßmus // fill 22752f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 22762f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, fillGradient); 22772f86ba45SStephan Aßmus 22782f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 22792f86ba45SStephan Aßmus } 22802f86ba45SStephan Aßmus 22812f86ba45SStephan Aßmus 22822f86ba45SStephan Aßmus // NOTE: May come from a add-on in the future. Initialized in 22832f86ba45SStephan Aßmus // InterfaceDefs.cpp 22842f86ba45SStephan Aßmus BControlLook* be_control_look = NULL; 22852f86ba45SStephan Aßmus 22862f86ba45SStephan Aßmus } // namespace BPrivate 2287