blob: 3c3a1730da1bcf77da506be13880a4a481278664 [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::Button::PressedCallback callback,
std::unique_ptr<views::ButtonControllerDelegate> delegate)
: ButtonController(button, std::move(delegate)),
callback_(std::move(callback)) {
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)
callback_.Run(event);
return pressed;
}
bool HoverButtonController::OnMousePressed(const ui::MouseEvent& event) {
DCHECK(notify_action() == views::ButtonController::NotifyAction::kOnRelease);
if (button()->GetRequestFocusOnPress())
button()->RequestFocus();
if (callback_) {
button()->ink_drop()->AnimateToState(views::InkDropState::ACTION_TRIGGERED,
ui::LocatedEvent::FromIfValid(&event));
} else {
button()->ink_drop()->AnimateToState(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()->GetState() != views::Button::STATE_DISABLED &&
delegate()->IsTriggerableEvent(event) &&
button()->HitTestPoint(event.location()) && !delegate()->InDrag()) {
if (callback_)
callback_.Run(event);
} else {
button()->ink_drop()->AnimateToState(views::InkDropState::HIDDEN, &event);
ButtonController::OnMouseReleased(event);
}
}
void HoverButtonController::OnGestureEvent(ui::GestureEvent* event) {
if (event->type() == ui::ET_GESTURE_TAP) {
button()->SetState(views::Button::STATE_NORMAL);
if (callback_)
callback_.Run(*event);
} else {
ButtonController::OnGestureEvent(event);
}
}