blob: 7b511c56df944eeddd18e7498cacc167d368659d [file] [log] [blame]
Ben Wagnerb2c4ea62018-08-08 11:36:17 -04001/*
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#ifndef SampleCode_DEFINED
9#define SampleCode_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkColor.h"
12#include "include/core/SkPoint.h"
13#include "include/core/SkRefCnt.h"
14#include "include/core/SkString.h"
15#include "include/private/SkMacros.h"
16#include "src/utils/SkMetaData.h"
Hal Canary3a85ed12019-07-08 16:07:57 -040017#include "tools/ModifierKey.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050018#include "tools/Registry.h"
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040019
Mike Kleincd5104e2019-03-20 11:55:08 -050020class AnimTimer;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040021class SkCanvas;
22class Sample;
23
24using SampleFactory = Sample* (*)();
25using SampleRegistry = sk_tools::Registry<SampleFactory>;
26
27#define DEF_SAMPLE(code) \
28 static Sample* SK_MACRO_APPEND_LINE(F_)() { code } \
29 static SampleRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
30
31///////////////////////////////////////////////////////////////////////////////
32
33class Sample : public SkRefCnt {
34public:
35 Sample()
36 : fBGColor(SK_ColorWHITE)
37 , fWidth(0), fHeight(0)
38 , fHaveCalledOnceBeforeDraw(false)
39 {}
40
41 SkScalar width() const { return fWidth; }
42 SkScalar height() const { return fHeight; }
43 void setSize(SkScalar width, SkScalar height);
44 void setSize(const SkPoint& size) { this->setSize(size.fX, size.fY); }
45 void setWidth(SkScalar width) { this->setSize(width, fHeight); }
46 void setHeight(SkScalar height) { this->setSize(fWidth, height); }
47
48 /** Call this to have the view draw into the specified canvas. */
49 virtual void draw(SkCanvas* canvas);
50
Hal Canary6cc65e12019-07-03 15:53:04 -040051 virtual bool onChar(SkUnichar) { return false; }
52
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040053 // Click handling
54 class Click {
55 public:
56 Click(Sample* target);
57 virtual ~Click();
58
59 enum State {
60 kDown_State,
61 kMoved_State,
62 kUp_State
63 };
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040064 SkPoint fOrig, fPrev, fCurr;
65 SkIPoint fIOrig, fIPrev, fICurr;
66 State fState;
Hal Canary3a85ed12019-07-08 16:07:57 -040067 ModifierKey fModifierKeys = ModifierKey::kNone;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040068
69 SkMetaData fMeta;
70 private:
71 sk_sp<Sample> fTarget;
72
73 friend class Sample;
74 };
Hal Canary3a85ed12019-07-08 16:07:57 -040075 Click* findClickHandler(SkScalar x, SkScalar y, ModifierKey modifierKeys);
76 static void DoClickDown(Click*, int x, int y, ModifierKey modi);
77 static void DoClickMoved(Click*, int x, int y, ModifierKey modi);
78 static void DoClickUp(Click*, int x, int y, ModifierKey modi);
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040079
80 void setBGColor(SkColor color) { fBGColor = color; }
Mike Kleincd5104e2019-03-20 11:55:08 -050081 bool animate(const AnimTimer& timer) { return this->onAnimate(timer); }
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040082
Hal Canary8a027312019-07-03 10:55:44 -040083 virtual SkString name() = 0;
84
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040085protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040086 /** Override to be notified of size changes. Overriders must call the super class. */
87 virtual void onSizeChange();
88
89 /** Override this if you might handle the click */
Hal Canary3a85ed12019-07-08 16:07:57 -040090 virtual Click* onFindClickHandler(SkScalar x, SkScalar y, ModifierKey modi);
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040091
92 /** Override to track clicks. Return true as long as you want to track the pen/mouse. */
93 virtual bool onClick(Click*);
94
95 virtual void onDrawBackground(SkCanvas*);
96 virtual void onDrawContent(SkCanvas*) = 0;
Mike Kleincd5104e2019-03-20 11:55:08 -050097 virtual bool onAnimate(const AnimTimer&) { return false; }
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040098 virtual void onOnceBeforeDraw() {}
99
100private:
101 SkColor fBGColor;
102 SkScalar fWidth, fHeight;
103 bool fHaveCalledOnceBeforeDraw;
104};
105
106#endif