#include "ash/shelf/shelf_button.h"
#include "ash/constants/ash_constants.h"
#include "ash/shelf/shelf.h"
#include "ash/shelf/shelf_button_delegate.h"
#include "ash/style/style_util.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/views/animation/ink_drop.h"
#include "ui/views/controls/highlight_path_generator.h"
namespace ash {
ShelfButton::ShelfButton(Shelf* shelf,
ShelfButtonDelegate* shelf_button_delegate)
: Button(Button::PressedCallback()),
shelf_(shelf),
shelf_button_delegate_(shelf_button_delegate) {
DCHECK(shelf_button_delegate_);
SetHideInkDropWhenShowingContextMenu(false);
SetFocusBehavior(FocusBehavior::ALWAYS);
views::InkDrop::Get(this)->SetMode(
views::InkDropHost::InkDropMode::ON_NO_GESTURE_HANDLER);
views::FocusRing::Get(this)->SetPathGenerator(
std::make_unique<views::CircleHighlightPathGenerator>(
gfx::Insets(-views::FocusRing::kDefaultHaloInset)));
SetFocusPainter(nullptr);
views::InkDrop::UseInkDropForSquareRipple(views::InkDrop::Get(this),
false);
}
ShelfButton::~ShelfButton() = default;
void ShelfButton::OnThemeChanged() {
views::Button::OnThemeChanged();
StyleUtil::ConfigureInkDropAttributes(
this, StyleUtil::kBaseColor | StyleUtil::kInkDropOpacity);
}
const char* ShelfButton::GetClassName() const {
return "ash/ShelfButton";
}
gfx::Rect ShelfButton::GetAnchorBoundsInScreen() const {
gfx::Rect bounds = Button::GetAnchorBoundsInScreen();
constexpr int kAnchorOffset = 6;
bounds.Inset(gfx::Insets(-kAnchorOffset));
return bounds;
}
void ShelfButton::AboutToRequestFocusFromTabTraversal(bool reverse) {
shelf_button_delegate_->OnShelfButtonAboutToRequestFocusFromTabTraversal(
this, reverse);
}
void ShelfButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->role = ax::mojom::Role::kButton;
}
void ShelfButton::NotifyClick(const ui::Event& event) {
if (!shelf_->IsVisible())
return;
Button::NotifyClick(event);
if (shelf_button_delegate_)
shelf_button_delegate_->ButtonPressed(
this, event, views::InkDrop::Get(this)->GetInkDrop());
}
}