| Index: cc/input/top_controls_manager.cc
|
| diff --git a/cc/input/top_controls_manager.cc b/cc/input/top_controls_manager.cc
|
| index 1615d7f2d3875e4766bb55f884e166caa7d380b9..615afb07056800b92d55ad38807fec7ce2212c65 100644
|
| --- a/cc/input/top_controls_manager.cc
|
| +++ b/cc/input/top_controls_manager.cc
|
| @@ -39,7 +39,6 @@ TopControlsManager::TopControlsManager(TopControlsManagerClient* client,
|
| : client_(client),
|
| animation_direction_(NO_ANIMATION),
|
| permitted_state_(BOTH),
|
| - top_controls_height_(0.f),
|
| current_scroll_delta_(0.f),
|
| controls_scroll_begin_offset_(0.f),
|
| top_controls_show_threshold_(top_controls_hide_threshold),
|
| @@ -51,12 +50,20 @@ TopControlsManager::TopControlsManager(TopControlsManagerClient* client,
|
| TopControlsManager::~TopControlsManager() {
|
| }
|
|
|
| -float TopControlsManager::ControlsTopOffset() {
|
| - return client_->ControlsTopOffset();
|
| +float TopControlsManager::ControlsTopOffset() const {
|
| + return ContentTopOffset() - TopControlsHeight();
|
| }
|
|
|
| -float TopControlsManager::ContentTopOffset() {
|
| - return client_->ControlsTopOffset() + top_controls_height_;
|
| +float TopControlsManager::ContentTopOffset() const {
|
| + return TopControlsShownRatio() * TopControlsHeight();
|
| +}
|
| +
|
| +float TopControlsManager::TopControlsShownRatio() const {
|
| + return client_->CurrentTopControlsShownRatio();
|
| +}
|
| +
|
| +float TopControlsManager::TopControlsHeight() const {
|
| + return client_->TopControlsHeight();
|
| }
|
|
|
| void TopControlsManager::UpdateTopControlsState(TopControlsState constraints,
|
| @@ -72,31 +79,25 @@ void TopControlsManager::UpdateTopControlsState(TopControlsState constraints,
|
| return;
|
|
|
| // Don't do anything if there is no change in offset.
|
| - float final_controls_position = 0.f;
|
| - if (constraints == HIDDEN || current == HIDDEN) {
|
| - final_controls_position = -top_controls_height_;
|
| - }
|
| - if (final_controls_position == client_->ControlsTopOffset()) {
|
| + float final_shown_ratio = 1.f;
|
| + if (constraints == HIDDEN || current == HIDDEN)
|
| + final_shown_ratio = 0.f;
|
| + if (final_shown_ratio == TopControlsShownRatio())
|
| return;
|
| - }
|
|
|
| - AnimationDirection animation_direction = SHOWING_CONTROLS;
|
| - if (constraints == HIDDEN || current == HIDDEN)
|
| - animation_direction = HIDING_CONTROLS;
|
| - ResetAnimations();
|
| if (animate) {
|
| - SetupAnimation(animation_direction);
|
| + SetupAnimation(final_shown_ratio ? SHOWING_CONTROLS : HIDING_CONTROLS);
|
| } else {
|
| - client_->SetControlsTopOffset(final_controls_position);
|
| + ResetAnimations();
|
| + client_->SetCurrentTopControlsShownRatio(final_shown_ratio);
|
| }
|
| - client_->DidChangeTopControlsPosition();
|
| }
|
|
|
| void TopControlsManager::ScrollBegin() {
|
| DCHECK(!pinch_gesture_active_);
|
| ResetAnimations();
|
| current_scroll_delta_ = 0.f;
|
| - controls_scroll_begin_offset_ = client_->ControlsTopOffset();
|
| + controls_scroll_begin_offset_ = ContentTopOffset();
|
| }
|
|
|
| gfx::Vector2dF TopControlsManager::ScrollBy(
|
| @@ -111,19 +112,21 @@ gfx::Vector2dF TopControlsManager::ScrollBy(
|
|
|
| current_scroll_delta_ += pending_delta.y();
|
|
|
| - float old_offset = client_->ControlsTopOffset();
|
| - SetControlsTopOffset(controls_scroll_begin_offset_ - current_scroll_delta_);
|
| + float old_offset = ContentTopOffset();
|
| + client_->SetCurrentTopControlsShownRatio(
|
| + (controls_scroll_begin_offset_ - current_scroll_delta_) /
|
| + TopControlsHeight());
|
|
|
| // If the controls are fully visible, treat the current position as the
|
| // new baseline even if the gesture didn't end.
|
| - if (client_->ControlsTopOffset() == 0.f) {
|
| + if (TopControlsShownRatio() == 1.f) {
|
| current_scroll_delta_ = 0.f;
|
| - controls_scroll_begin_offset_ = 0.f;
|
| + controls_scroll_begin_offset_ = ContentTopOffset();
|
| }
|
|
|
| ResetAnimations();
|
|
|
| - gfx::Vector2dF applied_delta(0.f, old_offset - client_->ControlsTopOffset());
|
| + gfx::Vector2dF applied_delta(0.f, old_offset - ContentTopOffset());
|
| return pending_delta - applied_delta;
|
| }
|
|
|
| @@ -146,44 +149,20 @@ void TopControlsManager::PinchEnd() {
|
| ScrollBegin();
|
| }
|
|
|
| -void TopControlsManager::SetControlsTopOffset(float controls_top_offset) {
|
| - controls_top_offset = std::max(controls_top_offset, -top_controls_height_);
|
| - controls_top_offset = std::min(controls_top_offset, 0.f);
|
| -
|
| - if (client_->ControlsTopOffset() == controls_top_offset)
|
| - return;
|
| -
|
| - client_->SetControlsTopOffset(controls_top_offset);
|
| -
|
| - client_->DidChangeTopControlsPosition();
|
| -}
|
| -
|
| -void TopControlsManager::SetTopControlsHeight(float top_controls_height) {
|
| - DCHECK_GE(top_controls_height, 0);
|
| -
|
| - if (top_controls_height == top_controls_height_)
|
| - return;
|
| -
|
| - ResetAnimations();
|
| - float top_controls_offset = client_->ControlsTopOffset();
|
| - top_controls_height_ = top_controls_height;
|
| - SetControlsTopOffset(top_controls_offset);
|
| - StartAnimationIfNecessary();
|
| -}
|
| -
|
| gfx::Vector2dF TopControlsManager::Animate(base::TimeTicks monotonic_time) {
|
| if (!top_controls_animation_ || !client_->HaveRootScrollLayer())
|
| return gfx::Vector2dF();
|
|
|
| base::TimeDelta time = monotonic_time - base::TimeTicks();
|
|
|
| - float old_offset = client_->ControlsTopOffset();
|
| - SetControlsTopOffset(top_controls_animation_->GetValue(time));
|
| + float old_offset = ContentTopOffset();
|
| + client_->SetCurrentTopControlsShownRatio(
|
| + top_controls_animation_->GetValue(time));
|
|
|
| if (IsAnimationCompleteAtTime(monotonic_time))
|
| ResetAnimations();
|
|
|
| - gfx::Vector2dF scroll_delta(0.f, client_->ControlsTopOffset() - old_offset);
|
| + gfx::Vector2dF scroll_delta(0.f, ContentTopOffset() - old_offset);
|
| return scroll_delta;
|
| }
|
|
|
| @@ -193,15 +172,9 @@ void TopControlsManager::ResetAnimations() {
|
| }
|
|
|
| void TopControlsManager::SetupAnimation(AnimationDirection direction) {
|
| - DCHECK(direction != NO_ANIMATION);
|
| -
|
| - if (direction == SHOWING_CONTROLS && client_->ControlsTopOffset() == 0)
|
| - return;
|
| -
|
| - if (direction == HIDING_CONTROLS &&
|
| - client_->ControlsTopOffset() == -top_controls_height_) {
|
| - return;
|
| - }
|
| + DCHECK_NE(NO_ANIMATION, direction);
|
| + DCHECK_IMPLIES(direction == HIDING_CONTROLS, TopControlsShownRatio() > 0.f);
|
| + DCHECK_IMPLIES(direction == SHOWING_CONTROLS, TopControlsShownRatio() < 1.f);
|
|
|
| if (top_controls_animation_ && animation_direction_ == direction)
|
| return;
|
| @@ -209,42 +182,32 @@ void TopControlsManager::SetupAnimation(AnimationDirection direction) {
|
| top_controls_animation_ = KeyframedFloatAnimationCurve::Create();
|
| base::TimeDelta start_time = gfx::FrameTime::Now() - base::TimeTicks();
|
| top_controls_animation_->AddKeyframe(
|
| - FloatKeyframe::Create(start_time, client_->ControlsTopOffset(), nullptr));
|
| - float max_ending_offset =
|
| - (direction == SHOWING_CONTROLS ? 1 : -1) * top_controls_height_;
|
| + FloatKeyframe::Create(start_time, TopControlsShownRatio(), nullptr));
|
| + float max_ending_ratio = (direction == SHOWING_CONTROLS ? 1 : -1);
|
| top_controls_animation_->AddKeyframe(FloatKeyframe::Create(
|
| start_time + base::TimeDelta::FromMilliseconds(kShowHideMaxDurationMs),
|
| - client_->ControlsTopOffset() + max_ending_offset,
|
| + TopControlsShownRatio() + max_ending_ratio,
|
| EaseTimingFunction::Create()));
|
| animation_direction_ = direction;
|
| client_->DidChangeTopControlsPosition();
|
| }
|
|
|
| void TopControlsManager::StartAnimationIfNecessary() {
|
| - if (client_->ControlsTopOffset() != 0
|
| - && client_->ControlsTopOffset() != -top_controls_height_) {
|
| - AnimationDirection show_controls = NO_ANIMATION;
|
| -
|
| - float top_controls_show_height =
|
| - top_controls_height_ * top_controls_hide_threshold_;
|
| - float top_controls_hide_height =
|
| - top_controls_height_ * (1.f - top_controls_show_threshold_);
|
| - if (client_->ControlsTopOffset() >= -top_controls_show_height) {
|
| - // If we're showing so much that the hide threshold won't trigger, show.
|
| - show_controls = SHOWING_CONTROLS;
|
| - } else if (client_->ControlsTopOffset() <= -top_controls_hide_height) {
|
| - // If we're showing so little that the show threshold won't trigger, hide.
|
| - show_controls = HIDING_CONTROLS;
|
| - } else {
|
| - // If we could be either showing or hiding, we determine which one to
|
| - // do based on whether or not the total scroll delta was moving up or
|
| - // down.
|
| - show_controls = current_scroll_delta_ <= 0.f ?
|
| - SHOWING_CONTROLS : HIDING_CONTROLS;
|
| - }
|
| -
|
| - if (show_controls != NO_ANIMATION)
|
| - SetupAnimation(show_controls);
|
| + if (TopControlsShownRatio() == 0.f || TopControlsShownRatio() == 1.f)
|
| + return;
|
| +
|
| + if (TopControlsShownRatio() >= 1.f - top_controls_hide_threshold_) {
|
| + // If we're showing so much that the hide threshold won't trigger, show.
|
| + SetupAnimation(SHOWING_CONTROLS);
|
| + } else if (TopControlsShownRatio() <= top_controls_show_threshold_) {
|
| + // If we're showing so little that the show threshold won't trigger, hide.
|
| + SetupAnimation(HIDING_CONTROLS);
|
| + } else {
|
| + // If we could be either showing or hiding, we determine which one to
|
| + // do based on whether or not the total scroll delta was moving up or
|
| + // down.
|
| + SetupAnimation(current_scroll_delta_ <= 0.f ? SHOWING_CONTROLS
|
| + : HIDING_CONTROLS);
|
| }
|
| }
|
|
|
| @@ -253,11 +216,10 @@ bool TopControlsManager::IsAnimationCompleteAtTime(base::TimeTicks time) {
|
| return true;
|
|
|
| base::TimeDelta animation_time = time - base::TimeTicks();
|
| - float new_offset = top_controls_animation_->GetValue(animation_time);
|
| + float new_ratio = top_controls_animation_->GetValue(animation_time);
|
|
|
| - if ((animation_direction_ == SHOWING_CONTROLS && new_offset >= 0) ||
|
| - (animation_direction_ == HIDING_CONTROLS
|
| - && new_offset <= -top_controls_height_)) {
|
| + if ((animation_direction_ == SHOWING_CONTROLS && new_ratio >= 1.f) ||
|
| + (animation_direction_ == HIDING_CONTROLS && new_ratio <= 0.f)) {
|
| return true;
|
| }
|
| return false;
|
|
|