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 */ 5*d452ff66SAxel Dörfler 6*d452ff66SAxel Dörfler 72f86ba45SStephan Aßmus #include <ControlLook.h> 82f86ba45SStephan Aßmus 9d63b75faSPhilippe Saint-Pierre #include "ContainerWindow.h" 10d63b75faSPhilippe Saint-Pierre 112f86ba45SStephan Aßmus #include <stdio.h> 122f86ba45SStephan Aßmus 132f86ba45SStephan Aßmus #include <Control.h> 142f86ba45SStephan Aßmus #include <GradientLinear.h> 152f86ba45SStephan Aßmus #include <Region.h> 162f86ba45SStephan Aßmus #include <Shape.h> 172f86ba45SStephan Aßmus #include <String.h> 182f86ba45SStephan Aßmus #include <View.h> 19d63b75faSPhilippe Saint-Pierre #include <Window.h> 202f86ba45SStephan Aßmus 212f86ba45SStephan Aßmus namespace BPrivate { 222f86ba45SStephan Aßmus 232f86ba45SStephan Aßmus static const float kEdgeBevelLightTint = 0.59; 242f86ba45SStephan Aßmus static const float kEdgeBevelShadowTint = 1.0735; 25d63b75faSPhilippe Saint-Pierre const rgb_color kWhite = (rgb_color){255, 255, 255, 255}; 26d63b75faSPhilippe Saint-Pierre const rgb_color kBlack = (rgb_color){0, 0, 0, 255}; 272f86ba45SStephan Aßmus 282f86ba45SStephan Aßmus 29d63b75faSPhilippe Saint-Pierre BControlLook::BControlLook(): 30d63b75faSPhilippe Saint-Pierre fCachedOutline(false), 31d63b75faSPhilippe Saint-Pierre fCachedWorkspace(-1) 322f86ba45SStephan Aßmus { 332f86ba45SStephan Aßmus } 342f86ba45SStephan Aßmus 352f86ba45SStephan Aßmus 362f86ba45SStephan Aßmus BControlLook::~BControlLook() 372f86ba45SStephan Aßmus { 382f86ba45SStephan Aßmus } 392f86ba45SStephan Aßmus 402f86ba45SStephan Aßmus 412f86ba45SStephan Aßmus BAlignment 422f86ba45SStephan Aßmus BControlLook::DefaultLabelAlignment() const 432f86ba45SStephan Aßmus { 442f86ba45SStephan Aßmus return BAlignment(B_ALIGN_LEFT, B_ALIGN_VERTICAL_CENTER); 452f86ba45SStephan Aßmus } 462f86ba45SStephan Aßmus 472f86ba45SStephan Aßmus 482f86ba45SStephan Aßmus float 492f86ba45SStephan Aßmus BControlLook::DefaultLabelSpacing() const 502f86ba45SStephan Aßmus { 5120a11271SAxel Dörfler return ceilf(be_plain_font->Size() / 2.0); 5220a11271SAxel Dörfler } 5320a11271SAxel Dörfler 5420a11271SAxel Dörfler 5520a11271SAxel Dörfler float 5620a11271SAxel Dörfler BControlLook::DefaultItemSpacing() const 5720a11271SAxel Dörfler { 5820a11271SAxel Dörfler return ceilf(be_plain_font->Size() * 0.85); 592f86ba45SStephan Aßmus } 602f86ba45SStephan Aßmus 612f86ba45SStephan Aßmus 6282ab3167SAlex Wilson float 636648dd3cSAlex Wilson BControlLook::ComposeSpacing(float spacing) 6482ab3167SAlex Wilson { 65d90a465eSAlex Wilson if (spacing == B_USE_DEFAULT_SPACING || spacing == B_USE_ITEM_SPACING) { 6682ab3167SAlex Wilson return be_control_look->DefaultItemSpacing(); 676648dd3cSAlex Wilson } else if (spacing == B_USE_HALF_ITEM_SPACING) { 686648dd3cSAlex Wilson return be_control_look->DefaultItemSpacing() * 0.5f; 696648dd3cSAlex Wilson } else if (spacing == B_USE_WINDOW_INSETS) { 706648dd3cSAlex Wilson return be_control_look->DefaultItemSpacing(); 716648dd3cSAlex Wilson } else if (spacing == B_USE_SMALL_SPACING) { 726648dd3cSAlex Wilson return be_control_look->DefaultItemSpacing() * 0.7f; 736648dd3cSAlex Wilson } else if (spacing == B_USE_BIG_SPACING) { 746648dd3cSAlex Wilson return be_control_look->DefaultItemSpacing() * 1.3f; 756648dd3cSAlex Wilson } 766648dd3cSAlex Wilson return spacing; 7782ab3167SAlex Wilson } 7882ab3167SAlex Wilson 7982ab3167SAlex Wilson 802f86ba45SStephan Aßmus uint32 812f86ba45SStephan Aßmus BControlLook::Flags(BControl* control) const 822f86ba45SStephan Aßmus { 832f86ba45SStephan Aßmus uint32 flags = 0; 842f86ba45SStephan Aßmus 852f86ba45SStephan Aßmus if (!control->IsEnabled()) 862f86ba45SStephan Aßmus flags |= B_DISABLED; 872f86ba45SStephan Aßmus 882f86ba45SStephan Aßmus if (control->IsFocus()) 892f86ba45SStephan Aßmus flags |= B_FOCUSED; 902f86ba45SStephan Aßmus 912f86ba45SStephan Aßmus if (control->Value() == B_CONTROL_ON) 922f86ba45SStephan Aßmus flags |= B_ACTIVATED; 932f86ba45SStephan Aßmus 9461ac1a85SStephan Aßmus if (control->Parent() != NULL 9561ac1a85SStephan Aßmus && (control->Parent()->Flags() & B_DRAW_ON_CHILDREN) != 0) { 9661ac1a85SStephan Aßmus // In this constellation, assume we want to render the control 9761ac1a85SStephan Aßmus // against the already existing view contents of the parent view. 9861ac1a85SStephan Aßmus flags |= B_BLEND_FRAME; 9961ac1a85SStephan Aßmus } 10061ac1a85SStephan Aßmus 1012f86ba45SStephan Aßmus return flags; 1022f86ba45SStephan Aßmus } 1032f86ba45SStephan Aßmus 1042f86ba45SStephan Aßmus 1052f86ba45SStephan Aßmus // #pragma mark - 1062f86ba45SStephan Aßmus 1072f86ba45SStephan Aßmus 1082f86ba45SStephan Aßmus void 1092f86ba45SStephan Aßmus BControlLook::DrawButtonFrame(BView* view, BRect& rect, const BRect& updateRect, 110681c2e44SStephan Aßmus const rgb_color& base, const rgb_color& background, uint32 flags, 111681c2e44SStephan Aßmus uint32 borders) 1122f86ba45SStephan Aßmus { 113681c2e44SStephan Aßmus _DrawButtonFrame(view, rect, updateRect, base, background, 1.0, 1.0, flags, 114681c2e44SStephan Aßmus borders); 1152f86ba45SStephan Aßmus } 1162f86ba45SStephan Aßmus 1172f86ba45SStephan Aßmus 1182f86ba45SStephan Aßmus void 1192f86ba45SStephan Aßmus BControlLook::DrawButtonBackground(BView* view, BRect& rect, 1202f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 1212f86ba45SStephan Aßmus uint32 borders, enum orientation orientation) 1222f86ba45SStephan Aßmus { 1232f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 1242f86ba45SStephan Aßmus return; 1252f86ba45SStephan Aßmus 1262f86ba45SStephan Aßmus // the surface edges 1272f86ba45SStephan Aßmus 1282f86ba45SStephan Aßmus // colors 1292f86ba45SStephan Aßmus rgb_color buttonBgColor = tint_color(base, B_LIGHTEN_1_TINT); 1302f86ba45SStephan Aßmus rgb_color maxLightColor; 1312f86ba45SStephan Aßmus 1322f86ba45SStephan Aßmus rgb_color bevelColor1; 1332f86ba45SStephan Aßmus rgb_color bevelColor2; 1342f86ba45SStephan Aßmus 1352f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0) { 1362f86ba45SStephan Aßmus maxLightColor = tint_color(base, 0.2); 1372f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 1.08); 1382f86ba45SStephan Aßmus bevelColor2 = base; 1392f86ba45SStephan Aßmus } else { 1402f86ba45SStephan Aßmus maxLightColor = tint_color(base, 0.7); 1412f86ba45SStephan Aßmus bevelColor1 = base; 1422f86ba45SStephan Aßmus bevelColor2 = buttonBgColor; 1432f86ba45SStephan Aßmus buttonBgColor = maxLightColor; 1442f86ba45SStephan Aßmus } 1452f86ba45SStephan Aßmus 1462f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 1472f86ba45SStephan Aßmus view->BeginLineArray(4); 1482f86ba45SStephan Aßmus 1492f86ba45SStephan Aßmus bevelColor1 = tint_color(bevelColor1, B_DARKEN_1_TINT); 1502f86ba45SStephan Aßmus bevelColor2 = tint_color(bevelColor2, B_DARKEN_1_TINT); 1512f86ba45SStephan Aßmus 1522f86ba45SStephan Aßmus // shadow along left/top borders 1532f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 1542f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1552f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), bevelColor1); 1562f86ba45SStephan Aßmus rect.left++; 1572f86ba45SStephan Aßmus } 1582f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 1592f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1602f86ba45SStephan Aßmus BPoint(rect.right, rect.top), bevelColor1); 1612f86ba45SStephan Aßmus rect.top++; 1622f86ba45SStephan Aßmus } 1632f86ba45SStephan Aßmus 1642f86ba45SStephan Aßmus // softer shadow along left/top borders 1652f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 1662f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1672f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), bevelColor2); 1682f86ba45SStephan Aßmus rect.left++; 1692f86ba45SStephan Aßmus } 1702f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 1712f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, rect.top), 1722f86ba45SStephan Aßmus BPoint(rect.right, rect.top), bevelColor2); 1732f86ba45SStephan Aßmus rect.top++; 1742f86ba45SStephan Aßmus } 1752f86ba45SStephan Aßmus 1762f86ba45SStephan Aßmus view->EndLineArray(); 1772f86ba45SStephan Aßmus } else { 1782f86ba45SStephan Aßmus _DrawFrame(view, rect, 1792f86ba45SStephan Aßmus maxLightColor, maxLightColor, 1802f86ba45SStephan Aßmus bevelColor1, bevelColor1, 1812f86ba45SStephan Aßmus buttonBgColor, buttonBgColor, borders); 1822f86ba45SStephan Aßmus } 1832f86ba45SStephan Aßmus 1842f86ba45SStephan Aßmus // the actual surface top 1852f86ba45SStephan Aßmus 1862f86ba45SStephan Aßmus float topTint = 0.49; 1872f86ba45SStephan Aßmus float middleTint1 = 0.62; 1882f86ba45SStephan Aßmus float middleTint2 = 0.76; 1892f86ba45SStephan Aßmus float bottomTint = 0.90; 1902f86ba45SStephan Aßmus 1912f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 1922f86ba45SStephan Aßmus topTint = 1.11; 1932f86ba45SStephan Aßmus bottomTint = 1.08; 1942f86ba45SStephan Aßmus } 1952f86ba45SStephan Aßmus 1962f86ba45SStephan Aßmus if (flags & B_DISABLED) { 1972f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 1982f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 1992f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 2002f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 2012f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 2022f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 2032f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 2042f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 2052f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 2062f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 2072f86ba45SStephan Aßmus } 2082f86ba45SStephan Aßmus 2092f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 2102f86ba45SStephan Aßmus _FillGradient(view, rect, base, topTint, bottomTint, orientation); 2112f86ba45SStephan Aßmus } else { 2122f86ba45SStephan Aßmus _FillGlossyGradient(view, rect, base, topTint, middleTint1, 2132f86ba45SStephan Aßmus middleTint2, bottomTint, orientation); 2142f86ba45SStephan Aßmus } 2152f86ba45SStephan Aßmus } 2162f86ba45SStephan Aßmus 2172f86ba45SStephan Aßmus 2182f86ba45SStephan Aßmus void 2192f86ba45SStephan Aßmus BControlLook::DrawMenuBarBackground(BView* view, BRect& rect, 2201a72cb41SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 2211a72cb41SStephan Aßmus uint32 borders) 2222f86ba45SStephan Aßmus { 2232f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 2242f86ba45SStephan Aßmus return; 2252f86ba45SStephan Aßmus 2262f86ba45SStephan Aßmus // the surface edges 2272f86ba45SStephan Aßmus 2282f86ba45SStephan Aßmus // colors 2291a72cb41SStephan Aßmus float topTint; 2301a72cb41SStephan Aßmus float bottomTint; 2311a72cb41SStephan Aßmus 2321a72cb41SStephan Aßmus if (flags & B_ACTIVATED) { 2331a72cb41SStephan Aßmus rgb_color bevelColor1 = tint_color(base, 1.40); 2341a72cb41SStephan Aßmus rgb_color bevelColor2 = tint_color(base, 1.25); 2351a72cb41SStephan Aßmus 2361a72cb41SStephan Aßmus topTint = 1.25; 2371a72cb41SStephan Aßmus bottomTint = 1.20; 2382f86ba45SStephan Aßmus 2392f86ba45SStephan Aßmus _DrawFrame(view, rect, 2401a72cb41SStephan Aßmus bevelColor1, bevelColor1, 2411a72cb41SStephan Aßmus bevelColor2, bevelColor2, 2421a72cb41SStephan Aßmus borders & B_TOP_BORDER); 2431a72cb41SStephan Aßmus } else { 2441a72cb41SStephan Aßmus rgb_color cornerColor = tint_color(base, 0.9); 2451a72cb41SStephan Aßmus rgb_color bevelColorTop = tint_color(base, 0.5); 2461a72cb41SStephan Aßmus rgb_color bevelColorLeft = tint_color(base, 0.7); 2471a72cb41SStephan Aßmus rgb_color bevelColorRightBottom = tint_color(base, 1.08); 2481a72cb41SStephan Aßmus 2491a72cb41SStephan Aßmus topTint = 0.69; 2501a72cb41SStephan Aßmus bottomTint = 1.03; 2511a72cb41SStephan Aßmus 2521a72cb41SStephan Aßmus _DrawFrame(view, rect, 2531a72cb41SStephan Aßmus bevelColorLeft, bevelColorTop, 2541a72cb41SStephan Aßmus bevelColorRightBottom, bevelColorRightBottom, 2552f86ba45SStephan Aßmus cornerColor, cornerColor, 2562f86ba45SStephan Aßmus borders); 2571a72cb41SStephan Aßmus } 2582f86ba45SStephan Aßmus 2592f86ba45SStephan Aßmus // the actual surface top 2602f86ba45SStephan Aßmus 2612f86ba45SStephan Aßmus _FillGradient(view, rect, base, topTint, bottomTint); 2622f86ba45SStephan Aßmus } 2632f86ba45SStephan Aßmus 2642f86ba45SStephan Aßmus 2652f86ba45SStephan Aßmus void 266681c2e44SStephan Aßmus BControlLook::DrawMenuFieldFrame(BView* view, BRect& rect, 267681c2e44SStephan Aßmus const BRect& updateRect, const rgb_color& base, 268681c2e44SStephan Aßmus const rgb_color& background, uint32 flags, uint32 borders) 26913cd46dfSStephan Aßmus { 270681c2e44SStephan Aßmus _DrawButtonFrame(view, rect, updateRect, base, background, 0.6, 1.0, flags, 271681c2e44SStephan Aßmus borders); 27213cd46dfSStephan Aßmus } 27313cd46dfSStephan Aßmus 27413cd46dfSStephan Aßmus 27513cd46dfSStephan Aßmus void 2762f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect, 2772f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, bool popupIndicator, 2782f86ba45SStephan Aßmus uint32 flags) 2792f86ba45SStephan Aßmus { 2802f86ba45SStephan Aßmus if (popupIndicator) { 2812f86ba45SStephan Aßmus BRect leftRect(rect); 2822f86ba45SStephan Aßmus leftRect.right -= 10; 2832f86ba45SStephan Aßmus 2842f86ba45SStephan Aßmus BRect rightRect(rect); 2852f86ba45SStephan Aßmus rightRect.left = rightRect.right - 9; 2862f86ba45SStephan Aßmus 2872f86ba45SStephan Aßmus DrawMenuFieldBackground(view, leftRect, updateRect, base, flags, 2882f86ba45SStephan Aßmus B_LEFT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER); 2892f86ba45SStephan Aßmus 2902f86ba45SStephan Aßmus rgb_color indicatorBase; 2912f86ba45SStephan Aßmus rgb_color markColor; 2922f86ba45SStephan Aßmus if (flags & B_DISABLED) { 2932f86ba45SStephan Aßmus indicatorBase = tint_color(base, 1.05); 29413cd46dfSStephan Aßmus markColor = tint_color(base, 1.35); 2952f86ba45SStephan Aßmus } else { 29613cd46dfSStephan Aßmus indicatorBase = tint_color(base, 1.12); 29713cd46dfSStephan Aßmus markColor = tint_color(base, 1.65); 2982f86ba45SStephan Aßmus } 2992f86ba45SStephan Aßmus 3002f86ba45SStephan Aßmus DrawMenuFieldBackground(view, rightRect, updateRect, indicatorBase, 3012f86ba45SStephan Aßmus flags, B_RIGHT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER); 3022f86ba45SStephan Aßmus 3032f86ba45SStephan Aßmus // popup marker 3042f86ba45SStephan Aßmus BPoint center(roundf((rightRect.left + rightRect.right) / 2.0), 3052f86ba45SStephan Aßmus roundf((rightRect.top + rightRect.bottom) / 2.0)); 3062f86ba45SStephan Aßmus BPoint triangle[3]; 3072f86ba45SStephan Aßmus triangle[0] = center + BPoint(-2.5, -0.5); 3082f86ba45SStephan Aßmus triangle[1] = center + BPoint(2.5, -0.5); 3092f86ba45SStephan Aßmus triangle[2] = center + BPoint(0.0, 2.0); 3102f86ba45SStephan Aßmus 3112f86ba45SStephan Aßmus uint32 viewFlags = view->Flags(); 3122f86ba45SStephan Aßmus view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE); 3132f86ba45SStephan Aßmus 3142f86ba45SStephan Aßmus view->SetHighColor(markColor); 3152f86ba45SStephan Aßmus view->FillTriangle(triangle[0], triangle[1], triangle[2]); 3162f86ba45SStephan Aßmus 3172f86ba45SStephan Aßmus view->SetFlags(viewFlags); 3182f86ba45SStephan Aßmus 3192f86ba45SStephan Aßmus rect = leftRect; 3202f86ba45SStephan Aßmus } else { 3212f86ba45SStephan Aßmus DrawMenuFieldBackground(view, rect, updateRect, base, flags); 3222f86ba45SStephan Aßmus } 3232f86ba45SStephan Aßmus } 3242f86ba45SStephan Aßmus 3252f86ba45SStephan Aßmus void 3262f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect, 3272f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 3282f86ba45SStephan Aßmus uint32 borders) 3292f86ba45SStephan Aßmus { 3302f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 3312f86ba45SStephan Aßmus return; 3322f86ba45SStephan Aßmus 3332f86ba45SStephan Aßmus // the surface edges 3342f86ba45SStephan Aßmus 3352f86ba45SStephan Aßmus // colors 3362f86ba45SStephan Aßmus rgb_color cornerColor = tint_color(base, 0.85); 3372f86ba45SStephan Aßmus rgb_color bevelColor1 = tint_color(base, 0.3); 3382f86ba45SStephan Aßmus rgb_color bevelColor2 = tint_color(base, 0.5); 3392f86ba45SStephan Aßmus rgb_color bevelColor3 = tint_color(base, 1.03); 3402f86ba45SStephan Aßmus 3412f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3422f86ba45SStephan Aßmus cornerColor = tint_color(base, 0.8); 3432f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 0.7); 3442f86ba45SStephan Aßmus bevelColor2 = tint_color(base, 0.8); 3452f86ba45SStephan Aßmus bevelColor3 = tint_color(base, 1.01); 3462f86ba45SStephan Aßmus } else { 3472f86ba45SStephan Aßmus cornerColor = tint_color(base, 0.85); 3482f86ba45SStephan Aßmus bevelColor1 = tint_color(base, 0.3); 3492f86ba45SStephan Aßmus bevelColor2 = tint_color(base, 0.5); 3502f86ba45SStephan Aßmus bevelColor3 = tint_color(base, 1.03); 3512f86ba45SStephan Aßmus } 3522f86ba45SStephan Aßmus 3532f86ba45SStephan Aßmus _DrawFrame(view, rect, 3542f86ba45SStephan Aßmus bevelColor2, bevelColor1, 3552f86ba45SStephan Aßmus bevelColor3, bevelColor3, 3562f86ba45SStephan Aßmus cornerColor, cornerColor, 3572f86ba45SStephan Aßmus borders); 3582f86ba45SStephan Aßmus 3592f86ba45SStephan Aßmus // the actual surface top 3602f86ba45SStephan Aßmus 3612f86ba45SStephan Aßmus float topTint = 0.49; 3622f86ba45SStephan Aßmus float middleTint1 = 0.62; 3632f86ba45SStephan Aßmus float middleTint2 = 0.76; 3642f86ba45SStephan Aßmus float bottomTint = 0.90; 3652f86ba45SStephan Aßmus 3662f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3672f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 3682f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 3692f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 3702f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 3712f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 3722f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 3732f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 3742f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 3752f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 3762f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 3772f86ba45SStephan Aßmus } 3782f86ba45SStephan Aßmus 3792f86ba45SStephan Aßmus _FillGlossyGradient(view, rect, base, topTint, middleTint1, 3802f86ba45SStephan Aßmus middleTint2, bottomTint); 3812f86ba45SStephan Aßmus } 3822f86ba45SStephan Aßmus 3832f86ba45SStephan Aßmus void 3842f86ba45SStephan Aßmus BControlLook::DrawMenuBackground(BView* view, BRect& rect, 3852f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 3862f86ba45SStephan Aßmus uint32 borders) 3872f86ba45SStephan Aßmus { 3882f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 3892f86ba45SStephan Aßmus return; 3902f86ba45SStephan Aßmus 3912f86ba45SStephan Aßmus // the surface edges 3922f86ba45SStephan Aßmus 3932f86ba45SStephan Aßmus rgb_color bevelLightColor; 3942f86ba45SStephan Aßmus rgb_color bevelShadowColor; 3952f86ba45SStephan Aßmus rgb_color background = tint_color(base, 0.75); 3962f86ba45SStephan Aßmus 3972f86ba45SStephan Aßmus if (flags & B_DISABLED) { 3982f86ba45SStephan Aßmus bevelLightColor = tint_color(background, 0.80); 3992f86ba45SStephan Aßmus bevelShadowColor = tint_color(background, 1.07); 4002f86ba45SStephan Aßmus } else { 4012f86ba45SStephan Aßmus bevelLightColor = tint_color(background, 0.6); 4022f86ba45SStephan Aßmus bevelShadowColor = tint_color(background, 1.12); 4032f86ba45SStephan Aßmus } 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->SetHighColor(background); 4132f86ba45SStephan Aßmus view->FillRect(rect); 4142f86ba45SStephan Aßmus } 4152f86ba45SStephan Aßmus 4162f86ba45SStephan Aßmus 4172f86ba45SStephan Aßmus void 4182f86ba45SStephan Aßmus BControlLook::DrawMenuItemBackground(BView* view, BRect& rect, 4192f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 4202f86ba45SStephan Aßmus uint32 borders) 4212f86ba45SStephan Aßmus { 4222f86ba45SStephan Aßmus if (!rect.IsValid() || !updateRect.Intersects(rect)) 4232f86ba45SStephan Aßmus return; 4242f86ba45SStephan Aßmus 4252f86ba45SStephan Aßmus // the surface edges 4262f86ba45SStephan Aßmus 4272f86ba45SStephan Aßmus float topTint; 4282f86ba45SStephan Aßmus float bottomTint; 4292f86ba45SStephan Aßmus rgb_color selectedColor = base; 4302f86ba45SStephan Aßmus 4312f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 4322f86ba45SStephan Aßmus topTint = 0.9; 4332f86ba45SStephan Aßmus bottomTint = 1.05; 4342f86ba45SStephan Aßmus selectedColor = tint_color(base, 1.26); 4352f86ba45SStephan Aßmus } else if (flags & B_DISABLED) { 4362f86ba45SStephan Aßmus topTint = 0.80; 4372f86ba45SStephan Aßmus bottomTint = 1.07; 4382f86ba45SStephan Aßmus } else { 4392f86ba45SStephan Aßmus topTint = 0.6; 4402f86ba45SStephan Aßmus bottomTint = 1.12; 4412f86ba45SStephan Aßmus } 4422f86ba45SStephan Aßmus 4432f86ba45SStephan Aßmus rgb_color bevelLightColor = tint_color(selectedColor, topTint); 4442f86ba45SStephan Aßmus rgb_color bevelShadowColor = tint_color(selectedColor, bottomTint); 4452f86ba45SStephan Aßmus 4462f86ba45SStephan Aßmus _DrawFrame(view, rect, 4472f86ba45SStephan Aßmus bevelLightColor, bevelLightColor, 4482f86ba45SStephan Aßmus bevelShadowColor, bevelShadowColor, 4492f86ba45SStephan Aßmus borders); 4502f86ba45SStephan Aßmus 4512f86ba45SStephan Aßmus // the actual surface top 4522f86ba45SStephan Aßmus 4532f86ba45SStephan Aßmus view->SetLowColor(selectedColor); 4542f86ba45SStephan Aßmus // _FillGradient(view, rect, selectedColor, topTint, bottomTint); 4552f86ba45SStephan Aßmus _FillGradient(view, rect, selectedColor, bottomTint, topTint); 4562f86ba45SStephan Aßmus } 4572f86ba45SStephan Aßmus 4582f86ba45SStephan Aßmus 4592f86ba45SStephan Aßmus void 4602f86ba45SStephan Aßmus BControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect, 4612f86ba45SStephan Aßmus const rgb_color& base, const rgb_color& barColor, float progressPosition) 4622f86ba45SStephan Aßmus { 4632f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 4642f86ba45SStephan Aßmus return; 4652f86ba45SStephan Aßmus 4662f86ba45SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6); 4672f86ba45SStephan Aßmus 4682f86ba45SStephan Aßmus // colors 4692f86ba45SStephan Aßmus rgb_color dark1BorderColor = tint_color(base, 1.3); 4702f86ba45SStephan Aßmus rgb_color dark2BorderColor = tint_color(base, 1.2); 4712f86ba45SStephan Aßmus rgb_color dark1FilledBorderColor = tint_color(barColor, 1.20); 4722f86ba45SStephan Aßmus rgb_color dark2FilledBorderColor = tint_color(barColor, 1.45); 4732f86ba45SStephan Aßmus 4742f86ba45SStephan Aßmus BRect filledRect(rect); 4752f86ba45SStephan Aßmus filledRect.right = progressPosition - 1; 4762f86ba45SStephan Aßmus 4772f86ba45SStephan Aßmus BRect nonfilledRect(rect); 4782f86ba45SStephan Aßmus nonfilledRect.left = progressPosition; 4792f86ba45SStephan Aßmus 4802f86ba45SStephan Aßmus bool filledSurface = filledRect.Width() > 0; 4812f86ba45SStephan Aßmus bool nonfilledSurface = nonfilledRect.Width() > 0; 4822f86ba45SStephan Aßmus 4832f86ba45SStephan Aßmus if (filledSurface) { 4842f86ba45SStephan Aßmus _DrawFrame(view, filledRect, 4852f86ba45SStephan Aßmus dark1FilledBorderColor, dark1FilledBorderColor, 4862f86ba45SStephan Aßmus dark2FilledBorderColor, dark2FilledBorderColor); 4872f86ba45SStephan Aßmus 4882f86ba45SStephan Aßmus _FillGlossyGradient(view, filledRect, barColor, 0.55, 0.68, 0.76, 0.90); 4892f86ba45SStephan Aßmus } 4902f86ba45SStephan Aßmus 4912f86ba45SStephan Aßmus if (nonfilledSurface) { 4922f86ba45SStephan Aßmus _DrawFrame(view, nonfilledRect, dark1BorderColor, dark1BorderColor, 4932f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, 4942f86ba45SStephan Aßmus B_TOP_BORDER | B_BOTTOM_BORDER | B_RIGHT_BORDER); 4952f86ba45SStephan Aßmus 4962f86ba45SStephan Aßmus if (nonfilledRect.left < nonfilledRect.right) { 4972f86ba45SStephan Aßmus // shadow from fill bar, or left border 4982f86ba45SStephan Aßmus rgb_color leftBorder = dark1BorderColor; 4992f86ba45SStephan Aßmus if (filledSurface) 5002f86ba45SStephan Aßmus leftBorder = tint_color(base, 0.50); 5012f86ba45SStephan Aßmus view->SetHighColor(leftBorder); 5022f86ba45SStephan Aßmus view->StrokeLine(nonfilledRect.LeftTop(), 5032f86ba45SStephan Aßmus nonfilledRect.LeftBottom()); 5042f86ba45SStephan Aßmus nonfilledRect.left++; 5052f86ba45SStephan Aßmus } 5062f86ba45SStephan Aßmus 5072f86ba45SStephan Aßmus _FillGradient(view, nonfilledRect, base, 0.25, 0.06); 5082f86ba45SStephan Aßmus } 5092f86ba45SStephan Aßmus } 5102f86ba45SStephan Aßmus 5112f86ba45SStephan Aßmus 5122f86ba45SStephan Aßmus void 5132f86ba45SStephan Aßmus BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect, 5142f86ba45SStephan Aßmus const rgb_color& base, uint32 flags) 5152f86ba45SStephan Aßmus { 5162f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 5172f86ba45SStephan Aßmus return; 5182f86ba45SStephan Aßmus 5192f86ba45SStephan Aßmus rgb_color dark1BorderColor; 5202f86ba45SStephan Aßmus rgb_color dark2BorderColor; 5212f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 5222f86ba45SStephan Aßmus 5232f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5244f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags); 5252f86ba45SStephan Aßmus 5262f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.15); 5272f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.15); 5282f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 5292f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.50); 5302f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.48); 5312f86ba45SStephan Aßmus 5322f86ba45SStephan Aßmus _DrawFrame(view, rect, 5332f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 5342f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 5352f86ba45SStephan Aßmus 5362f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 5372f86ba45SStephan Aßmus } else { 5384f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags); 5392f86ba45SStephan Aßmus 5402f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.40); 5412f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.38); 5422f86ba45SStephan Aßmus } 5432f86ba45SStephan Aßmus 5442f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 5452f86ba45SStephan Aßmus dark1BorderColor = navigationColor; 5462f86ba45SStephan Aßmus dark2BorderColor = navigationColor; 5472f86ba45SStephan Aßmus } 5482f86ba45SStephan Aßmus 5492f86ba45SStephan Aßmus _DrawFrame(view, rect, 5502f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 5512f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 5522f86ba45SStephan Aßmus 5532f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5542f86ba45SStephan Aßmus _FillGradient(view, rect, base, 0.4, 0.2); 5552f86ba45SStephan Aßmus } else { 5562f86ba45SStephan Aßmus _FillGradient(view, rect, base, 0.15, 0.0); 5572f86ba45SStephan Aßmus } 5582f86ba45SStephan Aßmus 5592f86ba45SStephan Aßmus rgb_color markColor; 5602f86ba45SStephan Aßmus if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) { 5612f86ba45SStephan Aßmus view->SetHighColor(markColor); 5622f86ba45SStephan Aßmus 5632f86ba45SStephan Aßmus rect.InsetBy(2, 2); 5642f86ba45SStephan Aßmus view->SetPenSize(max_c(1.0, ceilf(rect.Width() / 3.5))); 5652f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_OVER); 5662f86ba45SStephan Aßmus 5672f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightBottom()); 5682f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightTop()); 5692f86ba45SStephan Aßmus } 5702f86ba45SStephan Aßmus } 5712f86ba45SStephan Aßmus 5722f86ba45SStephan Aßmus 5732f86ba45SStephan Aßmus void 5742f86ba45SStephan Aßmus BControlLook::DrawRadioButton(BView* view, BRect& rect, const BRect& updateRect, 5752f86ba45SStephan Aßmus const rgb_color& base, uint32 flags) 5762f86ba45SStephan Aßmus { 5772f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 5782f86ba45SStephan Aßmus return; 5792f86ba45SStephan Aßmus 5802f86ba45SStephan Aßmus rgb_color borderColor; 5812f86ba45SStephan Aßmus rgb_color bevelLight; 5822f86ba45SStephan Aßmus rgb_color bevelShadow; 5832f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 5842f86ba45SStephan Aßmus 5852f86ba45SStephan Aßmus if (flags & B_DISABLED) { 5862f86ba45SStephan Aßmus borderColor = tint_color(base, 1.15); 5872f86ba45SStephan Aßmus bevelLight = base; 5882f86ba45SStephan Aßmus bevelShadow = base; 5892f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 5902f86ba45SStephan Aßmus borderColor = tint_color(base, 1.50); 5912f86ba45SStephan Aßmus bevelLight = borderColor; 5922f86ba45SStephan Aßmus bevelShadow = borderColor; 5932f86ba45SStephan Aßmus } else { 5942f86ba45SStephan Aßmus borderColor = tint_color(base, 1.45); 5952f86ba45SStephan Aßmus bevelLight = tint_color(base, 0.55); 5962f86ba45SStephan Aßmus bevelShadow = tint_color(base, 1.11); 5972f86ba45SStephan Aßmus } 5982f86ba45SStephan Aßmus 5992f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 6002f86ba45SStephan Aßmus borderColor = navigationColor; 6012f86ba45SStephan Aßmus } 6022f86ba45SStephan Aßmus 6032f86ba45SStephan Aßmus BGradientLinear bevelGradient; 6042f86ba45SStephan Aßmus bevelGradient.AddColor(bevelShadow, 0); 6052f86ba45SStephan Aßmus bevelGradient.AddColor(bevelLight, 255); 6062f86ba45SStephan Aßmus bevelGradient.SetStart(rect.LeftTop()); 6072f86ba45SStephan Aßmus bevelGradient.SetEnd(rect.RightBottom()); 6082f86ba45SStephan Aßmus 6092f86ba45SStephan Aßmus view->FillEllipse(rect, bevelGradient); 6102f86ba45SStephan Aßmus rect.InsetBy(1, 1); 6112f86ba45SStephan Aßmus 6122f86ba45SStephan Aßmus bevelGradient.MakeEmpty(); 6132f86ba45SStephan Aßmus bevelGradient.AddColor(borderColor, 0); 6142f86ba45SStephan Aßmus bevelGradient.AddColor(tint_color(borderColor, 0.8), 255); 6152f86ba45SStephan Aßmus view->FillEllipse(rect, bevelGradient); 6162f86ba45SStephan Aßmus rect.InsetBy(1, 1); 6172f86ba45SStephan Aßmus 6182f86ba45SStephan Aßmus float topTint; 6192f86ba45SStephan Aßmus float bottomTint; 6202f86ba45SStephan Aßmus if (flags & B_DISABLED) { 6212f86ba45SStephan Aßmus topTint = 0.4; 6222f86ba45SStephan Aßmus bottomTint = 0.2; 6232f86ba45SStephan Aßmus } else { 6242f86ba45SStephan Aßmus topTint = 0.15; 6252f86ba45SStephan Aßmus bottomTint = 0.0; 6262f86ba45SStephan Aßmus } 6272f86ba45SStephan Aßmus 6282f86ba45SStephan Aßmus BGradientLinear gradient; 6292f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint); 6302f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 6312f86ba45SStephan Aßmus 6322f86ba45SStephan Aßmus rgb_color markColor; 6332f86ba45SStephan Aßmus if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) { 6342f86ba45SStephan Aßmus view->SetHighColor(markColor); 6352f86ba45SStephan Aßmus rect.InsetBy(3, 3); 6362f86ba45SStephan Aßmus view->FillEllipse(rect); 6372f86ba45SStephan Aßmus } 6382f86ba45SStephan Aßmus } 6392f86ba45SStephan Aßmus 6402f86ba45SStephan Aßmus 6412f86ba45SStephan Aßmus void 6422f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect1, BRect& rect2, 6432f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 6442f86ba45SStephan Aßmus enum orientation orientation) 6452f86ba45SStephan Aßmus { 6462f86ba45SStephan Aßmus DrawScrollBarBackground(view, rect1, updateRect, base, flags, orientation); 6472f86ba45SStephan Aßmus DrawScrollBarBackground(view, rect2, updateRect, base, flags, orientation); 6482f86ba45SStephan Aßmus } 6492f86ba45SStephan Aßmus 6502f86ba45SStephan Aßmus void 6512f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect, 6522f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 6532f86ba45SStephan Aßmus enum orientation orientation) 6542f86ba45SStephan Aßmus { 6552f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 6562f86ba45SStephan Aßmus return; 6572f86ba45SStephan Aßmus 6582f86ba45SStephan Aßmus float gradient1Tint; 6592f86ba45SStephan Aßmus float gradient2Tint; 6602f86ba45SStephan Aßmus float darkEdge1Tint; 6612f86ba45SStephan Aßmus float darkEdge2Tint; 6622f86ba45SStephan Aßmus float shadowTint; 6632f86ba45SStephan Aßmus 6642f86ba45SStephan Aßmus if (flags & B_DISABLED) { 6652f86ba45SStephan Aßmus gradient1Tint = 0.9; 6662f86ba45SStephan Aßmus gradient2Tint = 0.8; 6672f86ba45SStephan Aßmus darkEdge1Tint = B_DARKEN_2_TINT; 6682f86ba45SStephan Aßmus darkEdge2Tint = B_DARKEN_2_TINT; 6692f86ba45SStephan Aßmus shadowTint = gradient1Tint; 6702f86ba45SStephan Aßmus } else { 6712f86ba45SStephan Aßmus gradient1Tint = 1.10; 6722f86ba45SStephan Aßmus gradient2Tint = 1.05; 6732f86ba45SStephan Aßmus darkEdge1Tint = B_DARKEN_3_TINT; 6742f86ba45SStephan Aßmus darkEdge2Tint = B_DARKEN_2_TINT; 6752f86ba45SStephan Aßmus shadowTint = gradient1Tint; 6762f86ba45SStephan Aßmus } 6772f86ba45SStephan Aßmus 6782f86ba45SStephan Aßmus rgb_color darkEdge1 = tint_color(base, darkEdge1Tint); 6792f86ba45SStephan Aßmus rgb_color darkEdge2 = tint_color(base, darkEdge2Tint); 6802f86ba45SStephan Aßmus rgb_color shadow = tint_color(base, shadowTint); 6812f86ba45SStephan Aßmus 6822f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 6832f86ba45SStephan Aßmus // dark vertical line on left edge 6842f86ba45SStephan Aßmus if (rect.Width() > 0) { 6852f86ba45SStephan Aßmus view->SetHighColor(darkEdge1); 6862f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 6872f86ba45SStephan Aßmus rect.left++; 6882f86ba45SStephan Aßmus } 6892f86ba45SStephan Aßmus // dark vertical line on right edge 6902f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6912f86ba45SStephan Aßmus view->SetHighColor(darkEdge2); 6922f86ba45SStephan Aßmus view->StrokeLine(rect.RightTop(), rect.RightBottom()); 6932f86ba45SStephan Aßmus rect.right--; 6942f86ba45SStephan Aßmus } 6952f86ba45SStephan Aßmus // vertical shadow line after left edge 6962f86ba45SStephan Aßmus if (rect.Width() >= 0) { 6972f86ba45SStephan Aßmus view->SetHighColor(shadow); 6982f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 6992f86ba45SStephan Aßmus rect.left++; 7002f86ba45SStephan Aßmus } 7012f86ba45SStephan Aßmus // fill 7022f86ba45SStephan Aßmus if (rect.Width() >= 0) { 7032f86ba45SStephan Aßmus _FillGradient(view, rect, base, gradient1Tint, gradient2Tint, 7042f86ba45SStephan Aßmus orientation); 7052f86ba45SStephan Aßmus } 7062f86ba45SStephan Aßmus } else { 7072f86ba45SStephan Aßmus // dark vertical line on top edge 7082f86ba45SStephan Aßmus if (rect.Height() > 0) { 7092f86ba45SStephan Aßmus view->SetHighColor(darkEdge1); 7102f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 7112f86ba45SStephan Aßmus rect.top++; 7122f86ba45SStephan Aßmus } 7132f86ba45SStephan Aßmus // dark vertical line on bottom edge 7142f86ba45SStephan Aßmus if (rect.Height() >= 0) { 7152f86ba45SStephan Aßmus view->SetHighColor(darkEdge2); 7162f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); 7172f86ba45SStephan Aßmus rect.bottom--; 7182f86ba45SStephan Aßmus } 7192f86ba45SStephan Aßmus // horizontal shadow line after top edge 7202f86ba45SStephan Aßmus if (rect.Height() >= 0) { 7212f86ba45SStephan Aßmus view->SetHighColor(shadow); 7222f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 7232f86ba45SStephan Aßmus rect.top++; 7242f86ba45SStephan Aßmus } 7252f86ba45SStephan Aßmus // fill 7262f86ba45SStephan Aßmus if (rect.Height() >= 0) { 7272f86ba45SStephan Aßmus _FillGradient(view, rect, base, gradient1Tint, gradient2Tint, 7282f86ba45SStephan Aßmus orientation); 7292f86ba45SStephan Aßmus } 7302f86ba45SStephan Aßmus } 7312f86ba45SStephan Aßmus } 7322f86ba45SStephan Aßmus 7332f86ba45SStephan Aßmus 73440a10e1cSStephan Aßmus void 73574bb70aeSStephan Aßmus BControlLook::DrawScrollViewFrame(BView* view, BRect& rect, 73674bb70aeSStephan Aßmus const BRect& updateRect, BRect verticalScrollBarFrame, 73774bb70aeSStephan Aßmus BRect horizontalScrollBarFrame, const rgb_color& base, 73874bb70aeSStephan Aßmus border_style border, uint32 flags, uint32 _borders) 73974bb70aeSStephan Aßmus { 740ce955579SStephan Aßmus // calculate scroll corner rect before messing with the "rect" 741ce955579SStephan Aßmus BRect scrollCornerFillRect(rect.right, rect.bottom, 742ce955579SStephan Aßmus rect.right, rect.bottom); 743ce955579SStephan Aßmus if (horizontalScrollBarFrame.IsValid()) 744ce955579SStephan Aßmus scrollCornerFillRect.left = horizontalScrollBarFrame.right + 1; 745ce955579SStephan Aßmus if (verticalScrollBarFrame.IsValid()) 746ce955579SStephan Aßmus scrollCornerFillRect.top = verticalScrollBarFrame.bottom + 1; 747ce955579SStephan Aßmus 748c44aa833SStephan Aßmus if (border == B_NO_BORDER) { 749c44aa833SStephan Aßmus if (scrollCornerFillRect.IsValid()) { 750c44aa833SStephan Aßmus view->SetHighColor(base); 751c44aa833SStephan Aßmus view->FillRect(scrollCornerFillRect); 752c44aa833SStephan Aßmus } 753c44aa833SStephan Aßmus return; 754c44aa833SStephan Aßmus } 755c44aa833SStephan Aßmus 756c44aa833SStephan Aßmus bool excludeScrollCorner = border == B_FANCY_BORDER 757c44aa833SStephan Aßmus && horizontalScrollBarFrame.IsValid() 758c44aa833SStephan Aßmus && verticalScrollBarFrame.IsValid(); 759c44aa833SStephan Aßmus 76074bb70aeSStephan Aßmus uint32 borders = _borders; 76174bb70aeSStephan Aßmus if (excludeScrollCorner) { 76274bb70aeSStephan Aßmus rect.bottom = horizontalScrollBarFrame.top; 76374bb70aeSStephan Aßmus rect.right = verticalScrollBarFrame.left; 76474bb70aeSStephan Aßmus borders &= ~(B_RIGHT_BORDER | B_BOTTOM_BORDER); 76574bb70aeSStephan Aßmus } 76674bb70aeSStephan Aßmus 76774bb70aeSStephan Aßmus rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT); 76874bb70aeSStephan Aßmus 76974bb70aeSStephan Aßmus if (border == B_FANCY_BORDER) 7704f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders); 77174bb70aeSStephan Aßmus 77274bb70aeSStephan Aßmus if (flags & B_FOCUSED) { 77374bb70aeSStephan Aßmus rgb_color focusColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 77474bb70aeSStephan Aßmus _DrawFrame(view, rect, focusColor, focusColor, focusColor, focusColor, 77574bb70aeSStephan Aßmus borders); 77674bb70aeSStephan Aßmus } else { 77774bb70aeSStephan Aßmus _DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor, 77874bb70aeSStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, borders); 77974bb70aeSStephan Aßmus } 78074bb70aeSStephan Aßmus 78174bb70aeSStephan Aßmus if (excludeScrollCorner) { 78274bb70aeSStephan Aßmus horizontalScrollBarFrame.InsetBy(-1, -1); 78374bb70aeSStephan Aßmus // do not overdraw the top edge 78474bb70aeSStephan Aßmus horizontalScrollBarFrame.top += 2; 78574bb70aeSStephan Aßmus borders = _borders; 78674bb70aeSStephan Aßmus borders &= ~B_TOP_BORDER; 78774bb70aeSStephan Aßmus _DrawOuterResessedFrame(view, horizontalScrollBarFrame, base, 7884f579098SStephan Aßmus 1.0, 1.0, flags, borders); 78974bb70aeSStephan Aßmus _DrawFrame(view, horizontalScrollBarFrame, scrollbarFrameColor, 79074bb70aeSStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, 79174bb70aeSStephan Aßmus borders); 79274bb70aeSStephan Aßmus 79374bb70aeSStephan Aßmus 79474bb70aeSStephan Aßmus verticalScrollBarFrame.InsetBy(-1, -1); 79574bb70aeSStephan Aßmus // do not overdraw the left edge 79674bb70aeSStephan Aßmus verticalScrollBarFrame.left += 2; 79774bb70aeSStephan Aßmus borders = _borders; 79874bb70aeSStephan Aßmus borders &= ~B_LEFT_BORDER; 79974bb70aeSStephan Aßmus _DrawOuterResessedFrame(view, verticalScrollBarFrame, base, 8004f579098SStephan Aßmus 1.0, 1.0, flags, borders); 80174bb70aeSStephan Aßmus _DrawFrame(view, verticalScrollBarFrame, scrollbarFrameColor, 80274bb70aeSStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, 80374bb70aeSStephan Aßmus borders); 804ce955579SStephan Aßmus 805ce955579SStephan Aßmus // exclude recessed frame 806ce955579SStephan Aßmus scrollCornerFillRect.top++; 807ce955579SStephan Aßmus scrollCornerFillRect.left++; 808ce955579SStephan Aßmus } 809ce955579SStephan Aßmus 810ce955579SStephan Aßmus if (scrollCornerFillRect.IsValid()) { 811ce955579SStephan Aßmus view->SetHighColor(base); 812ce955579SStephan Aßmus view->FillRect(scrollCornerFillRect); 81374bb70aeSStephan Aßmus } 81474bb70aeSStephan Aßmus } 81574bb70aeSStephan Aßmus 81674bb70aeSStephan Aßmus 81774bb70aeSStephan Aßmus void 81840a10e1cSStephan Aßmus BControlLook::DrawArrowShape(BView* view, BRect& rect, const BRect& updateRect, 81940a10e1cSStephan Aßmus const rgb_color& base, uint32 direction, uint32 flags, float tint) 82040a10e1cSStephan Aßmus { 82140a10e1cSStephan Aßmus BPoint tri1, tri2, tri3; 82240a10e1cSStephan Aßmus float hInset = rect.Width() / 3; 82340a10e1cSStephan Aßmus float vInset = rect.Height() / 3; 82440a10e1cSStephan Aßmus rect.InsetBy(hInset, vInset); 82540a10e1cSStephan Aßmus 82640a10e1cSStephan Aßmus switch (direction) { 82740a10e1cSStephan Aßmus case B_LEFT_ARROW: 82840a10e1cSStephan Aßmus tri1.Set(rect.right, rect.top); 82940a10e1cSStephan Aßmus tri2.Set(rect.right - rect.Width() / 1.33, 83040a10e1cSStephan Aßmus (rect.top + rect.bottom + 1) /2 ); 83140a10e1cSStephan Aßmus tri3.Set(rect.right, rect.bottom + 1); 83240a10e1cSStephan Aßmus break; 83340a10e1cSStephan Aßmus case B_RIGHT_ARROW: 83440a10e1cSStephan Aßmus tri1.Set(rect.left, rect.bottom + 1); 83540a10e1cSStephan Aßmus tri2.Set(rect.left + rect.Width() / 1.33, 83640a10e1cSStephan Aßmus (rect.top + rect.bottom + 1) / 2); 83740a10e1cSStephan Aßmus tri3.Set(rect.left, rect.top); 83840a10e1cSStephan Aßmus break; 83940a10e1cSStephan Aßmus case B_UP_ARROW: 84040a10e1cSStephan Aßmus tri1.Set(rect.left, rect.bottom); 84140a10e1cSStephan Aßmus tri2.Set((rect.left + rect.right + 1) / 2, 84240a10e1cSStephan Aßmus rect.bottom - rect.Height() / 1.33); 84340a10e1cSStephan Aßmus tri3.Set(rect.right + 1, rect.bottom); 84440a10e1cSStephan Aßmus break; 84540a10e1cSStephan Aßmus case B_DOWN_ARROW: 84640a10e1cSStephan Aßmus default: 84740a10e1cSStephan Aßmus tri1.Set(rect.left, rect.top); 84840a10e1cSStephan Aßmus tri2.Set((rect.left + rect.right + 1) / 2, 84940a10e1cSStephan Aßmus rect.top + rect.Height() / 1.33); 85040a10e1cSStephan Aßmus tri3.Set(rect.right + 1, rect.top); 85140a10e1cSStephan Aßmus break; 85240a10e1cSStephan Aßmus } 85340a10e1cSStephan Aßmus // offset triangle if down 85440a10e1cSStephan Aßmus if (flags & B_ACTIVATED) 85540a10e1cSStephan Aßmus view->MovePenTo(BPoint(1, 1)); 85640a10e1cSStephan Aßmus else 85740a10e1cSStephan Aßmus view->MovePenTo(BPoint(0, 0)); 85840a10e1cSStephan Aßmus 85940a10e1cSStephan Aßmus BShape arrowShape; 86040a10e1cSStephan Aßmus arrowShape.MoveTo(tri1); 86140a10e1cSStephan Aßmus arrowShape.LineTo(tri2); 86240a10e1cSStephan Aßmus arrowShape.LineTo(tri3); 86340a10e1cSStephan Aßmus 86440a10e1cSStephan Aßmus if (flags & B_DISABLED) 86540a10e1cSStephan Aßmus tint = (tint + B_NO_TINT + B_NO_TINT) / 3; 86640a10e1cSStephan Aßmus 86740a10e1cSStephan Aßmus view->SetHighColor(tint_color(base, tint)); 86840a10e1cSStephan Aßmus 86940a10e1cSStephan Aßmus float penSize = view->PenSize(); 87040a10e1cSStephan Aßmus drawing_mode mode = view->DrawingMode(); 87140a10e1cSStephan Aßmus 87240a10e1cSStephan Aßmus view->SetPenSize(ceilf(hInset / 2.0)); 87340a10e1cSStephan Aßmus view->SetDrawingMode(B_OP_OVER); 87440a10e1cSStephan Aßmus view->StrokeShape(&arrowShape); 87540a10e1cSStephan Aßmus 87640a10e1cSStephan Aßmus view->SetPenSize(penSize); 87740a10e1cSStephan Aßmus view->SetDrawingMode(mode); 87840a10e1cSStephan Aßmus } 87940a10e1cSStephan Aßmus 88040a10e1cSStephan Aßmus 8812f86ba45SStephan Aßmus rgb_color 8822f86ba45SStephan Aßmus BControlLook::SliderBarColor(const rgb_color& base) 8832f86ba45SStephan Aßmus { 8842f86ba45SStephan Aßmus return tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT); 8852f86ba45SStephan Aßmus } 8862f86ba45SStephan Aßmus 8872f86ba45SStephan Aßmus 8882f86ba45SStephan Aßmus void 8892f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect, 8902f86ba45SStephan Aßmus const rgb_color& base, rgb_color leftFillColor, rgb_color rightFillColor, 8912f86ba45SStephan Aßmus float sliderScale, uint32 flags, enum orientation orientation) 8922f86ba45SStephan Aßmus { 8932f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 8942f86ba45SStephan Aßmus return; 8952f86ba45SStephan Aßmus 8962f86ba45SStephan Aßmus // separate the bar in two sides 8972f86ba45SStephan Aßmus float sliderPosition; 8982f86ba45SStephan Aßmus BRect leftBarSide = rect; 8992f86ba45SStephan Aßmus BRect rightBarSide = rect; 9002f86ba45SStephan Aßmus 9012f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 9022f86ba45SStephan Aßmus sliderPosition = floorf(rect.left + 2 + (rect.Width() - 2) 9032f86ba45SStephan Aßmus * sliderScale); 9042f86ba45SStephan Aßmus leftBarSide.right = sliderPosition - 1; 9052f86ba45SStephan Aßmus rightBarSide.left = sliderPosition; 9062f86ba45SStephan Aßmus } else { 907f3997b74SStephan Aßmus // NOTE: position is reverse of coords 9082f86ba45SStephan Aßmus sliderPosition = floorf(rect.top + 2 + (rect.Height() - 2) 909f3997b74SStephan Aßmus * (1.0 - sliderScale)); 910f3997b74SStephan Aßmus leftBarSide.top = sliderPosition; 911f3997b74SStephan Aßmus rightBarSide.bottom = sliderPosition - 1; 9122f86ba45SStephan Aßmus } 9132f86ba45SStephan Aßmus 9142f86ba45SStephan Aßmus // fill the background for the corners, exclude the middle bar for now 9152f86ba45SStephan Aßmus BRegion region(rect); 9162f86ba45SStephan Aßmus region.Exclude(rightBarSide); 9172f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 9182f86ba45SStephan Aßmus 9192f86ba45SStephan Aßmus view->PushState(); 9202f86ba45SStephan Aßmus 9212f86ba45SStephan Aßmus DrawSliderBar(view, rect, updateRect, base, leftFillColor, flags, 9222f86ba45SStephan Aßmus orientation); 9232f86ba45SStephan Aßmus 9242f86ba45SStephan Aßmus view->PopState(); 9252f86ba45SStephan Aßmus 9262f86ba45SStephan Aßmus region.Set(rect); 9272f86ba45SStephan Aßmus region.Exclude(leftBarSide); 9282f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 9292f86ba45SStephan Aßmus 9302f86ba45SStephan Aßmus view->PushState(); 9312f86ba45SStephan Aßmus 9322f86ba45SStephan Aßmus DrawSliderBar(view, rect, updateRect, base, rightFillColor, flags, 9332f86ba45SStephan Aßmus orientation); 9342f86ba45SStephan Aßmus 9352f86ba45SStephan Aßmus view->PopState(); 9362f86ba45SStephan Aßmus 9372f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 9382f86ba45SStephan Aßmus } 9392f86ba45SStephan Aßmus 9402f86ba45SStephan Aßmus 9412f86ba45SStephan Aßmus void 9422f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect, 9432f86ba45SStephan Aßmus const rgb_color& base, rgb_color fillColor, uint32 flags, 9442f86ba45SStephan Aßmus enum orientation orientation) 9452f86ba45SStephan Aßmus { 9462f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 9472f86ba45SStephan Aßmus return; 9482f86ba45SStephan Aßmus 9492f86ba45SStephan Aßmus // separate the rect into corners 9502f86ba45SStephan Aßmus BRect leftCorner(rect); 9512f86ba45SStephan Aßmus BRect rightCorner(rect); 9522f86ba45SStephan Aßmus BRect barRect(rect); 9532f86ba45SStephan Aßmus 9542f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 9552f86ba45SStephan Aßmus leftCorner.right = leftCorner.left + leftCorner.Height(); 9562f86ba45SStephan Aßmus rightCorner.left = rightCorner.right - rightCorner.Height(); 9572f86ba45SStephan Aßmus barRect.left += ceilf(barRect.Height() / 2); 9582f86ba45SStephan Aßmus barRect.right -= ceilf(barRect.Height() / 2); 9592f86ba45SStephan Aßmus } else { 9602f86ba45SStephan Aßmus leftCorner.bottom = leftCorner.top + leftCorner.Width(); 9612f86ba45SStephan Aßmus rightCorner.top = rightCorner.bottom - rightCorner.Width(); 9622f86ba45SStephan Aßmus barRect.top += ceilf(barRect.Width() / 2); 9632f86ba45SStephan Aßmus barRect.bottom -= ceilf(barRect.Width() / 2); 9642f86ba45SStephan Aßmus } 9652f86ba45SStephan Aßmus 9662f86ba45SStephan Aßmus // fill the background for the corners, exclude the middle bar for now 9672f86ba45SStephan Aßmus BRegion region(rect); 9682f86ba45SStephan Aßmus region.Exclude(barRect); 9692f86ba45SStephan Aßmus view->ConstrainClippingRegion(®ion); 9702f86ba45SStephan Aßmus 97161ac1a85SStephan Aßmus if ((flags & B_BLEND_FRAME) == 0) { 9722f86ba45SStephan Aßmus view->SetHighColor(base); 9732f86ba45SStephan Aßmus view->FillRect(rect); 97461ac1a85SStephan Aßmus } 9752f86ba45SStephan Aßmus 9762f86ba45SStephan Aßmus // figure out the tints to be used 9772f86ba45SStephan Aßmus float edgeLightTint; 9782f86ba45SStephan Aßmus float edgeShadowTint; 9792f86ba45SStephan Aßmus float frameLightTint; 9802f86ba45SStephan Aßmus float frameShadowTint; 9812f86ba45SStephan Aßmus float fillLightTint; 9822f86ba45SStephan Aßmus float fillShadowTint; 98361ac1a85SStephan Aßmus uint8 edgeLightAlpha; 98461ac1a85SStephan Aßmus uint8 edgeShadowAlpha; 98561ac1a85SStephan Aßmus uint8 frameLightAlpha; 98661ac1a85SStephan Aßmus uint8 frameShadowAlpha; 9872f86ba45SStephan Aßmus 9882f86ba45SStephan Aßmus if (flags & B_DISABLED) { 9892f86ba45SStephan Aßmus edgeLightTint = 1.0; 9902f86ba45SStephan Aßmus edgeShadowTint = 1.0; 9912f86ba45SStephan Aßmus frameLightTint = 1.20; 9922f86ba45SStephan Aßmus frameShadowTint = 1.25; 9932f86ba45SStephan Aßmus fillLightTint = 0.9; 9942f86ba45SStephan Aßmus fillShadowTint = 1.05; 99510ddee8dSStephan Aßmus edgeLightAlpha = 12; 99610ddee8dSStephan Aßmus edgeShadowAlpha = 12; 99761ac1a85SStephan Aßmus frameLightAlpha = 40; 99861ac1a85SStephan Aßmus frameShadowAlpha = 45; 9992f86ba45SStephan Aßmus 10002f86ba45SStephan Aßmus fillColor.red = uint8(fillColor.red * 0.4 + base.red * 0.6); 10012f86ba45SStephan Aßmus fillColor.green = uint8(fillColor.green * 0.4 + base.green * 0.6); 10022f86ba45SStephan Aßmus fillColor.blue = uint8(fillColor.blue * 0.4 + base.blue * 0.6); 10032f86ba45SStephan Aßmus } else { 10042f86ba45SStephan Aßmus edgeLightTint = 0.65; 10052f86ba45SStephan Aßmus edgeShadowTint = 1.07; 10062f86ba45SStephan Aßmus frameLightTint = 1.40; 10072f86ba45SStephan Aßmus frameShadowTint = 1.50; 10082f86ba45SStephan Aßmus fillLightTint = 0.8; 10092f86ba45SStephan Aßmus fillShadowTint = 1.1; 101010ddee8dSStephan Aßmus edgeLightAlpha = 15; 101110ddee8dSStephan Aßmus edgeShadowAlpha = 15; 101261ac1a85SStephan Aßmus frameLightAlpha = 92; 101361ac1a85SStephan Aßmus frameShadowAlpha = 107; 10142f86ba45SStephan Aßmus } 10152f86ba45SStephan Aßmus 101661ac1a85SStephan Aßmus rgb_color edgeLightColor; 101761ac1a85SStephan Aßmus rgb_color edgeShadowColor; 101861ac1a85SStephan Aßmus rgb_color frameLightColor; 101961ac1a85SStephan Aßmus rgb_color frameShadowColor; 10202f86ba45SStephan Aßmus rgb_color fillLightColor = tint_color(fillColor, fillLightTint); 10212f86ba45SStephan Aßmus rgb_color fillShadowColor = tint_color(fillColor, fillShadowTint); 10222f86ba45SStephan Aßmus 102361ac1a85SStephan Aßmus drawing_mode oldMode = view->DrawingMode(); 102461ac1a85SStephan Aßmus 102561ac1a85SStephan Aßmus if (flags & B_BLEND_FRAME) { 102661ac1a85SStephan Aßmus edgeLightColor = (rgb_color){ 255, 255, 255, edgeLightAlpha }; 102761ac1a85SStephan Aßmus edgeShadowColor = (rgb_color){ 0, 0, 0, edgeShadowAlpha }; 102861ac1a85SStephan Aßmus frameLightColor = (rgb_color){ 0, 0, 0, frameLightAlpha }; 102961ac1a85SStephan Aßmus frameShadowColor = (rgb_color){ 0, 0, 0, frameShadowAlpha }; 103061ac1a85SStephan Aßmus 103161ac1a85SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 103261ac1a85SStephan Aßmus } else { 103361ac1a85SStephan Aßmus edgeLightColor = tint_color(base, edgeLightTint); 103461ac1a85SStephan Aßmus edgeShadowColor = tint_color(base, edgeShadowTint); 103561ac1a85SStephan Aßmus frameLightColor = tint_color(fillColor, frameLightTint); 103661ac1a85SStephan Aßmus frameShadowColor = tint_color(fillColor, frameShadowTint); 103761ac1a85SStephan Aßmus } 103861ac1a85SStephan Aßmus 10392f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 10402f86ba45SStephan Aßmus _DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor, 10412f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 10422f86ba45SStephan Aßmus fillShadowColor, 1.0, 1.0, 0.0, -1.0, orientation); 10432f86ba45SStephan Aßmus 10442f86ba45SStephan Aßmus _DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor, 10452f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 10462f86ba45SStephan Aßmus fillShadowColor, 0.0, 1.0, -1.0, -1.0, orientation); 10472f86ba45SStephan Aßmus } else { 10482f86ba45SStephan Aßmus _DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor, 10492f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 10502f86ba45SStephan Aßmus fillShadowColor, 1.0, 1.0, -1.0, 0.0, orientation); 10512f86ba45SStephan Aßmus 10522f86ba45SStephan Aßmus _DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor, 10532f86ba45SStephan Aßmus edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor, 10542f86ba45SStephan Aßmus fillShadowColor, 1.0, 0.0, -1.0, -1.0, orientation); 10552f86ba45SStephan Aßmus } 10562f86ba45SStephan Aßmus 10572f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 10582f86ba45SStephan Aßmus 10592f86ba45SStephan Aßmus view->BeginLineArray(4); 10602f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 10612f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.RightTop(), edgeShadowColor); 10622f86ba45SStephan Aßmus view->AddLine(barRect.LeftBottom(), barRect.RightBottom(), 10632f86ba45SStephan Aßmus edgeLightColor); 10642f86ba45SStephan Aßmus barRect.InsetBy(0, 1); 10652f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.RightTop(), frameShadowColor); 10662f86ba45SStephan Aßmus view->AddLine(barRect.LeftBottom(), barRect.RightBottom(), 10672f86ba45SStephan Aßmus frameLightColor); 10682f86ba45SStephan Aßmus barRect.InsetBy(0, 1); 10692f86ba45SStephan Aßmus } else { 10702f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), edgeShadowColor); 10712f86ba45SStephan Aßmus view->AddLine(barRect.RightTop(), barRect.RightBottom(), 10722f86ba45SStephan Aßmus edgeLightColor); 10732f86ba45SStephan Aßmus barRect.InsetBy(1, 0); 10742f86ba45SStephan Aßmus view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), frameShadowColor); 10752f86ba45SStephan Aßmus view->AddLine(barRect.RightTop(), barRect.RightBottom(), 10762f86ba45SStephan Aßmus frameLightColor); 10772f86ba45SStephan Aßmus barRect.InsetBy(1, 0); 10782f86ba45SStephan Aßmus } 10792f86ba45SStephan Aßmus view->EndLineArray(); 10802f86ba45SStephan Aßmus 108161ac1a85SStephan Aßmus view->SetDrawingMode(oldMode); 108261ac1a85SStephan Aßmus 10832f86ba45SStephan Aßmus _FillGradient(view, barRect, fillColor, fillShadowTint, fillLightTint, 10842f86ba45SStephan Aßmus orientation); 10852f86ba45SStephan Aßmus } 10862f86ba45SStephan Aßmus 10872f86ba45SStephan Aßmus 10882f86ba45SStephan Aßmus void 10892f86ba45SStephan Aßmus BControlLook::DrawSliderThumb(BView* view, BRect& rect, const BRect& updateRect, 10902f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, enum orientation orientation) 10912f86ba45SStephan Aßmus { 10922f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 10932f86ba45SStephan Aßmus return; 10942f86ba45SStephan Aßmus 10952f86ba45SStephan Aßmus // figure out frame color 10962f86ba45SStephan Aßmus rgb_color frameLightColor; 10972f86ba45SStephan Aßmus rgb_color frameShadowColor; 10982f86ba45SStephan Aßmus rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 }; 10992f86ba45SStephan Aßmus 11002f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 11012f86ba45SStephan Aßmus // focused 11022f86ba45SStephan Aßmus frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 11032f86ba45SStephan Aßmus frameShadowColor = frameLightColor; 11042f86ba45SStephan Aßmus } else { 11052f86ba45SStephan Aßmus // figure out the tints to be used 11062f86ba45SStephan Aßmus float frameLightTint; 11072f86ba45SStephan Aßmus float frameShadowTint; 11082f86ba45SStephan Aßmus 11092f86ba45SStephan Aßmus if (flags & B_DISABLED) { 11102f86ba45SStephan Aßmus frameLightTint = 1.30; 11112f86ba45SStephan Aßmus frameShadowTint = 1.35; 11122f86ba45SStephan Aßmus shadowColor.alpha = 30; 11132f86ba45SStephan Aßmus } else { 11142f86ba45SStephan Aßmus frameLightTint = 1.6; 11152f86ba45SStephan Aßmus frameShadowTint = 1.65; 11162f86ba45SStephan Aßmus } 11172f86ba45SStephan Aßmus 11182f86ba45SStephan Aßmus frameLightColor = tint_color(base, frameLightTint); 11192f86ba45SStephan Aßmus frameShadowColor = tint_color(base, frameShadowTint); 11202f86ba45SStephan Aßmus } 11212f86ba45SStephan Aßmus 11222f86ba45SStephan Aßmus BRect originalRect(rect); 11232f86ba45SStephan Aßmus rect.right--; 11242f86ba45SStephan Aßmus rect.bottom--; 11252f86ba45SStephan Aßmus 11262f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, 11272f86ba45SStephan Aßmus frameShadowColor, frameShadowColor); 11282f86ba45SStephan Aßmus 11292f86ba45SStephan Aßmus flags &= ~B_ACTIVATED; 11302f86ba45SStephan Aßmus DrawButtonBackground(view, rect, updateRect, base, flags); 11312f86ba45SStephan Aßmus 11322f86ba45SStephan Aßmus // thumb shadow 11332f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 11342f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 11352f86ba45SStephan Aßmus originalRect.left++; 11362f86ba45SStephan Aßmus originalRect.top++; 11372f86ba45SStephan Aßmus view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom()); 11382f86ba45SStephan Aßmus originalRect.bottom--; 11392f86ba45SStephan Aßmus view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom()); 11402f86ba45SStephan Aßmus 11412f86ba45SStephan Aßmus // thumb edge 11422f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 11432f86ba45SStephan Aßmus rect.InsetBy(0, floorf(rect.Height() / 4)); 11442f86ba45SStephan Aßmus rect.left = floorf((rect.left + rect.right) / 2); 11452f86ba45SStephan Aßmus rect.right = rect.left + 1; 11462f86ba45SStephan Aßmus shadowColor = tint_color(base, B_DARKEN_2_TINT); 11472f86ba45SStephan Aßmus shadowColor.alpha = 128; 11482f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 11492f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.LeftBottom()); 11502f86ba45SStephan Aßmus rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 11512f86ba45SStephan Aßmus lightColor.alpha = 128; 11522f86ba45SStephan Aßmus view->SetHighColor(lightColor); 11532f86ba45SStephan Aßmus view->StrokeLine(rect.RightTop(), rect.RightBottom()); 11542f86ba45SStephan Aßmus } else { 11552f86ba45SStephan Aßmus rect.InsetBy(floorf(rect.Width() / 4), 0); 11562f86ba45SStephan Aßmus rect.top = floorf((rect.top + rect.bottom) / 2); 11572f86ba45SStephan Aßmus rect.bottom = rect.top + 1; 11582f86ba45SStephan Aßmus shadowColor = tint_color(base, B_DARKEN_2_TINT); 11592f86ba45SStephan Aßmus shadowColor.alpha = 128; 11602f86ba45SStephan Aßmus view->SetHighColor(shadowColor); 11612f86ba45SStephan Aßmus view->StrokeLine(rect.LeftTop(), rect.RightTop()); 11622f86ba45SStephan Aßmus rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT); 11632f86ba45SStephan Aßmus lightColor.alpha = 128; 11642f86ba45SStephan Aßmus view->SetHighColor(lightColor); 11652f86ba45SStephan Aßmus view->StrokeLine(rect.LeftBottom(), rect.RightBottom()); 11662f86ba45SStephan Aßmus } 11672f86ba45SStephan Aßmus 11682f86ba45SStephan Aßmus view->SetDrawingMode(B_OP_COPY); 11692f86ba45SStephan Aßmus } 11702f86ba45SStephan Aßmus 11712f86ba45SStephan Aßmus 11722f86ba45SStephan Aßmus void 11732f86ba45SStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect, 11742f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 11752f86ba45SStephan Aßmus enum orientation orientation) 11762f86ba45SStephan Aßmus { 11778ee9217eSStephan Aßmus DrawSliderTriangle(view, rect, updateRect, base, base, flags, orientation); 11788ee9217eSStephan Aßmus } 11798ee9217eSStephan Aßmus 11808ee9217eSStephan Aßmus 11818ee9217eSStephan Aßmus void 11828ee9217eSStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect, 11838ee9217eSStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& fill, 11848ee9217eSStephan Aßmus uint32 flags, enum orientation orientation) 11858ee9217eSStephan Aßmus { 11862f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 11872f86ba45SStephan Aßmus return; 11882f86ba45SStephan Aßmus 11892f86ba45SStephan Aßmus // figure out frame color 11902f86ba45SStephan Aßmus rgb_color frameLightColor; 11912f86ba45SStephan Aßmus rgb_color frameShadowColor; 11922f86ba45SStephan Aßmus rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 }; 11932f86ba45SStephan Aßmus 11942f86ba45SStephan Aßmus float topTint = 0.49; 11952f86ba45SStephan Aßmus float middleTint1 = 0.62; 11962f86ba45SStephan Aßmus float middleTint2 = 0.76; 11972f86ba45SStephan Aßmus float bottomTint = 0.90; 11982f86ba45SStephan Aßmus 11992f86ba45SStephan Aßmus if (flags & B_DISABLED) { 12002f86ba45SStephan Aßmus topTint = (topTint + B_NO_TINT) / 2; 12012f86ba45SStephan Aßmus middleTint1 = (middleTint1 + B_NO_TINT) / 2; 12022f86ba45SStephan Aßmus middleTint2 = (middleTint2 + B_NO_TINT) / 2; 12032f86ba45SStephan Aßmus bottomTint = (bottomTint + B_NO_TINT) / 2; 12042f86ba45SStephan Aßmus } else if (flags & B_HOVER) { 12052f86ba45SStephan Aßmus static const float kHoverTintFactor = 0.85; 12062f86ba45SStephan Aßmus topTint *= kHoverTintFactor; 12072f86ba45SStephan Aßmus middleTint1 *= kHoverTintFactor; 12082f86ba45SStephan Aßmus middleTint2 *= kHoverTintFactor; 12092f86ba45SStephan Aßmus bottomTint *= kHoverTintFactor; 12102f86ba45SStephan Aßmus } 12112f86ba45SStephan Aßmus 12122f86ba45SStephan Aßmus if (flags & B_FOCUSED) { 12132f86ba45SStephan Aßmus // focused 12142f86ba45SStephan Aßmus frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 12152f86ba45SStephan Aßmus frameShadowColor = frameLightColor; 12162f86ba45SStephan Aßmus } else { 12172f86ba45SStephan Aßmus // figure out the tints to be used 12182f86ba45SStephan Aßmus float frameLightTint; 12192f86ba45SStephan Aßmus float frameShadowTint; 12202f86ba45SStephan Aßmus 12212f86ba45SStephan Aßmus if (flags & B_DISABLED) { 12222f86ba45SStephan Aßmus frameLightTint = 1.30; 12232f86ba45SStephan Aßmus frameShadowTint = 1.35; 12242f86ba45SStephan Aßmus shadowColor.alpha = 30; 12252f86ba45SStephan Aßmus } else { 12262f86ba45SStephan Aßmus frameLightTint = 1.6; 12272f86ba45SStephan Aßmus frameShadowTint = 1.65; 12282f86ba45SStephan Aßmus } 12292f86ba45SStephan Aßmus 12302f86ba45SStephan Aßmus frameLightColor = tint_color(base, frameLightTint); 12312f86ba45SStephan Aßmus frameShadowColor = tint_color(base, frameShadowTint); 12322f86ba45SStephan Aßmus } 12332f86ba45SStephan Aßmus 12348ee9217eSStephan Aßmus // make room for the shadow 12358ee9217eSStephan Aßmus rect.right--; 12368ee9217eSStephan Aßmus rect.bottom--; 12372f86ba45SStephan Aßmus 12382f86ba45SStephan Aßmus uint32 viewFlags = view->Flags(); 12392f86ba45SStephan Aßmus view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE); 12402f86ba45SStephan Aßmus view->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN); 12412f86ba45SStephan Aßmus 1242f3997b74SStephan Aßmus float centerh = (rect.left + rect.right) / 2; 1243f3997b74SStephan Aßmus float centerv = (rect.top + rect.bottom) / 2; 12442f86ba45SStephan Aßmus 12458ee9217eSStephan Aßmus BShape shape; 1246f3997b74SStephan Aßmus if (orientation == B_HORIZONTAL) { 12478ee9217eSStephan Aßmus shape.MoveTo(BPoint(rect.left + 0.5, rect.bottom + 0.5)); 12488ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5)); 12498ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5)); 1250f3997b74SStephan Aßmus shape.LineTo(BPoint(centerh + 0.5, rect.top + 0.5)); 12518ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5)); 1252f3997b74SStephan Aßmus } else { 1253f3997b74SStephan Aßmus shape.MoveTo(BPoint(rect.right + 0.5, rect.top + 0.5)); 1254f3997b74SStephan Aßmus shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5)); 1255f3997b74SStephan Aßmus shape.LineTo(BPoint(rect.right - 1 + 0.5, rect.bottom + 0.5)); 1256f3997b74SStephan Aßmus shape.LineTo(BPoint(rect.left + 0.5, centerv + 0.5)); 1257f3997b74SStephan Aßmus shape.LineTo(BPoint(rect.right - 1 + 0.5, rect.top + 0.5)); 1258f3997b74SStephan Aßmus } 12598ee9217eSStephan Aßmus shape.Close(); 12608ee9217eSStephan Aßmus 12618ee9217eSStephan Aßmus view->MovePenTo(BPoint(1, 1)); 12628ee9217eSStephan Aßmus 12638ee9217eSStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 12648ee9217eSStephan Aßmus view->SetHighColor(shadowColor); 12658ee9217eSStephan Aßmus view->StrokeShape(&shape); 12668ee9217eSStephan Aßmus 12678ee9217eSStephan Aßmus view->MovePenTo(B_ORIGIN); 12688ee9217eSStephan Aßmus 12698ee9217eSStephan Aßmus view->SetDrawingMode(B_OP_COPY); 12702f86ba45SStephan Aßmus view->SetHighColor(frameLightColor); 12718ee9217eSStephan Aßmus view->StrokeShape(&shape); 12722f86ba45SStephan Aßmus 12732f86ba45SStephan Aßmus rect.InsetBy(1, 1); 12748ee9217eSStephan Aßmus shape.Clear(); 1275f3997b74SStephan Aßmus if (orientation == B_HORIZONTAL) { 12768ee9217eSStephan Aßmus shape.MoveTo(BPoint(rect.left, rect.bottom + 1)); 12778ee9217eSStephan Aßmus shape.LineTo(BPoint(rect.right + 1, rect.bottom + 1)); 1278f3997b74SStephan Aßmus shape.LineTo(BPoint(centerh + 0.5, rect.top)); 1279f3997b74SStephan Aßmus } else { 1280f3997b74SStephan Aßmus shape.MoveTo(BPoint(rect.right + 1, rect.top)); 1281f3997b74SStephan Aßmus shape.LineTo(BPoint(rect.right + 1, rect.bottom + 1)); 1282f3997b74SStephan Aßmus shape.LineTo(BPoint(rect.left, centerv + 0.5)); 1283f3997b74SStephan Aßmus } 12848ee9217eSStephan Aßmus shape.Close(); 12852f86ba45SStephan Aßmus 12862f86ba45SStephan Aßmus BGradientLinear gradient; 12872f86ba45SStephan Aßmus if (flags & B_DISABLED) { 12888ee9217eSStephan Aßmus _MakeGradient(gradient, rect, fill, topTint, bottomTint); 12892f86ba45SStephan Aßmus } else { 12908ee9217eSStephan Aßmus _MakeGlossyGradient(gradient, rect, fill, topTint, middleTint1, 12912f86ba45SStephan Aßmus middleTint2, bottomTint); 12922f86ba45SStephan Aßmus } 12932f86ba45SStephan Aßmus 12948ee9217eSStephan Aßmus view->FillShape(&shape, gradient); 12952f86ba45SStephan Aßmus 12962f86ba45SStephan Aßmus view->SetFlags(viewFlags); 12972f86ba45SStephan Aßmus } 12982f86ba45SStephan Aßmus 12992f86ba45SStephan Aßmus 13002f86ba45SStephan Aßmus void 13012f86ba45SStephan Aßmus BControlLook::DrawSliderHashMarks(BView* view, BRect& rect, 13022f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, int32 count, 13032f86ba45SStephan Aßmus hash_mark_location location, uint32 flags, enum orientation orientation) 13042f86ba45SStephan Aßmus { 13052f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 13062f86ba45SStephan Aßmus return; 13072f86ba45SStephan Aßmus 13082f86ba45SStephan Aßmus rgb_color lightColor; 13092f86ba45SStephan Aßmus rgb_color darkColor; 13102f86ba45SStephan Aßmus 13112f86ba45SStephan Aßmus if (flags & B_DISABLED) { 13122f86ba45SStephan Aßmus lightColor = tint_color(base, 0.9); 13132f86ba45SStephan Aßmus darkColor = tint_color(base, 1.07); 13142f86ba45SStephan Aßmus } else { 13152f86ba45SStephan Aßmus lightColor = tint_color(base, 0.8); 13162f86ba45SStephan Aßmus darkColor = tint_color(base, 1.14); 13172f86ba45SStephan Aßmus } 13182f86ba45SStephan Aßmus 13192f86ba45SStephan Aßmus int32 hashMarkCount = max_c(count, 2); 13202f86ba45SStephan Aßmus // draw at least two hashmarks at min/max if 13212f86ba45SStephan Aßmus // fHashMarks != B_HASH_MARKS_NONE 13222f86ba45SStephan Aßmus float factor; 13232f86ba45SStephan Aßmus float startPos; 13242f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 13252f86ba45SStephan Aßmus factor = (rect.Width() - 2) / (hashMarkCount - 1); 13262f86ba45SStephan Aßmus startPos = rect.left + 1; 13272f86ba45SStephan Aßmus } else { 13282f86ba45SStephan Aßmus factor = (rect.Height() - 2) / (hashMarkCount - 1); 13292f86ba45SStephan Aßmus startPos = rect.top + 1; 13302f86ba45SStephan Aßmus } 13312f86ba45SStephan Aßmus 13322f86ba45SStephan Aßmus if (location & B_HASH_MARKS_TOP) { 13332f86ba45SStephan Aßmus view->BeginLineArray(hashMarkCount * 2); 13342f86ba45SStephan Aßmus 13352f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 13362f86ba45SStephan Aßmus float pos = startPos; 13372f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 13382f86ba45SStephan Aßmus view->AddLine(BPoint(pos, rect.top), 13392f86ba45SStephan Aßmus BPoint(pos, rect.top + 4), darkColor); 13402f86ba45SStephan Aßmus view->AddLine(BPoint(pos + 1, rect.top), 13412f86ba45SStephan Aßmus BPoint(pos + 1, rect.top + 4), lightColor); 13422f86ba45SStephan Aßmus 13432f86ba45SStephan Aßmus pos += factor; 13442f86ba45SStephan Aßmus } 13452f86ba45SStephan Aßmus } else { 13462f86ba45SStephan Aßmus float pos = startPos; 13472f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 13482f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, pos), 13492f86ba45SStephan Aßmus BPoint(rect.left + 4, pos), darkColor); 13502f86ba45SStephan Aßmus view->AddLine(BPoint(rect.left, pos + 1), 13512f86ba45SStephan Aßmus BPoint(rect.left + 4, pos + 1), lightColor); 13522f86ba45SStephan Aßmus 13532f86ba45SStephan Aßmus pos += factor; 13542f86ba45SStephan Aßmus } 13552f86ba45SStephan Aßmus } 13562f86ba45SStephan Aßmus 13572f86ba45SStephan Aßmus view->EndLineArray(); 13582f86ba45SStephan Aßmus } 13592f86ba45SStephan Aßmus 13602f86ba45SStephan Aßmus if (location & B_HASH_MARKS_BOTTOM) { 13612f86ba45SStephan Aßmus 13622f86ba45SStephan Aßmus view->BeginLineArray(hashMarkCount * 2); 13632f86ba45SStephan Aßmus 13642f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) { 13652f86ba45SStephan Aßmus float pos = startPos; 13662f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 13672f86ba45SStephan Aßmus view->AddLine(BPoint(pos, rect.bottom - 4), 13682f86ba45SStephan Aßmus BPoint(pos, rect.bottom), darkColor); 13692f86ba45SStephan Aßmus view->AddLine(BPoint(pos + 1, rect.bottom - 4), 13702f86ba45SStephan Aßmus BPoint(pos + 1, rect.bottom), lightColor); 13712f86ba45SStephan Aßmus 13722f86ba45SStephan Aßmus pos += factor; 13732f86ba45SStephan Aßmus } 13742f86ba45SStephan Aßmus } else { 13752f86ba45SStephan Aßmus float pos = startPos; 13762f86ba45SStephan Aßmus for (int32 i = 0; i < hashMarkCount; i++) { 13772f86ba45SStephan Aßmus view->AddLine(BPoint(rect.right - 4, pos), 13782f86ba45SStephan Aßmus BPoint(rect.right, pos), darkColor); 13792f86ba45SStephan Aßmus view->AddLine(BPoint(rect.right - 4, pos + 1), 13802f86ba45SStephan Aßmus BPoint(rect.right, pos + 1), lightColor); 13812f86ba45SStephan Aßmus 13822f86ba45SStephan Aßmus pos += factor; 13832f86ba45SStephan Aßmus } 13842f86ba45SStephan Aßmus } 13852f86ba45SStephan Aßmus 13862f86ba45SStephan Aßmus view->EndLineArray(); 13872f86ba45SStephan Aßmus } 13882f86ba45SStephan Aßmus } 13892f86ba45SStephan Aßmus 13902f86ba45SStephan Aßmus 13912f86ba45SStephan Aßmus void 13922f86ba45SStephan Aßmus BControlLook::DrawActiveTab(BView* view, BRect& rect, const BRect& updateRect, 13932f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, uint32 borders) 13942f86ba45SStephan Aßmus { 13952f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 13962f86ba45SStephan Aßmus return; 13972f86ba45SStephan Aßmus 13982f86ba45SStephan Aßmus rgb_color edgeShadowColor; 13992f86ba45SStephan Aßmus rgb_color edgeLightColor; 14002f86ba45SStephan Aßmus rgb_color frameShadowColor; 14012f86ba45SStephan Aßmus rgb_color frameLightColor; 14022f86ba45SStephan Aßmus rgb_color bevelShadowColor; 14032f86ba45SStephan Aßmus rgb_color bevelLightColor; 14042f86ba45SStephan Aßmus BGradientLinear fillGradient; 14052f86ba45SStephan Aßmus fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3)); 14062f86ba45SStephan Aßmus fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3)); 14072f86ba45SStephan Aßmus 14082f86ba45SStephan Aßmus if (flags & B_DISABLED) { 14092f86ba45SStephan Aßmus edgeShadowColor = base; 14102f86ba45SStephan Aßmus edgeLightColor = base; 14112f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 14122f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.25); 14132f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 14142f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.8); 14152f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.85), 0); 14162f86ba45SStephan Aßmus fillGradient.AddColor(base, 255); 14172f86ba45SStephan Aßmus } else { 14182f86ba45SStephan Aßmus edgeShadowColor = tint_color(base, 1.03); 14192f86ba45SStephan Aßmus edgeLightColor = tint_color(base, 0.80); 14202f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 14212f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.30); 14222f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 14232f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.6); 14242f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.75), 0); 14252f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.03), 255); 14262f86ba45SStephan Aßmus } 142712ea5a2cSStephan Aßmus 14282f86ba45SStephan Aßmus static const float kRoundCornerRadius = 4; 14292f86ba45SStephan Aßmus 14302f86ba45SStephan Aßmus // left/top corner 14312f86ba45SStephan Aßmus BRect cornerRect(rect); 14322f86ba45SStephan Aßmus cornerRect.right = cornerRect.left + kRoundCornerRadius; 14332f86ba45SStephan Aßmus cornerRect.bottom = cornerRect.top + kRoundCornerRadius; 14342f86ba45SStephan Aßmus 14352f86ba45SStephan Aßmus BRegion clipping(rect); 14362f86ba45SStephan Aßmus clipping.Exclude(cornerRect); 14372f86ba45SStephan Aßmus 14382f86ba45SStephan Aßmus _DrawRoundCornerLeftTop(view, cornerRect, updateRect, base, edgeShadowColor, 14392f86ba45SStephan Aßmus frameLightColor, bevelLightColor, fillGradient); 14402f86ba45SStephan Aßmus 14412f86ba45SStephan Aßmus // left/top corner 14422f86ba45SStephan Aßmus cornerRect.right = rect.right; 14432f86ba45SStephan Aßmus cornerRect.left = cornerRect.right - kRoundCornerRadius; 14442f86ba45SStephan Aßmus 14452f86ba45SStephan Aßmus clipping.Exclude(cornerRect); 14462f86ba45SStephan Aßmus 14472f86ba45SStephan Aßmus _DrawRoundCornerRightTop(view, cornerRect, updateRect, base, edgeShadowColor, 14482f86ba45SStephan Aßmus edgeLightColor, frameLightColor, frameShadowColor, bevelLightColor, 14492f86ba45SStephan Aßmus bevelShadowColor, fillGradient); 14502f86ba45SStephan Aßmus 14512f86ba45SStephan Aßmus // rest of frame and fill 14522f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 14532f86ba45SStephan Aßmus 14542f86ba45SStephan Aßmus _DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor, 14552f86ba45SStephan Aßmus edgeLightColor, 14562f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 14572f86ba45SStephan Aßmus if ((borders & B_LEFT_BORDER) == 0) 14582f86ba45SStephan Aßmus rect.left++; 14592f86ba45SStephan Aßmus if ((borders & B_RIGHT_BORDER) == 0) 14602f86ba45SStephan Aßmus rect.right--; 14612f86ba45SStephan Aßmus 14622f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor, 14632f86ba45SStephan Aßmus frameShadowColor, B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER); 14642f86ba45SStephan Aßmus 14652f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelLightColor, bevelLightColor, bevelShadowColor, 14662f86ba45SStephan Aßmus bevelShadowColor); 14672f86ba45SStephan Aßmus 14682f86ba45SStephan Aßmus view->FillRect(rect, fillGradient); 14692f86ba45SStephan Aßmus 14702f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 14712f86ba45SStephan Aßmus } 14722f86ba45SStephan Aßmus 14732f86ba45SStephan Aßmus 14742f86ba45SStephan Aßmus void 147583aff015SPhilippe Houdoin BControlLook::DrawInactiveTab(BView* view, BRect& rect, const BRect& updateRect, 14762f86ba45SStephan Aßmus const rgb_color& base, uint32 flags, uint32 borders) 14772f86ba45SStephan Aßmus { 14782f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 14792f86ba45SStephan Aßmus return; 14802f86ba45SStephan Aßmus 14812f86ba45SStephan Aßmus rgb_color edgeShadowColor; 14822f86ba45SStephan Aßmus rgb_color edgeLightColor; 14832f86ba45SStephan Aßmus rgb_color frameShadowColor; 14842f86ba45SStephan Aßmus rgb_color frameLightColor; 14852f86ba45SStephan Aßmus rgb_color bevelShadowColor; 14862f86ba45SStephan Aßmus rgb_color bevelLightColor; 14872f86ba45SStephan Aßmus BGradientLinear fillGradient; 14882f86ba45SStephan Aßmus fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3)); 14892f86ba45SStephan Aßmus fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3)); 14902f86ba45SStephan Aßmus 14912f86ba45SStephan Aßmus if (flags & B_DISABLED) { 14922f86ba45SStephan Aßmus edgeShadowColor = base; 14932f86ba45SStephan Aßmus edgeLightColor = base; 14942f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 14952f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.25); 14962f86ba45SStephan Aßmus bevelShadowColor = tint_color(base, 1.07); 14972f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 0.8); 14982f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 0.85), 0); 14992f86ba45SStephan Aßmus fillGradient.AddColor(base, 255); 15002f86ba45SStephan Aßmus } else { 15012f86ba45SStephan Aßmus edgeShadowColor = tint_color(base, 1.03); 15022f86ba45SStephan Aßmus edgeLightColor = tint_color(base, 0.80); 15032f86ba45SStephan Aßmus frameShadowColor = tint_color(base, 1.30); 15042f86ba45SStephan Aßmus frameLightColor = tint_color(base, 1.30); 150512ea5a2cSStephan Aßmus bevelShadowColor = tint_color(base, 1.17); 15062f86ba45SStephan Aßmus bevelLightColor = tint_color(base, 1.10); 15072f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.12), 0); 15082f86ba45SStephan Aßmus fillGradient.AddColor(tint_color(base, 1.08), 255); 15092f86ba45SStephan Aßmus } 15102f86ba45SStephan Aßmus 15112f86ba45SStephan Aßmus // active tabs stand out at the top, but this is an inactive tab 15122f86ba45SStephan Aßmus view->SetHighColor(base); 15132f86ba45SStephan Aßmus view->FillRect(BRect(rect.left, rect.top, rect.right, rect.top + 4)); 15142f86ba45SStephan Aßmus rect.top += 4; 15152f86ba45SStephan Aßmus 15162f86ba45SStephan Aßmus // frame and fill 15172f86ba45SStephan Aßmus _DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor, 15182f86ba45SStephan Aßmus edgeLightColor, 15192f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 15202f86ba45SStephan Aßmus 15212f86ba45SStephan Aßmus _DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor, 15222f86ba45SStephan Aßmus frameShadowColor, 15232f86ba45SStephan Aßmus borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER)); 15242f86ba45SStephan Aßmus 1525b3601d82SStephan Aßmus if (rect.IsValid()) { 1526b3601d82SStephan Aßmus _DrawFrame(view, rect, bevelShadowColor, bevelShadowColor, 1527b3601d82SStephan Aßmus bevelLightColor, bevelLightColor, B_LEFT_BORDER & ~borders); 1528b3601d82SStephan Aßmus } else { 1529b3601d82SStephan Aßmus if ((B_LEFT_BORDER & ~borders) != 0) 1530b3601d82SStephan Aßmus rect.left++; 1531b3601d82SStephan Aßmus } 15322f86ba45SStephan Aßmus 15332f86ba45SStephan Aßmus view->FillRect(rect, fillGradient); 15342f86ba45SStephan Aßmus } 15352f86ba45SStephan Aßmus 15362f86ba45SStephan Aßmus 15371f9fd6d8SStephan Aßmus void 15381f9fd6d8SStephan Aßmus BControlLook::DrawSplitter(BView* view, BRect& rect, const BRect& updateRect, 15391f9fd6d8SStephan Aßmus const rgb_color& base, enum orientation orientation, uint32 flags, 15401f9fd6d8SStephan Aßmus uint32 borders) 15411f9fd6d8SStephan Aßmus { 15421f9fd6d8SStephan Aßmus rgb_color background; 15431f9fd6d8SStephan Aßmus if ((flags & (B_CLICKED | B_ACTIVATED)) != 0) 15441f9fd6d8SStephan Aßmus background = tint_color(base, B_DARKEN_1_TINT); 15451f9fd6d8SStephan Aßmus else 15461f9fd6d8SStephan Aßmus background = base; 15471f9fd6d8SStephan Aßmus 15481f9fd6d8SStephan Aßmus rgb_color light = tint_color(background, 0.6); 15491f9fd6d8SStephan Aßmus rgb_color shadow = tint_color(background, 1.21); 15501f9fd6d8SStephan Aßmus 15511f9fd6d8SStephan Aßmus // frame 15521f9fd6d8SStephan Aßmus if (borders != 0 && rect.Width() > 3 && rect.Height() > 3) 15531f9fd6d8SStephan Aßmus DrawRaisedBorder(view, rect, updateRect, background, flags, borders); 15541f9fd6d8SStephan Aßmus 15551f9fd6d8SStephan Aßmus // dots and rest of background 15561f9fd6d8SStephan Aßmus if (orientation == B_HORIZONTAL) { 15571f9fd6d8SStephan Aßmus if (rect.Width() > 2) { 15581f9fd6d8SStephan Aßmus // background on left/right 15591f9fd6d8SStephan Aßmus BRegion region(rect); 15601f9fd6d8SStephan Aßmus rect.left = floorf((rect.left + rect.right) / 2.0 - 0.5); 15611f9fd6d8SStephan Aßmus rect.right = rect.left + 1; 15621f9fd6d8SStephan Aßmus region.Exclude(rect); 15631f9fd6d8SStephan Aßmus view->SetHighColor(background); 15641f9fd6d8SStephan Aßmus view->FillRegion(®ion); 15651f9fd6d8SStephan Aßmus } 15661f9fd6d8SStephan Aßmus 15671f9fd6d8SStephan Aßmus BPoint dot = rect.LeftTop(); 15681f9fd6d8SStephan Aßmus BPoint stop = rect.LeftBottom(); 15691f9fd6d8SStephan Aßmus int32 num = 1; 15701f9fd6d8SStephan Aßmus while (dot.y <= stop.y) { 15711f9fd6d8SStephan Aßmus rgb_color col1; 15721f9fd6d8SStephan Aßmus rgb_color col2; 15731f9fd6d8SStephan Aßmus switch (num) { 15741f9fd6d8SStephan Aßmus case 1: 15751f9fd6d8SStephan Aßmus col1 = background; 15761f9fd6d8SStephan Aßmus col2 = background; 15771f9fd6d8SStephan Aßmus break; 15781f9fd6d8SStephan Aßmus case 2: 15791f9fd6d8SStephan Aßmus col1 = shadow; 15801f9fd6d8SStephan Aßmus col2 = background; 15811f9fd6d8SStephan Aßmus break; 15821f9fd6d8SStephan Aßmus case 3: 1583a5339f65SStephan Aßmus default: 15841f9fd6d8SStephan Aßmus col1 = background; 15851f9fd6d8SStephan Aßmus col2 = light; 15861f9fd6d8SStephan Aßmus num = 0; 15871f9fd6d8SStephan Aßmus break; 15881f9fd6d8SStephan Aßmus } 15891f9fd6d8SStephan Aßmus view->SetHighColor(col1); 15901f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 15911f9fd6d8SStephan Aßmus view->SetHighColor(col2); 15921f9fd6d8SStephan Aßmus dot.x++; 15931f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 15941f9fd6d8SStephan Aßmus dot.x -= 1.0; 15951f9fd6d8SStephan Aßmus // next pixel 15961f9fd6d8SStephan Aßmus num++; 15971f9fd6d8SStephan Aßmus dot.y++; 15981f9fd6d8SStephan Aßmus } 15991f9fd6d8SStephan Aßmus } else { 16001f9fd6d8SStephan Aßmus if (rect.Height() > 2) { 16011f9fd6d8SStephan Aßmus // background on left/right 16021f9fd6d8SStephan Aßmus BRegion region(rect); 16031f9fd6d8SStephan Aßmus rect.top = floorf((rect.top + rect.bottom) / 2.0 - 0.5); 16041f9fd6d8SStephan Aßmus rect.bottom = rect.top + 1; 16051f9fd6d8SStephan Aßmus region.Exclude(rect); 16061f9fd6d8SStephan Aßmus view->SetHighColor(background); 16071f9fd6d8SStephan Aßmus view->FillRegion(®ion); 16081f9fd6d8SStephan Aßmus } 16091f9fd6d8SStephan Aßmus 16101f9fd6d8SStephan Aßmus BPoint dot = rect.LeftTop(); 16111f9fd6d8SStephan Aßmus BPoint stop = rect.RightTop(); 16121f9fd6d8SStephan Aßmus int32 num = 1; 16131f9fd6d8SStephan Aßmus while (dot.x <= stop.x) { 16141f9fd6d8SStephan Aßmus rgb_color col1; 16151f9fd6d8SStephan Aßmus rgb_color col2; 16161f9fd6d8SStephan Aßmus switch (num) { 16171f9fd6d8SStephan Aßmus case 1: 16181f9fd6d8SStephan Aßmus col1 = background; 16191f9fd6d8SStephan Aßmus col2 = background; 16201f9fd6d8SStephan Aßmus break; 16211f9fd6d8SStephan Aßmus case 2: 16221f9fd6d8SStephan Aßmus col1 = shadow; 16231f9fd6d8SStephan Aßmus col2 = background; 16241f9fd6d8SStephan Aßmus break; 16251f9fd6d8SStephan Aßmus case 3: 16269f981a88SFrançois Revol default: 16271f9fd6d8SStephan Aßmus col1 = background; 16281f9fd6d8SStephan Aßmus col2 = light; 16291f9fd6d8SStephan Aßmus num = 0; 16301f9fd6d8SStephan Aßmus break; 16311f9fd6d8SStephan Aßmus } 16321f9fd6d8SStephan Aßmus view->SetHighColor(col1); 16331f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 16341f9fd6d8SStephan Aßmus view->SetHighColor(col2); 16351f9fd6d8SStephan Aßmus dot.y++; 16361f9fd6d8SStephan Aßmus view->StrokeLine(dot, dot, B_SOLID_HIGH); 16371f9fd6d8SStephan Aßmus dot.y -= 1.0; 16381f9fd6d8SStephan Aßmus // next pixel 16391f9fd6d8SStephan Aßmus num++; 16401f9fd6d8SStephan Aßmus dot.x++; 16411f9fd6d8SStephan Aßmus } 16421f9fd6d8SStephan Aßmus } 16431f9fd6d8SStephan Aßmus } 16441f9fd6d8SStephan Aßmus 16451f9fd6d8SStephan Aßmus 16462f86ba45SStephan Aßmus // #pragma mark - 16472f86ba45SStephan Aßmus 16482f86ba45SStephan Aßmus 16492f86ba45SStephan Aßmus void 16502f86ba45SStephan Aßmus BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect, 16512f86ba45SStephan Aßmus const rgb_color& base, border_style border, uint32 flags, uint32 borders) 16522f86ba45SStephan Aßmus { 16532f86ba45SStephan Aßmus if (border == B_NO_BORDER) 16542f86ba45SStephan Aßmus return; 16552f86ba45SStephan Aßmus 16562f86ba45SStephan Aßmus rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT); 16572f86ba45SStephan Aßmus if (flags & B_FOCUSED) 16582f86ba45SStephan Aßmus scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 16592f86ba45SStephan Aßmus 16602f86ba45SStephan Aßmus if (border == B_FANCY_BORDER) 16614f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders); 16622f86ba45SStephan Aßmus 16632f86ba45SStephan Aßmus _DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor, 16642f86ba45SStephan Aßmus scrollbarFrameColor, scrollbarFrameColor, borders); 16652f86ba45SStephan Aßmus } 16662f86ba45SStephan Aßmus 16672f86ba45SStephan Aßmus 16682f86ba45SStephan Aßmus void 16692f86ba45SStephan Aßmus BControlLook::DrawRaisedBorder(BView* view, BRect& rect, 16702f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 16712f86ba45SStephan Aßmus uint32 borders) 16722f86ba45SStephan Aßmus { 16732f86ba45SStephan Aßmus rgb_color lightColor; 16742f86ba45SStephan Aßmus rgb_color shadowColor; 16752f86ba45SStephan Aßmus 16762f86ba45SStephan Aßmus if (flags & B_DISABLED) { 16772f86ba45SStephan Aßmus lightColor = base; 16782f86ba45SStephan Aßmus shadowColor = base; 16792f86ba45SStephan Aßmus } else { 16802f86ba45SStephan Aßmus lightColor = tint_color(base, 0.85); 16812f86ba45SStephan Aßmus shadowColor = tint_color(base, 1.07); 16822f86ba45SStephan Aßmus } 16832f86ba45SStephan Aßmus 16842f86ba45SStephan Aßmus _DrawFrame(view, rect, lightColor, lightColor, shadowColor, shadowColor, 16852f86ba45SStephan Aßmus borders); 16862f86ba45SStephan Aßmus } 16872f86ba45SStephan Aßmus 16882f86ba45SStephan Aßmus 16892f86ba45SStephan Aßmus void 16902f86ba45SStephan Aßmus BControlLook::DrawTextControlBorder(BView* view, BRect& rect, 16912f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 16922f86ba45SStephan Aßmus uint32 borders) 16932f86ba45SStephan Aßmus { 16942f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 16952f86ba45SStephan Aßmus return; 16962f86ba45SStephan Aßmus 16972f86ba45SStephan Aßmus rgb_color dark1BorderColor; 16982f86ba45SStephan Aßmus rgb_color dark2BorderColor; 16992f86ba45SStephan Aßmus rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 17002f86ba45SStephan Aßmus 17012f86ba45SStephan Aßmus if (flags & B_DISABLED) { 17024f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags, borders); 17032f86ba45SStephan Aßmus 17044f579098SStephan Aßmus if (flags & B_BLEND_FRAME) 17054f579098SStephan Aßmus dark1BorderColor = (rgb_color){ 0, 0, 0, 40 }; 17064f579098SStephan Aßmus else 17072f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.15); 17084f579098SStephan Aßmus dark2BorderColor = dark1BorderColor; 17092f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 17102f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.50); 17112f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.49); 17122f86ba45SStephan Aßmus 17134f579098SStephan Aßmus // BCheckBox uses this to indicate the clicked state... 17142f86ba45SStephan Aßmus _DrawFrame(view, rect, 17152f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 17162f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor); 17172f86ba45SStephan Aßmus 17182f86ba45SStephan Aßmus dark2BorderColor = dark1BorderColor; 17192f86ba45SStephan Aßmus } else { 17204f579098SStephan Aßmus _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags, borders); 17212f86ba45SStephan Aßmus 17224f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 17234f579098SStephan Aßmus dark1BorderColor = (rgb_color){ 0, 0, 0, 102 }; 17244f579098SStephan Aßmus dark2BorderColor = (rgb_color){ 0, 0, 0, 97 }; 17254f579098SStephan Aßmus } else { 17262f86ba45SStephan Aßmus dark1BorderColor = tint_color(base, 1.40); 17272f86ba45SStephan Aßmus dark2BorderColor = tint_color(base, 1.38); 17282f86ba45SStephan Aßmus } 17294f579098SStephan Aßmus } 17302f86ba45SStephan Aßmus 17312f86ba45SStephan Aßmus if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) { 17322f86ba45SStephan Aßmus dark1BorderColor = navigationColor; 17332f86ba45SStephan Aßmus dark2BorderColor = navigationColor; 17342f86ba45SStephan Aßmus } 17352f86ba45SStephan Aßmus 17364f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 17374f579098SStephan Aßmus drawing_mode oldMode = view->DrawingMode(); 17384f579098SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 17394f579098SStephan Aßmus 17402f86ba45SStephan Aßmus _DrawFrame(view, rect, 17412f86ba45SStephan Aßmus dark1BorderColor, dark1BorderColor, 17422f86ba45SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 17434f579098SStephan Aßmus 17444f579098SStephan Aßmus view->SetDrawingMode(oldMode); 17454f579098SStephan Aßmus } else { 17464f579098SStephan Aßmus _DrawFrame(view, rect, 17474f579098SStephan Aßmus dark1BorderColor, dark1BorderColor, 17484f579098SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 17494f579098SStephan Aßmus } 17502f86ba45SStephan Aßmus } 17512f86ba45SStephan Aßmus 17522f86ba45SStephan Aßmus 17532f86ba45SStephan Aßmus void 17542f86ba45SStephan Aßmus BControlLook::DrawGroupFrame(BView* view, BRect& rect, const BRect& updateRect, 17552f86ba45SStephan Aßmus const rgb_color& base, uint32 borders) 17562f86ba45SStephan Aßmus { 17572f86ba45SStephan Aßmus rgb_color frameColor = tint_color(base, 1.30); 17582f86ba45SStephan Aßmus rgb_color bevelLight = tint_color(base, 0.8); 17592f86ba45SStephan Aßmus rgb_color bevelShadow = tint_color(base, 1.03); 17602f86ba45SStephan Aßmus 17612f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelShadow, bevelShadow, bevelLight, bevelLight, 17622f86ba45SStephan Aßmus borders); 17632f86ba45SStephan Aßmus 17642f86ba45SStephan Aßmus _DrawFrame(view, rect, frameColor, frameColor, frameColor, frameColor, 17652f86ba45SStephan Aßmus borders); 17662f86ba45SStephan Aßmus 17672f86ba45SStephan Aßmus _DrawFrame(view, rect, bevelLight, bevelLight, bevelShadow, bevelShadow, 17682f86ba45SStephan Aßmus borders); 17692f86ba45SStephan Aßmus } 17702f86ba45SStephan Aßmus 17712f86ba45SStephan Aßmus 17722f86ba45SStephan Aßmus void 17732f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect, 17742f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags) 17752f86ba45SStephan Aßmus { 17762f86ba45SStephan Aßmus DrawLabel(view, label, rect, updateRect, base, flags, 17772f86ba45SStephan Aßmus DefaultLabelAlignment()); 17782f86ba45SStephan Aßmus } 17792f86ba45SStephan Aßmus 17802f86ba45SStephan Aßmus 17812f86ba45SStephan Aßmus void 17822f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect, 17832f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, uint32 flags, 17842f86ba45SStephan Aßmus const BAlignment& alignment) 17852f86ba45SStephan Aßmus { 17862f86ba45SStephan Aßmus if (!rect.Intersects(updateRect)) 17872f86ba45SStephan Aßmus return; 17882f86ba45SStephan Aßmus 17892f86ba45SStephan Aßmus // truncate the label if necessary and get the width and height 17902f86ba45SStephan Aßmus BString truncatedLabel(label); 17912f86ba45SStephan Aßmus 17922f86ba45SStephan Aßmus BFont font; 17932f86ba45SStephan Aßmus view->GetFont(&font); 17942f86ba45SStephan Aßmus 17952f86ba45SStephan Aßmus float width = rect.Width(); 17962f86ba45SStephan Aßmus font.TruncateString(&truncatedLabel, B_TRUNCATE_END, width); 17972f86ba45SStephan Aßmus width = font.StringWidth(truncatedLabel.String()); 17982f86ba45SStephan Aßmus 17992f86ba45SStephan Aßmus font_height fontHeight; 18002f86ba45SStephan Aßmus font.GetHeight(&fontHeight); 18012f86ba45SStephan Aßmus float height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent); 18022f86ba45SStephan Aßmus 18032f86ba45SStephan Aßmus // handle alignment 18042f86ba45SStephan Aßmus BPoint location; 18052f86ba45SStephan Aßmus 18062f86ba45SStephan Aßmus switch (alignment.horizontal) { 18072f86ba45SStephan Aßmus default: 18082f86ba45SStephan Aßmus case B_ALIGN_LEFT: 18092f86ba45SStephan Aßmus location.x = rect.left; 18102f86ba45SStephan Aßmus break; 18112f86ba45SStephan Aßmus case B_ALIGN_RIGHT: 18122f86ba45SStephan Aßmus location.x = rect.right - width; 18132f86ba45SStephan Aßmus break; 18142f86ba45SStephan Aßmus case B_ALIGN_CENTER: 18152f86ba45SStephan Aßmus location.x = (rect.left + rect.right - width) / 2.0f; 18162f86ba45SStephan Aßmus break; 18172f86ba45SStephan Aßmus } 18182f86ba45SStephan Aßmus 18192f86ba45SStephan Aßmus switch (alignment.vertical) { 18202f86ba45SStephan Aßmus case B_ALIGN_TOP: 18212f86ba45SStephan Aßmus location.y = rect.top + ceilf(fontHeight.ascent); 18222f86ba45SStephan Aßmus break; 18232f86ba45SStephan Aßmus default: 18242f86ba45SStephan Aßmus case B_ALIGN_MIDDLE: 18252f86ba45SStephan Aßmus location.y = floorf((rect.top + rect.bottom - height) / 2.0f + 0.5f) 18262f86ba45SStephan Aßmus + ceilf(fontHeight.ascent); 18272f86ba45SStephan Aßmus break; 18282f86ba45SStephan Aßmus case B_ALIGN_BOTTOM: 18292f86ba45SStephan Aßmus location.y = rect.bottom - ceilf(fontHeight.descent); 18302f86ba45SStephan Aßmus break; 18312f86ba45SStephan Aßmus } 18322f86ba45SStephan Aßmus 1833c4e211feSStephan Aßmus DrawLabel(view, truncatedLabel.String(), base, flags, location); 1834c4e211feSStephan Aßmus } 1835c4e211feSStephan Aßmus 1836c4e211feSStephan Aßmus 1837c4e211feSStephan Aßmus void 1838c4e211feSStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, const rgb_color& base, 1839c4e211feSStephan Aßmus uint32 flags, const BPoint& where) 1840c4e211feSStephan Aßmus { 1841c4e211feSStephan Aßmus // setup the text color 1842c4e211feSStephan Aßmus // TODO: Should either use the ui_color(B_CONTROL_TEXT_COLOR) here, 1843c4e211feSStephan Aßmus // or elliminate that constant alltogether (stippi: +1). 1844d63b75faSPhilippe Saint-Pierre 1845d63b75faSPhilippe Saint-Pierre BWindow* window = view->Window(); 1846d63b75faSPhilippe Saint-Pierre bool isDesktop = window 1847d63b75faSPhilippe Saint-Pierre && window->Feel() == kPrivateDesktopWindowFeel 1848d63b75faSPhilippe Saint-Pierre && window->Look() == kPrivateDesktopWindowLook 1849d63b75faSPhilippe Saint-Pierre && view->Parent() 1850d63b75faSPhilippe Saint-Pierre && view->Parent()->Parent() == NULL 1851d63b75faSPhilippe Saint-Pierre && (flags & B_IGNORE_OUTLINE) == 0; 1852d63b75faSPhilippe Saint-Pierre 1853d63b75faSPhilippe Saint-Pierre rgb_color low; 1854c4e211feSStephan Aßmus rgb_color color; 1855d63b75faSPhilippe Saint-Pierre rgb_color glowColor; 1856d63b75faSPhilippe Saint-Pierre 1857d63b75faSPhilippe Saint-Pierre if (isDesktop) 1858d63b75faSPhilippe Saint-Pierre low = view->Parent()->ViewColor(); 1859c4e211feSStephan Aßmus else 1860d63b75faSPhilippe Saint-Pierre low = base; 1861d63b75faSPhilippe Saint-Pierre 1862d63b75faSPhilippe Saint-Pierre if (low.red + low.green + low.blue > 128 * 3) { 1863d63b75faSPhilippe Saint-Pierre color = tint_color(low, B_DARKEN_MAX_TINT); 1864d63b75faSPhilippe Saint-Pierre glowColor = kWhite; 1865d63b75faSPhilippe Saint-Pierre } else { 1866d63b75faSPhilippe Saint-Pierre color = tint_color(low, B_LIGHTEN_MAX_TINT); 1867d63b75faSPhilippe Saint-Pierre glowColor = kBlack; 1868d63b75faSPhilippe Saint-Pierre } 1869c4e211feSStephan Aßmus 1870c4e211feSStephan Aßmus if (flags & B_DISABLED) { 1871d63b75faSPhilippe Saint-Pierre color.red = (uint8)(((int32)low.red + color.red + 1) / 2); 1872d63b75faSPhilippe Saint-Pierre color.green = (uint8)(((int32)low.green + color.green + 1) / 2); 1873d63b75faSPhilippe Saint-Pierre color.blue = (uint8)(((int32)low.blue + color.blue + 1) / 2); 1874d63b75faSPhilippe Saint-Pierre } 1875d63b75faSPhilippe Saint-Pierre 1876d63b75faSPhilippe Saint-Pierre drawing_mode oldMode = view->DrawingMode(); 1877d63b75faSPhilippe Saint-Pierre 1878d63b75faSPhilippe Saint-Pierre // check if the drawing occurs on the desktop 1879d63b75faSPhilippe Saint-Pierre if (isDesktop) { 1880d63b75faSPhilippe Saint-Pierre 1881d63b75faSPhilippe Saint-Pierre if (fCachedWorkspace != current_workspace()) { 1882d63b75faSPhilippe Saint-Pierre 1883d63b75faSPhilippe Saint-Pierre int8 indice = 0; 1884d63b75faSPhilippe Saint-Pierre int32 mask; 1885d63b75faSPhilippe Saint-Pierre bool tmpOutline; 1886d63b75faSPhilippe Saint-Pierre while (fBackgroundInfo.FindInt32("be:bgndimginfoworkspaces", 1887d63b75faSPhilippe Saint-Pierre indice, &mask) == B_OK 1888d63b75faSPhilippe Saint-Pierre && fBackgroundInfo.FindBool("be:bgndimginfoerasetext", 1889d63b75faSPhilippe Saint-Pierre indice, &tmpOutline) == B_OK) { 1890d63b75faSPhilippe Saint-Pierre 1891d63b75faSPhilippe Saint-Pierre if (((1 << current_workspace()) & mask) != 0) { 1892d63b75faSPhilippe Saint-Pierre fCachedOutline = tmpOutline; 1893d63b75faSPhilippe Saint-Pierre fCachedWorkspace = current_workspace(); 1894d63b75faSPhilippe Saint-Pierre break; 1895d63b75faSPhilippe Saint-Pierre } 1896d63b75faSPhilippe Saint-Pierre indice++; 1897d63b75faSPhilippe Saint-Pierre } 1898d63b75faSPhilippe Saint-Pierre } 1899d63b75faSPhilippe Saint-Pierre 1900d63b75faSPhilippe Saint-Pierre if (fCachedOutline) { 1901d63b75faSPhilippe Saint-Pierre BFont font; 1902d63b75faSPhilippe Saint-Pierre view->GetFont(&font); 1903d63b75faSPhilippe Saint-Pierre 1904d63b75faSPhilippe Saint-Pierre view->SetDrawingMode(B_OP_ALPHA); 1905d63b75faSPhilippe Saint-Pierre view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); 1906d63b75faSPhilippe Saint-Pierre // Draw glow or outline 1907d63b75faSPhilippe Saint-Pierre if (glowColor == kWhite) { 1908d63b75faSPhilippe Saint-Pierre font.SetFalseBoldWidth(2.0); 1909d63b75faSPhilippe Saint-Pierre view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); 1910d63b75faSPhilippe Saint-Pierre 1911d63b75faSPhilippe Saint-Pierre glowColor.alpha = 30; 1912d63b75faSPhilippe Saint-Pierre view->SetHighColor(glowColor); 1913d63b75faSPhilippe Saint-Pierre view->DrawString(label, where); 1914d63b75faSPhilippe Saint-Pierre 1915d63b75faSPhilippe Saint-Pierre font.SetFalseBoldWidth(1.0); 1916d63b75faSPhilippe Saint-Pierre view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); 1917d63b75faSPhilippe Saint-Pierre 1918d63b75faSPhilippe Saint-Pierre glowColor.alpha = 65; 1919d63b75faSPhilippe Saint-Pierre view->SetHighColor(glowColor); 1920d63b75faSPhilippe Saint-Pierre view->DrawString(label, where); 1921d63b75faSPhilippe Saint-Pierre 1922d63b75faSPhilippe Saint-Pierre font.SetFalseBoldWidth(0.0); 1923d63b75faSPhilippe Saint-Pierre view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); 1924d63b75faSPhilippe Saint-Pierre 1925d63b75faSPhilippe Saint-Pierre } else if (glowColor == kBlack) { 1926d63b75faSPhilippe Saint-Pierre font.SetFalseBoldWidth(1.0); 1927d63b75faSPhilippe Saint-Pierre view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); 1928d63b75faSPhilippe Saint-Pierre 1929d63b75faSPhilippe Saint-Pierre glowColor.alpha = 30; 1930d63b75faSPhilippe Saint-Pierre view->SetHighColor(glowColor); 1931d63b75faSPhilippe Saint-Pierre view->DrawString(label, where); 1932d63b75faSPhilippe Saint-Pierre 1933d63b75faSPhilippe Saint-Pierre font.SetFalseBoldWidth(0.0); 1934d63b75faSPhilippe Saint-Pierre view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH); 1935d63b75faSPhilippe Saint-Pierre 1936d63b75faSPhilippe Saint-Pierre glowColor.alpha = 200; 1937d63b75faSPhilippe Saint-Pierre view->SetHighColor(glowColor); 1938d63b75faSPhilippe Saint-Pierre view->DrawString(label, BPoint(where.x + 1, where.y + 1)); 1939d63b75faSPhilippe Saint-Pierre } 1940d63b75faSPhilippe Saint-Pierre } 1941c4e211feSStephan Aßmus } 1942c4e211feSStephan Aßmus 1943c4e211feSStephan Aßmus view->SetHighColor(color); 1944d63b75faSPhilippe Saint-Pierre 1945c4e211feSStephan Aßmus view->SetDrawingMode(B_OP_OVER); 1946c4e211feSStephan Aßmus 1947c4e211feSStephan Aßmus view->DrawString(label, where); 1948c4e211feSStephan Aßmus 1949c4e211feSStephan Aßmus view->SetDrawingMode(oldMode); 19502f86ba45SStephan Aßmus } 19512f86ba45SStephan Aßmus 19522f86ba45SStephan Aßmus 1953d63b75faSPhilippe Saint-Pierre void 1954*d452ff66SAxel Dörfler BControlLook::SetBackgroundInfo(const BMessage& backgroundInfo) 1955d63b75faSPhilippe Saint-Pierre { 1956*d452ff66SAxel Dörfler fBackgroundInfo = backgroundInfo; 1957d63b75faSPhilippe Saint-Pierre fCachedWorkspace = -1; 1958d63b75faSPhilippe Saint-Pierre } 1959d63b75faSPhilippe Saint-Pierre 1960d63b75faSPhilippe Saint-Pierre 19612f86ba45SStephan Aßmus // #pragma mark - 19622f86ba45SStephan Aßmus 19632f86ba45SStephan Aßmus 19642f86ba45SStephan Aßmus void 196513cd46dfSStephan Aßmus BControlLook::_DrawButtonFrame(BView* view, BRect& rect, 1966681c2e44SStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& background, 196713cd46dfSStephan Aßmus float contrast, float brightness, uint32 flags, uint32 borders) 196813cd46dfSStephan Aßmus { 196913cd46dfSStephan Aßmus // colors 197013cd46dfSStephan Aßmus rgb_color dark1BorderColor; 197113cd46dfSStephan Aßmus rgb_color dark2BorderColor; 197213cd46dfSStephan Aßmus 197313cd46dfSStephan Aßmus if ((flags & B_DISABLED) == 0) { 19744f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 19754f579098SStephan Aßmus dark1BorderColor = (rgb_color){ 0, 0, 0, 75 }; 19764f579098SStephan Aßmus dark2BorderColor = (rgb_color){ 0, 0, 0, 95 }; 19774f579098SStephan Aßmus } else { 197813cd46dfSStephan Aßmus dark1BorderColor = tint_color(base, 1.33); 197913cd46dfSStephan Aßmus dark2BorderColor = tint_color(base, 1.45); 19804f579098SStephan Aßmus } 198113cd46dfSStephan Aßmus 198213cd46dfSStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 19834f579098SStephan Aßmus // TODO: B_BLEND_FRAME 198413cd46dfSStephan Aßmus dark2BorderColor = tint_color(dark1BorderColor, 1.5); 198513cd46dfSStephan Aßmus dark1BorderColor = tint_color(dark1BorderColor, 1.35); 198613cd46dfSStephan Aßmus } 198713cd46dfSStephan Aßmus } else { 19884f579098SStephan Aßmus // TODO: B_BLEND_FRAME 198913cd46dfSStephan Aßmus dark1BorderColor = tint_color(base, 1.147); 199013cd46dfSStephan Aßmus dark2BorderColor = tint_color(base, 1.24); 199113cd46dfSStephan Aßmus 199213cd46dfSStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 199374bb70aeSStephan Aßmus dark1BorderColor = tint_color(dark1BorderColor, 1.14); 199474bb70aeSStephan Aßmus dark2BorderColor = tint_color(dark1BorderColor, 1.12); 199513cd46dfSStephan Aßmus } 199613cd46dfSStephan Aßmus } 199713cd46dfSStephan Aßmus 199813cd46dfSStephan Aßmus if (flags & B_ACTIVATED) { 199913cd46dfSStephan Aßmus rgb_color temp = dark2BorderColor; 200013cd46dfSStephan Aßmus dark2BorderColor = dark1BorderColor; 200113cd46dfSStephan Aßmus dark1BorderColor = temp; 200213cd46dfSStephan Aßmus } 200313cd46dfSStephan Aßmus 200413cd46dfSStephan Aßmus // indicate focus by changing main button border 200513cd46dfSStephan Aßmus if (flags & B_FOCUSED) { 200613cd46dfSStephan Aßmus dark1BorderColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 200713cd46dfSStephan Aßmus dark2BorderColor = dark1BorderColor; 200813cd46dfSStephan Aßmus } 200913cd46dfSStephan Aßmus 201013cd46dfSStephan Aßmus if (flags & B_DEFAULT_BUTTON) { 20114f579098SStephan Aßmus // TODO: B_BLEND_FRAME 201213cd46dfSStephan Aßmus float focusTint = 1.2; 201313cd46dfSStephan Aßmus if (flags & B_DISABLED) 201413cd46dfSStephan Aßmus focusTint = (B_NO_TINT + focusTint) / 2; 201513cd46dfSStephan Aßmus 201613cd46dfSStephan Aßmus rgb_color focusColor = tint_color(base, focusTint); 201713cd46dfSStephan Aßmus view->SetHighColor(base); 201813cd46dfSStephan Aßmus 201913cd46dfSStephan Aßmus view->StrokeRect(rect); 202013cd46dfSStephan Aßmus rect.InsetBy(1.0, 1.0); 202113cd46dfSStephan Aßmus 202213cd46dfSStephan Aßmus view->SetHighColor(focusColor); 202313cd46dfSStephan Aßmus view->StrokeRect(rect); 202413cd46dfSStephan Aßmus rect.InsetBy(1.0, 1.0); 202513cd46dfSStephan Aßmus view->StrokeRect(rect); 202613cd46dfSStephan Aßmus rect.InsetBy(1.0, 1.0); 202713cd46dfSStephan Aßmus 202813cd46dfSStephan Aßmus // bevel around external border 202913cd46dfSStephan Aßmus _DrawOuterResessedFrame(view, rect, focusColor, 203074bb70aeSStephan Aßmus contrast * (((flags & B_DISABLED) ? 0.3 : 0.8)), 203174bb70aeSStephan Aßmus brightness * (((flags & B_DISABLED) ? 1.0 : 0.9)), 20324f579098SStephan Aßmus flags, borders); 203313cd46dfSStephan Aßmus } else { 203413cd46dfSStephan Aßmus // bevel around external border 2035681c2e44SStephan Aßmus _DrawOuterResessedFrame(view, rect, background, 203613cd46dfSStephan Aßmus contrast * ((flags & B_DISABLED) ? 0.0 : 1.0), brightness * 1.0, 20374f579098SStephan Aßmus flags, borders); 203813cd46dfSStephan Aßmus } 203913cd46dfSStephan Aßmus 20404f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 20414f579098SStephan Aßmus drawing_mode oldDrawingMode = view->DrawingMode(); 20424f579098SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 20434f579098SStephan Aßmus 204413cd46dfSStephan Aßmus _DrawFrame(view, rect, dark1BorderColor, dark1BorderColor, 204513cd46dfSStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 20464f579098SStephan Aßmus 20474f579098SStephan Aßmus view->SetDrawingMode(oldDrawingMode); 20484f579098SStephan Aßmus } else { 20494f579098SStephan Aßmus _DrawFrame(view, rect, dark1BorderColor, dark1BorderColor, 20504f579098SStephan Aßmus dark2BorderColor, dark2BorderColor, borders); 20514f579098SStephan Aßmus } 205213cd46dfSStephan Aßmus } 205313cd46dfSStephan Aßmus 205413cd46dfSStephan Aßmus 205513cd46dfSStephan Aßmus void 20562f86ba45SStephan Aßmus BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect, 20574f579098SStephan Aßmus const rgb_color& base, float contrast, float brightness, uint32 flags, 20584f579098SStephan Aßmus uint32 borders) 20592f86ba45SStephan Aßmus { 20604f579098SStephan Aßmus if (flags & B_BLEND_FRAME) { 20614f579098SStephan Aßmus // assumes the background has already been painted 20624f579098SStephan Aßmus drawing_mode oldDrawingMode = view->DrawingMode(); 20634f579098SStephan Aßmus view->SetDrawingMode(B_OP_ALPHA); 20644f579098SStephan Aßmus 20654f579098SStephan Aßmus uint8 alpha = uint8(20 * contrast); 20664f579098SStephan Aßmus uint32 white = uint8(255 * brightness); 20674f579098SStephan Aßmus 20684f579098SStephan Aßmus rgb_color borderBevelShadow = (rgb_color){ 0, 0, 0, alpha }; 20694f579098SStephan Aßmus rgb_color borderBevelLight = (rgb_color){ white, white, white, alpha }; 20704f579098SStephan Aßmus 20714f579098SStephan Aßmus _DrawFrame(view, rect, borderBevelShadow, borderBevelShadow, 20724f579098SStephan Aßmus borderBevelLight, borderBevelLight, borders); 20734f579098SStephan Aßmus 20744f579098SStephan Aßmus view->SetDrawingMode(oldDrawingMode); 20754f579098SStephan Aßmus } else { 20762f86ba45SStephan Aßmus // colors 20772f86ba45SStephan Aßmus float tintLight = kEdgeBevelLightTint; 20782f86ba45SStephan Aßmus float tintShadow = kEdgeBevelShadowTint; 20792f86ba45SStephan Aßmus 20802f86ba45SStephan Aßmus if (contrast == 0.0) { 20812f86ba45SStephan Aßmus tintLight = B_NO_TINT; 20822f86ba45SStephan Aßmus tintShadow = B_NO_TINT; 20832f86ba45SStephan Aßmus } else if (contrast != 1.0) { 20842f86ba45SStephan Aßmus tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast; 20852f86ba45SStephan Aßmus tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast; 20862f86ba45SStephan Aßmus } 20872f86ba45SStephan Aßmus 20882f86ba45SStephan Aßmus rgb_color borderBevelShadow = tint_color(base, tintShadow); 20892f86ba45SStephan Aßmus rgb_color borderBevelLight = tint_color(base, tintLight); 20902f86ba45SStephan Aßmus 20912f86ba45SStephan Aßmus if (brightness < 1.0) { 20922f86ba45SStephan Aßmus borderBevelShadow.red = uint8(borderBevelShadow.red * brightness); 20932f86ba45SStephan Aßmus borderBevelShadow.green = uint8(borderBevelShadow.green * brightness); 20942f86ba45SStephan Aßmus borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness); 20952f86ba45SStephan Aßmus borderBevelLight.red = uint8(borderBevelLight.red * brightness); 20962f86ba45SStephan Aßmus borderBevelLight.green = uint8(borderBevelLight.green * brightness); 20972f86ba45SStephan Aßmus borderBevelLight.blue = uint8(borderBevelLight.blue * brightness); 20982f86ba45SStephan Aßmus } 20992f86ba45SStephan Aßmus 21002f86ba45SStephan Aßmus _DrawFrame(view, rect, borderBevelShadow, borderBevelShadow, 21012f86ba45SStephan Aßmus borderBevelLight, borderBevelLight, borders); 21022f86ba45SStephan Aßmus } 21034f579098SStephan Aßmus } 21042f86ba45SStephan Aßmus 21052f86ba45SStephan Aßmus 21062f86ba45SStephan Aßmus void 21072f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left, 21082f86ba45SStephan Aßmus const rgb_color& top, const rgb_color& right, const rgb_color& bottom, 21092f86ba45SStephan Aßmus uint32 borders) 21102f86ba45SStephan Aßmus { 21112f86ba45SStephan Aßmus view->BeginLineArray(4); 21122f86ba45SStephan Aßmus 21132f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 21142f86ba45SStephan Aßmus view->AddLine( 21152f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 21162f86ba45SStephan Aßmus BPoint(rect.left, rect.top), left); 21172f86ba45SStephan Aßmus rect.left++; 21182f86ba45SStephan Aßmus } 21192f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 21202f86ba45SStephan Aßmus view->AddLine( 21212f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 21222f86ba45SStephan Aßmus BPoint(rect.right, rect.top), top); 21232f86ba45SStephan Aßmus rect.top++; 21242f86ba45SStephan Aßmus } 21252f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 21262f86ba45SStephan Aßmus view->AddLine( 21272f86ba45SStephan Aßmus BPoint(rect.right, rect.top), 21282f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), right); 21292f86ba45SStephan Aßmus rect.right--; 21302f86ba45SStephan Aßmus } 21312f86ba45SStephan Aßmus if (borders & B_BOTTOM_BORDER) { 21322f86ba45SStephan Aßmus view->AddLine( 21332f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 21342f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), bottom); 21352f86ba45SStephan Aßmus rect.bottom--; 21362f86ba45SStephan Aßmus } 21372f86ba45SStephan Aßmus 21382f86ba45SStephan Aßmus view->EndLineArray(); 21392f86ba45SStephan Aßmus } 21402f86ba45SStephan Aßmus 21412f86ba45SStephan Aßmus 21422f86ba45SStephan Aßmus void 21432f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left, 21442f86ba45SStephan Aßmus const rgb_color& top, const rgb_color& right, const rgb_color& bottom, 21452f86ba45SStephan Aßmus const rgb_color& rightTop, const rgb_color& leftBottom, uint32 borders) 21462f86ba45SStephan Aßmus { 21472f86ba45SStephan Aßmus view->BeginLineArray(6); 21482f86ba45SStephan Aßmus 21492f86ba45SStephan Aßmus if (borders & B_TOP_BORDER) { 21502f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 21512f86ba45SStephan Aßmus view->AddLine( 21522f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 21532f86ba45SStephan Aßmus BPoint(rect.right - 1, rect.top), top); 21542f86ba45SStephan Aßmus view->AddLine( 21552f86ba45SStephan Aßmus BPoint(rect.right, rect.top), 21562f86ba45SStephan Aßmus BPoint(rect.right, rect.top), rightTop); 21572f86ba45SStephan Aßmus } else { 21582f86ba45SStephan Aßmus view->AddLine( 21592f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 21602f86ba45SStephan Aßmus BPoint(rect.right, rect.top), top); 21612f86ba45SStephan Aßmus } 21622f86ba45SStephan Aßmus rect.top++; 21632f86ba45SStephan Aßmus } 21642f86ba45SStephan Aßmus 21652f86ba45SStephan Aßmus if (borders & B_LEFT_BORDER) { 21662f86ba45SStephan Aßmus view->AddLine( 21672f86ba45SStephan Aßmus BPoint(rect.left, rect.top), 21682f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom - 1), left); 21692f86ba45SStephan Aßmus view->AddLine( 21702f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 21712f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), leftBottom); 21722f86ba45SStephan Aßmus rect.left++; 21732f86ba45SStephan Aßmus } 21742f86ba45SStephan Aßmus 21752f86ba45SStephan Aßmus if (borders & B_BOTTOM_BORDER) { 21762f86ba45SStephan Aßmus view->AddLine( 21772f86ba45SStephan Aßmus BPoint(rect.left, rect.bottom), 21782f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), bottom); 21792f86ba45SStephan Aßmus rect.bottom--; 21802f86ba45SStephan Aßmus } 21812f86ba45SStephan Aßmus 21822f86ba45SStephan Aßmus if (borders & B_RIGHT_BORDER) { 21832f86ba45SStephan Aßmus view->AddLine( 21842f86ba45SStephan Aßmus BPoint(rect.right, rect.bottom), 21852f86ba45SStephan Aßmus BPoint(rect.right, rect.top), right); 21862f86ba45SStephan Aßmus rect.right--; 21872f86ba45SStephan Aßmus } 21882f86ba45SStephan Aßmus 21892f86ba45SStephan Aßmus view->EndLineArray(); 21902f86ba45SStephan Aßmus } 21912f86ba45SStephan Aßmus 21922f86ba45SStephan Aßmus 21932f86ba45SStephan Aßmus //void 21942f86ba45SStephan Aßmus //BControlLook::_DrawShadowFrame(BView* view, BRect& rect, const rgb_color& base, 21952f86ba45SStephan Aßmus // uint32 borders) 21962f86ba45SStephan Aßmus //{ 21972f86ba45SStephan Aßmus // view->BeginLineArray(4); 21982f86ba45SStephan Aßmus // 21992f86ba45SStephan Aßmus // bevelColor1 = tint_color(base, 1.2); 22002f86ba45SStephan Aßmus // bevelColor2 = tint_color(base, 1.1); 22012f86ba45SStephan Aßmus // 22022f86ba45SStephan Aßmus // // shadow along left/top borders 22032f86ba45SStephan Aßmus // if (rect.Height() > 0 && borders & B_LEFT_BORDER) { 22042f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 22052f86ba45SStephan Aßmus // BPoint(rect.left, rect.bottom), bevelColor1); 22062f86ba45SStephan Aßmus // rect.left++; 22072f86ba45SStephan Aßmus // } 22082f86ba45SStephan Aßmus // if (rect.Width() > 0 && borders & B_TOP_BORDER) { 22092f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 22102f86ba45SStephan Aßmus // BPoint(rect.right, rect.top), bevelColor1); 22112f86ba45SStephan Aßmus // rect.top++; 22122f86ba45SStephan Aßmus // } 22132f86ba45SStephan Aßmus // 22142f86ba45SStephan Aßmus // // softer shadow along left/top borders 22152f86ba45SStephan Aßmus // if (rect.Height() > 0 && borders & B_LEFT_BORDER) { 22162f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 22172f86ba45SStephan Aßmus // BPoint(rect.left, rect.bottom), bevelColor2); 22182f86ba45SStephan Aßmus // rect.left++; 22192f86ba45SStephan Aßmus // } 22202f86ba45SStephan Aßmus // if (rect.Width() > 0 && borders & B_TOP_BORDER) { 22212f86ba45SStephan Aßmus // view->AddLine(BPoint(rect.left, rect.top), 22222f86ba45SStephan Aßmus // BPoint(rect.right, rect.top), bevelColor2); 22232f86ba45SStephan Aßmus // rect.top++; 22242f86ba45SStephan Aßmus // } 22252f86ba45SStephan Aßmus // 22262f86ba45SStephan Aßmus // view->EndLineArray(); 22272f86ba45SStephan Aßmus //} 22282f86ba45SStephan Aßmus 22292f86ba45SStephan Aßmus 22302f86ba45SStephan Aßmus void 22312f86ba45SStephan Aßmus BControlLook::_FillGradient(BView* view, const BRect& rect, 22322f86ba45SStephan Aßmus const rgb_color& base, float topTint, float bottomTint, 22332f86ba45SStephan Aßmus enum orientation orientation) 22342f86ba45SStephan Aßmus { 22352f86ba45SStephan Aßmus BGradientLinear gradient; 22362f86ba45SStephan Aßmus _MakeGradient(gradient, rect, base, topTint, bottomTint, orientation); 22372f86ba45SStephan Aßmus view->FillRect(rect, gradient); 22382f86ba45SStephan Aßmus } 22392f86ba45SStephan Aßmus 22402f86ba45SStephan Aßmus 22412f86ba45SStephan Aßmus void 22422f86ba45SStephan Aßmus BControlLook::_FillGlossyGradient(BView* view, const BRect& rect, 22432f86ba45SStephan Aßmus const rgb_color& base, float topTint, float middle1Tint, 22442f86ba45SStephan Aßmus float middle2Tint, float bottomTint, enum orientation orientation) 22452f86ba45SStephan Aßmus { 22462f86ba45SStephan Aßmus BGradientLinear gradient; 22472f86ba45SStephan Aßmus _MakeGlossyGradient(gradient, rect, base, topTint, middle1Tint, 22482f86ba45SStephan Aßmus middle2Tint, bottomTint, orientation); 22492f86ba45SStephan Aßmus view->FillRect(rect, gradient); 22502f86ba45SStephan Aßmus } 22512f86ba45SStephan Aßmus 22522f86ba45SStephan Aßmus 22532f86ba45SStephan Aßmus void 22542f86ba45SStephan Aßmus BControlLook::_MakeGradient(BGradientLinear& gradient, const BRect& rect, 22552f86ba45SStephan Aßmus const rgb_color& base, float topTint, float bottomTint, 22562f86ba45SStephan Aßmus enum orientation orientation) const 22572f86ba45SStephan Aßmus { 22582f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, topTint), 0); 22592f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, bottomTint), 255); 22602f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 22612f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 22622f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 22632f86ba45SStephan Aßmus else 22642f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 22652f86ba45SStephan Aßmus } 22662f86ba45SStephan Aßmus 22672f86ba45SStephan Aßmus 22682f86ba45SStephan Aßmus void 22692f86ba45SStephan Aßmus BControlLook::_MakeGlossyGradient(BGradientLinear& gradient, const BRect& rect, 22702f86ba45SStephan Aßmus const rgb_color& base, float topTint, float middle1Tint, 22712f86ba45SStephan Aßmus float middle2Tint, float bottomTint, 22722f86ba45SStephan Aßmus enum orientation orientation) const 22732f86ba45SStephan Aßmus { 22742f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, topTint), 0); 22752f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, middle1Tint), 132); 22762f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, middle2Tint), 136); 22772f86ba45SStephan Aßmus gradient.AddColor(tint_color(base, bottomTint), 255); 22782f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 22792f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 22802f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 22812f86ba45SStephan Aßmus else 22822f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 22832f86ba45SStephan Aßmus } 22842f86ba45SStephan Aßmus 22852f86ba45SStephan Aßmus 22862f86ba45SStephan Aßmus bool 22872f86ba45SStephan Aßmus BControlLook::_RadioButtonAndCheckBoxMarkColor(const rgb_color& base, 22882f86ba45SStephan Aßmus rgb_color& color, uint32 flags) const 22892f86ba45SStephan Aßmus { 22902f86ba45SStephan Aßmus if ((flags & (B_ACTIVATED | B_CLICKED)) == 0) { 22912f86ba45SStephan Aßmus // no mark to be drawn at all 22922f86ba45SStephan Aßmus return false; 22932f86ba45SStephan Aßmus } 22942f86ba45SStephan Aßmus 22952f86ba45SStephan Aßmus // TODO: Get from UI settings 22962f86ba45SStephan Aßmus color.red = 27; 22972f86ba45SStephan Aßmus color.green = 82; 22982f86ba45SStephan Aßmus color.blue = 140; 22992f86ba45SStephan Aßmus 23002f86ba45SStephan Aßmus float mix = 1.0; 23012f86ba45SStephan Aßmus 23022f86ba45SStephan Aßmus if (flags & B_DISABLED) { 23032f86ba45SStephan Aßmus // activated, but disabled 23042f86ba45SStephan Aßmus mix = 0.4; 23052f86ba45SStephan Aßmus } else if (flags & B_CLICKED) { 23062f86ba45SStephan Aßmus if (flags & B_ACTIVATED) { 23072f86ba45SStephan Aßmus // loosing activation 23082f86ba45SStephan Aßmus mix = 0.7; 23092f86ba45SStephan Aßmus } else { 23102f86ba45SStephan Aßmus // becoming activated 23112f86ba45SStephan Aßmus mix = 0.3; 23122f86ba45SStephan Aßmus } 23132f86ba45SStephan Aßmus } else { 23142f86ba45SStephan Aßmus // simply activated 23152f86ba45SStephan Aßmus } 23162f86ba45SStephan Aßmus 23172f86ba45SStephan Aßmus color.red = uint8(color.red * mix + base.red * (1.0 - mix)); 23182f86ba45SStephan Aßmus color.green = uint8(color.green * mix + base.green * (1.0 - mix)); 23192f86ba45SStephan Aßmus color.blue = uint8(color.blue * mix + base.blue * (1.0 - mix)); 23202f86ba45SStephan Aßmus 23212f86ba45SStephan Aßmus return true; 23222f86ba45SStephan Aßmus } 23232f86ba45SStephan Aßmus 23242f86ba45SStephan Aßmus 23252f86ba45SStephan Aßmus void 23262f86ba45SStephan Aßmus BControlLook::_DrawRoundBarCorner(BView* view, BRect& rect, 23272f86ba45SStephan Aßmus const BRect& updateRect, 23282f86ba45SStephan Aßmus const rgb_color& edgeLightColor, const rgb_color& edgeShadowColor, 23292f86ba45SStephan Aßmus const rgb_color& frameLightColor, const rgb_color& frameShadowColor, 23302f86ba45SStephan Aßmus const rgb_color& fillLightColor, const rgb_color& fillShadowColor, 23312f86ba45SStephan Aßmus float leftInset, float topInset, float rightInset, float bottomInset, 23322f86ba45SStephan Aßmus enum orientation orientation) 23332f86ba45SStephan Aßmus { 23342f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 23352f86ba45SStephan Aßmus return; 23362f86ba45SStephan Aßmus 23372f86ba45SStephan Aßmus BGradientLinear gradient; 23382f86ba45SStephan Aßmus gradient.AddColor(edgeShadowColor, 0); 23392f86ba45SStephan Aßmus gradient.AddColor(edgeLightColor, 255); 23402f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 23412f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 23422f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 23432f86ba45SStephan Aßmus else 23442f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 23452f86ba45SStephan Aßmus 23462f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 23472f86ba45SStephan Aßmus 23482f86ba45SStephan Aßmus rect.left += leftInset; 23492f86ba45SStephan Aßmus rect.top += topInset; 23502f86ba45SStephan Aßmus rect.right += rightInset; 23512f86ba45SStephan Aßmus rect.bottom += bottomInset; 23522f86ba45SStephan Aßmus 23532f86ba45SStephan Aßmus gradient.MakeEmpty(); 23542f86ba45SStephan Aßmus gradient.AddColor(frameShadowColor, 0); 23552f86ba45SStephan Aßmus gradient.AddColor(frameLightColor, 255); 23562f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 23572f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 23582f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 23592f86ba45SStephan Aßmus else 23602f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 23612f86ba45SStephan Aßmus 23622f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 23632f86ba45SStephan Aßmus 23642f86ba45SStephan Aßmus rect.left += leftInset; 23652f86ba45SStephan Aßmus rect.top += topInset; 23662f86ba45SStephan Aßmus rect.right += rightInset; 23672f86ba45SStephan Aßmus rect.bottom += bottomInset; 23682f86ba45SStephan Aßmus 23692f86ba45SStephan Aßmus gradient.MakeEmpty(); 23702f86ba45SStephan Aßmus gradient.AddColor(fillShadowColor, 0); 23712f86ba45SStephan Aßmus gradient.AddColor(fillLightColor, 255); 23722f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 23732f86ba45SStephan Aßmus if (orientation == B_HORIZONTAL) 23742f86ba45SStephan Aßmus gradient.SetEnd(rect.LeftBottom()); 23752f86ba45SStephan Aßmus else 23762f86ba45SStephan Aßmus gradient.SetEnd(rect.RightTop()); 23772f86ba45SStephan Aßmus 23782f86ba45SStephan Aßmus view->FillEllipse(rect, gradient); 23792f86ba45SStephan Aßmus } 23802f86ba45SStephan Aßmus 23812f86ba45SStephan Aßmus 23822f86ba45SStephan Aßmus void 23832f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerLeftTop(BView* view, BRect& rect, 23842f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, const rgb_color& edgeColor, 23852f86ba45SStephan Aßmus const rgb_color& frameColor, const rgb_color& bevelColor, 23862f86ba45SStephan Aßmus const BGradientLinear& fillGradient) 23872f86ba45SStephan Aßmus { 23882f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 23892f86ba45SStephan Aßmus return; 23902f86ba45SStephan Aßmus 23912f86ba45SStephan Aßmus BRegion clipping(rect); 23922f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 23932f86ba45SStephan Aßmus 23942f86ba45SStephan Aßmus // background 23952f86ba45SStephan Aßmus view->SetHighColor(base); 23962f86ba45SStephan Aßmus view->FillRect(rect); 23972f86ba45SStephan Aßmus 23982f86ba45SStephan Aßmus // outer edge 23992f86ba45SStephan Aßmus BRect ellipseRect(rect); 24002f86ba45SStephan Aßmus ellipseRect.right = ellipseRect.left + ellipseRect.Width() * 2; 24012f86ba45SStephan Aßmus ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2; 24022f86ba45SStephan Aßmus 24032f86ba45SStephan Aßmus view->SetHighColor(edgeColor); 24042f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 24052f86ba45SStephan Aßmus 24062f86ba45SStephan Aßmus // frame 24072f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 24082f86ba45SStephan Aßmus view->SetHighColor(frameColor); 24092f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 24102f86ba45SStephan Aßmus 24112f86ba45SStephan Aßmus // bevel 24122f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 24132f86ba45SStephan Aßmus view->SetHighColor(bevelColor); 24142f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 24152f86ba45SStephan Aßmus 24162f86ba45SStephan Aßmus // fill 24172f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 24182f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, fillGradient); 24192f86ba45SStephan Aßmus 24202f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 24212f86ba45SStephan Aßmus } 24222f86ba45SStephan Aßmus 24232f86ba45SStephan Aßmus void 24242f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerRightTop(BView* view, BRect& rect, 24252f86ba45SStephan Aßmus const BRect& updateRect, const rgb_color& base, 24262f86ba45SStephan Aßmus const rgb_color& edgeTopColor, const rgb_color& edgeRightColor, 24272f86ba45SStephan Aßmus const rgb_color& frameTopColor, const rgb_color& frameRightColor, 24282f86ba45SStephan Aßmus const rgb_color& bevelTopColor, const rgb_color& bevelRightColor, 24292f86ba45SStephan Aßmus const BGradientLinear& fillGradient) 24302f86ba45SStephan Aßmus { 24312f86ba45SStephan Aßmus if (!rect.IsValid() || !rect.Intersects(updateRect)) 24322f86ba45SStephan Aßmus return; 24332f86ba45SStephan Aßmus 24342f86ba45SStephan Aßmus BRegion clipping(rect); 24352f86ba45SStephan Aßmus view->ConstrainClippingRegion(&clipping); 24362f86ba45SStephan Aßmus 24372f86ba45SStephan Aßmus // background 24382f86ba45SStephan Aßmus view->SetHighColor(base); 24392f86ba45SStephan Aßmus view->FillRect(rect); 24402f86ba45SStephan Aßmus 24412f86ba45SStephan Aßmus // outer edge 24422f86ba45SStephan Aßmus BRect ellipseRect(rect); 24432f86ba45SStephan Aßmus ellipseRect.left = ellipseRect.right - ellipseRect.Width() * 2; 24442f86ba45SStephan Aßmus ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2; 24452f86ba45SStephan Aßmus 24462f86ba45SStephan Aßmus BGradientLinear gradient; 24472f86ba45SStephan Aßmus gradient.AddColor(edgeTopColor, 0); 24482f86ba45SStephan Aßmus gradient.AddColor(edgeRightColor, 255); 24492f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 24502f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 24512f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 24522f86ba45SStephan Aßmus 24532f86ba45SStephan Aßmus // frame 24542f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 24552f86ba45SStephan Aßmus rect.right--; 24562f86ba45SStephan Aßmus rect.top++; 24572f86ba45SStephan Aßmus if (frameTopColor == frameRightColor) { 24582f86ba45SStephan Aßmus view->SetHighColor(frameTopColor); 24592f86ba45SStephan Aßmus view->FillEllipse(ellipseRect); 24602f86ba45SStephan Aßmus } else { 24612f86ba45SStephan Aßmus gradient.SetColor(0, frameTopColor); 24622f86ba45SStephan Aßmus gradient.SetColor(1, frameRightColor); 24632f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 24642f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 24652f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 24662f86ba45SStephan Aßmus } 24672f86ba45SStephan Aßmus 24682f86ba45SStephan Aßmus // bevel 24692f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 24702f86ba45SStephan Aßmus rect.right--; 24712f86ba45SStephan Aßmus rect.top++; 24722f86ba45SStephan Aßmus gradient.SetColor(0, bevelTopColor); 24732f86ba45SStephan Aßmus gradient.SetColor(1, bevelRightColor); 24742f86ba45SStephan Aßmus gradient.SetStart(rect.LeftTop()); 24752f86ba45SStephan Aßmus gradient.SetEnd(rect.RightBottom()); 24762f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, gradient); 24772f86ba45SStephan Aßmus 24782f86ba45SStephan Aßmus // fill 24792f86ba45SStephan Aßmus ellipseRect.InsetBy(1, 1); 24802f86ba45SStephan Aßmus view->FillEllipse(ellipseRect, fillGradient); 24812f86ba45SStephan Aßmus 24822f86ba45SStephan Aßmus view->ConstrainClippingRegion(NULL); 24832f86ba45SStephan Aßmus } 24842f86ba45SStephan Aßmus 24852f86ba45SStephan Aßmus 24862f86ba45SStephan Aßmus // NOTE: May come from a add-on in the future. Initialized in 24872f86ba45SStephan Aßmus // InterfaceDefs.cpp 24882f86ba45SStephan Aßmus BControlLook* be_control_look = NULL; 24892f86ba45SStephan Aßmus 24902f86ba45SStephan Aßmus } // namespace BPrivate 2491