/****************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtQml module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
QT_BEGIN_NAMESPACE
/*!
- \qmlclass PathElement QQuickPathElement
+ \qmltype PathElement
+ \instantiates QQuickPathElement
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief PathElement is the base path type.
+ \ingroup qtquick-animation-paths
+ \brief PathElement is the base path type
This type is the base for all path types. It cannot
be instantiated.
*/
/*!
- \qmlclass Path QQuickPath
+ \qmltype Path
+ \instantiates QQuickPath
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief A Path object defines a path for use by \l PathView.
+ \ingroup qtquick-animation-paths
+ \brief Defines a path for use by \l PathView
A Path is composed of one or more path segments - PathLine, PathQuad,
PathCubic, PathArc, PathCurve, PathSvg.
A path can contain the following path objects:
\list
- \i \l PathLine - a straight line to a given position.
- \i \l PathQuad - a quadratic Bezier curve to a given position with a control point.
- \i \l PathCubic - a cubic Bezier curve to a given position with two control points.
- \i \l PathArc - an arc to a given position with a radius.
- \i \l PathSvg - a path specified as an SVG path data string.
- \i \l PathCurve - a point on a Catmull-Rom curve.
- \i \l PathAttribute - an attribute at a given position in the path.
- \i \l PathPercent - a way to spread out items along various segments of the path.
+ \li \l PathLine - a straight line to a given position.
+ \li \l PathQuad - a quadratic Bezier curve to a given position with a control point.
+ \li \l PathCubic - a cubic Bezier curve to a given position with two control points.
+ \li \l PathArc - an arc to a given position with a radius.
+ \li \l PathSvg - a path specified as an SVG path data string.
+ \li \l PathCurve - a point on a Catmull-Rom curve.
+ \li \l PathAttribute - an attribute at a given position in the path.
+ \li \l PathPercent - a way to spread out items along various segments of the path.
\endlist
- \snippet doc/src/snippets/qml/pathview/pathattributes.qml 2
+ \snippet qml/pathview/pathattributes.qml 2
*/
QQmlListProperty<QQuickPathElement> QQuickPath::pathElements()
return QBezier();
}
+static inline int segmentCount(const QPainterPath &path, qreal pathLength)
+{
+ // In the really simple case of a single straight line we can interpolate without jitter
+ // between just two points.
+ if (path.elementCount() == 2
+ && path.elementAt(0).type == QPainterPath::MoveToElement
+ && path.elementAt(1).type == QPainterPath::LineToElement) {
+ return 1;
+ }
+ // more points means less jitter between items as they move along the
+ // path, but takes longer to generate
+ return qCeil(pathLength*5);
+}
+
//derivative of the equation
static inline qreal slopeAt(qreal t, qreal a, qreal b, qreal c, qreal d)
{
qreal pathLength = d->pathLength;
if (pathLength <= 0 || qIsNaN(pathLength))
return;
- // more points means less jitter between items as they move along the
- // path, but takes longer to generate
- const int points = qCeil(pathLength*5);
+
+ const int segments = segmentCount(d->_path, pathLength);
const int lastElement = d->_path.elementCount() - 1;
- d->_pointCache.resize(points+1);
+ d->_pointCache.resize(segments+1);
int currElement = -1;
qreal bezLength = 0;
qreal prevPercent = 0;
qreal prevOrigPercent = 0;
for (int ii = 0; ii < d->_attributePoints.count(); ++ii) {
- qreal percent = qreal(i)/points;
+ qreal percent = qreal(i)/segments;
const AttributePoint &point = d->_attributePoints.at(ii);
if (percent < point.percent || ii == d->_attributePoints.count() - 1) { //### || is special case for very last item
qreal elementPercent = (percent - prevPercent);
QPointF QQuickPath::sequentialPointAt(const QPainterPath &path, const qreal &pathLength, const QList<AttributePoint> &attributePoints, QQuickCachedBezier &prevBez, qreal p, qreal *angle)
{
+ Q_ASSERT(p >= 0.0 && p <= 1.0);
+
if (!prevBez.isValid)
return p > .5 ? backwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle) :
forwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle);
return QPointF();
}
- const int pointCacheSize = d->_pointCache.size();
- qreal idxf = p*pointCacheSize;
+ const int segmentCount = d->_pointCache.size() - 1;
+ qreal idxf = p*segmentCount;
int idx1 = qFloor(idxf);
qreal delta = idxf - idx1;
- if (idx1 >= pointCacheSize)
- idx1 = pointCacheSize - 1;
+ if (idx1 > segmentCount)
+ idx1 = segmentCount;
else if (idx1 < 0)
idx1 = 0;
// interpolate between the two points.
int idx2 = qCeil(idxf);
- if (idx2 >= pointCacheSize)
- idx2 = pointCacheSize - 1;
+ if (idx2 > segmentCount)
+ idx2 = segmentCount;
else if (idx2 < 0)
idx2 = 0;
/****************************************************************************/
/*!
- \qmlclass PathAttribute QQuickPathAttribute
+ \qmltype PathAttribute
+ \instantiates QQuickPathAttribute
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathAttribute allows setting an attribute at a given position in a Path.
+ \ingroup qtquick-animation-paths
+ \brief Specifies how to set an attribute at a given position in a Path
The PathAttribute object allows attributes consisting of a name and
a value to be specified for various points along a path. The
attributes are exposed to the delegate as
- \l{qdeclarativeintroduction.html#attached-properties} {Attached Properties}.
+ \l{Attached Properties and Attached Signal Handlers} {Attached Properties}.
The value of an attribute at any particular point along the path is interpolated
from the PathAttributes bounding that point.
\table
\row
- \o \image declarative-pathattribute.png
- \o
- \snippet doc/src/snippets/qml/pathview/pathattributes.qml 0
+ \li \image declarative-pathattribute.png
+ \li
+ \snippet qml/pathview/pathattributes.qml 0
(see the PathView documentation for the specification of ContactModel.qml
used for ContactModel above.)
\endtable
Note that using an existing Item property name such as "opacity" as an
attribute is allowed. This is because path attributes add a new
- \l{qdeclarativeintroduction.html#attached-properties} {Attached Property}
+ \l{Attached Properties and Attached Signal Handlers} {Attached Property}
which in no way clashes with existing properties.
*/
\endqml
In our delegate, we can then bind the \e rotation property to the
- \l{qdeclarativeintroduction.html#attached-properties} {Attached Property}
+ \l{Attached Properties and Attached Signal Handlers} {Attached Property}
\e PathView.itemRotation created for this attribute.
\qml
/****************************************************************************/
/*!
- \qmlclass PathLine QQuickPathLine
+ \qmltype PathLine
+ \instantiates QQuickPathLine
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathLine defines a straight line.
+ \ingroup qtquick-animation-paths
+ \brief Defines a straight line
The example below creates a path consisting of a straight line from
0,100 to 200,100:
/****************************************************************************/
/*!
- \qmlclass PathQuad QQuickPathQuad
+ \qmltype PathQuad
+ \instantiates QQuickPathQuad
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathQuad defines a quadratic Bezier curve with a control point.
+ \ingroup qtquick-animation-paths
+ \brief Defines a quadratic Bezier curve with a control point
The following QML produces the path shown below:
\table
\row
- \o \image declarative-pathquad.png
- \o
+ \li \image declarative-pathquad.png
+ \li
\qml
Path {
startX: 0; startY: 0
}
/*!
- \qmlproperty real QtQuick2::PathCubic::relativeControlX
- \qmlproperty real QtQuick2::PathCubic::relativeControlY
+ \qmlproperty real QtQuick2::PathQuad::relativeControlX
+ \qmlproperty real QtQuick2::PathQuad::relativeControlY
Defines the position of the control point relative to the curve's start.
/****************************************************************************/
/*!
- \qmlclass PathCubic QQuickPathCubic
+ \qmltype PathCubic
+ \instantiates QQuickPathCubic
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathCubic defines a cubic Bezier curve with two control points.
+ \ingroup qtquick-animation-paths
+ \brief Defines a cubic Bezier curve with two control points
The following QML produces the path shown below:
\table
\row
- \o \image declarative-pathcubic.png
- \o
+ \li \image declarative-pathcubic.png
+ \li
\qml
Path {
startX: 20; startY: 0
/****************************************************************************/
/*!
- \qmlclass PathCurve QQuickPathCurve
+ \qmltype PathCurve
+ \instantiates QQuickPathCatmullRomCurve
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathCurve defines a point on a Catmull-Rom curve.
+ \ingroup qtquick-animation-paths
+ \brief Defines a point on a Catmull-Rom curve
PathCurve provides an easy way to specify a curve passing directly through a set of points.
Typically multiple PathCurves are used in a series, as the following example demonstrates:
- \snippet doc/src/snippets/qml/path/basiccurve.qml 0
+ \snippet qml/path/basiccurve.qml 0
This example produces the following path (with the starting point and PathCurve points
highlighted in red):
/****************************************************************************/
/*!
- \qmlclass PathArc QQuickPathArc
+ \qmltype PathArc
+ \instantiates QQuickPathArc
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathArc defines an arc with the given radius.
+ \ingroup qtquick-animation-paths
+ \brief Defines an arc with the given radius
PathArc provides a simple way of specifying an arc that ends at a given position
and uses the specified radius. It is modeled after the SVG elliptical arc command.
The following QML produces the path shown below:
\table
\row
- \o \image declarative-patharc.png
- \o \snippet doc/src/snippets/qml/path/basicarc.qml 0
+ \li \image declarative-patharc.png
+ \li \snippet qml/path/basicarc.qml 0
\endtable
Note that a single PathArc cannot be used to specify a circle. Instead, you can
the shape of the arc:
\table
\row
- \o \image declarative-arcradius.png
- \o \snippet doc/src/snippets/qml/path/arcradius.qml 0
+ \li \image declarative-arcradius.png
+ \li \snippet qml/path/arcradius.qml 0
\endtable
*/
\table
\row
- \o \image declarative-largearc.png
- \o \snippet doc/src/snippets/qml/path/largearc.qml 0
+ \li \image declarative-largearc.png
+ \li \snippet qml/path/largearc.qml 0
\endtable
The default value is false.
}
/*!
- \qmlproperty enum QtQuick2::PathArc::direction
+ \qmlproperty enumeration QtQuick2::PathArc::direction
Defines the direction of the arc. Possible values are
PathArc.Clockwise (default) and PathArc.Counterclockwise.
by changing the value of direction.
\table
\row
- \o \image declarative-arcdirection.png
- \o \snippet doc/src/snippets/qml/path/arcdirection.qml 0
+ \li \image declarative-arcdirection.png
+ \li \snippet qml/path/arcdirection.qml 0
\endtable
\sa useLargeArc
/****************************************************************************/
/*!
- \qmlclass PathSvg QQuickPathSvg
+ \qmltype PathSvg
+ \instantiates QQuickPathSvg
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathSvg defines a path using an SVG path data string.
+ \ingroup qtquick-animation-paths
+ \brief Defines a path using an SVG path data string
The following QML produces the path shown below:
\table
\row
- \o \image declarative-pathsvg.png
- \o
+ \li \image declarative-pathsvg.png
+ \li
\qml
Path {
startX: 50; startY: 50
/****************************************************************************/
/*!
- \qmlclass PathPercent QQuickPathPercent
+ \qmltype PathPercent
+ \instantiates QQuickPathPercent
\inqmlmodule QtQuick 2
- \ingroup qml-view-elements
- \brief The PathPercent manipulates the way a path is interpreted.
+ \ingroup qtquick-animation-paths
+ \brief Manipulates the way a path is interpreted
PathPercent allows you to manipulate the spacing between items on a
PathView's path. You can use it to bunch together items on part of
PathLine section of the path.
\table
\row
- \o \image declarative-nopercent.png
- \o
+ \li \image declarative-nopercent.png
+ \li
\qml
PathView {
// ...
}
\endqml
\row
- \o \image declarative-percent.png
- \o
+ \li \image declarative-percent.png
+ \li
\qml
PathView {
// ...