1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "OverView.h" 9 10 #include "SampleCode.h" 11 12 #include "SkCanvas.h" 13 #include "SkView.h" 14 15 static const int N = 8; 16 static const SkScalar kWidth = SkIntToScalar(640); 17 static const SkScalar kHeight = SkIntToScalar(480); 18 static const char gIsOverview[] = "is-overview"; 19 20 class OverView : public SkView { 21 public: 22 OverView(int count, const SkViewFactory* factories[]); 23 virtual ~OverView(); 24 25 protected: 26 // Overridden from SkEventSink: 27 virtual bool onEvent(const SkEvent&) SK_OVERRIDE; 28 virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { 29 if (SampleCode::TitleQ(*evt)) { 30 SampleCode::TitleR(evt, "Overview"); 31 return true; 32 } 33 if (evt->isType(gIsOverview)) { 34 return true; 35 } 36 return this->INHERITED::onQuery(evt); 37 } 38 39 40 // Overridden from SkView: 41 virtual void onSizeChange() SK_OVERRIDE; 42 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 43 canvas->drawColor(SK_ColorLTGRAY); 44 } 45 46 virtual SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE; 47 48 virtual bool onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { 49 return false; 50 } 51 52 virtual Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) SK_OVERRIDE { 53 int ix = (int)(SkScalarDiv(x * N, kWidth)); 54 int iy = (int)(SkScalarDiv(y * N, kHeight)); 55 if (ix >= 0 && iy >= 0) { 56 SkEvent evt("set-curr-index"); 57 evt.setFast32(iy * N + ix); 58 this->sendEventToParents(evt); 59 } 60 return NULL; 61 } 62 63 private: 64 int fCount; 65 const SkViewFactory** fFactories; 66 67 typedef SkView INHERITED; 68 }; 69 70 SkView* create_overview(int count, const SkViewFactory* factories[]) { 71 return SkNEW_ARGS(OverView, (count, factories)); 72 } 73 74 bool is_overview(SkView* view) { 75 SkEvent isOverview(gIsOverview); 76 return view->doQuery(&isOverview); 77 } 78 79 OverView::OverView(int count, const SkViewFactory* factories[]) { 80 fCount = count; 81 fFactories = factories; 82 } 83 84 OverView::~OverView() { 85 } 86 87 bool OverView::onEvent(const SkEvent& evt) { 88 return this->INHERITED::onEvent(evt); 89 } 90 91 void OverView::onSizeChange() { 92 this->detachAllChildren(); 93 94 SkScalar locX = 0; 95 SkScalar locY = 0; 96 for (int i = 0; i < fCount; i++) { 97 SkView* view = (*fFactories[i])(); 98 view->setVisibleP(true); 99 this->attachChildToBack(view)->unref(); 100 view->setLoc(locX, locY); 101 view->setSize(kWidth, kHeight); 102 locX += kWidth; 103 if ((i % N) == N - 1) { 104 locY += kHeight; 105 locX = 0; 106 } 107 } 108 } 109 110 SkCanvas* OverView::beforeChildren(SkCanvas* canvas) { 111 canvas->scale(SK_Scalar1 / N, SK_Scalar1 / N); 112 return canvas; 113 } 114