| Index: ui/native_theme/native_theme_aura.cc
|
| diff --git a/ui/native_theme/native_theme_aura.cc b/ui/native_theme/native_theme_aura.cc
|
| index 6587ec1060157f7d69f0ee2227e92754c2046ace..d03a0d3211edc0f216a157fa5ff93b7ce22cab68 100644
|
| --- a/ui/native_theme/native_theme_aura.cc
|
| +++ b/ui/native_theme/native_theme_aura.cc
|
| @@ -8,6 +8,7 @@
|
| #include <utility>
|
|
|
| #include "base/logging.h"
|
| +#include "base/trace_event/trace_event.h"
|
| #include "build/build_config.h"
|
| #include "ui/base/layout.h"
|
| #include "ui/base/material_design/material_design_controller.h"
|
| @@ -21,40 +22,33 @@
|
| #include "ui/gfx/skia_util.h"
|
| #include "ui/native_theme/common_theme.h"
|
| #include "ui/native_theme/native_theme_switches.h"
|
| +#include "ui/native_theme/overlay_scrollbar_constants_aura.h"
|
|
|
| namespace ui {
|
|
|
| namespace {
|
|
|
| +// Constants for painting overlay scrollbars. Other properties needed outside
|
| +// this painting code are defined in overlay_scrollbar_constants_aura.h.
|
| +constexpr int kOverlayScrollbarStrokeWidth = 1;
|
| +constexpr int kOverlayScrollbarMinimumLength = 12;
|
| +constexpr SkAlpha kOverlayScrollbarAlphaNormal = 0x4D;
|
| +constexpr SkAlpha kOverlayScrollbarAlphaHovered = 0x80;
|
| +constexpr SkAlpha kOverlayScrollbarAlphaPressed = 0x80;
|
| +constexpr SkColor kOverlayScrollbarThumbColor = SK_ColorBLACK;
|
| +constexpr SkColor kOverlayScrollbarStrokeColor = SK_ColorWHITE;
|
| +
|
| SkAlpha ThumbAlphaForState(NativeTheme::State state) {
|
| bool overlay = IsOverlayScrollbarEnabled();
|
| switch (state) {
|
| case NativeTheme::kDisabled:
|
| return 0x00;
|
| case NativeTheme::kHovered:
|
| - return overlay ? 0xB2 : 0x4D;
|
| + return overlay ? kOverlayScrollbarAlphaHovered : 0x4D;
|
| case NativeTheme::kNormal:
|
| - return overlay ? 0x8C : 0x33;
|
| + return overlay ? kOverlayScrollbarAlphaNormal : 0x33;
|
| case NativeTheme::kPressed:
|
| - return overlay ? 0xB2 : 0x80;
|
| - case NativeTheme::kNumStates:
|
| - break;
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return 0xFF;
|
| -}
|
| -
|
| -SkAlpha ThumbStrokeAlphaForState(NativeTheme::State state) {
|
| - DCHECK(IsOverlayScrollbarEnabled());
|
| - switch (state) {
|
| - case NativeTheme::kDisabled:
|
| - return 0x00;
|
| - case NativeTheme::kHovered:
|
| - case NativeTheme::kPressed:
|
| - return 0x33;
|
| - case NativeTheme::kNormal:
|
| - return 0x26;
|
| + return overlay ? kOverlayScrollbarAlphaPressed : 0x80;
|
| case NativeTheme::kNumStates:
|
| break;
|
| }
|
| @@ -84,6 +78,11 @@ NativeThemeAura::NativeThemeAura() {
|
| set_scrollbar_button_length(0);
|
| #endif
|
|
|
| + if (IsOverlayScrollbarEnabled()) {
|
| + scrollbar_width_ =
|
| + kOverlayScrollbarThumbWidthPressed + kOverlayScrollbarStrokeWidth * 2;
|
| + }
|
| +
|
| // Images and alphas declarations assume the following order.
|
| static_assert(kDisabled == 0, "states unexpectedly changed");
|
| static_assert(kHovered == 1, "states unexpectedly changed");
|
| @@ -196,20 +195,28 @@ void NativeThemeAura::PaintScrollbarThumbStateTransition(
|
| State end_state,
|
| double progress,
|
| const gfx::Rect& rect) const {
|
| + TRACE_EVENT0("blink", "NativeThemeAura::PaintScrollbarThumbStateTransition");
|
| gfx::Rect thumb_rect(rect);
|
| + SkColor thumb_color;
|
| if (IsOverlayScrollbarEnabled()) {
|
| // In overlay mode, draw a stroke (border).
|
| - const int kStrokeWidth = 1;
|
| + constexpr int kStrokeWidth = kOverlayScrollbarStrokeWidth;
|
| SkAlpha stroke_alpha = gfx::Tween::IntValueBetween(
|
| - progress, ThumbStrokeAlphaForState(start_state),
|
| - ThumbStrokeAlphaForState(end_state));
|
| + progress, ThumbAlphaForState(start_state),
|
| + ThumbAlphaForState(end_state));
|
| SkPaint paint;
|
| - paint.setColor(SkColorSetA(SK_ColorWHITE, stroke_alpha));
|
| + paint.setColor(SkColorSetA(kOverlayScrollbarStrokeColor, stroke_alpha));
|
| paint.setStyle(SkPaint::kStroke_Style);
|
| paint.setStrokeWidth(kStrokeWidth);
|
| - canvas->drawIRect(gfx::RectToSkIRect(thumb_rect), paint);
|
|
|
| - thumb_rect.Inset(kStrokeWidth, kStrokeWidth, kStrokeWidth, kStrokeWidth);
|
| + gfx::RectF stroke_rect(thumb_rect);
|
| + constexpr float kHalfStrokeWidth = kStrokeWidth / 2.f;
|
| + stroke_rect.Inset(kHalfStrokeWidth, kHalfStrokeWidth);
|
| + canvas->drawRect(gfx::RectFToSkRect(stroke_rect), paint);
|
| +
|
| + // Inset the all the edges edges so we fill-in the stroke below.
|
| + thumb_rect.Inset(kStrokeWidth, kStrokeWidth);
|
| + thumb_color = kOverlayScrollbarThumbColor;
|
| } else {
|
| // If there are no scrollbuttons then provide some padding so that the thumb
|
| // doesn't touch the top of the track.
|
| @@ -220,12 +227,14 @@ void NativeThemeAura::PaintScrollbarThumbStateTransition(
|
| thumb_rect.Inset(kThumbPadding, extra_padding);
|
| else
|
| thumb_rect.Inset(extra_padding, kThumbPadding);
|
| +
|
| + thumb_color = SK_ColorBLACK;
|
| }
|
|
|
| SkPaint paint;
|
| SkAlpha alpha = gfx::Tween::IntValueBetween(
|
| progress, ThumbAlphaForState(start_state), ThumbAlphaForState(end_state));
|
| - paint.setColor(SkColorSetA(SK_ColorBLACK, alpha));
|
| + paint.setColor(SkColorSetA(thumb_color, alpha));
|
| canvas->drawIRect(gfx::RectToSkIRect(thumb_rect), paint);
|
| }
|
|
|
| @@ -239,4 +248,31 @@ void NativeThemeAura::PaintScrollbarCorner(SkCanvas* canvas,
|
| canvas->drawIRect(RectToSkIRect(rect), paint);
|
| }
|
|
|
| +gfx::Size NativeThemeAura::GetPartSize(Part part,
|
| + State state,
|
| + const ExtraParams& extra) const {
|
| + if (IsOverlayScrollbarEnabled()) {
|
| + constexpr int minimum_length =
|
| + kOverlayScrollbarMinimumLength + 2 * kOverlayScrollbarStrokeWidth;
|
| +
|
| + // Aura overlay scrollbars need a slight tweak from the base sizes.
|
| + switch (part) {
|
| + case kScrollbarHorizontalThumb:
|
| + return gfx::Size(minimum_length, scrollbar_width_);
|
| + case kScrollbarVerticalThumb:
|
| + return gfx::Size(scrollbar_width_, minimum_length);
|
| + default:
|
| + // TODO(bokan): We should probably make sure code using overlay
|
| + // scrollbars isn't asking for part sizes that don't exist. This
|
| + // currently breaks in Views layout code which indicates they aren't
|
| + // overlay aware yet. The Views code should be fixed and either this
|
| + // branch return 0 for parts that don't exist or assert NOTREACHED.
|
| + // crbug.com/657159.
|
| + break;
|
| + }
|
| + }
|
| +
|
| + return NativeThemeBase::GetPartSize(part, state, extra);
|
| +}
|
| +
|
| } // namespace ui
|
|
|