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: