aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/OverView.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-02-03 15:02:24 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-03 15:02:24 -0800
commitbf015c34e4c36467dfef385893f375b68718450e (patch)
treeb26711b4d5c91b5dd89fc2dc8b22c6b7a0bac64c /samplecode/OverView.cpp
parent7b274c78fbeefa3818af68099545f2839c854847 (diff)
add textual overview
Diffstat (limited to 'samplecode/OverView.cpp')
-rw-r--r--samplecode/OverView.cpp140
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;
-}