Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / app_list / views / folder_background_view.cc
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