#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 "chromeos/constants/chromeos_features.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
#include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/animation/ink_drop.h"
#include "ui/views/controls/focus_ring.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::FocusRing::Get(this)->SetOutsetFocusRingDisabled(true);
views::FocusRing::Get(this)->SetPathGenerator(
std::make_unique<views::CircleHighlightPathGenerator>(
gfx::Insets(-views::FocusRing::kDefaultHaloInset)));
SetFocusPainter(nullptr);
GetViewAccessibility().SetRole(ax::mojom::Role::kButton);
}
ShelfButton::~ShelfButton() = default;
void ShelfButton::OnThemeChanged() {
views::Button::OnThemeChanged();
auto* ink_drop = views::InkDrop::Get(this);
ink_drop->SetBaseColor(cros_tokens::kCrosSysRippleNeutralOnSubtle);
ink_drop->SetVisibleOpacity(1.0f);
GetViewAccessibility().SetRole(ax::mojom::Role::kButton);
}
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::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());
}
BEGIN_METADATA(ShelfButton)
END_METADATA
}