add std::function option to Click to simplify callsites

More sites to update, but can happen later

Change-Id: I75e8b60050c6af2a1563057f7fe9da84bc017370
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/284876
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/samplecode/Sample.cpp b/samplecode/Sample.cpp
index d3821f1..9fa836b 100644
--- a/samplecode/Sample.cpp
+++ b/samplecode/Sample.cpp
@@ -62,6 +62,10 @@
 ////////////////////////////////////////////////////////////////////////////
 
 bool Sample::mouse(SkPoint point, skui::InputState clickState, skui::ModifierKey modifierKeys) {
+    auto dispatch = [this](Click* c) {
+        return c->fHasFunc ? c->fFunc(c) : this->onClick(c);
+    };
+
     switch (clickState) {
         case skui::InputState::kDown:
             fClick = nullptr;
@@ -72,7 +76,7 @@
             fClick->fPrev = fClick->fCurr = fClick->fOrig = point;
             fClick->fState = skui::InputState::kDown;
             fClick->fModifierKeys = modifierKeys;
-            this->onClick(fClick.get());
+            dispatch(fClick.get());
             return true;
         case skui::InputState::kMove:
             if (fClick) {
@@ -80,7 +84,7 @@
                 fClick->fCurr = point;
                 fClick->fState = skui::InputState::kMove;
                 fClick->fModifierKeys = modifierKeys;
-                return this->onClick(fClick.get());
+                return dispatch(fClick.get());
             }
             return false;
         case skui::InputState::kUp:
@@ -89,7 +93,7 @@
                 fClick->fCurr = point;
                 fClick->fState = skui::InputState::kUp;
                 fClick->fModifierKeys = modifierKeys;
-                bool result = this->onClick(fClick.get());
+                bool result = dispatch(fClick.get());
                 fClick = nullptr;
                 return result;
             }
diff --git a/samplecode/Sample.h b/samplecode/Sample.h
index d6ccf48..f1026bd 100644
--- a/samplecode/Sample.h
+++ b/samplecode/Sample.h
@@ -18,6 +18,8 @@
 #include "tools/skui/InputState.h"
 #include "tools/skui/ModifierKey.h"
 
+#include <functional>
+
 class SkCanvas;
 class Sample;
 
@@ -55,13 +57,19 @@
     // Click handling
     class Click {
     public:
+        Click() {}
+        Click(std::function<bool(Click*)> f) : fFunc(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 mouse(SkPoint point, skui::InputState clickState, skui::ModifierKey modifierKeys);
 
diff --git a/samplecode/SampleClip.cpp b/samplecode/SampleClip.cpp
index a7c8e78..74af4ae 100644
--- a/samplecode/SampleClip.cpp
+++ b/samplecode/SampleClip.cpp
@@ -619,22 +619,15 @@
         const float tol = 15;
         for (int i = 0; i < 12; ++i) {
             if (dist({x,y}, fPatch[i]) <= tol) {
-                Click* c = new Click;
-                c->fMeta.setS32("index", i);
-                return c;
+                return new Click([this, i](Click* c) {
+                    fPatch[i] = c->fCurr;
+                    return true;
+                });
             }
         }
         return nullptr;
     }
 
-    bool onClick(Click* click) override {
-        int32_t index;
-        SkAssertResult(click->fMeta.findS32("index", &index));
-        SkASSERT(index >= 0 && index < 12);
-        fPatch[index] = click->fCurr;
-        return true;
-    }
-
     bool onChar(SkUnichar uni) override {
         switch (uni) {
             case 'h': fShowHandles = !fShowHandles; return true;
diff --git a/samplecode/SamplePath.cpp b/samplecode/SamplePath.cpp
index 478f6a0..74daa1b 100644
--- a/samplecode/SamplePath.cpp
+++ b/samplecode/SamplePath.cpp
@@ -279,24 +279,15 @@
         canvas->drawPath(path, fSkeletonPaint);
     }
 
-    bool onClick(Click* click) override {
-        int32_t index;
-        if (click->fMeta.findS32("index", &index)) {
-            SkASSERT((unsigned)index < N);
-            fPts[index] = click->fCurr;
-            return true;
-        }
-        return false;
-    }
-
     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         const SkScalar tol = 4;
         const SkRect r = SkRect::MakeXYWH(x - tol, y - tol, tol * 2, tol * 2);
         for (int i = 0; i < N; ++i) {
             if (r.intersects(SkRect::MakeXYWH(fPts[i].fX, fPts[i].fY, 1, 1))) {
-                Click* click = new Click();
-                click->fMeta.setS32("index", i);
-                return click;
+                return new Click([this, i](Click* c) {
+                    fPts[i] = c->fCurr;
+                    return true;
+                });
             }
         }
         return nullptr;
@@ -407,24 +398,15 @@
         canvas->drawPoints(SkCanvas::kPoints_PointMode, N, fPts, fPtsPaint);
     }
 
-    bool onClick(Click* click) override {
-        int32_t index;
-        if (click->fMeta.findS32("index", &index)) {
-            SkASSERT((unsigned)index < N);
-            fPts[index] = click->fCurr;
-            return true;
-        }
-        return false;
-    }
-
     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         const SkScalar tol = 4;
         const SkRect r = SkRect::MakeXYWH(x - tol, y - tol, tol * 2, tol * 2);
         for (int i = 0; i < N; ++i) {
             if (r.intersects(SkRect::MakeXYWH(fPts[i].fX, fPts[i].fY, 1, 1))) {
-                Click* click = new Click();
-                click->fMeta.setS32("index", i);
-                return click;
+                return new Click([this, i](Click* c) {
+                    fPts[i] = c->fCurr;
+                    return true;
+                });
             }
         }
         return nullptr;
@@ -524,24 +506,15 @@
         }
     }
 
