#ifndef UI_VIEWS_ANIMATION_INK_DROP_EVENT_HANDLER_H_
#define UI_VIEWS_ANIMATION_INK_DROP_EVENT_HANDLER_H_
#include <memory>
#include <string_view>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "ui/events/event_handler.h"
#include "ui/views/view.h"
#include "ui/views/view_observer.h"
#include "ui/views/views_export.h"
#include "ui/views/widget/widget_observer.h"
namespace ui {
class LocatedEvent;
class ScopedTargetHandler;
}
namespace views {
class InkDrop;
enum class InkDropState;
struct ViewHierarchyChangedDetails;
class VIEWS_EXPORT InkDropEventHandler : public ui::EventHandler,
public ViewObserver,
public WidgetObserver {
public:
class Delegate {
public:
virtual InkDrop* GetInkDrop() = 0;
virtual bool HasInkDrop() const = 0;
virtual bool SupportsGestureEvents() const = 0;
};
InkDropEventHandler(View* host_view, Delegate* delegate);
InkDropEventHandler(const InkDropEventHandler&) = delete;
InkDropEventHandler& operator=(const InkDropEventHandler&) = delete;
~InkDropEventHandler() override;
void AnimateToState(InkDropState state, const ui::LocatedEvent* event);
ui::LocatedEvent* GetLastRippleTriggeringEvent() const;
private:
void OnGestureEvent(ui::GestureEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
std::string_view GetLogContext() const override;
void OnViewVisibilityChanged(View* observed_view,
View* starting_view,
bool visible) override;
void OnViewHierarchyChanged(
View* observed_view,
const ViewHierarchyChangedDetails& details) override;
void OnViewBoundsChanged(View* observed_view) override;
void OnViewFocused(View* observed_view) override;
void OnViewBlurred(View* observed_view) override;
void OnViewThemeChanged(View* observed_view) override;
void OnViewAddedToWidget(View* observed_view) override;
void OnViewRemovedFromWidget(View* observed_view) override;
void OnWidgetDestroying(Widget* widget) override;
private:
void CleanupInkDrop();
std::unique_ptr<ui::ScopedTargetHandler> target_handler_;
const raw_ptr<View> host_view_;
const raw_ptr<Delegate> delegate_;
std::unique_ptr<ui::LocatedEvent> last_ripple_triggering_event_;
base::ScopedObservation<View, ViewObserver> view_observation_{this};
base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
};
}
#endif