blob: 0a4319899b4a8813306cd18b67703a29f56575bf [file] [log] [blame]
// Copyright 2017 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/indicator_chip_view.h"
#include "base/memory/ptr_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/fill_layout.h"
namespace app_list {
namespace {
constexpr int kIndicatorHeight = 16;
constexpr int kHorizontalPadding = 16;
constexpr int kBorderCornerRadius = 8;
constexpr SkColor kLabelColor = SkColorSetARGBMacro(0x8A, 0xFF, 0xFF, 0xFF);
constexpr SkColor kBackgroundColor =
SkColorSetARGBMacro(0x14, 0xFF, 0xFF, 0xFF);
class IndicatorBackground : public views::Background {
public:
IndicatorBackground() = default;
~IndicatorBackground() override = default;
private:
// views::Background overrides:
void Paint(gfx::Canvas* canvas, views::View* view) const override {
cc::PaintFlags flags;
flags.setStyle(cc::PaintFlags::kFill_Style);
flags.setColor(kBackgroundColor);
flags.setAntiAlias(true);
canvas->DrawRoundRect(view->GetContentsBounds(), kBorderCornerRadius,
flags);
}
DISALLOW_COPY_AND_ASSIGN(IndicatorBackground);
};
} // namespace
IndicatorChipView::IndicatorChipView(const base::string16& text) {
SetPaintToLayer();
layer()->SetFillsBoundsOpaquely(false);
container_ = new views::View();
container_->set_can_process_events_within_subtree(false);
AddChildView(container_);
container_->SetBackground(base::MakeUnique<IndicatorBackground>());
label_ = new views::Label(text);
const gfx::FontList& small_font =
ui::ResourceBundle::GetSharedInstance().GetFontList(
ui::ResourceBundle::SmallFont);
label_->SetFontList(small_font.DeriveWithSizeDelta(-2));
label_->SetEnabledColor(kLabelColor);
label_->SetAutoColorReadabilityEnabled(false);
label_->SetBackgroundColor(kBackgroundColor);
label_->SetHandlesTooltips(false);
label_->SetHorizontalAlignment(gfx::ALIGN_CENTER);
container_->AddChildView(label_);
}
IndicatorChipView::~IndicatorChipView() = default;
gfx::Rect IndicatorChipView::GetLabelBoundsInScreen() const {
return label_ ? label_->GetBoundsInScreen() : gfx::Rect();
}
gfx::Size IndicatorChipView::CalculatePreferredSize() const {
const int label_width = label_->GetPreferredSize().width();
return gfx::Size(label_width + 2 * kHorizontalPadding, kIndicatorHeight);
}
void IndicatorChipView::Layout() {
const int label_width = label_->GetPreferredSize().width();
container_->SetSize(
gfx::Size(label_width + 2 * kHorizontalPadding, kIndicatorHeight));
label_->SetBoundsRect(container_->GetContentsBounds());
}
} // namespace app_list