blob: 0f648a32c717cc2ad8bf6edab7b01586ea219706 [file] [log] [blame]
/*
* Copyright 2022 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef ClickHandlerSlide_DEFINED
#define ClickHandlerSlide_DEFINED
#include "tools/SkMetaData.h"
#include "tools/viewer/Slide.h"
#include "include/core/SkPoint.h"
#include <functional>
/**
* Provides a higher level abstraction for click handling than the Slide base class. A Click object
* is is used to track the state of the mouse over time.
*/
class ClickHandlerSlide : public Slide {
public:
// Click handling
class Click {
public:
Click() {}
Click(std::function<bool(Click*)> f) : fFunc(std::move(f)), fHasFunc(true) {}
virtual ~Click() = default;
SkPoint fOrig = {0, 0};
SkPoint fPrev = {0, 0};
SkPoint fCurr = {0, 0};
skui::InputState fState = skui::InputState::kDown;
skui::ModifierKey fModifierKeys = skui::ModifierKey::kNone;
SkMetaData fMeta;
std::function<bool(Click*)> fFunc;
bool fHasFunc = false;
};
bool onMouse(SkScalar x, SkScalar y,
skui::InputState clickState,
skui::ModifierKey modifierKeys) final;
protected:
/**
* Return a Click object to handle the click. onClick will be called repeatedly with the latest
* mouse state tracked on the Click object until it returns false.
*/
virtual Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) = 0;
/** Override to track clicks. Return true as long as you want to track the pen/mouse. */
virtual bool onClick(Click*) = 0;
private:
std::unique_ptr<Click> fClick;
};
#endif