1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SampleCode_DEFINED 9cb93a386Sopenharmony_ci#define SampleCode_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 13cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 14cb93a386Sopenharmony_ci#include "include/core/SkString.h" 15cb93a386Sopenharmony_ci#include "include/private/SkMacros.h" 16cb93a386Sopenharmony_ci#include "tools/Registry.h" 17cb93a386Sopenharmony_ci#include "tools/SkMetaData.h" 18cb93a386Sopenharmony_ci#include "tools/skui/InputState.h" 19cb93a386Sopenharmony_ci#include "tools/skui/ModifierKey.h" 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci#include <functional> 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ciclass SkCanvas; 24cb93a386Sopenharmony_ciclass Sample; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciusing SampleFactory = Sample* (*)(); 27cb93a386Sopenharmony_ciusing SampleRegistry = sk_tools::Registry<SampleFactory>; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci#define DEF_SAMPLE(code) \ 30cb93a386Sopenharmony_ci static Sample* SK_MACRO_APPEND_LINE(F_)() { code } \ 31cb93a386Sopenharmony_ci static SampleRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ciclass Sample { 36cb93a386Sopenharmony_cipublic: 37cb93a386Sopenharmony_ci Sample() 38cb93a386Sopenharmony_ci : fBGColor(SK_ColorWHITE) 39cb93a386Sopenharmony_ci , fWidth(0), fHeight(0) 40cb93a386Sopenharmony_ci , fHaveCalledOnceBeforeDraw(false) 41cb93a386Sopenharmony_ci {} 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci virtual ~Sample() = default; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci SkScalar width() const { return fWidth; } 46cb93a386Sopenharmony_ci SkScalar height() const { return fHeight; } 47cb93a386Sopenharmony_ci void setSize(SkScalar width, SkScalar height); 48cb93a386Sopenharmony_ci void setSize(const SkPoint& size) { this->setSize(size.fX, size.fY); } 49cb93a386Sopenharmony_ci void setWidth(SkScalar width) { this->setSize(width, fHeight); } 50cb93a386Sopenharmony_ci void setHeight(SkScalar height) { this->setSize(fWidth, height); } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci /** Call this to have the view draw into the specified canvas. */ 53cb93a386Sopenharmony_ci virtual void draw(SkCanvas* canvas); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci virtual bool onChar(SkUnichar) { return false; } 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci // Click handling 58cb93a386Sopenharmony_ci class Click { 59cb93a386Sopenharmony_ci public: 60cb93a386Sopenharmony_ci Click() {} 61cb93a386Sopenharmony_ci Click(std::function<bool(Click*)> f) : fFunc(f), fHasFunc(true) {} 62cb93a386Sopenharmony_ci virtual ~Click() = default; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci SkPoint fOrig = {0, 0}; 65cb93a386Sopenharmony_ci SkPoint fPrev = {0, 0}; 66cb93a386Sopenharmony_ci SkPoint fCurr = {0, 0}; 67cb93a386Sopenharmony_ci skui::InputState fState = skui::InputState::kDown; 68cb93a386Sopenharmony_ci skui::ModifierKey fModifierKeys = skui::ModifierKey::kNone; 69cb93a386Sopenharmony_ci SkMetaData fMeta; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci std::function<bool(Click*)> fFunc; 72cb93a386Sopenharmony_ci bool fHasFunc = false; 73cb93a386Sopenharmony_ci }; 74cb93a386Sopenharmony_ci bool mouse(SkPoint point, skui::InputState clickState, skui::ModifierKey modifierKeys); 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci void setBGColor(SkColor color) { fBGColor = color; } 77cb93a386Sopenharmony_ci bool animate(double nanos) { return this->onAnimate(nanos); } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci virtual SkString name() = 0; 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ciprotected: 82cb93a386Sopenharmony_ci /** Override to be notified of size changes. Overriders must call the super class. */ 83cb93a386Sopenharmony_ci virtual void onSizeChange(); 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci /** Override this if you might handle the click */ 86cb93a386Sopenharmony_ci virtual Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi); 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci /** Override to track clicks. Return true as long as you want to track the pen/mouse. */ 89cb93a386Sopenharmony_ci virtual bool onClick(Click*); 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci virtual void onDrawBackground(SkCanvas*); 92cb93a386Sopenharmony_ci virtual void onDrawContent(SkCanvas*) = 0; 93cb93a386Sopenharmony_ci virtual bool onAnimate(double /*nanos*/) { return false; } 94cb93a386Sopenharmony_ci virtual void onOnceBeforeDraw() {} 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ciprivate: 97cb93a386Sopenharmony_ci std::unique_ptr<Click> fClick; 98cb93a386Sopenharmony_ci SkColor fBGColor; 99cb93a386Sopenharmony_ci SkScalar fWidth, fHeight; 100cb93a386Sopenharmony_ci bool fHaveCalledOnceBeforeDraw; 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci Sample(const Sample&) = delete; 103cb93a386Sopenharmony_ci Sample& operator=(const Sample&) = delete; 104cb93a386Sopenharmony_ci}; 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci#endif 107