| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "cc/input/scroll_elasticity_helper.h" |
| |
| #include "cc/layers/layer_impl.h" |
| #include "cc/trees/layer_tree_host_impl.h" |
| #include "cc/trees/layer_tree_impl.h" |
| |
| namespace cc { |
| |
| class ScrollElasticityHelperImpl : public ScrollElasticityHelper { |
| public: |
| explicit ScrollElasticityHelperImpl(LayerTreeHostImpl* layer_tree_host_impl); |
| virtual ~ScrollElasticityHelperImpl(); |
| |
| // The amount that the view is stretched past the normal allowable bounds. |
| // The "overhang" amount. |
| gfx::Vector2dF StretchAmount() override; |
| void SetStretchAmount(const gfx::Vector2dF& stretch_amount) override; |
| bool PinnedInDirection(const gfx::Vector2dF& direction) override; |
| bool CanScrollHorizontally() override; |
| bool CanScrollVertically() override; |
| void RequestAnimate() override; |
| |
| private: |
| LayerTreeHostImpl* layer_tree_host_impl_; |
| }; |
| |
| ScrollElasticityHelperImpl::ScrollElasticityHelperImpl( |
| LayerTreeHostImpl* layer_tree) |
| : layer_tree_host_impl_(layer_tree) { |
| } |
| |
| ScrollElasticityHelperImpl::~ScrollElasticityHelperImpl() { |
| } |
| |
| gfx::Vector2dF ScrollElasticityHelperImpl::StretchAmount() { |
| return -layer_tree_host_impl_->active_tree()->elastic_overscroll()->Current( |
| true); |
| } |
| |
| void ScrollElasticityHelperImpl::SetStretchAmount( |
| const gfx::Vector2dF& stretch_amount) { |
| if (stretch_amount == StretchAmount()) |
| return; |
| |
| layer_tree_host_impl_->active_tree()->elastic_overscroll()->SetCurrent( |
| -stretch_amount); |
| layer_tree_host_impl_->active_tree()->set_needs_update_draw_properties(); |
| layer_tree_host_impl_->SetNeedsCommit(); |
| layer_tree_host_impl_->SetNeedsRedraw(); |
| layer_tree_host_impl_->SetFullRootLayerDamage(); |
| } |
| |
| bool ScrollElasticityHelperImpl::PinnedInDirection( |
| const gfx::Vector2dF& direction) { |
| gfx::ScrollOffset scroll_offset = |
| layer_tree_host_impl_->active_tree()->TotalScrollOffset(); |
| gfx::ScrollOffset max_scroll_offset = |
| layer_tree_host_impl_->active_tree()->TotalMaxScrollOffset(); |
| bool result = false; |
| if (direction.x() < 0) |
| result |= scroll_offset.x() <= 0; |
| if (direction.x() > 0) |
| result |= scroll_offset.x() >= max_scroll_offset.x(); |
| if (direction.y() < 0) |
| result |= scroll_offset.y() <= 0; |
| if (direction.y() > 0) |
| result |= scroll_offset.y() >= max_scroll_offset.y(); |
| return result; |
| } |
| |
| bool ScrollElasticityHelperImpl::CanScrollHorizontally() { |
| return layer_tree_host_impl_->active_tree()->TotalMaxScrollOffset().x() > 0; |
| } |
| |
| bool ScrollElasticityHelperImpl::CanScrollVertically() { |
| return layer_tree_host_impl_->active_tree()->TotalMaxScrollOffset().y() > 0; |
| } |
| |
| void ScrollElasticityHelperImpl::RequestAnimate() { |
| layer_tree_host_impl_->SetNeedsAnimate(); |
| } |
| |
| // static |
| ScrollElasticityHelper* ScrollElasticityHelper::CreateForLayerTreeHostImpl( |
| LayerTreeHostImpl* layer_tree_host_impl) { |
| return new ScrollElasticityHelperImpl(layer_tree_host_impl); |
| } |
| |
| } // namespace cc |