blob: 390ac4c11bf6c2f8f0f6f927be34e32d1aa9abc0 [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"
Greg Daniel12e75852019-07-16 00:28:32 +000016#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
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040020class SkCanvas;
21class Sample;
22
23using SampleFactory = Sample* (*)();
24using SampleRegistry = sk_tools::Registry<SampleFactory>;
25
26#define DEF_SAMPLE(code) \
27 static Sample* SK_MACRO_APPEND_LINE(F_)() { code } \
28 static SampleRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
29
30///////////////////////////////////////////////////////////////////////////////
31
Hal Canaryfcf63592019-07-12 11:32:43 -040032class Sample {
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040033public:
34 Sample()
35 : fBGColor(SK_ColorWHITE)
36 , fWidth(0), fHeight(0)
37 , fHaveCalledOnceBeforeDraw(false)
38 {}
39
Hal Canaryfcf63592019-07-12 11:32:43 -040040 virtual ~Sample() = default;
41
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040042 SkScalar width() const { return fWidth; }
43 SkScalar height() const { return fHeight; }
44 void setSize(SkScalar width, SkScalar height);
45 void setSize(const SkPoint& size) { this->setSize(size.fX, size.fY); }
46 void setWidth(SkScalar width) { this->setSize(width, fHeight); }
47 void setHeight(SkScalar height) { this->setSize(fWidth, height); }
48
49 /** Call this to have the view draw into the specified canvas. */
50 virtual void draw(SkCanvas* canvas);
51
Hal Canary6cc65e12019-07-03 15:53:04 -040052 virtual bool onChar(SkUnichar) { return false; }
53
Hal Canaryfcf63592019-07-12 11:32:43 -040054 // Click handling
55 // TODO: unify Sample::InputState and sk_app::Window::InputState
56 enum class InputState { kDown, kUp, kMove };
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040057 class Click {
58 public:
Hal Canaryfcf63592019-07-12 11:32:43 -040059 virtual ~Click() = default;
60 SkPoint fOrig = {0, 0};
61 SkPoint fPrev = {0, 0};
62 SkPoint fCurr = {0, 0};
63 InputState fState = InputState::kDown;
Hal Canary3a85ed12019-07-08 16:07:57 -040064 ModifierKey fModifierKeys = ModifierKey::kNone;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040065 SkMetaData fMeta;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040066 };
Hal Canaryfcf63592019-07-12 11:32:43 -040067 bool mouse(SkPoint point, InputState clickState, ModifierKey modifierKeys);
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040068
69 void setBGColor(SkColor color) { fBGColor = color; }
Hal Canary41248072019-07-11 16:32:53 -040070 bool animate(double nanos) { return this->onAnimate(nanos); }
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040071
Hal Canary8a027312019-07-03 10:55:44 -040072 virtual SkString name() = 0;
73
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040074protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040075 /** Override to be notified of size changes. Overriders must call the super class. */
76 virtual void onSizeChange();
77
78 /** Override this if you might handle the click */
Hal Canary3a85ed12019-07-08 16:07:57 -040079 virtual Click* onFindClickHandler(SkScalar x, SkScalar y, ModifierKey modi);
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040080
81 /** Override to track clicks. Return true as long as you want to track the pen/mouse. */
82 virtual bool onClick(Click*);
83
84 virtual void onDrawBackground(SkCanvas*);
85 virtual void onDrawContent(SkCanvas*) = 0;
Hal Canary41248072019-07-11 16:32:53 -040086 virtual bool onAnimate(double /*nanos*/) { return false; }
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040087 virtual void onOnceBeforeDraw() {}
88
89private:
Hal Canaryfcf63592019-07-12 11:32:43 -040090 std::unique_ptr<Click> fClick;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040091 SkColor fBGColor;
92 SkScalar fWidth, fHeight;
93 bool fHaveCalledOnceBeforeDraw;
Hal Canaryfcf63592019-07-12 11:32:43 -040094
95 Sample(const Sample&) = delete;
96 Sample& operator=(const Sample&) = delete;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040097};
98
99#endif