| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #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"; | |
| class OverView : public SkView { | |
| public: | |
| OverView(int count, const SkViewFactory* factories[]); | |
| virtual ~OverView(); | |
| protected: | |
| // Overridden from SkEventSink: | |
| virtual bool onEvent(const SkEvent&) SK_OVERRIDE; | |
| virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { | |
| if (SampleCode::TitleQ(*evt)) { | |
| SampleCode::TitleR(evt, "Overview"); | |
| return true; | |
| } | |
| if (evt->isType(gIsOverview)) { | |
| return true; | |
| } | |
| return this->INHERITED::onQuery(evt); | |
| } | |
| // Overridden from SkView: | |
| virtual void onSizeChange() SK_OVERRIDE; | |
| virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | |
| canvas->drawColor(SK_ColorLTGRAY); | |
| } | |
| virtual SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE; | |
| virtual bool onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { | |
| return false; | |
| } | |
| virtual 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); | |
| } | |
| return NULL; | |
| } | |
| private: | |
| int fCount; | |
| const SkViewFactory** fFactories; | |
| typedef SkView INHERITED; | |
| }; | |
| SkView* create_overview(int count, const SkViewFactory* factories[]) { | |
| return SkNEW_ARGS(OverView, (count, factories)); | |
| } | |
| bool is_overview(SkView* view) { | |
| SkEvent isOverview(gIsOverview); | |
| return view->doQuery(&isOverview); | |
| } | |
| OverView::OverView(int count, const SkViewFactory* factories[]) { | |
| fCount = count; | |
| fFactories = factories; | |
| } | |
| OverView::~OverView() { | |
| } | |
| 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; | |
| } | |
| } | |
| } | |
| SkCanvas* OverView::beforeChildren(SkCanvas* canvas) { | |
| canvas->scale(SK_Scalar1 / N, SK_Scalar1 / N); | |
| return canvas; | |
| } |