blob: 999c003b0a6e640271370fec13c2e3c5f17fe5a7 [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 "chrome/browser/ui/views/hover_button_controller.h"
#include "chrome/browser/ui/views/controls/hover_button.h"
#include "ui/views/animation/ink_drop.h"
#include "ui/views/controls/button/button_controller_delegate.h"
#include "ui/views/mouse_constants.h"
#include "ui/views/widget/root_view.h"
#include "ui/views/widget/widget.h"
HoverButtonController::HoverButtonController(
HoverButton* button,
std::unique_ptr<views::ButtonControllerDelegate> delegate)
: ButtonController(button, std::move(delegate)) {
set_notify_action(views::ButtonController::NotifyAction::kOnRelease);
}
HoverButtonController::~HoverButtonController() = default;
bool HoverButtonController::OnKeyPressed(const ui::KeyEvent& event) {
const bool pressed = callback() && ((event.key_code() == ui::VKEY_SPACE) ||
(event.key_code() == ui::VKEY_RETURN));
if (pressed) {
delegate()->NotifyClick(event);
}
return pressed;
}
bool HoverButtonController::OnMousePressed(const ui::MouseEvent& event) {
DCHECK(notify_action() == views::ButtonController::NotifyAction::kOnRelease);
if (button()->GetRequestFocusOnPress()) {
button()->RequestFocus();
}
if (callback()) {
views::InkDrop::Get(button())->AnimateToState(
views::InkDropState::ACTION_PENDING,
ui::LocatedEvent::FromIfValid(&event));
} else {
views::InkDrop::Get(button())->AnimateToState(
views::InkDropState::HIDDEN, ui::LocatedEvent::FromIfValid(&event));
}
return true;
}
void HoverButtonController::OnMouseReleased(const ui::MouseEvent& event) {
DCHECK(notify_action() == views::ButtonController::NotifyAction::kOnRelease);
views::InkDrop::Get(button())->AnimateToState(views::InkDropState::HIDDEN,
&event);
if (button()->GetState() != views::Button::STATE_DISABLED &&
delegate()->IsTriggerableEvent(event) &&
button()->HitTestPoint(event.location()) && !delegate()->InDrag()) {
if (callback()) {
delegate()->NotifyClick(event);
}
} else {
ButtonController::OnMouseReleased(event);
}
}
void HoverButtonController::OnGestureEvent(ui::GestureEvent* event) {
if (event->type() == ui::EventType::kGestureTap) {
button()->SetState(views::Button::STATE_NORMAL);
if (callback()) {
delegate()->NotifyClick(*event);
}
} else {
ButtonController::OnGestureEvent(event);
}
}
views::Button::PressedCallback& HoverButtonController::callback() {
// `this` is only constructible with a `HoverButton*`, so this downcast is
// safe.
return static_cast<HoverButton*>(button())->callback({});
}