-    bool onClick(Click* click) override {
-        int32_t index;
-        if (click->fMeta.findS32("index", &index)) {
-            SkASSERT((unsigned)index < N);
-            fPts[index] = click->fCurr;
-            return true;
-        }
-        return false;
-    }
-
     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         const SkScalar tol = 8;
         const SkRect r = SkRect::MakeXYWH(x - tol, y - tol, tol * 2, tol * 2);
         for (int i = 0; i < N; ++i) {
             if (r.intersects(SkRect::MakeXYWH(fPts[i].fX, fPts[i].fY, 1, 1))) {
-                Click* click = new Click();
-                click->fMeta.setS32("index", i);
-                return click;
+                return new Click([this, i](Click* c) {
+                    fPts[i] = c->fCurr;
+                    return true;
+                });
             }
         }
         return this->INHERITED::onFindClickHandler(x, y, modi);
@@ -720,24 +693,15 @@
 
     }
 
-    bool onClick(Click* click) override {
-        int32_t index;
-        if (click->fMeta.findS32("index", &index)) {
-            SkASSERT((unsigned)index < N);
-            fPts[index] = click->fCurr;
-            return true;
-        }
-        return false;
-    }
-
     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         const SkScalar tol = 8;
         const SkRect r = SkRect::MakeXYWH(x - tol, y - tol, tol * 2, tol * 2);
         for (int i = 0; i < N; ++i) {
             if (r.intersects(SkRect::MakeXYWH(fPts[i].fX, fPts[i].fY, 1, 1))) {
-                Click* click = new Click();
-                click->fMeta.setS32("index", i);
-                return click;
+                return new Click([this, i](Click* c) {
+                    fPts[i] = c->fCurr;
+                    return true;
+                });
             }
         }
         return this->INHERITED::onFindClickHandler(x, y, modi);
diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp
index c7852ab..daf5bb3 100644
--- a/samplecode/SamplePathClip.cpp
+++ b/samplecode/SamplePathClip.cpp
@@ -53,12 +53,10 @@
     }
 
     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override {
-        return new Click();
-    }
-
-    bool onClick(Click* click) override {
-        fCenter.set(click->fCurr.fX, click->fCurr.fY);
-        return false;
+        return new Click([&](Click* c) {
+            fCenter = c->fCurr;
+            return false;
+        });
     }
 
 private: