1// Copyright (c) 2012 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/app_list_background.h"
6
7#include "base/command_line.h"
8#include "third_party/skia/include/core/SkPaint.h"
9#include "third_party/skia/include/core/SkPath.h"
10#include "ui/app_list/app_list_constants.h"
11#include "ui/app_list/app_list_switches.h"
12#include "ui/app_list/views/app_list_main_view.h"
13#include "ui/app_list/views/contents_view.h"
14#include "ui/app_list/views/search_box_view.h"
15#include "ui/gfx/canvas.h"
16#include "ui/gfx/rect.h"
17#include "ui/gfx/skia_util.h"
18#include "ui/views/view.h"
19
20namespace {
21
22// Size of top separator between searchbox and grid view.
23const int kTopSeparatorSize = 1;
24
25// Size of bottom separator between contents view and contents switcher.
26const int kBottomSeparatorSize = 1;
27
28}  // namespace
29
30namespace app_list {
31
32AppListBackground::AppListBackground(int corner_radius,
33                                     AppListMainView* main_view)
34    : corner_radius_(corner_radius),
35      main_view_(main_view) {
36}
37
38AppListBackground::~AppListBackground() {
39}
40
41void AppListBackground::Paint(gfx::Canvas* canvas,
42                              views::View* view) const {
43  gfx::Rect bounds = view->GetContentsBounds();
44
45  canvas->Save();
46  SkPath path;
47  // Contents corner radius is 1px smaller than border corner radius.
48  SkScalar radius = SkIntToScalar(corner_radius_ - 1);
49  path.addRoundRect(gfx::RectToSkRect(bounds), radius, radius);
50  canvas->ClipPath(path, false);
51
52  SkPaint paint;
53  paint.setStyle(SkPaint::kFill_Style);
54
55  int contents_top = bounds.y();
56  views::View* search_box_view = main_view_->search_box_view();
57  if (main_view_->visible() && search_box_view->visible() &&
58      !app_list::switches::IsExperimentalAppListEnabled()) {
59    const gfx::Rect search_box_view_bounds =
60        search_box_view->ConvertRectToWidget(search_box_view->GetLocalBounds());
61    gfx::Rect search_box_rect(bounds.x(),
62                              bounds.y(),
63                              bounds.width(),
64                              search_box_view_bounds.bottom() - bounds.y());
65
66    paint.setColor(kSearchBoxBackground);
67    canvas->DrawRect(search_box_rect, paint);
68
69    gfx::Rect separator_rect(search_box_rect);
70    separator_rect.set_y(separator_rect.bottom());
71    separator_rect.set_height(kTopSeparatorSize);
72    canvas->FillRect(separator_rect, kTopSeparatorColor);
73    contents_top = separator_rect.bottom();
74  }
75
76  gfx::Rect contents_rect(bounds.x(),
77                          contents_top,
78                          bounds.width(),
79                          bounds.bottom() - contents_top);
80
81  paint.setColor(kContentsBackgroundColor);
82  canvas->DrawRect(contents_rect, paint);
83
84  if (app_list::switches::IsExperimentalAppListEnabled()) {
85    if (main_view_->visible()) {
86      views::View* contents_view = main_view_->contents_view();
87      const gfx::Rect contents_view_view_bounds =
88          contents_view->ConvertRectToWidget(contents_view->GetLocalBounds());
89      gfx::Rect separator_rect(contents_rect);
90      separator_rect.Inset(
91          kExperimentalWindowPadding + main_view_->GetInsets().left(), 0);
92      separator_rect.set_y(contents_view_view_bounds.bottom() - 1);
93      separator_rect.set_height(kBottomSeparatorSize);
94      canvas->FillRect(separator_rect, kBottomSeparatorColor);
95    }
96  }
97
98  canvas->Restore();
99}
100
101}  // namespace app_list
102