| Index: ui/app_list/pagination_model.cc
|
| diff --git a/ui/app_list/pagination_model.cc b/ui/app_list/pagination_model.cc
|
| deleted file mode 100644
|
| index 0e568d81535021426122c7f075359c8f6848b6eb..0000000000000000000000000000000000000000
|
| --- a/ui/app_list/pagination_model.cc
|
| +++ /dev/null
|
| @@ -1,283 +0,0 @@
|
| -// Copyright (c) 2012 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 "ui/app_list/pagination_model.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "ui/app_list/pagination_model_observer.h"
|
| -#include "ui/gfx/animation/slide_animation.h"
|
| -
|
| -namespace app_list {
|
| -
|
| -PaginationModel::PaginationModel()
|
| - : total_pages_(-1),
|
| - selected_page_(-1),
|
| - transition_(-1, 0),
|
| - pending_selected_page_(-1),
|
| - transition_duration_ms_(0),
|
| - overscroll_transition_duration_ms_(0),
|
| - last_overscroll_target_page_(0) {
|
| -}
|
| -
|
| -PaginationModel::~PaginationModel() {
|
| -}
|
| -
|
| -void PaginationModel::SetTotalPages(int total_pages) {
|
| - if (total_pages == total_pages_)
|
| - return;
|
| -
|
| - total_pages_ = total_pages;
|
| - if (selected_page_ < 0)
|
| - SelectPage(0, false /* animate */);
|
| - if (selected_page_ >= total_pages_)
|
| - SelectPage(std::max(total_pages_ - 1, 0), false /* animate */);
|
| - FOR_EACH_OBSERVER(PaginationModelObserver, observers_, TotalPagesChanged());
|
| -}
|
| -
|
| -void PaginationModel::SelectPage(int page, bool animate) {
|
| - if (animate) {
|
| - // -1 and |total_pages_| are valid target page for animation.
|
| - DCHECK(page >= -1 && page <= total_pages_);
|
| -
|
| - if (!transition_animation_) {
|
| - if (page == selected_page_)
|
| - return;
|
| -
|
| - // Suppress over scroll animation if the same one happens too fast.
|
| - if (!is_valid_page(page)) {
|
| - const base::TimeTicks now = base::TimeTicks::Now();
|
| -
|
| - if (page == last_overscroll_target_page_) {
|
| - const int kMinOverScrollTimeGapInMs = 500;
|
| - const base::TimeDelta time_elapsed =
|
| - now - last_overscroll_animation_start_time_;
|
| - if (time_elapsed.InMilliseconds() < kMinOverScrollTimeGapInMs)
|
| - return;
|
| - }
|
| -
|
| - last_overscroll_target_page_ = page;
|
| - last_overscroll_animation_start_time_ = now;
|
| - }
|
| -
|
| - // Creates an animation if there is not one.
|
| - StartTransitionAnimation(Transition(page, 0));
|
| - return;
|
| - } else {
|
| - const bool showing = transition_animation_->IsShowing();
|
| - const int from_page = showing ? selected_page_ : transition_.target_page;
|
| - const int to_page = showing ? transition_.target_page : selected_page_;
|
| -
|
| - if (from_page == page) {
|
| - if (showing)
|
| - transition_animation_->Hide();
|
| - else
|
| - transition_animation_->Show();
|
| - pending_selected_page_ = -1;
|
| - } else if (to_page != page) {
|
| - pending_selected_page_ = page;
|
| - } else {
|
| - pending_selected_page_ = -1;
|
| - }
|
| - }
|
| - } else {
|
| - DCHECK(total_pages_ == 0 || (page >= 0 && page < total_pages_));
|
| -
|
| - if (page == selected_page_)
|
| - return;
|
| -
|
| - ResetTransitionAnimation();
|
| -
|
| - int old_selected = selected_page_;
|
| - selected_page_ = page;
|
| - NotifySelectedPageChanged(old_selected, selected_page_);
|
| - }
|
| -}
|
| -
|
| -void PaginationModel::SelectPageRelative(int delta, bool animate) {
|
| - SelectPage(CalculateTargetPage(delta), animate);
|
| -}
|
| -
|
| -void PaginationModel::FinishAnimation() {
|
| - SelectPage(SelectedTargetPage(), false);
|
| -}
|
| -
|
| -void PaginationModel::SetTransition(const Transition& transition) {
|
| - // -1 and |total_pages_| is a valid target page, which means user is at
|
| - // the end and there is no target page for this scroll.
|
| - DCHECK(transition.target_page >= -1 &&
|
| - transition.target_page <= total_pages_);
|
| - DCHECK(transition.progress >= 0 && transition.progress <= 1);
|
| -
|
| - if (transition_.Equals(transition))
|
| - return;
|
| -
|
| - transition_ = transition;
|
| - NotifyTransitionChanged();
|
| -}
|
| -
|
| -void PaginationModel::SetTransitionDurations(int duration_ms,
|
| - int overscroll_duration_ms) {
|
| - transition_duration_ms_ = duration_ms;
|
| - overscroll_transition_duration_ms_ = overscroll_duration_ms;
|
| -}
|
| -
|
| -void PaginationModel::StartScroll() {
|
| - // Cancels current transition animation (if any).
|
| - transition_animation_.reset();
|
| -}
|
| -
|
| -void PaginationModel::UpdateScroll(double delta) {
|
| - // Translates scroll delta to desired page change direction.
|
| - int page_change_dir = delta > 0 ? -1 : 1;
|
| -
|
| - // Initializes a transition if there is none.
|
| - if (!has_transition())
|
| - transition_.target_page = CalculateTargetPage(page_change_dir);
|
| -
|
| - // Updates transition progress.
|
| - int transition_dir = transition_.target_page > selected_page_ ? 1 : -1;
|
| - double progress = transition_.progress +
|
| - fabs(delta) * page_change_dir * transition_dir;
|
| -
|
| - if (progress < 0) {
|
| - if (transition_.progress) {
|
| - transition_.progress = 0;
|
| - NotifyTransitionChanged();
|
| - }
|
| - clear_transition();
|
| - } else if (progress > 1) {
|
| - if (is_valid_page(transition_.target_page)) {
|
| - SelectPage(transition_.target_page, false);
|
| - clear_transition();
|
| - }
|
| - } else {
|
| - transition_.progress = progress;
|
| - NotifyTransitionChanged();
|
| - }
|
| -}
|
| -
|
| -void PaginationModel::EndScroll(bool cancel) {
|
| - if (!has_transition())
|
| - return;
|
| -
|
| - StartTransitionAnimation(transition_);
|
| -
|
| - if (cancel)
|
| - transition_animation_->Hide();
|
| -}
|
| -
|
| -bool PaginationModel::IsRevertingCurrentTransition() const {
|
| - // Use !IsShowing() so that we return true at the end of hide animation.
|
| - return transition_animation_ && !transition_animation_->IsShowing();
|
| -}
|
| -
|
| -void PaginationModel::AddObserver(PaginationModelObserver* observer) {
|
| - observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void PaginationModel::RemoveObserver(PaginationModelObserver* observer) {
|
| - observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -int PaginationModel::SelectedTargetPage() const {
|
| - // If no animation, or animation is in reverse, just the selected page.
|
| - if (!transition_animation_ || !transition_animation_->IsShowing())
|
| - return selected_page_;
|
| -
|
| - // If, at the end of the current animation, we will animate to another page,
|
| - // return that eventual page.
|
| - if (pending_selected_page_ >= 0)
|
| - return pending_selected_page_;
|
| -
|
| - // Just the target of the current animation.
|
| - return transition_.target_page;
|
| -}
|
| -
|
| -void PaginationModel::NotifySelectedPageChanged(int old_selected,
|
| - int new_selected) {
|
| - FOR_EACH_OBSERVER(PaginationModelObserver,
|
| - observers_,
|
| - SelectedPageChanged(old_selected, new_selected));
|
| -}
|
| -
|
| -void PaginationModel::NotifyTransitionStarted() {
|
| - FOR_EACH_OBSERVER(PaginationModelObserver, observers_, TransitionStarted());
|
| -}
|
| -
|
| -void PaginationModel::NotifyTransitionChanged() {
|
| - FOR_EACH_OBSERVER(PaginationModelObserver, observers_, TransitionChanged());
|
| -}
|
| -
|
| -int PaginationModel::CalculateTargetPage(int delta) const {
|
| - DCHECK_GT(total_pages_, 0);
|
| - const int target_page = SelectedTargetPage() + delta;
|
| -
|
| - int start_page = 0;
|
| - int end_page = total_pages_ - 1;
|
| -
|
| - // Use invalid page when |selected_page_| is at ends.
|
| - if (target_page < start_page && selected_page_ == start_page)
|
| - start_page = -1;
|
| - else if (target_page > end_page && selected_page_ == end_page)
|
| - end_page = total_pages_;
|
| -
|
| - return std::max(start_page, std::min(end_page, target_page));
|
| -}
|
| -
|
| -void PaginationModel::StartTransitionAnimation(const Transition& transition) {
|
| - DCHECK(selected_page_ != transition.target_page);
|
| -
|
| - NotifyTransitionStarted();
|
| - SetTransition(transition);
|
| -
|
| - transition_animation_.reset(new gfx::SlideAnimation(this));
|
| - transition_animation_->SetTweenType(gfx::Tween::FAST_OUT_SLOW_IN);
|
| - transition_animation_->Reset(transition_.progress);
|
| -
|
| - const int duration = is_valid_page(transition_.target_page) ?
|
| - transition_duration_ms_ : overscroll_transition_duration_ms_;
|
| - if (duration)
|
| - transition_animation_->SetSlideDuration(duration);
|
| -
|
| - transition_animation_->Show();
|
| -}
|
| -
|
| -void PaginationModel::ResetTransitionAnimation() {
|
| - transition_animation_.reset();
|
| - transition_.target_page = -1;
|
| - transition_.progress = 0;
|
| - pending_selected_page_ = -1;
|
| -}
|
| -
|
| -void PaginationModel::AnimationProgressed(const gfx::Animation* animation) {
|
| - transition_.progress = transition_animation_->GetCurrentValue();
|
| - NotifyTransitionChanged();
|
| -}
|
| -
|
| -void PaginationModel::AnimationEnded(const gfx::Animation* animation) {
|
| - // Save |pending_selected_page_| because SelectPage resets it.
|
| - int next_target = pending_selected_page_;
|
| -
|
| - if (transition_animation_->GetCurrentValue() == 1) {
|
| - // Showing animation ends.
|
| - if (!is_valid_page(transition_.target_page)) {
|
| - // If target page is not in valid range, reverse the animation.
|
| - transition_animation_->Hide();
|
| - return;
|
| - }
|
| -
|
| - // Otherwise, change page and finish the transition.
|
| - DCHECK(selected_page_ != transition_.target_page);
|
| - SelectPage(transition_.target_page, false /* animate */);
|
| - } else if (transition_animation_->GetCurrentValue() == 0) {
|
| - // Hiding animation ends. No page change should happen.
|
| - ResetTransitionAnimation();
|
| - }
|
| -
|
| - if (next_target >= 0)
|
| - SelectPage(next_target, true);
|
| -}
|
| -
|
| -} // namespace app_list
|
|
|