1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132

cc / input / scrollbar.h [blame]

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_INPUT_SCROLLBAR_H_
#define CC_INPUT_SCROLLBAR_H_

#include "base/memory/ref_counted.h"
#include "cc/cc_export.h"
#include "cc/paint/paint_canvas.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"

// Autoscrolling (on the main thread) happens by applying a delta every 50ms.
// Hence, pixels per second for a autoscroll cc animation can be calculated as:
// autoscroll velocity = delta / 0.05 sec = delta x 20
static constexpr float kAutoscrollMultiplier = 20.f;
static constexpr base::TimeDelta kInitialAutoscrollTimerDelay =
    base::Milliseconds(250);

// Constants used to figure the how far out in the non-scrolling direction
// should trigger the thumb to snap back to its origin.  These calculations are
// based on observing the behavior of the MSVC8 main window scrollbar + some
// guessing/extrapolation.
static constexpr int kOffSideMultiplier = 8;
static constexpr int kDefaultWinScrollbarThickness = 17;

namespace cc {

enum class ScrollbarOrientation { kHorizontal, kVertical };

enum class ScrollbarPart {
  kThumb,
  kBackButton,
  kForwardButton,
  kBackTrack,
  kForwardTrack,
  kNoPart,
};

class Scrollbar : public base::RefCounted<Scrollbar> {
 public:
  // Check if this scrollbar and the other scrollbar are backed with the same
  // source scrollbar (e.g. blink::Scrollbar).
  virtual bool IsSame(const Scrollbar&) const = 0;

  virtual ScrollbarOrientation Orientation() const = 0;
  virtual bool IsLeftSideVerticalScrollbar() const = 0;
  virtual bool IsSolidColor() const = 0;
  virtual bool IsOverlay() const = 0;
  virtual bool IsRunningWebTest() const = 0;
  virtual bool IsFluentOverlayScrollbarMinimalMode() const = 0;
  virtual bool HasThumb() const = 0;
  virtual bool SupportsDragSnapBack() const = 0;
  virtual bool JumpOnTrackClick() const = 0;
  virtual bool IsOpaque() const = 0;

  // The following rects are all relative to the scrollbar's origin.
  // The location of ThumbRect reflects scroll offset, but cc will ignore it
  // because the compositor thread will compute thumb location from scroll
  // offset.
  virtual gfx::Rect ThumbRect() const = 0;
  virtual gfx::Rect TrackRect() const = 0;
  virtual gfx::Rect BackButtonRect() const = 0;
  virtual gfx::Rect ForwardButtonRect() const = 0;

  virtual float Opacity() const = 0;
  virtual bool HasTickmarks() const = 0;

  virtual bool ThumbNeedsRepaint() const = 0;
  virtual void ClearThumbNeedsRepaint() = 0;
  virtual bool TrackAndButtonsNeedRepaint() const = 0;

  // Paints the thumb in the given rect. The implementation should paint
  // relative to the rect, and doesn't need to know the current coordinate
  // space of `canvas`. When `UsesNinePatchThumbResource()` returns true,
  // whether to use nine-patch depends on the size of `rect`. Nine-patch
  // will be disabled if the size is the full size of the thumb.
  virtual void PaintThumb(PaintCanvas& canvas, const gfx::Rect& rect) = 0;
  // Paints the track (including tickmarks if present) and buttons in the
  // given rect. See the above function about `rect`.
  virtual void PaintTrackAndButtons(PaintCanvas& canvas,
                                    const gfx::Rect& rect) = 0;

  // The thumb color for a solid color scrollbar, or a scrollbar using solid
  // color thumb. This is meaningful only when IsSolidColor() or
  // UsesSolidColorThumb() is true.
  virtual SkColor4f ThumbColor() const = 0;

  // The following two functions are called from blink only.
  // Returns true if either the track or the thumb needs repaint, or the thumb
  // moved (which doesn't need to repaint the track or the thumb in many
  // scrollbar themes).
  virtual bool NeedsUpdateDisplay() const = 0;
  virtual void ClearNeedsUpdateDisplay() = 0;

  // Whether the thumb can be painted as a nine-patch resource. Cc will stretch
  // the resource to fill the full size of the thumb. This should never change
  // during the life of the scrollbar.
  virtual bool UsesNinePatchThumbResource() const = 0;
  virtual gfx::Size NinePatchThumbCanvasSize() const = 0;
  virtual gfx::Rect NinePatchThumbAperture() const = 0;

  // Whether the thumb can be painted in a single color. This should not never
  // change during the life of the scrollbar.
  virtual bool UsesSolidColorThumb() const = 0;
  // The insets of the solid color thumb from ThumbRect().
  virtual gfx::Insets SolidColorThumbInsets() const = 0;

  // Whether the track and buttons can be painted together as a nine-patch
  // resource. Cc which will stretch the resource to fill the full size of the
  // scrollbar. This should never change during the life of the scrollbar.
  // Note that tickmarks can't be painted in nine-patch. If there are tickmarks
  // (`HasTickmarks()`), this can still return true, but the nine-patch
  // implementation in cc will not be used for painting.
  virtual bool UsesNinePatchTrackAndButtonsResource() const = 0;
  virtual gfx::Size NinePatchTrackAndButtonsCanvasSize(float scale) const = 0;
  virtual gfx::Rect NinePatchTrackAndButtonsAperture(float scale) const = 0;

  // This is used by blink only, to adjust the painted thumb rect in
  // main-thread minimal mode.
  virtual gfx::Rect ShrinkMainThreadedMinimalModeThumbRect(
      gfx::Rect& rect) const = 0;

 protected:
  friend class base::RefCounted<Scrollbar>;
  virtual ~Scrollbar() {}
};

}  // namespace cc

#endif  // CC_INPUT_SCROLLBAR_H_