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

Unified Diff: athena/home/athena_start_page_view.cc

Issue 478293004: Refactor the home card structure and introduce animation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 4 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
« no previous file with comments | « athena/home/athena_start_page_view.h ('k') | athena/home/home_card_gesture_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « athena/home/athena_start_page_view.h ('k') | athena/home/home_card_gesture_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698