Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(520)

Unified Diff: ui/app_list/views/contents_view.cc

Issue 316393002: App list uses PaginationModel to transition between pages. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/app_list/views/contents_view.h ('K') | « ui/app_list/views/contents_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/app_list/views/contents_view.cc
diff --git a/ui/app_list/views/contents_view.cc b/ui/app_list/views/contents_view.cc
index a6fd2c41428b3a1d2e0e7090eeb3d6a6147d2687..f15ee29282631b7c8b31ef57537a1dcd617f7efb 100644
--- a/ui/app_list/views/contents_view.cc
+++ b/ui/app_list/views/contents_view.cc
@@ -10,7 +10,6 @@
#include "ui/app_list/app_list_constants.h"
#include "ui/app_list/app_list_switches.h"
#include "ui/app_list/app_list_view_delegate.h"
-#include "ui/app_list/pagination_model.h"
#include "ui/app_list/views/app_list_folder_view.h"
#include "ui/app_list/views/app_list_main_view.h"
#include "ui/app_list/views/apps_container_view.h"
@@ -18,7 +17,6 @@
#include "ui/app_list/views/search_result_list_view.h"
#include "ui/app_list/views/start_page_view.h"
#include "ui/events/event.h"
-#include "ui/views/animation/bounds_animator.h"
#include "ui/views/view_model.h"
#include "ui/views/view_model_utils.h"
@@ -39,8 +37,7 @@ ContentsView::ContentsView(AppListMainView* app_list_main_view,
AppListViewDelegate* view_delegate)
: start_page_view_(NULL),
app_list_main_view_(app_list_main_view),
- view_model_(new views::ViewModel),
- bounds_animator_(new views::BoundsAnimator(this)) {
+ view_model_(new views::ViewModel) {
DCHECK(model);
search_results_view_ =
@@ -53,12 +50,17 @@ ContentsView::ContentsView(AppListMainView* app_list_main_view,
}
apps_container_view_ = new AppsContainerView(app_list_main_view, model);
- active_page_ = AddLauncherPage(apps_container_view_, NAMED_PAGE_APPS);
+ int apps_page_index = AddLauncherPage(apps_container_view_, NAMED_PAGE_APPS);
search_results_view_->SetResults(model->results());
+
+ pagination_model_.SetTotalPages(view_model_->view_size());
+ pagination_model_.SelectPage(apps_page_index, false);
+ pagination_model_.AddObserver(this);
}
ContentsView::~ContentsView() {
+ pagination_model_.RemoveObserver(this);
}
void ContentsView::CancelDrag() {
@@ -78,19 +80,25 @@ void ContentsView::SetDragAndDropHostOfCurrentAppList(
}
void ContentsView::SetActivePage(int page_index) {
- if (active_page_ == page_index)
+ if (GetActivePageIndex() == page_index)
return;
- active_page_ = page_index;
+ // Start animating to the new page.
+ pagination_model_.SelectPage(page_index, true);
ActivePageChanged();
}
+int ContentsView::GetActivePageIndex() const {
+ // The active page is changed at the beginning of an animation, not the end.
+ return pagination_model_.SelectedTargetPage();
+}
+
bool ContentsView::IsNamedPageActive(NamedPage named_page) const {
std::map<NamedPage, int>::const_iterator it =
named_page_to_view_.find(named_page);
if (it == named_page_to_view_.end())
return false;
- return it->second == active_page_;
+ return it->second == GetActivePageIndex();
}
int ContentsView::GetPageIndexForNamedPage(NamedPage named_page) const {
@@ -116,52 +124,57 @@ void ContentsView::ActivePageChanged() {
if (IsNamedPageActive(NAMED_PAGE_START))
start_page_view_->Reset();
-
- AnimateToIdealBounds();
}
-void ContentsView::CalculateIdealBounds() {
+void ContentsView::CalculateAndSetBounds(bool ideal) {
gfx::Rect rect(GetContentsBounds());
if (rect.IsEmpty())
return;
- if (app_list::switches::IsExperimentalAppListEnabled()) {
- gfx::Rect incoming_target(rect);
- gfx::Rect outgoing_target(rect);
- outgoing_target.set_x(-outgoing_target.width());
-
- for (int i = 0; i < view_model_->view_size(); ++i) {
- view_model_->set_ideal_bounds(
- i, i == active_page_ ? incoming_target : outgoing_target);
+ // The bounds calculations will potentially be mid-transition (depending on
+ // the state of the PaginationModel).
+ int current_page = std::max(0, pagination_model_.selected_page());
calamity 2014/06/12 03:05:08 When can this be negative?
Matt Giuca 2014/06/16 00:59:05 pagination_model_.selected_page() is -1 by default
+ int target_page = current_page;
+ double progress = 1;
+ if (pagination_model_.has_transition()) {
+ const PaginationModel::Transition& transition =
+ pagination_model_.transition();
+ if (pagination_model_.is_valid_page(transition.target_page)) {
+ target_page = transition.target_page;
+ // If |ideal|, assume that any pending animation has already completed.
+ if (!ideal)
+ progress = transition.progress;
}
- return;
}
- gfx::Rect container_frame(rect);
- gfx::Rect results_frame(rect);
-
- // Offsets apps grid and result list based on |active_page_|.
- // SearchResultListView is on top of apps grid. Visible view is left in
- // visible area and invisible ones is put out of the visible area.
- int contents_area_height = rect.height();
- if (IsNamedPageActive(NAMED_PAGE_APPS))
- results_frame.Offset(0, -contents_area_height);
- else if (IsNamedPageActive(NAMED_PAGE_SEARCH_RESULTS))
- container_frame.Offset(0, contents_area_height);
- else
- NOTREACHED() << "Page " << active_page_ << " invalid in current app list.";
+ gfx::Rect incoming_target(rect);
+ gfx::Rect outgoing_target(rect);
+ int dir = target_page > current_page ? -1 : 1;
- view_model_->set_ideal_bounds(GetPageIndexForNamedPage(NAMED_PAGE_APPS),
- container_frame);
- view_model_->set_ideal_bounds(
- GetPageIndexForNamedPage(NAMED_PAGE_SEARCH_RESULTS), results_frame);
-}
+ if (app_list::switches::IsExperimentalAppListEnabled()) {
+ // The experimental app list transitions horizontally.
+ int page_width = rect.width();
+ int transition_offset = progress * page_width * dir;
+
+ outgoing_target.set_x(transition_offset);
+ incoming_target.set_x(dir < 0 ? transition_offset + page_width
+ : transition_offset - page_width);
+ } else {
+ // The normal app list transitions vertically.
+ int page_height = rect.height();
+ int transition_offset = progress * page_height * dir;
+
+ outgoing_target.set_y(transition_offset);
+ incoming_target.set_y(dir < 0 ? transition_offset + page_height
+ : transition_offset - page_height);
+ }
-void ContentsView::AnimateToIdealBounds() {
- CalculateIdealBounds();
- for (int i = 0; i < view_model_->view_size(); ++i) {
- bounds_animator_->AnimateViewTo(view_model_->view_at(i),
- view_model_->ideal_bounds(i));
+ if (ideal) {
+ view_model_->set_ideal_bounds(current_page, outgoing_target);
+ view_model_->set_ideal_bounds(target_page, incoming_target);
calamity 2014/06/12 03:05:08 It looks like ideal bounds aren't really used anyw
Matt Giuca 2014/06/16 00:59:05 I guess if something isn't used at all, but semant
+ } else {
+ view_model_->view_at(current_page)->SetBoundsRect(outgoing_target);
+ view_model_->view_at(target_page)->SetBoundsRect(incoming_target);
}
}
@@ -197,6 +210,13 @@ int ContentsView::AddLauncherPage(views::View* view, NamedPage named_page) {
return page_index;
}
+void ContentsView::FinishCurrentAnimationForTests() {
+ if (!pagination_model_.has_transition())
+ return;
calamity 2014/06/12 03:05:08 nit: blank line after early return.
Matt Giuca 2014/06/16 00:59:05 Done.
+ pagination_model_.SelectPage(pagination_model_.transition().target_page,
+ false);
+}
+
gfx::Size ContentsView::GetPreferredSize() const {
const gfx::Size container_size =
apps_container_view_->apps_grid_view()->GetPreferredSize();
@@ -208,12 +228,12 @@ gfx::Size ContentsView::GetPreferredSize() const {
}
void ContentsView::Layout() {
- CalculateIdealBounds();
+ CalculateAndSetBounds(true);
views::ViewModelUtils::SetViewBoundsToIdealBounds(*view_model_);
}
bool ContentsView::OnKeyPressed(const ui::KeyEvent& event) {
- return view_model_->view_at(active_page_)->OnKeyPressed(event);
+ return view_model_->view_at(GetActivePageIndex())->OnKeyPressed(event);
}
bool ContentsView::OnMouseWheel(const ui::MouseWheelEvent& event) {
@@ -236,6 +256,19 @@ bool ContentsView::OnMouseWheel(const ui::MouseWheelEvent& event) {
return false;
}
+void ContentsView::TotalPagesChanged() {
+}
+
+void ContentsView::SelectedPageChanged(int old_selected, int new_selected) {
+}
+
+void ContentsView::TransitionStarted() {
+}
+
+void ContentsView::TransitionChanged() {
+ CalculateAndSetBounds(false);
+}
+
void ContentsView::OnGestureEvent(ui::GestureEvent* event) {
if (!IsNamedPageActive(NAMED_PAGE_APPS))
return;
« ui/app_list/views/contents_view.h ('K') | « ui/app_list/views/contents_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698