blob: ad608327b18182641b808f52f82f22651239243e [file] [log] [blame]
// Copyright 2016 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 "ui/views/animation/ink_drop.h"
#include <memory>
#include <utility>
#include "base/bind.h"
#include "base/callback.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/compositor/layer.h"
#include "ui/views/animation/ink_drop_host_view.h"
#include "ui/views/animation/ink_drop_impl.h"
#include "ui/views/animation/ink_drop_observer.h"
DEFINE_UI_CLASS_PROPERTY_TYPE(views::InkDropHost*)
namespace views {
namespace {
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(InkDropHost, kInkDropKey, nullptr)
// TODO(pbos): Remove this by changing the constructor parameters to
// InkDropImpl.
std::unique_ptr<InkDrop> CreateInkDropImpl(
InkDropHost* host,
InkDropImpl::AutoHighlightMode auto_highlight_mode,
bool highlight_on_hover,
bool highlight_on_focus) {
auto ink_drop = std::make_unique<InkDropImpl>(host, host->host_view()->size(),
auto_highlight_mode);
ink_drop->SetShowHighlightOnHover(highlight_on_hover);
ink_drop->SetShowHighlightOnFocus(highlight_on_focus);
return ink_drop;
}
} // namespace
InkDrop::~InkDrop() = default;
void InkDrop::Install(View* host, std::unique_ptr<InkDropHost> ink_drop) {
host->SetProperty(kInkDropKey, std::move(ink_drop));
}
void InkDrop::Remove(View* host) {
host->ClearProperty(kInkDropKey);
}
const InkDropHost* InkDrop::Get(const View* host) {
return host->GetProperty(kInkDropKey);
}
std::unique_ptr<InkDrop> InkDrop::CreateInkDropForSquareRipple(
InkDropHost* host,
bool highlight_on_hover,
bool highlight_on_focus) {
return CreateInkDropImpl(host, InkDropImpl::AutoHighlightMode::HIDE_ON_RIPPLE,
highlight_on_hover, highlight_on_focus);
}
void InkDrop::UseInkDropForSquareRipple(InkDropHost* host,
bool highlight_on_hover,
bool highlight_on_focus) {
host->SetCreateInkDropCallback(
base::BindRepeating(&InkDrop::CreateInkDropForSquareRipple, host,
highlight_on_hover, highlight_on_focus));
}
std::unique_ptr<InkDrop> InkDrop::CreateInkDropForFloodFillRipple(
InkDropHost* host,
bool highlight_on_hover,
bool highlight_on_focus) {
return CreateInkDropImpl(host, InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE,
highlight_on_hover, highlight_on_focus);
}
void InkDrop::UseInkDropForFloodFillRipple(InkDropHost* host,
bool highlight_on_hover,
bool highlight_on_focus) {
host->SetCreateInkDropCallback(
base::BindRepeating(&InkDrop::CreateInkDropForFloodFillRipple, host,
highlight_on_hover, highlight_on_focus));
}
std::unique_ptr<InkDrop> InkDrop::CreateInkDropWithoutAutoHighlight(
InkDropHost* host,
bool highlight_on_hover,
bool highlight_on_focus) {
return CreateInkDropImpl(host, InkDropImpl::AutoHighlightMode::NONE,
highlight_on_hover, highlight_on_focus);
}
void InkDrop::UseInkDropWithoutAutoHighlight(InkDropHost* host,
bool highlight_on_hover,
bool highlight_on_focus) {
host->SetCreateInkDropCallback(
base::BindRepeating(&InkDrop::CreateInkDropWithoutAutoHighlight, host,
highlight_on_hover, highlight_on_focus));
}
void InkDrop::AddObserver(InkDropObserver* observer) {
CHECK(observer);
observers_.AddObserver(observer);
}
void InkDrop::RemoveObserver(InkDropObserver* observer) {
CHECK(observer);
observers_.RemoveObserver(observer);
}
InkDrop::InkDrop() = default;
void InkDrop::NotifyInkDropAnimationStarted() {
for (InkDropObserver& observer : observers_)
observer.InkDropAnimationStarted();
}
void InkDrop::NotifyInkDropRippleAnimationEnded(InkDropState ink_drop_state) {
for (InkDropObserver& observer : observers_)
observer.InkDropRippleAnimationEnded(ink_drop_state);
}
InkDropContainerView::InkDropContainerView() {
// Ensure the container View is found as the EventTarget instead of this.
SetCanProcessEventsWithinSubtree(false);
}
BEGIN_METADATA(InkDropContainerView, views::View)
END_METADATA
} // namespace views