diff options
author | 2015-02-03 15:02:24 -0800 | |
---|---|---|
committer | 2015-02-03 15:02:24 -0800 | |
commit | bf015c34e4c36467dfef385893f375b68718450e (patch) | |
tree | b26711b4d5c91b5dd89fc2dc8b22c6b7a0bac64c /samplecode/OverView.cpp | |
parent | 7b274c78fbeefa3818af68099545f2839c854847 (diff) |
add textual overview
BUG=skia:
Review URL: https://codereview.chromium.org/898573002
Diffstat (limited to 'samplecode/OverView.cpp')
-rw-r--r-- | samplecode/OverView.cpp | 140 |
1 files changed, 100 insertions, 40 deletions
diff --git a/samplecode/OverView.cpp b/samplecode/OverView.cpp index 5346c1a18c..bbf647ae68 100644 --- a/samplecode/OverView.cpp +++ b/samplecode/OverView.cpp @@ -6,24 +6,48 @@ */ #include "OverView.h" - #include "SampleCode.h" - #include "SkCanvas.h" #include "SkView.h" -static const int N = 8; -static const SkScalar kWidth = SkIntToScalar(640); -static const SkScalar kHeight = SkIntToScalar(480); static const char gIsOverview[] = "is-overview"; +static int to_lower(int c) { + if ('A' <= c && c <= 'Z') { + c = c - 'A' + 'a'; + } + return c; +} + +static void make_lc(SkString* str) { + char* ptr = str->writable_str(); + while (*ptr) { + *ptr = to_lower(*ptr); + ptr += 1; + } +} + +static bool case_insensitive_find(const SkString& base, const SkString& sub) { + SkString lcBase(base); + SkString lcSub(sub); + make_lc(&lcBase); + make_lc(&lcSub); + return lcBase.find(lcSub.c_str()) >= 0; +} + +static bool draw_this_name(const SkString& name, const SkString& filter) { + if (filter.isEmpty()) { + return true; + } + return case_insensitive_find(name, filter); +} + class OverView : public SkView { public: OverView(int count, const SkViewFactory* factories[]); virtual ~OverView(); protected: - // Overridden from SkEventSink: bool onEvent(const SkEvent&) SK_OVERRIDE; bool onQuery(SkEvent* evt) SK_OVERRIDE { if (SampleCode::TitleQ(*evt)) { @@ -33,29 +57,34 @@ protected: if (evt->isType(gIsOverview)) { return true; } + SkUnichar uni; + if (SampleCode::CharQ(*evt, &uni)) { + fMatchStr.appendUnichar(uni); + this->inval(NULL); + return true; + } return this->INHERITED::onQuery(evt); } - - // Overridden from SkView: - void onSizeChange() SK_OVERRIDE; - void onDraw(SkCanvas* canvas) SK_OVERRIDE { - canvas->drawColor(SK_ColorLTGRAY); - } - - SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE; + void onDraw(SkCanvas* canvas) SK_OVERRIDE; bool onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { return false; } - Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { - int ix = (int)(SkScalarDiv(x * N, kWidth)); - int iy = (int)(SkScalarDiv(y * N, kHeight)); - if (ix >= 0 && iy >= 0) { - SkEvent evt("set-curr-index"); - evt.setFast32(iy * N + ix); - this->sendEventToParents(evt); + Click* onFindClickHandler(SkScalar cx, SkScalar cy, unsigned modi) SK_OVERRIDE { + const SkRect crect = SkRect::MakeXYWH(cx - 0.5f, cy - 0.5f, 1, 1); + SkPoint loc = this->start(); + for (int i = 0; i < fCount; ++i) { + if (draw_this_name(fNames[i], fMatchStr)) { + if (this->bounds(loc).intersects(crect)) { + SkEvent evt("set-curr-index"); + evt.setFast32(i); + this->sendEventToParents(evt); + break; + } + this->next(&loc); + } } return NULL; } @@ -63,6 +92,28 @@ protected: private: int fCount; const SkViewFactory** fFactories; + SkString* fNames; + SkString fMatchStr; + SkPaint fNamePaint; + SkPaint::FontMetrics fNameMetrics; + SkScalar fNameW; + SkScalar fNameH; + + SkRect bounds(const SkPoint& loc) const { + return SkRect::MakeXYWH(loc.x(), loc.y() + fNameMetrics.fAscent, fNameW, fNameH); + } + + SkPoint start() const { + return SkPoint::Make(10, -fNameMetrics.fTop); + } + + void next(SkPoint* loc) const { + loc->fY += fNameH; + if (loc->fY > this->height() - fNameMetrics.fBottom) { + loc->fY = -fNameMetrics.fTop; + loc->fX += fNameW; + } + } typedef SkView INHERITED; }; @@ -79,35 +130,44 @@ bool is_overview(SkView* view) { OverView::OverView(int count, const SkViewFactory* factories[]) { fCount = count; fFactories = factories; + + fNames = new SkString[count]; + for (int i = 0; i < count; ++i) { + SkView* view = (*fFactories[i])(); + if (view) { + (void)SampleCode::RequestTitle(view, &fNames[i]); + if (0 == fNames[i].find("GM:")) { + fNames[i].remove(0, 3); + } + } + } + + fNamePaint.setAntiAlias(true); + fNamePaint.setTextSize(12); + fNameW = 160; + fNameH = fNamePaint.getFontMetrics(&fNameMetrics); } OverView::~OverView() { + delete[] fNames; } bool OverView::onEvent(const SkEvent& evt) { return this->INHERITED::onEvent(evt); } -void OverView::onSizeChange() { - this->detachAllChildren(); - - SkScalar locX = 0; - SkScalar locY = 0; - for (int i = 0; i < fCount; i++) { - SkView* view = (*fFactories[i])(); - view->setVisibleP(true); - this->attachChildToBack(view)->unref(); - view->setLoc(locX, locY); - view->setSize(kWidth, kHeight); - locX += kWidth; - if ((i % N) == N - 1) { - locY += kHeight; - locX = 0; +void OverView::onDraw(SkCanvas* canvas) { + SkPaint paint; + paint.setColor(0xFFF8F8F8); + canvas->drawPaint(paint); + + SkPoint loc = this->start(); + for (int i = 0; i < fCount; ++i) { + if (draw_this_name(fNames[i], fMatchStr)) { + canvas->drawRect(this->bounds(loc), paint); + canvas->drawText(fNames[i].c_str(), fNames[i].size(), loc.x(), loc.y(), fNamePaint); + this->next(&loc); } } } -SkCanvas* OverView::beforeChildren(SkCanvas* canvas) { - canvas->scale(SK_Scalar1 / N, SK_Scalar1 / N); - return canvas; -} |