| 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 0fcea771c37c7c3536ba50a0377e34205c5a9ea5..a6fd2c41428b3a1d2e0e7090eeb3d6a6147d2687 100644
|
| --- a/ui/app_list/views/contents_view.cc
|
| +++ b/ui/app_list/views/contents_view.cc
|
| @@ -26,11 +26,6 @@ namespace app_list {
|
|
|
| namespace {
|
|
|
| -// Indexes of interesting views in ViewModel of ContentsView.
|
| -const int kIndexAppsContainer = 0;
|
| -const int kIndexSearchResults = 1;
|
| -const int kIndexStartPage = 2;
|
| -
|
| const int kMinMouseWheelToSwitchPage = 20;
|
| const int kMinScrollToSwitchPage = 20;
|
| const int kMinHorizVelocityToSwitchPage = 800;
|
| @@ -42,28 +37,24 @@ const double kFinishTransitionThreshold = 0.33;
|
| ContentsView::ContentsView(AppListMainView* app_list_main_view,
|
| AppListModel* model,
|
| AppListViewDelegate* view_delegate)
|
| - : show_state_(SHOW_APPS),
|
| - start_page_view_(NULL),
|
| + : start_page_view_(NULL),
|
| app_list_main_view_(app_list_main_view),
|
| view_model_(new views::ViewModel),
|
| bounds_animator_(new views::BoundsAnimator(this)) {
|
| DCHECK(model);
|
|
|
| - apps_container_view_ = new AppsContainerView(app_list_main_view, model);
|
| - AddChildView(apps_container_view_);
|
| - view_model_->Add(apps_container_view_, kIndexAppsContainer);
|
| -
|
| search_results_view_ =
|
| new SearchResultListView(app_list_main_view, view_delegate);
|
| - AddChildView(search_results_view_);
|
| - view_model_->Add(search_results_view_, kIndexSearchResults);
|
| + AddLauncherPage(search_results_view_, NAMED_PAGE_SEARCH_RESULTS);
|
|
|
| if (app_list::switches::IsExperimentalAppListEnabled()) {
|
| start_page_view_ = new StartPageView(app_list_main_view, view_delegate);
|
| - AddChildView(start_page_view_);
|
| - view_model_->Add(start_page_view_, kIndexStartPage);
|
| + AddLauncherPage(start_page_view_, NAMED_PAGE_START);
|
| }
|
|
|
| + apps_container_view_ = new AppsContainerView(app_list_main_view, model);
|
| + active_page_ = AddLauncherPage(apps_container_view_, NAMED_PAGE_APPS);
|
| +
|
| search_results_view_->SetResults(model->results());
|
| }
|
|
|
| @@ -86,24 +77,44 @@ void ContentsView::SetDragAndDropHostOfCurrentAppList(
|
| apps_container_view_->SetDragAndDropHostOfCurrentAppList(drag_and_drop_host);
|
| }
|
|
|
| -void ContentsView::SetShowState(ShowState show_state) {
|
| - if (show_state_ == show_state)
|
| +void ContentsView::SetActivePage(int page_index) {
|
| + if (active_page_ == page_index)
|
| return;
|
|
|
| - show_state_ = show_state;
|
| - ShowStateChanged();
|
| + active_page_ = page_index;
|
| + ActivePageChanged();
|
| }
|
|
|
| -void ContentsView::ShowStateChanged() {
|
| +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_;
|
| +}
|
| +
|
| +int ContentsView::GetPageIndexForNamedPage(NamedPage named_page) const {
|
| + // Find the index of the view corresponding to the given named_page.
|
| + std::map<NamedPage, int>::const_iterator it =
|
| + named_page_to_view_.find(named_page);
|
| + // GetPageIndexForNamedPage should never be called on a named_page that does
|
| + // not have a corresponding view.
|
| + DCHECK(it != named_page_to_view_.end());
|
| + return it->second;
|
| +}
|
| +
|
| +void ContentsView::ActivePageChanged() {
|
| // TODO(xiyuan): Highlight default match instead of the first.
|
| - if (show_state_ == SHOW_SEARCH_RESULTS && search_results_view_->visible())
|
| + if (IsNamedPageActive(NAMED_PAGE_SEARCH_RESULTS) &&
|
| + search_results_view_->visible()) {
|
| search_results_view_->SetSelectedIndex(0);
|
| + }
|
| search_results_view_->UpdateAutoLaunchState();
|
|
|
| - // Notify parent AppListMainView of show state change.
|
| - app_list_main_view_->OnContentsViewShowStateChanged();
|
| + // Notify parent AppListMainView of the page change.
|
| + app_list_main_view_->OnContentsViewActivePageChanged();
|
|
|
| - if (show_state_ == SHOW_START_PAGE)
|
| + if (IsNamedPageActive(NAMED_PAGE_START))
|
| start_page_view_->Reset();
|
|
|
| AnimateToIdealBounds();
|
| @@ -115,29 +126,13 @@ void ContentsView::CalculateIdealBounds() {
|
| return;
|
|
|
| if (app_list::switches::IsExperimentalAppListEnabled()) {
|
| - int incoming_view_index = 0;
|
| - switch (show_state_) {
|
| - case SHOW_APPS:
|
| - incoming_view_index = kIndexAppsContainer;
|
| - break;
|
| - case SHOW_SEARCH_RESULTS:
|
| - incoming_view_index = kIndexSearchResults;
|
| - break;
|
| - case SHOW_START_PAGE:
|
| - incoming_view_index = kIndexStartPage;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -
|
| 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 == incoming_view_index ? incoming_target
|
| - : outgoing_target);
|
| + view_model_->set_ideal_bounds(
|
| + i, i == active_page_ ? incoming_target : outgoing_target);
|
| }
|
| return;
|
| }
|
| @@ -145,24 +140,21 @@ void ContentsView::CalculateIdealBounds() {
|
| gfx::Rect container_frame(rect);
|
| gfx::Rect results_frame(rect);
|
|
|
| - // Offsets apps grid and result list based on |show_state_|.
|
| + // 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();
|
| - switch (show_state_) {
|
| - case SHOW_APPS:
|
| - results_frame.Offset(0, -contents_area_height);
|
| - break;
|
| - case SHOW_SEARCH_RESULTS:
|
| - container_frame.Offset(0, contents_area_height);
|
| - break;
|
| - default:
|
| - NOTREACHED() << "Unknown show_state_ " << show_state_;
|
| - break;
|
| - }
|
| + 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.";
|
|
|
| - view_model_->set_ideal_bounds(kIndexAppsContainer, container_frame);
|
| - view_model_->set_ideal_bounds(kIndexSearchResults, results_frame);
|
| + view_model_->set_ideal_bounds(GetPageIndexForNamedPage(NAMED_PAGE_APPS),
|
| + container_frame);
|
| + view_model_->set_ideal_bounds(
|
| + GetPageIndexForNamedPage(NAMED_PAGE_SEARCH_RESULTS), results_frame);
|
| }
|
|
|
| void ContentsView::AnimateToIdealBounds() {
|
| @@ -178,7 +170,8 @@ PaginationModel* ContentsView::GetAppsPaginationModel() {
|
| }
|
|
|
| void ContentsView::ShowSearchResults(bool show) {
|
| - SetShowState(show ? SHOW_SEARCH_RESULTS : SHOW_APPS);
|
| + NamedPage new_named_page = show ? NAMED_PAGE_SEARCH_RESULTS : NAMED_PAGE_APPS;
|
| + SetActivePage(GetPageIndexForNamedPage(new_named_page));
|
| }
|
|
|
| void ContentsView::ShowFolderContent(AppListFolderItem* item) {
|
| @@ -191,6 +184,19 @@ void ContentsView::Prerender() {
|
| apps_container_view_->apps_grid_view()->Prerender(selected_page);
|
| }
|
|
|
| +int ContentsView::AddLauncherPage(views::View* view) {
|
| + int page_index = view_model_->view_size();
|
| + AddChildView(view);
|
| + view_model_->Add(view, page_index);
|
| + return page_index;
|
| +}
|
| +
|
| +int ContentsView::AddLauncherPage(views::View* view, NamedPage named_page) {
|
| + int page_index = AddLauncherPage(view);
|
| + named_page_to_view_.insert(std::pair<NamedPage, int>(named_page, page_index));
|
| + return page_index;
|
| +}
|
| +
|
| gfx::Size ContentsView::GetPreferredSize() const {
|
| const gfx::Size container_size =
|
| apps_container_view_->apps_grid_view()->GetPreferredSize();
|
| @@ -207,21 +213,11 @@ void ContentsView::Layout() {
|
| }
|
|
|
| bool ContentsView::OnKeyPressed(const ui::KeyEvent& event) {
|
| - switch (show_state_) {
|
| - case SHOW_APPS:
|
| - return apps_container_view_->OnKeyPressed(event);
|
| - case SHOW_SEARCH_RESULTS:
|
| - return search_results_view_->OnKeyPressed(event);
|
| - case SHOW_START_PAGE:
|
| - return start_page_view_->OnKeyPressed(event);
|
| - default:
|
| - NOTREACHED() << "Unknown show state " << show_state_;
|
| - }
|
| - return false;
|
| + return view_model_->view_at(active_page_)->OnKeyPressed(event);
|
| }
|
|
|
| bool ContentsView::OnMouseWheel(const ui::MouseWheelEvent& event) {
|
| - if (show_state_ != SHOW_APPS)
|
| + if (!IsNamedPageActive(NAMED_PAGE_APPS))
|
| return false;
|
|
|
| int offset;
|
| @@ -241,7 +237,7 @@ bool ContentsView::OnMouseWheel(const ui::MouseWheelEvent& event) {
|
| }
|
|
|
| void ContentsView::OnGestureEvent(ui::GestureEvent* event) {
|
| - if (show_state_ != SHOW_APPS)
|
| + if (!IsNamedPageActive(NAMED_PAGE_APPS))
|
| return;
|
|
|
| switch (event->type()) {
|
| @@ -277,7 +273,7 @@ void ContentsView::OnGestureEvent(ui::GestureEvent* event) {
|
| }
|
|
|
| void ContentsView::OnScrollEvent(ui::ScrollEvent* event) {
|
| - if (show_state_ != SHOW_APPS ||
|
| + if (!IsNamedPageActive(NAMED_PAGE_APPS) ||
|
| event->type() == ui::ET_SCROLL_FLING_CANCEL) {
|
| return;
|
| }
|
|
|