1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the demonstration applications of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:BSD$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** BSD License Usage |
18 | ** Alternatively, you may use this file under the terms of the BSD license |
19 | ** as follows: |
20 | ** |
21 | ** "Redistribution and use in source and binary forms, with or without |
22 | ** modification, are permitted provided that the following conditions are |
23 | ** met: |
24 | ** * Redistributions of source code must retain the above copyright |
25 | ** notice, this list of conditions and the following disclaimer. |
26 | ** * Redistributions in binary form must reproduce the above copyright |
27 | ** notice, this list of conditions and the following disclaimer in |
28 | ** the documentation and/or other materials provided with the |
29 | ** distribution. |
30 | ** * Neither the name of The Qt Company Ltd nor the names of its |
31 | ** contributors may be used to endorse or promote products derived |
32 | ** from this software without specific prior written permission. |
33 | ** |
34 | ** |
35 | ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
36 | ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
37 | ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
38 | ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
39 | ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
40 | ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
41 | ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
42 | ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
43 | ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
44 | ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
45 | ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
46 | ** |
47 | ** $QT_END_LICENSE$ |
48 | ** |
49 | ****************************************************************************/ |
50 | |
51 | #ifndef HOVERPOINTS_H |
52 | #define HOVERPOINTS_H |
53 | |
54 | #include <QtWidgets> |
55 | |
56 | QT_FORWARD_DECLARE_CLASS(QBypassWidget) |
57 | |
58 | class HoverPoints : public QObject |
59 | { |
60 | Q_OBJECT |
61 | public: |
62 | enum PointShape { |
63 | CircleShape, |
64 | RectangleShape |
65 | }; |
66 | |
67 | enum LockType { |
68 | LockToLeft = 0x01, |
69 | LockToRight = 0x02, |
70 | LockToTop = 0x04, |
71 | LockToBottom = 0x08 |
72 | }; |
73 | |
74 | enum SortType { |
75 | NoSort, |
76 | XSort, |
77 | YSort |
78 | }; |
79 | |
80 | enum ConnectionType { |
81 | NoConnection, |
82 | LineConnection, |
83 | CurveConnection |
84 | }; |
85 | |
86 | HoverPoints(QWidget *widget, PointShape shape); |
87 | |
88 | bool eventFilter(QObject *object, QEvent *event) override; |
89 | |
90 | void paintPoints(); |
91 | |
92 | inline QRectF boundingRect() const; |
93 | void setBoundingRect(const QRectF &boundingRect) { m_bounds = boundingRect; } |
94 | |
95 | QPolygonF points() const { return m_points; } |
96 | void setPoints(const QPolygonF &points); |
97 | |
98 | QSizeF pointSize() const { return m_pointSize; } |
99 | void setPointSize(const QSizeF &size) { m_pointSize = size; } |
100 | |
101 | SortType sortType() const { return m_sortType; } |
102 | void setSortType(SortType sortType) { m_sortType = sortType; } |
103 | |
104 | ConnectionType connectionType() const { return m_connectionType; } |
105 | void setConnectionType(ConnectionType connectionType) { m_connectionType = connectionType; } |
106 | |
107 | void setConnectionPen(const QPen &pen) { m_connectionPen = pen; } |
108 | void setShapePen(const QPen &pen) { m_pointPen = pen; } |
109 | void setShapeBrush(const QBrush &brush) { m_pointBrush = brush; } |
110 | |
111 | void setPointLock(int pos, LockType lock) { m_locks[pos] = lock; } |
112 | |
113 | void setEditable(bool editable) { m_editable = editable; } |
114 | bool editable() const { return m_editable; } |
115 | |
116 | public slots: |
117 | void setEnabled(bool enabled); |
118 | void setDisabled(bool disabled) { setEnabled(!disabled); } |
119 | |
120 | signals: |
121 | void pointsChanged(const QPolygonF &points); |
122 | |
123 | public: |
124 | void firePointChange(); |
125 | |
126 | private: |
127 | inline QRectF pointBoundingRect(int i) const; |
128 | void movePoint(int i, const QPointF &newPos, bool emitChange = true); |
129 | |
130 | QWidget *m_widget; |
131 | |
132 | QPolygonF m_points; |
133 | QRectF m_bounds; |
134 | PointShape m_shape; |
135 | SortType m_sortType; |
136 | ConnectionType m_connectionType; |
137 | |
138 | QVector<uint> m_locks; |
139 | |
140 | QSizeF m_pointSize; |
141 | int m_currentIndex; |
142 | bool m_editable; |
143 | bool m_enabled; |
144 | |
145 | QHash<int, int> m_fingerPointMapping; |
146 | |
147 | QPen m_pointPen; |
148 | QBrush m_pointBrush; |
149 | QPen m_connectionPen; |
150 | }; |
151 | |
152 | |
153 | inline QRectF HoverPoints::pointBoundingRect(int i) const |
154 | { |
155 | QPointF p = m_points.at(i); |
156 | qreal w = m_pointSize.width(); |
157 | qreal h = m_pointSize.height(); |
158 | qreal x = p.x() - w / 2; |
159 | qreal y = p.y() - h / 2; |
160 | return QRectF(x, y, w, h); |
161 | } |
162 | |
163 | inline QRectF HoverPoints::boundingRect() const |
164 | { |
165 | if (m_bounds.isEmpty()) |
166 | return m_widget->rect(); |
167 | else |
168 | return m_bounds; |
169 | } |
170 | |
171 | #endif // HOVERPOINTS_H |
172 | |