1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkView_DEFINED
#define SkView_DEFINED
#include "SkEventSink.h"
#include "SkRect.h"
#include "SkMatrix.h"
#include "SkMetaData.h"
class SkCanvas;
/** \class SkView
SkView is the base class for screen management. All widgets and controls inherit
from SkView.
*/
class SkView : public SkEventSink {
public:
enum Flag_Shift {
kVisible_Shift,
kEnabled_Shift,
kFocusable_Shift,
kFlexH_Shift,
kFlexV_Shift,
kNoClip_Shift,
kFlagShiftCount
};
enum Flag_Mask {
kVisible_Mask = 1 << kVisible_Shift, //!< set if the view is visible
kEnabled_Mask = 1 << kEnabled_Shift, //!< set if the view is enabled
kFocusable_Mask = 1 << kFocusable_Shift, //!< set if the view can receive focus
kFlexH_Mask = 1 << kFlexH_Shift, //!< set if the view's width is stretchable
kFlexV_Mask = 1 << kFlexV_Shift, //!< set if the view's height is stretchable
kNoClip_Mask = 1 << kNoClip_Shift, //!< set if the view is not clipped to its bounds
kAllFlagMasks = (uint32_t)(0 - 1) >> (32 - kFlagShiftCount)
};
SkView(uint32_t flags = 0);
virtual ~SkView();
/** Return the flags associated with the view
*/
uint32_t getFlags() const { return fFlags; }
/** Set the flags associated with the view
*/
void setFlags(uint32_t flags);
/** Helper that returns non-zero if the kVisible_Mask bit is set in the view's flags
*/
int isVisible() const { return fFlags & kVisible_Mask; }
int isEnabled() const { return fFlags & kEnabled_Mask; }
int isFocusable() const { return fFlags & kFocusable_Mask; }
int isClipToBounds() const { return !(fFlags & kNoClip_Mask); }
/** Helper to set/clear the view's kVisible_Mask flag */
void setVisibleP(bool);
void setEnabledP(bool);
void setFocusableP(bool);
void setClipToBounds(bool);
/** Return the view's width */
SkScalar width() const { return fWidth; }
/** Return the view's height */
SkScalar height() const { return fHeight; }
/** Set the view's width and height. These must both be >= 0. This does not affect the view's loc */
void setSize(SkScalar width, SkScalar height);
void setSize(const SkPoint& size) { this->setSize(size.fX, size.fY); }
void setWidth(SkScalar width) { this->setSize(width, fHeight); }
void setHeight(SkScalar height) { this->setSize(fWidth, height); }
/** Call this to have the view draw into the specified canvas. */
virtual void draw(SkCanvas* canvas);
// Click handling
class Click {
public:
Click(SkView* target);
virtual ~Click();
enum State {
kDown_State,
kMoved_State,
kUp_State
};
SkPoint fOrig, fPrev, fCurr;
SkIPoint fIOrig, fIPrev, fICurr;
State fState;
unsigned fModifierKeys;
SkMetaData fMeta;
private:
SkEventSinkID fTargetID;
friend class SkView;
};
Click* findClickHandler(SkScalar x, SkScalar y, unsigned modifierKeys);
static void DoClickDown(Click*, int x, int y, unsigned modi);
static void DoClickMoved(Click*, int x, int y, unsigned modi);
static void DoClickUp(Click*, int x, int y, unsigned modi);
protected:
/** Override this to draw inside the view. Be sure to call the inherited version too */
virtual void onDraw(SkCanvas*);
/** Override this to be notified when the view's size changes. Be sure to call the inherited version too */
virtual void onSizeChange();
/** Override this if you might handle the click
*/
virtual Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi);
/** Override this to track clicks, returning true as long as you want to track
the pen/mouse.
*/
virtual bool onClick(Click*);
private:
SkScalar fWidth, fHeight;
uint8_t fFlags;
};
#endif
|