blob: 860b65ecb467ddb9f5f974471d9fb75ce70c3231 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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);
// Inset focus ring path to avoid clipping the edges of the ring.
views::FocusRing::Get(this)->SetPathGenerator(
std::make_unique<views::CircleHighlightPathGenerator>(
gfx::Insets(-views::FocusRing::kDefaultHaloInset)));
SetFocusPainter(nullptr);
views::InkDrop::UseInkDropForSquareRipple(views::InkDrop::Get(this),
/*highlight_on_hover=*/false);
}
ShelfButton::~ShelfButton() = default;
////////////////////////////////////////////////////////////////////////////////
// views::View
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();
// Padding used to position bubbles offset from the shelf. Note that this
// includes Shelf tooltip.
constexpr int kAnchorOffset = 6;
bounds.Inset(gfx::Insets(-kAnchorOffset));
return bounds;
}
void ShelfButton::AboutToRequestFocusFromTabTraversal(bool reverse) {
shelf_button_delegate_->OnShelfButtonAboutToRequestFocusFromTabTraversal(
this, reverse);
}
// Do not remove this function to avoid unnecessary ChromeVox announcement
// triggered by Button::GetAccessibleNodeData. (See https://crbug.com/932200)
void ShelfButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->role = ax::mojom::Role::kButton;
}
////////////////////////////////////////////////////////////////////////////////
// views::Button
void ShelfButton::NotifyClick(const ui::Event& event) {
// Pressing a shelf button in the auto-hide shelf should not do anything.
// The event can still be received by the auto-hide shelf since we reserved
// a portion of the auto-hide shelf within the screen bounds.
if (!shelf_->IsVisible())
return;
Button::NotifyClick(event);
if (shelf_button_delegate_)
shelf_button_delegate_->ButtonPressed(
/*sender=*/this, event, views::InkDrop::Get(this)->GetInkDrop());
}
} // namespace ash