1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/app_list/views/folder_background_view.h" 6 7 #include "ui/app_list/app_list_constants.h" 8 #include "ui/app_list/views/app_list_folder_view.h" 9 #include "ui/app_list/views/apps_container_view.h" 10 #include "ui/compositor/scoped_layer_animation_settings.h" 11 #include "ui/gfx/canvas.h" 12 #include "ui/gfx/transform_util.h" 13 14 namespace app_list { 15 16 namespace { 17 18 const float kFolderInkBubbleScale = 1.2f; 19 const int kBubbleTransitionDurationMs = 200; 20 21 } // namespace 22 23 FolderBackgroundView::FolderBackgroundView() 24 : folder_view_(NULL), 25 show_state_(NO_BUBBLE) { 26 SetPaintToLayer(true); 27 SetFillsBoundsOpaquely(false); 28 } 29 30 FolderBackgroundView::~FolderBackgroundView() { 31 } 32 33 void FolderBackgroundView::UpdateFolderContainerBubble(ShowState state) { 34 if (show_state_ == state || 35 (state == HIDE_BUBBLE && show_state_ == NO_BUBBLE)) { 36 return; 37 } 38 39 show_state_ = state; 40 41 // Set the initial state before the animation starts. 42 const gfx::Rect bounds(layer()->bounds().size()); 43 gfx::Transform transform = 44 gfx::GetScaleTransform(bounds.CenterPoint(), kFolderInkBubbleScale); 45 if (show_state_ == SHOW_BUBBLE) { 46 layer()->SetOpacity(0.0f); 47 layer()->SetTransform(transform); 48 } else { 49 layer()->SetOpacity(1.0f); 50 layer()->SetTransform(gfx::Transform()); 51 } 52 53 ui::ScopedLayerAnimationSettings settings(layer()->GetAnimator()); 54 settings.AddObserver(this); 55 settings.SetTransitionDuration( 56 base::TimeDelta::FromMilliseconds((kBubbleTransitionDurationMs))); 57 if (show_state_ == SHOW_BUBBLE) { 58 settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); 59 layer()->SetOpacity(1.0f); 60 layer()->SetTransform(gfx::Transform()); 61 } else { 62 settings.SetTweenType(gfx::Tween::FAST_OUT_LINEAR_IN); 63 layer()->SetOpacity(0.0f); 64 layer()->SetTransform(transform); 65 } 66 67 SchedulePaint(); 68 } 69 70 int FolderBackgroundView::GetFolderContainerBubbleRadius() const { 71 return std::max(GetContentsBounds().width(), GetContentsBounds().height()) / 72 2; 73 } 74 75 void FolderBackgroundView::OnPaint(gfx::Canvas* canvas) { 76 if (show_state_ == NO_BUBBLE) 77 return; 78 79 // Draw ink bubble that shows the folder boundary. 80 SkPaint paint; 81 paint.setStyle(SkPaint::kFill_Style); 82 paint.setAntiAlias(true); 83 paint.setColor(kFolderBubbleColor); 84 canvas->DrawCircle(GetContentsBounds().CenterPoint(), 85 GetFolderContainerBubbleRadius(), 86 paint); 87 } 88 89 void FolderBackgroundView::OnImplicitAnimationsCompleted() { 90 // Show folder name after the ink bubble disappears. 91 if (show_state_ == HIDE_BUBBLE) { 92 static_cast<AppsContainerView*>(parent())->app_list_folder_view()-> 93 UpdateFolderNameVisibility(true); 94 } 95 } 96 97 } // namespace app_list 98