Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / src / declarative / graphicsitems / qdeclarativepath_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDECLARATIVEPATH_H
43 #define QDECLARATIVEPATH_H
44
45 #include "qdeclarativeitem.h"
46
47 #include <qdeclarative.h>
48
49 #include <QtCore/QObject>
50 #include <QtGui/QPainterPath>
51
52 QT_BEGIN_HEADER
53
54 QT_BEGIN_NAMESPACE
55
56 QT_MODULE(Declarative)
57 class Q_AUTOTEST_EXPORT QDeclarativePathElement : public QObject
58 {
59     Q_OBJECT
60 public:
61     QDeclarativePathElement(QObject *parent=0) : QObject(parent) {}
62 Q_SIGNALS:
63     void changed();
64 };
65
66 class Q_AUTOTEST_EXPORT QDeclarativePathAttribute : public QDeclarativePathElement
67 {
68     Q_OBJECT
69
70     Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
71     Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged)
72 public:
73     QDeclarativePathAttribute(QObject *parent=0) : QDeclarativePathElement(parent), _value(0) {}
74
75
76     QString name() const;
77     void setName(const QString &name);
78
79     qreal value() const;
80     void setValue(qreal value);
81
82 Q_SIGNALS:
83     void nameChanged();
84     void valueChanged();
85
86 private:
87     QString _name;
88     qreal _value;
89 };
90
91 class Q_AUTOTEST_EXPORT QDeclarativeCurve : public QDeclarativePathElement
92 {
93     Q_OBJECT
94
95     Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
96     Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
97 public:
98     QDeclarativeCurve(QObject *parent=0) : QDeclarativePathElement(parent), _x(0), _y(0) {}
99
100     qreal x() const;
101     void setX(qreal x);
102
103     qreal y() const;
104     void setY(qreal y);
105
106     virtual void addToPath(QPainterPath &) {}
107
108 Q_SIGNALS:
109     void xChanged();
110     void yChanged();
111
112 private:
113     qreal _x;
114     qreal _y;
115 };
116
117 class Q_AUTOTEST_EXPORT QDeclarativePathLine : public QDeclarativeCurve
118 {
119     Q_OBJECT
120 public:
121     QDeclarativePathLine(QObject *parent=0) : QDeclarativeCurve(parent) {}
122
123     void addToPath(QPainterPath &path);
124 };
125
126 class Q_AUTOTEST_EXPORT QDeclarativePathQuad : public QDeclarativeCurve
127 {
128     Q_OBJECT
129
130     Q_PROPERTY(qreal controlX READ controlX WRITE setControlX NOTIFY controlXChanged)
131     Q_PROPERTY(qreal controlY READ controlY WRITE setControlY NOTIFY controlYChanged)
132 public:
133     QDeclarativePathQuad(QObject *parent=0) : QDeclarativeCurve(parent), _controlX(0), _controlY(0) {}
134
135     qreal controlX() const;
136     void setControlX(qreal x);
137
138     qreal controlY() const;
139     void setControlY(qreal y);
140
141     void addToPath(QPainterPath &path);
142
143 Q_SIGNALS:
144     void controlXChanged();
145     void controlYChanged();
146
147 private:
148     qreal _controlX;
149     qreal _controlY;
150 };
151
152 class Q_AUTOTEST_EXPORT QDeclarativePathCubic : public QDeclarativeCurve
153 {
154     Q_OBJECT
155
156     Q_PROPERTY(qreal control1X READ control1X WRITE setControl1X NOTIFY control1XChanged)
157     Q_PROPERTY(qreal control1Y READ control1Y WRITE setControl1Y NOTIFY control1YChanged)
158     Q_PROPERTY(qreal control2X READ control2X WRITE setControl2X NOTIFY control2XChanged)
159     Q_PROPERTY(qreal control2Y READ control2Y WRITE setControl2Y NOTIFY control2YChanged)
160 public:
161     QDeclarativePathCubic(QObject *parent=0) : QDeclarativeCurve(parent), _control1X(0), _control1Y(0), _control2X(0), _control2Y(0) {}
162
163     qreal control1X() const;
164     void setControl1X(qreal x);
165
166     qreal control1Y() const;
167     void setControl1Y(qreal y);
168
169     qreal control2X() const;
170     void setControl2X(qreal x);
171
172     qreal control2Y() const;
173     void setControl2Y(qreal y);
174
175     void addToPath(QPainterPath &path);
176
177 Q_SIGNALS:
178     void control1XChanged();
179     void control1YChanged();
180     void control2XChanged();
181     void control2YChanged();
182
183 private:
184     qreal _control1X;
185     qreal _control1Y;
186     qreal _control2X;
187     qreal _control2Y;
188 };
189
190 class Q_AUTOTEST_EXPORT QDeclarativePathPercent : public QDeclarativePathElement
191 {
192     Q_OBJECT
193     Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged)
194 public:
195     QDeclarativePathPercent(QObject *parent=0) : QDeclarativePathElement(parent) {}
196
197     qreal value() const;
198     void setValue(qreal value);
199
200 signals:
201     void valueChanged();
202
203 private:
204     qreal _value;
205 };
206
207 class QDeclarativePathPrivate;
208 class Q_AUTOTEST_EXPORT QDeclarativePath : public QObject, public QDeclarativeParserStatus
209 {
210     Q_OBJECT
211
212     Q_INTERFACES(QDeclarativeParserStatus)
213     Q_PROPERTY(QDeclarativeListProperty<QDeclarativePathElement> pathElements READ pathElements)
214     Q_PROPERTY(qreal startX READ startX WRITE setStartX NOTIFY startXChanged)
215     Q_PROPERTY(qreal startY READ startY WRITE setStartY NOTIFY startYChanged)
216     Q_PROPERTY(bool closed READ isClosed NOTIFY changed)
217     Q_CLASSINFO("DefaultProperty", "pathElements")
218     Q_INTERFACES(QDeclarativeParserStatus)
219 public:
220     QDeclarativePath(QObject *parent=0);
221     ~QDeclarativePath();
222
223     QDeclarativeListProperty<QDeclarativePathElement> pathElements();
224
225     qreal startX() const;
226     void setStartX(qreal x);
227
228     qreal startY() const;
229     void setStartY(qreal y);
230
231     bool isClosed() const;
232
233     QPainterPath path() const;
234     QStringList attributes() const;
235     qreal attributeAt(const QString &, qreal) const;
236     QPointF pointAt(qreal) const;
237
238 Q_SIGNALS:
239     void changed();
240     void startXChanged();
241     void startYChanged();
242
243 protected:
244     virtual void componentComplete();
245     virtual void classBegin();
246
247 private Q_SLOTS:
248     void processPath();
249
250 private:
251     struct AttributePoint {
252         AttributePoint() : percent(0), scale(1), origpercent(0) {}
253         AttributePoint(const AttributePoint &other)
254             : percent(other.percent), scale(other.scale), origpercent(other.origpercent), values(other.values) {}
255         AttributePoint &operator=(const AttributePoint &other) {
256             percent = other.percent; scale = other.scale; origpercent = other.origpercent; values = other.values; return *this;
257         }
258         qreal percent;      //massaged percent along the painter path
259         qreal scale;
260         qreal origpercent;  //'real' percent along the painter path
261         QHash<QString, qreal> values;
262     };
263
264     void interpolate(int idx, const QString &name, qreal value);
265     void endpoint(const QString &name);
266     void createPointCache() const;
267
268 private:
269     Q_DISABLE_COPY(QDeclarativePath)
270     Q_DECLARE_PRIVATE(QDeclarativePath)
271 };
272
273 QT_END_NAMESPACE
274
275 QML_DECLARE_TYPE(QDeclarativePathElement)
276 QML_DECLARE_TYPE(QDeclarativePathAttribute)
277 QML_DECLARE_TYPE(QDeclarativeCurve)
278 QML_DECLARE_TYPE(QDeclarativePathLine)
279 QML_DECLARE_TYPE(QDeclarativePathQuad)
280 QML_DECLARE_TYPE(QDeclarativePathCubic)
281 QML_DECLARE_TYPE(QDeclarativePathPercent)
282 QML_DECLARE_TYPE(QDeclarativePath)
283
284 QT_END_HEADER
285
286 #endif // QDECLARATIVEPATH_H