blob: d6ccf488cf95a79b42955f9448b4572573500dfe [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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "tools/Registry.h"
Hal Canarye574f1e2019-07-15 14:01:37 -040017#include "tools/SkMetaData.h"
Hal Canaryb1f411a2019-08-29 10:39:22 -040018#include "tools/skui/InputState.h"
19#include "tools/skui/ModifierKey.h"
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040020
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
Hal Canaryfcf63592019-07-12 11:32:43 -040033class Sample {
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040034public:
35 Sample()
36 : fBGColor(SK_ColorWHITE)
37 , fWidth(0), fHeight(0)
38 , fHaveCalledOnceBeforeDraw(false)
39 {}
40
Hal Canaryfcf63592019-07-12 11:32:43 -040041 virtual ~Sample() = default;
42
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040043 SkScalar width() const { return fWidth; }
44 SkScalar height() const { return fHeight; }
45 void setSize(SkScalar width, SkScalar height);
46 void setSize(const SkPoint& size) { this->setSize(size.fX, size.fY); }
47 void setWidth(SkScalar width) { this->setSize(width, fHeight); }
48 void setHeight(SkScalar height) { this->setSize(fWidth, height); }
49
50 /** Call this to have the view draw into the specified canvas. */
51 virtual void draw(SkCanvas* canvas);
52
Hal Canary6cc65e12019-07-03 15:53:04 -040053 virtual bool onChar(SkUnichar) { return false; }
54
Hal Canaryfcf63592019-07-12 11:32:43 -040055 // Click handling
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040056 class Click {
57 public:
Hal Canaryfcf63592019-07-12 11:32:43 -040058 virtual ~Click() = default;
59 SkPoint fOrig = {0, 0};
60 SkPoint fPrev = {0, 0};
61 SkPoint fCurr = {0, 0};
Hal Canaryb1f411a2019-08-29 10:39:22 -040062 skui::InputState fState = skui::InputState::kDown;
63 skui::ModifierKey fModifierKeys = skui::ModifierKey::kNone;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040064 SkMetaData fMeta;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040065 };
Hal Canaryb1f411a2019-08-29 10:39:22 -040066 bool mouse(SkPoint point, skui::InputState clickState, skui::ModifierKey modifierKeys);
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040067
68 void setBGColor(SkColor color) { fBGColor = color; }
Hal Canary41248072019-07-11 16:32:53 -040069 bool animate(double nanos) { return this->onAnimate(nanos); }
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040070
Hal Canary8a027312019-07-03 10:55:44 -040071 virtual SkString name() = 0;
72
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040073protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040074 /** Override to be notified of size changes. Overriders must call the super class. */
75 virtual void onSizeChange();
76
77 /** Override this if you might handle the click */
Hal Canaryb1f411a2019-08-29 10:39:22 -040078 virtual Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi);
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040079
80 /** Override to track clicks. Return true as long as you want to track the pen/mouse. */
81 virtual bool onClick(Click*);
82
83 virtual void onDrawBackground(SkCanvas*);
84 virtual void onDrawContent(SkCanvas*) = 0;
Hal Canary41248072019-07-11 16:32:53 -040085 virtual bool onAnimate(double /*nanos*/) { return false; }
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040086 virtual void onOnceBeforeDraw() {}
87
88private:
Hal Canaryfcf63592019-07-12 11:32:43 -040089 std::unique_ptr<Click> fClick;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040090 SkColor fBGColor;
91 SkScalar fWidth, fHeight;
92 bool fHaveCalledOnceBeforeDraw;
Hal Canaryfcf63592019-07-12 11:32:43 -040093
94 Sample(const Sample&) = delete;
95 Sample& operator=(const Sample&) = delete;
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040096};
97
98#endif