diff options
author | andresantoso@chromium.org <andresantoso@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-14 08:01:29 +0000 |
---|---|---|
committer | andresantoso@chromium.org <andresantoso@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-14 08:01:29 +0000 |
commit | 34b2da7abe4d32962a9854c2e888280f2b5a27c4 (patch) | |
tree | 28f7b0a6bff28c6b20cc1e422da2df5a906e349d /ui/native_theme | |
parent | 8d9cc95b2930e2d2323b294ed3b4354ebc7592ea (diff) | |
download | chromium_src-34b2da7abe4d32962a9854c2e888280f2b5a27c4.zip chromium_src-34b2da7abe4d32962a9854c2e888280f2b5a27c4.tar.gz chromium_src-34b2da7abe4d32962a9854c2e888280f2b5a27c4.tar.bz2 |
MacViews: Implement scrollbar theming.
The default views scrollbars look out of place on Mac OS X.
As a start, theme the scrollbar drawing to look like the native non-overlay
scrollbars. It looks like a simple round-rect that is inset from the track,
with a line border next to the content area.
BUG=401346
Review URL: https://codereview.chromium.org/456473002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289486 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/native_theme')
-rw-r--r-- | ui/native_theme/native_theme_base.cc | 3 | ||||
-rw-r--r-- | ui/native_theme/native_theme_base.h | 2 | ||||
-rw-r--r-- | ui/native_theme/native_theme_mac.h | 13 | ||||
-rw-r--r-- | ui/native_theme/native_theme_mac.mm | 145 |
4 files changed, 162 insertions, 1 deletions
diff --git a/ui/native_theme/native_theme_base.cc b/ui/native_theme/native_theme_base.cc index b839621..1e1e76f 100644 --- a/ui/native_theme/native_theme_base.cc +++ b/ui/native_theme/native_theme_base.cc @@ -236,7 +236,8 @@ void NativeThemeBase::Paint(SkCanvas* canvas, case kScrollbarUpArrow: case kScrollbarLeftArrow: case kScrollbarRightArrow: - PaintArrowButton(canvas, rect, part, state); + if (scrollbar_button_length_ > 0) + PaintArrowButton(canvas, rect, part, state); break; case kScrollbarHorizontalThumb: case kScrollbarVerticalThumb: diff --git a/ui/native_theme/native_theme_base.h b/ui/native_theme/native_theme_base.h index e0a877f..454c4b6 100644 --- a/ui/native_theme/native_theme_base.h +++ b/ui/native_theme/native_theme_base.h @@ -200,6 +200,8 @@ class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme { const SkScalar borderRadius) const; unsigned int scrollbar_width_; + + // The length of the arrow buttons, 0 means no buttons are drawn. unsigned int scrollbar_button_length_; DISALLOW_COPY_AND_ASSIGN(NativeThemeBase); diff --git a/ui/native_theme/native_theme_mac.h b/ui/native_theme/native_theme_mac.h index 0b15b3f..ecdd38e 100644 --- a/ui/native_theme/native_theme_mac.h +++ b/ui/native_theme/native_theme_mac.h @@ -20,6 +20,19 @@ class NativeThemeMac : public FallbackTheme { virtual SkColor GetSystemColor(ColorId color_id) const OVERRIDE; // Overridden from NativeThemeBase: + virtual void PaintScrollbarTrack( + SkCanvas* canvas, + Part part, + State state, + const ScrollbarTrackExtraParams& extra_params, + const gfx::Rect& rect) const OVERRIDE; + virtual void PaintScrollbarThumb(SkCanvas* sk_canvas, + Part part, + State state, + const gfx::Rect& rect) const OVERRIDE; + virtual void PaintScrollbarCorner(SkCanvas* canvas, + State state, + const gfx::Rect& rect) const OVERRIDE; virtual void PaintMenuPopupBackground( SkCanvas* canvas, const gfx::Size& size, diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm index 2477af8..60c049c 100644 --- a/ui/native_theme/native_theme_mac.mm +++ b/ui/native_theme/native_theme_mac.mm @@ -12,10 +12,26 @@ #include "base/mac/sdk_forward_declarations.h" #include "ui/native_theme/common_theme.h" #import "skia/ext/skia_utils_mac.h" +#include "third_party/skia/include/effects/SkGradientShader.h" +#include "ui/gfx/geometry/rect.h" #include "ui/gfx/skia_util.h" namespace { +const SkColor kScrollerTrackGradientColors[] = { + SkColorSetRGB(0xEF, 0xEF, 0xEF), + SkColorSetRGB(0xF9, 0xF9, 0xF9), + SkColorSetRGB(0xFD, 0xFD, 0xFD), + SkColorSetRGB(0xF6, 0xF6, 0xF6) }; +const SkColor kScrollerTrackInnerBorderColor = SkColorSetRGB(0xE4, 0xE4, 0xE4); +const SkColor kScrollerTrackOuterBorderColor = SkColorSetRGB(0xEF, 0xEF, 0xEF); +const SkColor kScrollerThumbColor = SkColorSetARGB(0x38, 0, 0, 0); +const SkColor kScrollerThumbHoverColor = SkColorSetARGB(0x80, 0, 0, 0); +const int kScrollerTrackBorderWidth = 1; + +// The amount the thumb is inset from both the ends and the sides of the track. +const int kScrollerThumbInset = 3; + // Values calculated by reading pixels and solving simultaneous equations // derived from "A over B" alpha compositing. Steps: Sample the semi-transparent // pixel over two backgrounds; P1, P2 over backgrounds B1, B2. Use the color @@ -184,6 +200,131 @@ SkColor NativeThemeMac::GetSystemColor(ColorId color_id) const { return FallbackTheme::GetSystemColor(color_id); } +void NativeThemeMac::PaintScrollbarTrack( + SkCanvas* canvas, + Part part, + State state, + const ScrollbarTrackExtraParams& extra_params, + const gfx::Rect& rect) const { + // Emulate the non-overlay scroller style from OSX 10.7 and later. + SkPoint gradient_bounds[2]; + if (part == kScrollbarVerticalTrack) { + gradient_bounds[0].set(rect.x(), rect.y()); + gradient_bounds[1].set(rect.right(), rect.y()); + } else { + DCHECK_EQ(part, kScrollbarHorizontalTrack); + gradient_bounds[0].set(rect.x(), rect.y()); + gradient_bounds[1].set(rect.x(), rect.bottom()); + } + skia::RefPtr<SkShader> shader = skia::AdoptRef( + SkGradientShader::CreateLinear(gradient_bounds, + kScrollerTrackGradientColors, + NULL, + arraysize(kScrollerTrackGradientColors), + SkShader::kClamp_TileMode)); + SkPaint gradient; + gradient.setShader(shader.get()); + + SkIRect track_rect = gfx::RectToSkIRect(rect); + canvas->drawIRect(track_rect, gradient); + + // Draw inner and outer line borders. + if (part == kScrollbarVerticalTrack) { + SkPaint paint; + paint.setColor(kScrollerTrackInnerBorderColor); + canvas->drawRectCoords(track_rect.left(), + track_rect.top(), + track_rect.left() + kScrollerTrackBorderWidth, + track_rect.bottom(), + paint); + paint.setColor(kScrollerTrackOuterBorderColor); + canvas->drawRectCoords(track_rect.right() - kScrollerTrackBorderWidth, + track_rect.top(), + track_rect.right(), + track_rect.bottom(), + paint); + } else { + SkPaint paint; + paint.setColor(kScrollerTrackInnerBorderColor); + canvas->drawRectCoords(track_rect.left(), + track_rect.top(), + track_rect.right(), + track_rect.top() + kScrollerTrackBorderWidth, + paint); + paint.setColor(kScrollerTrackOuterBorderColor); + canvas->drawRectCoords(track_rect.left(), + track_rect.bottom() - kScrollerTrackBorderWidth, + track_rect.right(), + track_rect.bottom(), + paint); + } +} + +void NativeThemeMac::PaintScrollbarThumb(SkCanvas* canvas, + Part part, + State state, + const gfx::Rect& rect) const { + gfx::Rect thumb_rect(rect); + switch (part) { + case kScrollbarHorizontalThumb: + thumb_rect.Inset(0, kScrollerTrackBorderWidth, 0, 0); + break; + case kScrollbarVerticalThumb: + thumb_rect.Inset(kScrollerTrackBorderWidth, 0, 0, 0); + break; + default: + NOTREACHED(); + break; + } + + thumb_rect.Inset(kScrollerThumbInset, kScrollerThumbInset); + + SkPaint paint; + paint.setAntiAlias(true); + paint.setColor(state == kHovered ? thumb_active_color_ + : thumb_inactive_color_); + const SkScalar radius = std::min(rect.width(), rect.height()); + canvas->drawRoundRect(gfx::RectToSkRect(thumb_rect), radius, radius, paint); +} + +void NativeThemeMac::PaintScrollbarCorner(SkCanvas* canvas, + State state, + const gfx::Rect& rect) const { + DCHECK_GT(rect.width(), 0); + DCHECK_GT(rect.height(), 0); + + // Draw radial gradient from top-left corner. + skia::RefPtr<SkShader> shader = skia::AdoptRef( + SkGradientShader::CreateRadial(SkPoint::Make(rect.x(), rect.y()), + rect.width(), + kScrollerTrackGradientColors, + NULL, + arraysize(kScrollerTrackGradientColors), + SkShader::kClamp_TileMode)); + SkPaint gradient; + gradient.setStyle(SkPaint::kFill_Style); + gradient.setAntiAlias(true); + gradient.setShader(shader.get()); + canvas->drawRect(gfx::RectToSkRect(rect), gradient); + + // Draw inner border corner point. + canvas->drawPoint(rect.x(), rect.y(), kScrollerTrackInnerBorderColor); + + // Draw outer borders. + SkPaint paint; + paint.setColor(kScrollerTrackOuterBorderColor); + canvas->drawRectCoords(rect.right() - kScrollerTrackBorderWidth, + rect.y(), + rect.right(), + rect.bottom(), + paint); + canvas->drawRectCoords(rect.x(), + rect.bottom() - kScrollerTrackBorderWidth, + rect.right(), + rect.bottom(), + paint); +} + void NativeThemeMac::PaintMenuPopupBackground( SkCanvas* canvas, const gfx::Size& size, @@ -217,6 +358,10 @@ void NativeThemeMac::PaintMenuItemBackground( } NativeThemeMac::NativeThemeMac() { + set_scrollbar_button_length(0); + SetScrollbarColors(kScrollerThumbColor, + kScrollerThumbHoverColor, + kScrollerTrackGradientColors[0]); } NativeThemeMac::~NativeThemeMac() { |