Index: ui/app_list/views/folder_background_view.cc |
diff --git a/ui/app_list/views/folder_background_view.cc b/ui/app_list/views/folder_background_view.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ebb3c12f4ad9188b3ed41d96c8ce00bc1ecdc9b8 |
--- /dev/null |
+++ b/ui/app_list/views/folder_background_view.cc |
@@ -0,0 +1,94 @@ |
+// Copyright 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/folder_background_view.h" |
+ |
+#include "ui/app_list/app_list_constants.h" |
+#include "ui/app_list/views/app_list_folder_view.h" |
+#include "ui/app_list/views/apps_container_view.h" |
+#include "ui/compositor/scoped_layer_animation_settings.h" |
+#include "ui/gfx/canvas.h" |
+#include "ui/gfx/transform_util.h" |
+ |
+namespace app_list { |
+ |
+namespace { |
+ |
+const float kFolderInkBubbleScale = 1.2f; |
+const int kBubbleTransitionDurationMs = 200; |
+ |
+} // namespace |
+ |
+FolderBackgroundView::FolderBackgroundView() |
+ : folder_view_(NULL), |
+ show_state_(NO_BUBBLE) { |
+ SetPaintToLayer(true); |
+ SetFillsBoundsOpaquely(false); |
+} |
+ |
+FolderBackgroundView::~FolderBackgroundView() { |
+} |
+ |
+void FolderBackgroundView::UpdateFolderContainerBubble(ShowState state) { |
+ if (show_state_ == state || |
+ (state == HIDE_BUBBLE && show_state_ == NO_BUBBLE)) { |
+ return; |
+ } |
+ |
+ show_state_ = state; |
+ |
+ // Set the initial state before the animation starts. |
+ const gfx::Rect bounds(layer()->bounds().size()); |
+ gfx::Transform transform = |
+ gfx::GetScaleTransform(bounds.CenterPoint(), kFolderInkBubbleScale); |
+ if (show_state_ == SHOW_BUBBLE) { |
+ layer()->SetOpacity(0.0f); |
+ layer()->SetTransform(transform); |
+ } else { |
+ layer()->SetOpacity(1.0f); |
+ layer()->SetTransform(gfx::Transform()); |
+ } |
+ |
+ ui::ScopedLayerAnimationSettings settings(layer()->GetAnimator()); |
+ settings.AddObserver(this); |
+ settings.SetTransitionDuration( |
+ base::TimeDelta::FromMilliseconds((kBubbleTransitionDurationMs))); |
+ if (show_state_ == SHOW_BUBBLE) { |
+ layer()->SetOpacity(1.0f); |
+ layer()->SetTransform(gfx::Transform()); |
+ } else { |
+ layer()->SetOpacity(0.0f); |
+ layer()->SetTransform(transform); |
+ } |
+ |
+ SchedulePaint(); |
+} |
+ |
+int FolderBackgroundView::GetFolderContainerBubbleRadius() const { |
+ return GetContentsBounds().height() / 2; |
+} |
+ |
+void FolderBackgroundView::OnPaint(gfx::Canvas* canvas) { |
+ if (show_state_ == NO_BUBBLE) |
+ return; |
+ |
+ // Draw ink bubble that shows the folder boundary. |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kFill_Style); |
+ paint.setAntiAlias(true); |
+ paint.setColor(kFolderBubbleColor); |
+ canvas->DrawCircle(GetContentsBounds().CenterPoint(), |
+ GetFolderContainerBubbleRadius(), |
+ paint); |
+} |
+ |
+void FolderBackgroundView::OnImplicitAnimationsCompleted() { |
+ // Show folder name after the ink bubble disappears. |
+ if (show_state_ == HIDE_BUBBLE) { |
+ static_cast<AppsContainerView*>(parent())->app_list_folder_view()-> |
+ UpdateFolderNameVisibility(true); |
+ } |
+} |
+ |
+} // namespace app_list |