Index: athena/home/home_card_impl.cc |
diff --git a/athena/home/home_card_impl.cc b/athena/home/home_card_impl.cc |
index 4ed12a4c13acb4014f45857e5462481dff8303de..a58f5c31e37bcb8368dc78b19c47771bae268fc9 100644 |
--- a/athena/home/home_card_impl.cc |
+++ b/athena/home/home_card_impl.cc |
@@ -5,6 +5,7 @@ |
#include "athena/home/public/home_card.h" |
#include "athena/home/app_list_view_delegate.h" |
+#include "athena/home/bottom_home_view.h" |
#include "athena/home/minimized_home.h" |
#include "athena/home/public/app_model_builder.h" |
#include "athena/input/public/accelerator_manager.h" |
@@ -12,11 +13,17 @@ |
#include "athena/wm/public/window_manager.h" |
#include "athena/wm/public/window_manager_observer.h" |
#include "base/bind.h" |
+#include "base/command_line.h" |
+#include "ui/app_list/app_list_switches.h" |
#include "ui/app_list/search_provider.h" |
-#include "ui/app_list/views/app_list_view.h" |
+#include "ui/app_list/views/app_list_main_view.h" |
+#include "ui/app_list/views/contents_view.h" |
#include "ui/aura/layout_manager.h" |
#include "ui/aura/window.h" |
+#include "ui/views/background.h" |
#include "ui/views/layout/box_layout.h" |
+#include "ui/views/widget/widget.h" |
+#include "ui/views/widget/widget_delegate.h" |
#include "ui/wm/core/visibility_controller.h" |
#include "ui/wm/core/window_animations.h" |
@@ -37,20 +44,30 @@ class HomeCardLayoutManager : public aura::LayoutManager { |
virtual int GetHorizontalMargin() const = 0; |
- // TODO(mukai): Remove this when bubble is no longer used for |
- // VISIBLE_CENTERED or VISIBLE_BOTTOM states. |
- virtual bool HasShadow() const = 0; |
- |
virtual aura::Window* GetNativeWindow() = 0; |
}; |
explicit HomeCardLayoutManager(Delegate* delegate) |
: delegate_(delegate) {} |
+ |
virtual ~HomeCardLayoutManager() {} |
- void UpdateVirtualKeyboardBounds(const gfx::Rect& bounds) { |
- virtual_keyboard_bounds_ = bounds; |
- Layout(); |
+ void Layout() { |
+ aura::Window* home_card = delegate_->GetNativeWindow(); |
+ // |home_card| could be detached from the root window (e.g. when it is being |
+ // destroyed). |
+ if (!home_card || !home_card->GetRootWindow()) |
+ return; |
+ |
+ int height = delegate_->GetHomeCardHeight(); |
+ int horiz_margin = delegate_->GetHorizontalMargin(); |
+ gfx::Rect screen_bounds = home_card->GetRootWindow()->bounds(); |
+ height = std::min(height, screen_bounds.height()); |
+ gfx::Rect card_bounds = screen_bounds; |
+ card_bounds.Inset(horiz_margin, screen_bounds.height() - height, |
+ horiz_margin, 0); |
+ |
+ SetChildBoundsDirect(home_card, card_bounds); |
} |
private: |
@@ -70,36 +87,60 @@ class HomeCardLayoutManager : public aura::LayoutManager { |
SetChildBoundsDirect(child, gfx::Rect(requested_bounds.size())); |
} |
- void Layout() { |
- int height = delegate_->GetHomeCardHeight(); |
- int horiz_margin = delegate_->GetHorizontalMargin(); |
- aura::Window* home_card = delegate_->GetNativeWindow(); |
- // |home_card| could be detached from the root window (e.g. when it is being |
- // destroyed). |
- if (!home_card || !home_card->GetRootWindow()) |
- return; |
+ Delegate* delegate_; |
- gfx::Rect screen_bounds = home_card->GetRootWindow()->bounds(); |
- if (!virtual_keyboard_bounds_.IsEmpty()) |
- screen_bounds.set_height(virtual_keyboard_bounds_.y()); |
- gfx::Rect card_bounds = screen_bounds; |
- card_bounds.Inset(horiz_margin, screen_bounds.height() - height, |
- horiz_margin, 0); |
+ DISALLOW_COPY_AND_ASSIGN(HomeCardLayoutManager); |
+}; |
- if (delegate_->HasShadow()) { |
- // Currently the home card is provided as a bubble and the bounds has to |
- // be increased to cancel the shadow. |
- // TODO(mukai): stops using the bubble and remove this. |
- const int kHomeCardShadowWidth = 30; |
- card_bounds.Inset(-kHomeCardShadowWidth, -kHomeCardShadowWidth); |
+// The container view of home card contents of each state. |
+class HomeCardView : public views::WidgetDelegateView { |
+ public: |
+ HomeCardView(app_list::AppListViewDelegate* view_delegate, |
+ aura::Window* container, |
+ MinimizedHomeDragDelegate* minimized_delegate) { |
+ set_background(views::Background::CreateSolidBackground(SK_ColorWHITE)); |
+ views::BoxLayout* layout = new views::BoxLayout( |
+ views::BoxLayout::kHorizontal, 0, 0, 0); |
+ layout->set_main_axis_alignment( |
+ views::BoxLayout::MAIN_AXIS_ALIGNMENT_FILL); |
+ layout->set_cross_axis_alignment( |
+ views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH); |
+ SetLayoutManager(layout); |
+ |
+ bottom_view_ = new BottomHomeView(view_delegate); |
+ AddChildView(bottom_view_); |
+ |
+ main_view_ = new app_list::AppListMainView( |
+ view_delegate, 0 /* initial_apps_page */, container); |
+ AddChildView(main_view_); |
+ |
+ minimized_view_ = CreateMinimizedHome(minimized_delegate); |
+ AddChildView(minimized_view_); |
+ } |
+ |
+ void SetState(HomeCard::State state) { |
+ bottom_view_->SetVisible(state == HomeCard::VISIBLE_BOTTOM); |
+ main_view_->SetVisible(state == HomeCard::VISIBLE_CENTERED); |
+ minimized_view_->SetVisible(state == HomeCard::VISIBLE_MINIMIZED); |
+ if (state == HomeCard::VISIBLE_CENTERED) { |
+ app_list::ContentsView* contents_view = main_view_->contents_view(); |
+ contents_view->SetActivePage(contents_view->GetPageIndexForNamedPage( |
+ app_list::ContentsView::NAMED_PAGE_START)); |
} |
- SetChildBoundsDirect(home_card, card_bounds); |
+ Layout(); |
} |
- Delegate* delegate_; |
- gfx::Rect virtual_keyboard_bounds_; |
+ private: |
+ // views::WidgetDelegate: |
+ virtual views::View* GetContentsView() OVERRIDE { |
+ return this; |
+ } |
- DISALLOW_COPY_AND_ASSIGN(HomeCardLayoutManager); |
+ app_list::AppListMainView* main_view_; |
+ BottomHomeView* bottom_view_; |
+ views::View* minimized_view_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(HomeCardView); |
}; |
class HomeCardImpl : public HomeCard, |
@@ -142,33 +183,32 @@ class HomeCardImpl : public HomeCard, |
virtual int GetHomeCardHeight() const OVERRIDE { |
const int kHomeCardHeight = 150; |
const int kHomeCardMinimizedHeight = 8; |
- CHECK_NE(HIDDEN, state_); |
- return state_ == VISIBLE_MINIMIZED ? kHomeCardMinimizedHeight : |
- kHomeCardHeight; |
+ |
+ switch (state_) { |
+ case VISIBLE_CENTERED: |
+ // Span the screen fully. |
+ return kint32max; |
+ case VISIBLE_BOTTOM: |
+ return kHomeCardHeight; |
+ case VISIBLE_MINIMIZED: |
+ return kHomeCardMinimizedHeight; |
+ default: |
+ NOTREACHED(); |
+ return -1; |
+ } |
} |
virtual int GetHorizontalMargin() const OVERRIDE { |
CHECK_NE(HIDDEN, state_); |
const int kHomeCardHorizontalMargin = 50; |
- return state_ == VISIBLE_MINIMIZED ? 0 : kHomeCardHorizontalMargin; |
- } |
- |
- virtual bool HasShadow() const OVERRIDE { |
- CHECK_NE(HIDDEN, state_); |
- return state_ != VISIBLE_MINIMIZED; |
+ return state_ == VISIBLE_BOTTOM ? kHomeCardHorizontalMargin : 0; |
} |
virtual aura::Window* GetNativeWindow() OVERRIDE { |
- switch (state_) { |
- case HIDDEN: |
- return NULL; |
- case VISIBLE_MINIMIZED: |
- return minimized_widget_ ? minimized_widget_->GetNativeWindow() : NULL; |
- case VISIBLE_CENTERED: |
- case VISIBLE_BOTTOM: |
- return home_card_widget_ ? home_card_widget_->GetNativeWindow() : NULL; |
- } |
- return NULL; |
+ if (state_ == HIDDEN) |
+ return NULL; |
+ |
+ return home_card_widget_ ? home_card_widget_->GetNativeWindow() : NULL; |
} |
// MinimizedHomeDragDelegate: |
@@ -188,10 +228,11 @@ class HomeCardImpl : public HomeCard, |
scoped_ptr<AppModelBuilder> model_builder_; |
HomeCard::State state_; |
+ HomeCard::State original_state_; |
views::Widget* home_card_widget_; |
- views::Widget* minimized_widget_; |
- AppListViewDelegate* view_delegate_; |
+ HomeCardView* home_card_view_; |
+ scoped_ptr<AppListViewDelegate> view_delegate_; |
HomeCardLayoutManager* layout_manager_; |
// Right now HomeCard allows only one search provider. |
@@ -204,8 +245,9 @@ class HomeCardImpl : public HomeCard, |
HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder) |
: model_builder_(model_builder), |
state_(VISIBLE_MINIMIZED), |
+ original_state_(VISIBLE_MINIMIZED), |
home_card_widget_(NULL), |
- minimized_widget_(NULL), |
+ home_card_view_(NULL), |
layout_manager_(NULL) { |
DCHECK(!instance); |
instance = this; |
@@ -216,8 +258,6 @@ HomeCardImpl::~HomeCardImpl() { |
DCHECK(instance); |
WindowManager::GetInstance()->RemoveObserver(this); |
home_card_widget_->CloseNow(); |
- minimized_widget_->CloseNow(); |
- view_delegate_ = NULL; |
instance = NULL; |
} |
@@ -225,20 +265,13 @@ void HomeCardImpl::SetState(HomeCard::State state) { |
// Update |state_| before changing the visibility of the widgets, so that |
// LayoutManager callbacks get the correct state. |
state_ = state; |
- switch (state_) { |
- case VISIBLE_MINIMIZED: |
- home_card_widget_->Hide(); |
- minimized_widget_->Show(); |
- break; |
- case HIDDEN: |
- home_card_widget_->Hide(); |
- minimized_widget_->Hide(); |
- break; |
- case VISIBLE_BOTTOM: |
- case VISIBLE_CENTERED: |
- home_card_widget_->Show(); |
- minimized_widget_->Hide(); |
- break; |
+ original_state_ = state; |
+ if (state_ == HIDDEN) { |
+ home_card_widget_->Hide(); |
+ } else { |
+ home_card_widget_->Show(); |
+ home_card_view_->SetState(state); |
+ layout_manager_->Layout(); |
} |
} |
@@ -251,13 +284,13 @@ void HomeCardImpl::RegisterSearchProvider( |
void HomeCardImpl::UpdateVirtualKeyboardBounds( |
const gfx::Rect& bounds) { |
- if (state_ == VISIBLE_MINIMIZED) { |
- if (bounds.IsEmpty()) |
- minimized_widget_->Show(); |
- else |
- minimized_widget_->Hide(); |
+ if (state_ == VISIBLE_BOTTOM && !bounds.IsEmpty()) { |
+ SetState(VISIBLE_CENTERED); |
+ original_state_ = VISIBLE_BOTTOM; |
oshima
2014/07/17 22:11:59
you can record "previous state" in SetState, and y
oshima
2014/07/19 04:00:13
you probably missed this comment.
Jun Mukai
2014/07/21 17:30:52
Oops, sorry.
Well, however, I don't think keeping
|
+ } else if (state_ == VISIBLE_CENTERED && original_state_ == VISIBLE_BOTTOM && |
+ bounds.IsEmpty()) { |
+ SetState(VISIBLE_BOTTOM); |
} |
- layout_manager_->UpdateVirtualKeyboardBounds(bounds); |
} |
void HomeCardImpl::Init() { |
@@ -269,20 +302,23 @@ void HomeCardImpl::Init() { |
container->SetLayoutManager(layout_manager_); |
wm::SetChildWindowVisibilityChangesAnimated(container); |
- view_delegate_ = new AppListViewDelegate(model_builder_.get()); |
+ view_delegate_.reset(new AppListViewDelegate(model_builder_.get())); |
if (search_provider_) |
view_delegate_->RegisterSearchProvider(search_provider_.get()); |
- app_list::AppListView* view = new app_list::AppListView(view_delegate_); |
- view->InitAsBubbleAtFixedLocation( |
- container, |
- 0 /* initial_apps_page */, |
- gfx::Point(), |
- views::BubbleBorder::FLOAT, |
- true /* border_accepts_events */); |
- home_card_widget_ = view->GetWidget(); |
- |
- // Start off in the minimized state. |
- minimized_widget_ = CreateMinimizedHome(container, this); |
+ |
+ // Force showing in the experimental app-list view. |
+ base::CommandLine::ForCurrentProcess()->AppendSwitch( |
+ app_list::switches::kEnableExperimentalAppList); |
+ |
+ home_card_view_ = new HomeCardView(view_delegate_.get(), container, this); |
+ home_card_widget_ = new views::Widget(); |
+ views::Widget::InitParams params( |
+ views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
+ params.parent = container; |
+ params.delegate = home_card_view_; |
+ params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
+ home_card_widget_->Init(params); |
+ |
SetState(VISIBLE_MINIMIZED); |
} |