Index: ui/app_list/views/top_icon_animation_view.cc |
diff --git a/ui/app_list/views/top_icon_animation_view.cc b/ui/app_list/views/top_icon_animation_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f8f2f523b7ec11a620c4bc6519546a00e730c42a |
--- /dev/null |
+++ b/ui/app_list/views/top_icon_animation_view.cc |
@@ -0,0 +1,82 @@ |
+// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/app_list/views/top_icon_animation_view.h" |
+ |
+#include "ui/app_list/app_list_constants.h" |
+#include "ui/compositor/scoped_layer_animation_settings.h" |
+#include "ui/gfx/image/image_skia_operations.h" |
+#include "ui/views/controls/image_view.h" |
+ |
+namespace app_list { |
+ |
+TopIconAnimationView::TopIconAnimationView(const gfx::ImageSkia& icon, |
+ const gfx::Rect& scaled_rect, |
+ bool open_folder) |
+ : icon_size_(kPreferredIconDimension, kPreferredIconDimension), |
+ icon_(new views::ImageView), |
+ scaled_rect_(scaled_rect), |
+ open_folder_(open_folder) { |
+ DCHECK(!icon.isNull()); |
+ gfx::ImageSkia resized(gfx::ImageSkiaOperations::CreateResizedImage( |
+ icon, |
+ skia::ImageOperations::RESIZE_BEST, icon_size_)); |
+ icon_->SetImage(resized); |
+ AddChildView(icon_); |
+ |
+ SetPaintToLayer(true); |
+ SetFillsBoundsOpaquely(false); |
+ } |
+ |
+TopIconAnimationView::~TopIconAnimationView() { |
+} |
+ |
+void TopIconAnimationView::AddObserver(TopIconAnimationObserver* observer) { |
+ observers_.AddObserver(observer); |
+} |
+ |
+void TopIconAnimationView::RemoveObserver(TopIconAnimationObserver* observer) { |
+ observers_.RemoveObserver(observer); |
+} |
+ |
+void TopIconAnimationView::TransformView() { |
+ // Transform used for scaling down the icon and move it back inside to the |
+ // original folder icon. |
+ const float kIconTransformScale = 0.33333f; |
+ gfx::Transform transform; |
+ transform.Translate(scaled_rect_.x() - layer()->bounds().x(), |
+ scaled_rect_.y() - layer()->bounds().y()); |
+ transform.Scale(kIconTransformScale, kIconTransformScale); |
+ |
+ if (open_folder_) { |
+ // Transform to a scaled down icon inside the original folder icon. |
+ layer()->SetTransform(transform); |
+ } |
+ |
+ // Animate the icon to its target location and scale when opening or |
+ // closing a folder. |
+ ui::ScopedLayerAnimationSettings settings(layer()->GetAnimator()); |
+ settings.AddObserver(this); |
+ settings.SetTransitionDuration( |
+ base::TimeDelta::FromMilliseconds(kFolderTransitionInDurationMs)); |
+ layer()->SetTransform(open_folder_ ? gfx::Transform() : transform); |
+} |
+ |
+gfx::Size TopIconAnimationView::GetPreferredSize() { |
+ return icon_size_; |
+} |
+ |
+void TopIconAnimationView::Layout() { |
+ icon_->SetBoundsRect(GetContentsBounds()); |
+} |
+ |
+void TopIconAnimationView::OnImplicitAnimationsCompleted() { |
+ SetVisible(false); |
+ FOR_EACH_OBSERVER(TopIconAnimationObserver, |
+ observers_, |
+ OnTopIconAnimationsComplete()); |
+ delete this; |
+} |
+ |
+} // namespace app_list |