blob: 0c37097043f8ece05f28746735f3c3dbdbb1d694 [file] [log] [blame]
// Copyright 2018 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 "ash/shelf/shelf_control_button.h"
#include "ash/public/cpp/ash_constants.h"
#include "ash/public/cpp/shelf_config.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/shelf/shelf_button_delegate.h"
#include "ash/system/tray/tray_popup_utils.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
#include "ui/views/animation/ink_drop_impl.h"
#include "ui/views/animation/ink_drop_mask.h"
#include "ui/views/controls/highlight_path_generator.h"
#include "ui/views/widget/widget.h"
namespace ash {
namespace {
class ShelfControlButtonHighlightPathGenerator
: public views::HighlightPathGenerator {
public:
ShelfControlButtonHighlightPathGenerator() = default;
// views::HighlightPathGenerator:
SkPath GetHighlightPath(const views::View* view) override {
const int border_radius = ShelfConfig::Get()->control_border_radius();
// Some control buttons have a slightly larger size to fill the shelf and
// maximize the click target, but we still want their "visual" size to be
// the same, so we find the center point and draw a square around that.
const gfx::Point center = view->GetLocalBounds().CenterPoint();
const int half_size = ShelfConfig::Get()->control_size() / 2;
const gfx::Rect visual_size(center.x() - half_size, center.y() - half_size,
ShelfConfig::Get()->control_size(),
ShelfConfig::Get()->control_size());
return SkPath().addRoundRect(gfx::RectToSkRect(visual_size), border_radius,
border_radius);
}
private:
DISALLOW_COPY_AND_ASSIGN(ShelfControlButtonHighlightPathGenerator);
};
} // namespace
ShelfControlButton::ShelfControlButton(
Shelf* shelf,
ShelfButtonDelegate* shelf_button_delegate)
: ShelfButton(shelf, shelf_button_delegate) {
set_has_ink_drop_action_on_click(true);
SetInstallFocusRingOnFocus(true);
views::HighlightPathGenerator::Install(
this, std::make_unique<ShelfControlButtonHighlightPathGenerator>());
focus_ring()->SetColor(ShelfConfig::Get()->shelf_focus_border_color());
SetFocusPainter(nullptr);
SetPaintToLayer();
layer()->SetFillsBoundsOpaquely(false);
}
ShelfControlButton::~ShelfControlButton() = default;
gfx::Point ShelfControlButton::GetCenterPoint() const {
return GetLocalBounds().CenterPoint();
}
std::unique_ptr<views::InkDropRipple> ShelfControlButton::CreateInkDropRipple()
const {
const int button_radius = ShelfConfig::Get()->control_border_radius();
gfx::Point center = GetCenterPoint();
gfx::Rect bounds(center.x() - button_radius, center.y() - button_radius,
2 * button_radius, 2 * button_radius);
return std::make_unique<views::FloodFillInkDropRipple>(
size(), GetLocalBounds().InsetsFrom(bounds),
GetInkDropCenterBasedOnLastEvent(), GetInkDropBaseColor(),
ink_drop_visible_opacity());
}
std::unique_ptr<views::InkDropMask> ShelfControlButton::CreateInkDropMask()
const {
return std::make_unique<views::CircleInkDropMask>(
size(), GetCenterPoint(), ShelfConfig::Get()->control_border_radius());
}
const char* ShelfControlButton::GetClassName() const {
return "ash/ShelfControlButton";
}
gfx::Size ShelfControlButton::CalculatePreferredSize() const {
return gfx::Size(ShelfConfig::Get()->control_size(),
ShelfConfig::Get()->control_size());
}
void ShelfControlButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
ShelfButton::GetAccessibleNodeData(node_data);
node_data->SetName(GetAccessibleName());
}
void ShelfControlButton::PaintButtonContents(gfx::Canvas* canvas) {
PaintBackground(canvas, GetContentsBounds());
}
void ShelfControlButton::PaintBackground(gfx::Canvas* canvas,
const gfx::Rect& bounds) {
cc::PaintFlags flags;
flags.setAntiAlias(true);
flags.setColor(
ShelfConfig::Get()->shelf_control_permanent_highlight_background());
canvas->DrawRoundRect(bounds, ShelfConfig::Get()->control_border_radius(),
flags);
}
} // namespace ash