diff options
author | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-03-21 00:53:39 +0000 |
---|---|---|
committer | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-03-21 00:53:39 +0000 |
commit | dd0cd34067d103ace7c6739405cb7885d8ad3fb2 (patch) | |
tree | 24a05e759baa0cb06f96a6ad05aa56ba49f590c2 /samplecode/SampleDraw.cpp | |
parent | b7d956df4665e06f3ae98cb696cef7c04452ab8e (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.cpp | 123 |
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; } |