aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleDraw.cpp
diff options
context:
space:
mode:
authorGravatar mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-03-21 00:53:39 +0000
committerGravatar mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-03-21 00:53:39 +0000
commitdd0cd34067d103ace7c6739405cb7885d8ad3fb2 (patch)
tree24a05e759baa0cb06f96a6ad05aa56ba49f590c2 /samplecode/SampleDraw.cpp
parentb7d956df4665e06f3ae98cb696cef7c04452ab8e (diff)
allow window-subclass to handle dispatching click events (for resize)
add drag tracking to Draw git-svn-id: http://skia.googlecode.com/svn/trunk@967 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleDraw.cpp')
-rw-r--r--samplecode/SampleDraw.cpp123
1 files changed, 116 insertions, 7 deletions
diff --git a/samplecode/SampleDraw.cpp b/samplecode/SampleDraw.cpp
index d7e8dce4a3..776d6daa4d 100644
--- a/samplecode/SampleDraw.cpp
+++ b/samplecode/SampleDraw.cpp
@@ -6,12 +6,76 @@
class Draw : public SkRefCnt {
public:
+ Draw() : fFlags(0) {}
+
+ enum Flags {
+ kSelected_Flag = 1 << 0
+ };
+ int getFlags() const { return fFlags; }
+ void setFlags(int flags);
+
+ bool isSelected() const { return SkToBool(fFlags & kSelected_Flag); }
+ void setSelected(bool pred) {
+ if (pred) {
+ fFlags |= kSelected_Flag;
+ } else {
+ fFlags &= ~kSelected_Flag;
+ }
+ }
+
void draw(SkCanvas* canvas) {
+ int sc = canvas->save();
this->onDraw(canvas);
+ canvas->restoreToCount(sc);
+
+ if (this->isSelected()) {
+ this->drawSelection(canvas);
+ }
+ }
+
+ void drawSelection(SkCanvas* canvas) {
+ int sc = canvas->save();
+ this->onDrawSelection(canvas);
+ canvas->restoreToCount(sc);
+ }
+
+ void getBounds(SkRect* bounds) {
+ this->onGetBounds(bounds);
+ }
+
+ bool hitTest(SkScalar x, SkScalar y) {
+ return this->onHitTest(x, y);
+ }
+
+ void offset(SkScalar dx, SkScalar dy) {
+ if (dx || dy) {
+ this->onOffset(dx, dy);
+ }
}
protected:
virtual void onDraw(SkCanvas*) = 0;
+ virtual void onGetBounds(SkRect*) = 0;
+ virtual void onOffset(SkScalar dx, SkScalar dy) = 0;
+ virtual void onDrawSelection(SkCanvas* canvas) {
+ SkRect r;
+ this->getBounds(&r);
+ SkPaint paint;
+ SkPoint pts[4];
+ r.toQuad(pts);
+ paint.setStrokeWidth(SkIntToScalar(10));
+ paint.setColor(0x80FF8844);
+ paint.setStrokeCap(SkPaint::kRound_Cap);
+ canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, pts, paint);
+ }
+ virtual bool onHitTest(SkScalar x, SkScalar y) {
+ SkRect bounds;
+ this->getBounds(&bounds);
+ return bounds.contains(x, y);
+ }
+
+private:
+ int fFlags;
};
class RDraw : public Draw {
@@ -55,6 +119,14 @@ protected:
}
}
+ virtual void onGetBounds(SkRect* bounds) {
+ *bounds = fRect;
+ }
+
+ virtual void onOffset(SkScalar dx, SkScalar dy) {
+ fRect.offset(dx, dy);
+ }
+
private:
SkRect fRect;
SkPaint fPaint;
@@ -117,6 +189,17 @@ public:
return (SkColor)fRand.nextU() | 0xFF000000;
}
+ Draw* hitTestList(SkScalar x, SkScalar y) const {
+ Draw** first = fList.begin();
+ for (Draw** iter = fList.end(); iter > first;) {
+ --iter;
+ if ((*iter)->hitTest(x, y)) {
+ return *iter;
+ }
+ }
+ return NULL;
+ }
+
protected:
// overrides from SkEventSink
virtual bool onQuery(SkEvent* evt) {
@@ -135,9 +218,7 @@ protected:
virtual void onDraw(SkCanvas* canvas) {
this->drawBG(canvas);
- Draw** iter = fList.begin();
- Draw** stop = fList.end();
- for (; iter < stop; iter++) {
+ for (Draw** iter = fList.begin(); iter < fList.end(); iter++) {
(*iter)->draw(canvas);
}
if (fDraw) {
@@ -146,13 +227,31 @@ protected:
}
virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
- return new Click(this);
+ for (Draw** iter = fList.begin(); iter < fList.end(); iter++) {
+ (*iter)->setSelected(false);
+ }
+
+ Click* c = new Click(this);
+ Draw* d = this->hitTestList(x, y);
+ if (d) {
+ d->setSelected(true);
+ c->setType("dragger");
+ } else {
+ c->setType("maker");
+ }
+ return c;
}
virtual bool onClick(Click* click) {
if (Click::kUp_State == click->fState) {
- *fList.append() = fDraw;
- fDraw = NULL;
+ if (click->isType("maker")) {
+ if (SkPoint::Distance(click->fOrig, click->fCurr) > SkIntToScalar(3)) {
+ *fList.append() = fDraw;
+ } else {
+ fDraw->unref();
+ }
+ fDraw = NULL;
+ }
return true;
}
@@ -161,7 +260,17 @@ protected:
p.setColor(this->randColor());
fFactory->setPaint(p);
}
- this->setDraw(fFactory->create(click->fOrig, click->fCurr))->unref();
+
+ if (click->isType("maker")) {
+ this->setDraw(fFactory->create(click->fOrig, click->fCurr))->unref();
+ } else if (click->isType("dragger")) {
+ for (Draw** iter = fList.begin(); iter < fList.end(); iter++) {
+ if ((*iter)->isSelected()) {
+ (*iter)->offset(click->fCurr.x() - click->fPrev.x(),
+ click->fCurr.y() - click->fPrev.y());
+ }
+ }
+ }
this->inval(NULL);
return true;
}