Index: athena/home/athena_start_page_view.cc |
diff --git a/athena/home/athena_start_page_view.cc b/athena/home/athena_start_page_view.cc |
index b5b8fb95564592f7836e33c4a18021d3772ca576..1ab634626873e6a83815ee20c011119df1d77582 100644 |
--- a/athena/home/athena_start_page_view.cc |
+++ b/athena/home/athena_start_page_view.cc |
@@ -127,17 +127,13 @@ class SearchBoxContainer : public views::View { |
new views::RoundRectPainter(SK_ColorGRAY, kSearchBoxCornerRadius), |
gfx::Insets(kSearchBoxBorderWidth, kSearchBoxBorderWidth, |
kSearchBoxBorderWidth, kSearchBoxBorderWidth))); |
+ SetLayoutManager(new views::FillLayout()); |
AddChildView(search_box_); |
} |
virtual ~SearchBoxContainer() {} |
private: |
// views::View: |
- virtual void Layout() OVERRIDE { |
- gfx::Rect search_box_bounds = GetContentsBounds(); |
- search_box_bounds.ClampToCenteredSize(GetPreferredSize()); |
- search_box_->SetBoundsRect(search_box_bounds); |
- } |
virtual gfx::Size GetPreferredSize() const OVERRIDE { |
return gfx::Size(kSearchBoxWidth, kSearchBoxHeight); |
} |
@@ -152,13 +148,30 @@ class SearchBoxContainer : public views::View { |
namespace athena { |
+// static |
+const char AthenaStartPageView::kViewClassName[] = "AthenaStartPageView"; |
+ |
+AthenaStartPageView::LayoutData::LayoutData() |
+ : logo_opacity(1.0f), |
+ background_opacity(1.0f) { |
+} |
+ |
AthenaStartPageView::AthenaStartPageView( |
app_list::AppListViewDelegate* view_delegate) |
: delegate_(view_delegate), |
+ layout_state_(0.0f), |
weak_factory_(this) { |
+ background_ = new views::View(); |
+ background_->set_background( |
+ views::Background::CreateSolidBackground(SK_ColorWHITE)); |
+ background_->SetPaintToLayer(true); |
+ background_->SetFillsBoundsOpaquely(false); |
+ AddChildView(background_); |
+ |
logo_ = view_delegate->CreateStartPageWebView( |
gfx::Size(kWebViewWidth, kWebViewHeight)); |
logo_->SetPaintToLayer(true); |
+ logo_->SetSize(logo_->GetPreferredSize()); |
AddChildView(logo_); |
search_results_view_ = new app_list::SearchResultListView( |
@@ -183,13 +196,7 @@ AthenaStartPageView::AthenaStartPageView( |
view_delegate->GetModel()->top_level_item_list(); |
for (size_t i = 0; i < std::min(top_level->item_count(), kMaxIconNum); ++i) |
app_icon_container_->AddChildView(new AppIconButton(top_level->item_at(i))); |
- |
- search_box_view_ = new app_list::SearchBoxView(this, view_delegate); |
- search_box_view_->set_contents_view(this); |
- search_box_container_ = new SearchBoxContainer(search_box_view_); |
- search_box_container_->SetPaintToLayer(true); |
- search_box_container_->SetFillsBoundsOpaquely(false); |
- AddChildView(search_box_container_); |
+ app_icon_container_->SetSize(app_icon_container_->GetPreferredSize()); |
control_icon_container_ = new views::View(); |
control_icon_container_->SetPaintToLayer(true); |
@@ -199,6 +206,15 @@ AthenaStartPageView::AthenaStartPageView( |
views::BoxLayout::kHorizontal, 0, 0, kIconMargin)); |
for (size_t i = 0; i < kMaxIconNum; ++i) |
control_icon_container_->AddChildView(new PlaceHolderButton()); |
+ control_icon_container_->SetSize(control_icon_container_->GetPreferredSize()); |
+ |
+ search_box_view_ = new app_list::SearchBoxView(this, view_delegate); |
+ search_box_view_->set_contents_view(this); |
+ search_box_container_ = new SearchBoxContainer(search_box_view_); |
+ search_box_container_->SetPaintToLayer(true); |
+ search_box_container_->SetFillsBoundsOpaquely(false); |
+ search_box_container_->SetSize(search_box_container_->GetPreferredSize()); |
+ AddChildView(search_box_container_); |
} |
AthenaStartPageView::~AthenaStartPageView() {} |
@@ -207,6 +223,69 @@ void AthenaStartPageView::RequestFocusOnSearchBox() { |
search_box_view_->search_box()->RequestFocus(); |
} |
+void AthenaStartPageView::SetLayoutState(float layout_state) { |
+ layout_state_ = layout_state; |
+ Layout(); |
+} |
+ |
+void AthenaStartPageView::SetLayoutStateWithAnimation(float layout_state) { |
+ ui::ScopedLayerAnimationSettings logo(logo_->layer()->GetAnimator()); |
+ ui::ScopedLayerAnimationSettings search_box( |
+ search_box_container_->layer()->GetAnimator()); |
+ ui::ScopedLayerAnimationSettings icons( |
+ app_icon_container_->layer()->GetAnimator()); |
+ ui::ScopedLayerAnimationSettings controls( |
+ control_icon_container_->layer()->GetAnimator()); |
+ |
+ logo.SetTweenType(gfx::Tween::EASE_IN_OUT); |
+ search_box.SetTweenType(gfx::Tween::EASE_IN_OUT); |
+ icons.SetTweenType(gfx::Tween::EASE_IN_OUT); |
+ controls.SetTweenType(gfx::Tween::EASE_IN_OUT); |
+ |
+ SetLayoutState(layout_state); |
+} |
+ |
+AthenaStartPageView::LayoutData AthenaStartPageView::CreateBottomBounds( |
+ int width) { |
+ LayoutData state; |
+ state.icons.set_size(app_icon_container_->size()); |
+ state.icons.set_x(kIconMargin); |
+ state.icons.set_y(kIconMargin); |
+ |
+ state.controls.set_size(control_icon_container_->size()); |
+ state.controls.set_x(width - kIconMargin - state.controls.width()); |
+ state.controls.set_y(kIconMargin); |
+ |
+ state.search_box.set_size(search_box_container_->size()); |
+ state.search_box.set_x((width - state.search_box.width()) / 2); |
+ state.search_box.set_y((kHomeCardHeight - state.search_box.height()) / 2); |
+ |
+ state.logo_opacity = 0.0f; |
+ state.background_opacity = 0.9f; |
+ return state; |
+} |
+ |
+AthenaStartPageView::LayoutData AthenaStartPageView::CreateCenteredBounds( |
+ int width) { |
+ LayoutData state; |
+ |
+ state.search_box.set_size(search_box_container_->size()); |
+ state.search_box.set_x((width - state.search_box.width()) / 2); |
+ state.search_box.set_y(logo_->bounds().bottom() + kInstantContainerSpacing); |
+ |
+ state.icons.set_size(app_icon_container_->size()); |
+ state.icons.set_x(width / 2 - state.icons.width() - kIconMargin / 2); |
+ state.icons.set_y(state.search_box.bottom() + kInstantContainerSpacing); |
+ |
+ state.controls.set_size(control_icon_container_->size()); |
+ state.controls.set_x(width / 2 + kIconMargin / 2 + kIconMargin % 2); |
+ state.controls.set_y(state.icons.y()); |
+ |
+ state.logo_opacity = 1.0f; |
+ state.background_opacity = 1.0f; |
+ return state; |
+} |
+ |
void AthenaStartPageView::LayoutSearchResults(bool should_show_search_results) { |
if (should_show_search_results == |
search_results_view_->layer()->GetTargetVisibility()) { |
@@ -276,57 +355,31 @@ void AthenaStartPageView::OnSearchResultLayoutAnimationCompleted( |
} |
void AthenaStartPageView::Layout() { |
- gfx::Rect bounds = GetContentsBounds(); |
search_results_view_->SetVisible(false); |
- |
- if (bounds.height() <= kHomeCardHeight) { |
- logo_->SetVisible(false); |
- gfx::Rect icon_bounds(app_icon_container_->GetPreferredSize()); |
- icon_bounds.set_x(bounds.x() + kIconMargin); |
- icon_bounds.set_y(bounds.x() + kIconMargin); |
- app_icon_container_->SetBoundsRect(icon_bounds); |
- |
- gfx::Rect control_bounds(control_icon_container_->GetPreferredSize()); |
- control_bounds.set_x( |
- bounds.right() - kIconMargin - control_bounds.width()); |
- control_bounds.set_y(bounds.y() + kIconMargin); |
- control_icon_container_->SetBoundsRect(control_bounds); |
- |
- search_box_container_->SetBounds( |
- icon_bounds.right(), bounds.y(), |
- control_bounds.x() - icon_bounds.right(), kHomeCardHeight); |
- |
- set_background(views::Background::CreateSolidBackground( |
- 255, 255, 255, 255 * 0.9)); |
- } else { |
- // TODO(mukai): set the intermediate state. |
- logo_->SetVisible(true); |
- logo_->layer()->SetOpacity(1.0f); |
- set_background(views::Background::CreateSolidBackground(SK_ColorWHITE)); |
- gfx::Rect logo_bounds(bounds.x() + bounds.width() / 2 - kWebViewWidth / 2, |
- bounds.y() + kTopMargin, |
- kWebViewWidth, |
- kWebViewHeight); |
- logo_->SetBoundsRect(logo_bounds); |
- |
- gfx::Rect search_box_bounds(search_box_container_->GetPreferredSize()); |
- search_box_bounds.set_x( |
- bounds.x() + bounds.width() / 2 - search_box_bounds.width() / 2); |
- search_box_bounds.set_y(logo_bounds.bottom() + kInstantContainerSpacing); |
- search_box_container_->SetBoundsRect(search_box_bounds); |
- |
- gfx::Rect icon_bounds(app_icon_container_->GetPreferredSize()); |
- icon_bounds.set_x(bounds.x() + bounds.width() / 2 - |
- icon_bounds.width() - kIconMargin / 2); |
- icon_bounds.set_y(search_box_bounds.bottom() + kInstantContainerSpacing); |
- app_icon_container_->SetBoundsRect(icon_bounds); |
- |
- gfx::Rect control_bounds(control_icon_container_->GetPreferredSize()); |
- control_bounds.set_x(bounds.x() + bounds.width() / 2 + |
- kIconMargin / 2 + kIconMargin % 2); |
- control_bounds.set_y(icon_bounds.y()); |
- control_icon_container_->SetBoundsRect(control_bounds); |
- } |
+ gfx::Rect logo_bounds(x() + width() / 2 - kWebViewWidth / 2, y() + kTopMargin, |
+ kWebViewWidth, kWebViewHeight); |
+ logo_->SetBoundsRect(logo_bounds); |
+ |
+ LayoutData bottom_bounds = CreateBottomBounds(width()); |
+ LayoutData centered_bounds = CreateCenteredBounds(width()); |
+ |
+ logo_->layer()->SetOpacity(gfx::Tween::FloatValueBetween( |
+ gfx::Tween::CalculateValue(gfx::Tween::EASE_IN_2, layout_state_), |
+ bottom_bounds.logo_opacity, centered_bounds.logo_opacity)); |
+ logo_->SetVisible(logo_->layer()->GetTargetOpacity() != 0.0f); |
+ |
+ app_icon_container_->SetBoundsRect(gfx::Tween::RectValueBetween( |
+ layout_state_, bottom_bounds.icons, centered_bounds.icons)); |
+ control_icon_container_->SetBoundsRect(gfx::Tween::RectValueBetween( |
+ layout_state_, bottom_bounds.controls, centered_bounds.controls)); |
+ search_box_container_->SetBoundsRect(gfx::Tween::RectValueBetween( |
+ layout_state_, bottom_bounds.search_box, centered_bounds.search_box)); |
+ |
+ background_->SetBoundsRect(bounds()); |
+ background_->layer()->SetOpacity(gfx::Tween::FloatValueBetween( |
+ layout_state_, |
+ bottom_bounds.background_opacity, |
+ centered_bounds.background_opacity)); |
} |
bool AthenaStartPageView::OnKeyPressed(const ui::KeyEvent& key_event) { |