blob: 3b971b285883393f1ddd2f6780b004c996d809f1 [file] [log] [blame]
// Copyright 2019 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 "chrome/browser/ui/views/hover_button_controller.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(
views::Button* button,
views::ButtonListener* listener,
std::unique_ptr<views::ButtonControllerDelegate> delegate)
: ButtonController(button, std::move(delegate)), listener_(listener) {
set_notify_action(views::ButtonController::NotifyAction::kOnRelease);
}
HoverButtonController::~HoverButtonController() = default;
bool HoverButtonController::OnKeyPressed(const ui::KeyEvent& event) {
if (!listener_)
return false;
switch (event.key_code()) {
case ui::VKEY_SPACE:
case ui::VKEY_RETURN:
listener_->ButtonPressed(button(), event);
return true;
default:
break;
}
return false;
}
bool HoverButtonController::OnMousePressed(const ui::MouseEvent& event) {
DCHECK(notify_action() == views::ButtonController::NotifyAction::kOnRelease);
if (button()->request_focus_on_press())
button()->RequestFocus();
if (listener_) {
button()->AnimateInkDrop(views::InkDropState::ACTION_TRIGGERED,
ui::LocatedEvent::FromIfValid(&event));
} else {
button()->AnimateInkDrop(views::InkDropState::HIDDEN,
ui::LocatedEvent::FromIfValid(&event));
}
return true;
}
void HoverButtonController::OnMouseReleased(const ui::MouseEvent& event) {
DCHECK(notify_action() == views::ButtonController::NotifyAction::kOnRelease);
if (button()->state() != views::Button::STATE_DISABLED &&
delegate()->IsTriggerableEvent(event) &&
button()->HitTestPoint(event.location()) && !delegate()->InDrag()) {
if (listener_)
listener_->ButtonPressed(button(), event);
} else {
button()->AnimateInkDrop(views::InkDropState::HIDDEN, &event);
ButtonController::OnMouseReleased(event);
}
}
void HoverButtonController::OnGestureEvent(ui::GestureEvent* event) {
if (event->type() == ui::ET_GESTURE_TAP) {
if (listener_)
listener_->ButtonPressed(button(), *event);
button()->SetState(views::Button::STATE_NORMAL);
} else {
ButtonController::OnGestureEvent(event);
}
}