diff options
Diffstat (limited to 'src/quick/util/qdeclarativepath.cpp')
-rw-r--r-- | src/quick/util/qdeclarativepath.cpp | 1798 |
1 files changed, 0 insertions, 1798 deletions
diff --git a/src/quick/util/qdeclarativepath.cpp b/src/quick/util/qdeclarativepath.cpp deleted file mode 100644 index 2ee534880c..0000000000 --- a/src/quick/util/qdeclarativepath.cpp +++ /dev/null @@ -1,1798 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia 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. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdeclarativepath_p.h" -#include "qdeclarativepath_p_p.h" -#include "qdeclarativesvgparser_p.h" - -#include <QSet> -#include <QTime> - -#include <private/qbezier_p.h> -#include <QtCore/qmath.h> -#include <QtCore/qnumeric.h> - -QT_BEGIN_NAMESPACE - -/*! - \qmlclass PathElement QDeclarativePathElement - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief PathElement is the base path type. - - This type is the base for all path types. It cannot - be instantiated. - - \sa Path, PathAttribute, PathPercent, PathLine, PathQuad, PathCubic, PathArc, PathCurve, PathSvg -*/ - -/*! - \qmlclass Path QDeclarativePath - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief A Path object defines a path for use by \l PathView. - - A Path is composed of one or more path segments - PathLine, PathQuad, - PathCubic, PathArc, PathCurve, PathSvg. - - The spacing of the items along the Path can be adjusted via a - PathPercent object. - - PathAttribute allows named attributes with values to be defined - along the path. - - \sa PathView, PathAttribute, PathPercent, PathLine, PathQuad, PathCubic, PathArc, PathCurve, PathSvg -*/ -QDeclarativePath::QDeclarativePath(QObject *parent) - : QObject(*(new QDeclarativePathPrivate), parent) -{ -} - -QDeclarativePath::~QDeclarativePath() -{ -} - -/*! - \qmlproperty real QtQuick2::Path::startX - \qmlproperty real QtQuick2::Path::startY - These properties hold the starting position of the path. -*/ -qreal QDeclarativePath::startX() const -{ - Q_D(const QDeclarativePath); - return d->startX.isNull ? 0 : d->startX.value; -} - -void QDeclarativePath::setStartX(qreal x) -{ - Q_D(QDeclarativePath); - if (d->startX.isValid() && qFuzzyCompare(x, d->startX)) - return; - d->startX = x; - emit startXChanged(); - processPath(); -} - -bool QDeclarativePath::hasStartX() const -{ - Q_D(const QDeclarativePath); - return d->startX.isValid(); -} - -qreal QDeclarativePath::startY() const -{ - Q_D(const QDeclarativePath); - return d->startY.isNull ? 0 : d->startY.value; -} - -void QDeclarativePath::setStartY(qreal y) -{ - Q_D(QDeclarativePath); - if (d->startY.isValid() && qFuzzyCompare(y, d->startY)) - return; - d->startY = y; - emit startYChanged(); - processPath(); -} - -bool QDeclarativePath::hasStartY() const -{ - Q_D(const QDeclarativePath); - return d->startY.isValid(); -} - -/*! - \qmlproperty bool QtQuick2::Path::closed - This property holds whether the start and end of the path are identical. -*/ -bool QDeclarativePath::isClosed() const -{ - Q_D(const QDeclarativePath); - return d->closed; -} - -bool QDeclarativePath::hasEnd() const -{ - Q_D(const QDeclarativePath); - for (int i = d->_pathElements.count() - 1; i > -1; --i) { - if (QDeclarativeCurve *curve = qobject_cast<QDeclarativeCurve *>(d->_pathElements.at(i))) { - if ((!curve->hasX() && !curve->hasRelativeX()) || (!curve->hasY() && !curve->hasRelativeY())) - return false; - else - return true; - } - } - return hasStartX() && hasStartY(); -} - -/*! - \qmlproperty list<PathElement> QtQuick2::Path::pathElements - This property holds the objects composing the path. - - \default - - 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. - \endlist - - \snippet doc/src/snippets/declarative/pathview/pathattributes.qml 2 -*/ - -QDeclarativeListProperty<QDeclarativePathElement> QDeclarativePath::pathElements() -{ - Q_D(QDeclarativePath); - return QDeclarativeListProperty<QDeclarativePathElement>(this, d->_pathElements); -} - -void QDeclarativePath::interpolate(int idx, const QString &name, qreal value) -{ - Q_D(QDeclarativePath); - interpolate(d->_attributePoints, idx, name, value); -} - -void QDeclarativePath::interpolate(QList<AttributePoint> &attributePoints, int idx, const QString &name, qreal value) -{ - if (!idx) - return; - - qreal lastValue = 0; - qreal lastPercent = 0; - int search = idx - 1; - while(search >= 0) { - const AttributePoint &point = attributePoints.at(search); - if (point.values.contains(name)) { - lastValue = point.values.value(name); - lastPercent = point.origpercent; - break; - } - --search; - } - - ++search; - - const AttributePoint &curPoint = attributePoints.at(idx); - - for (int ii = search; ii < idx; ++ii) { - AttributePoint &point = attributePoints[ii]; - - qreal val = lastValue + (value - lastValue) * (point.origpercent - lastPercent) / (curPoint.origpercent - lastPercent); - point.values.insert(name, val); - } -} - -void QDeclarativePath::endpoint(const QString &name) -{ - Q_D(QDeclarativePath); - const AttributePoint &first = d->_attributePoints.first(); - qreal val = first.values.value(name); - for (int ii = d->_attributePoints.count() - 1; ii >= 0; ii--) { - const AttributePoint &point = d->_attributePoints.at(ii); - if (point.values.contains(name)) { - for (int jj = ii + 1; jj < d->_attributePoints.count(); ++jj) { - AttributePoint &setPoint = d->_attributePoints[jj]; - setPoint.values.insert(name, val); - } - return; - } - } -} - -void QDeclarativePath::endpoint(QList<AttributePoint> &attributePoints, const QString &name) -{ - const AttributePoint &first = attributePoints.first(); - qreal val = first.values.value(name); - for (int ii = attributePoints.count() - 1; ii >= 0; ii--) { - const AttributePoint &point = attributePoints.at(ii); - if (point.values.contains(name)) { - for (int jj = ii + 1; jj < attributePoints.count(); ++jj) { - AttributePoint &setPoint = attributePoints[jj]; - setPoint.values.insert(name, val); - } - return; - } - } -} - -static QString percentString(QLatin1String("_qfx_percent")); - -void QDeclarativePath::processPath() -{ - Q_D(QDeclarativePath); - - if (!d->componentComplete) - return; - - d->_pointCache.clear(); - d->prevBez.isValid = false; - - d->_path = createPath(QPointF(), QPointF(), d->_attributes, d->pathLength, d->_attributePoints, &d->closed); - - emit changed(); -} - -QPainterPath QDeclarativePath::createPath(const QPointF &startPoint, const QPointF &endPoint, const QStringList &attributes, qreal &pathLength, QList<AttributePoint> &attributePoints, bool *closed) -{ - Q_D(QDeclarativePath); - - pathLength = 0; - attributePoints.clear(); - - if (!d->componentComplete) - return QPainterPath(); - - QPainterPath path; - - AttributePoint first; - for (int ii = 0; ii < attributes.count(); ++ii) - first.values[attributes.at(ii)] = 0; - attributePoints << first; - - qreal startX = d->startX.isValid() ? d->startX.value : startPoint.x(); - qreal startY = d->startY.isValid() ? d->startY.value : startPoint.y(); - path.moveTo(startX, startY); - - bool usesPercent = false; - int index = 0; - foreach (QDeclarativePathElement *pathElement, d->_pathElements) { - if (QDeclarativeCurve *curve = qobject_cast<QDeclarativeCurve *>(pathElement)) { - QDeclarativePathData data; - data.index = index; - data.endPoint = endPoint; - data.curves = d->_pathCurves; - curve->addToPath(path, data); - AttributePoint p; - p.origpercent = path.length(); - attributePoints << p; - ++index; - } else if (QDeclarativePathAttribute *attribute = qobject_cast<QDeclarativePathAttribute *>(pathElement)) { - AttributePoint &point = attributePoints.last(); - point.values[attribute->name()] = attribute->value(); - interpolate(attributePoints, attributePoints.count() - 1, attribute->name(), attribute->value()); - } else if (QDeclarativePathPercent *percent = qobject_cast<QDeclarativePathPercent *>(pathElement)) { - AttributePoint &point = attributePoints.last(); - point.values[percentString] = percent->value(); - interpolate(attributePoints, attributePoints.count() - 1, percentString, percent->value()); - usesPercent = true; - } - } - - // Fixup end points - const AttributePoint &last = attributePoints.last(); - for (int ii = 0; ii < attributes.count(); ++ii) { - if (!last.values.contains(attributes.at(ii))) - endpoint(attributePoints, attributes.at(ii)); - } - if (usesPercent && !last.values.contains(percentString)) { - d->_attributePoints.last().values[percentString] = 1; - interpolate(d->_attributePoints.count() - 1, percentString, 1); - } - - - // Adjust percent - qreal length = path.length(); - qreal prevpercent = 0; - qreal prevorigpercent = 0; - for (int ii = 0; ii < attributePoints.count(); ++ii) { - const AttributePoint &point = attributePoints.at(ii); - if (point.values.contains(percentString)) { //special string for QDeclarativePathPercent - if ( ii > 0) { - qreal scale = (attributePoints[ii].origpercent/length - prevorigpercent) / - (point.values.value(percentString)-prevpercent); - attributePoints[ii].scale = scale; - } - attributePoints[ii].origpercent /= length; - attributePoints[ii].percent = point.values.value(percentString); - prevorigpercent = attributePoints[ii].origpercent; - prevpercent = attributePoints[ii].percent; - } else { - attributePoints[ii].origpercent /= length; - attributePoints[ii].percent = attributePoints[ii].origpercent; - } - } - - if (closed) { - QPointF end = path.currentPosition(); - *closed = length > 0 && startX == end.x() && startY == end.y(); - } - pathLength = length; - - return path; -} - -void QDeclarativePath::classBegin() -{ - Q_D(QDeclarativePath); - d->componentComplete = false; -} - -void QDeclarativePath::componentComplete() -{ - Q_D(QDeclarativePath); - QSet<QString> attrs; - d->componentComplete = true; - - // First gather up all the attributes - foreach (QDeclarativePathElement *pathElement, d->_pathElements) { - if (QDeclarativeCurve *curve = - qobject_cast<QDeclarativeCurve *>(pathElement)) - d->_pathCurves.append(curve); - else if (QDeclarativePathAttribute *attribute = - qobject_cast<QDeclarativePathAttribute *>(pathElement)) - attrs.insert(attribute->name()); - } - d->_attributes = attrs.toList(); - - processPath(); - - foreach (QDeclarativePathElement *pathElement, d->_pathElements) - connect(pathElement, SIGNAL(changed()), this, SLOT(processPath())); -} - -QPainterPath QDeclarativePath::path() const -{ - Q_D(const QDeclarativePath); - return d->_path; -} - -QStringList QDeclarativePath::attributes() const -{ - Q_D(const QDeclarativePath); - if (!d->componentComplete) { - QSet<QString> attrs; - - // First gather up all the attributes - foreach (QDeclarativePathElement *pathElement, d->_pathElements) { - if (QDeclarativePathAttribute *attribute = - qobject_cast<QDeclarativePathAttribute *>(pathElement)) - attrs.insert(attribute->name()); - } - return attrs.toList(); - } - return d->_attributes; -} - -static inline QBezier nextBezier(const QPainterPath &path, int *current, qreal *bezLength, bool reverse = false) -{ - const int lastElement = reverse ? 0 : path.elementCount() - 1; - const int start = reverse ? *current - 1 : *current + 1; - for (int i=start; reverse ? i >= lastElement : i <= lastElement; reverse ? --i : ++i) { - const QPainterPath::Element &e = path.elementAt(i); - - switch (e.type) { - case QPainterPath::MoveToElement: - break; - case QPainterPath::LineToElement: - { - QLineF line(path.elementAt(i-1), e); - *bezLength = line.length(); - QPointF a = path.elementAt(i-1); - QPointF delta = e - a; - *current = i; - return QBezier::fromPoints(a, a + delta / 3, a + 2 * delta / 3, e); - } - case QPainterPath::CurveToElement: - { - QBezier b = QBezier::fromPoints(path.elementAt(i-1), - e, - path.elementAt(i+1), - path.elementAt(i+2)); - *bezLength = b.length(); - *current = i; - return b; - } - default: - break; - } - } - *current = lastElement; - *bezLength = 0; - return QBezier(); -} - -//derivative of the equation -static inline qreal slopeAt(qreal t, qreal a, qreal b, qreal c, qreal d) -{ - return 3*t*t*(d - 3*c + 3*b - a) + 6*t*(c - 2*b + a) + 3*(b - a); -} - -void QDeclarativePath::createPointCache() const -{ - Q_D(const QDeclarativePath); - 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 lastElement = d->_path.elementCount() - 1; - d->_pointCache.resize(points+1); - - int currElement = -1; - qreal bezLength = 0; - QBezier currBez = nextBezier(d->_path, &currElement, &bezLength); - qreal currLength = bezLength; - qreal epc = currLength / pathLength; - - for (int i = 0; i < d->_pointCache.size(); i++) { - //find which set we are in - qreal prevPercent = 0; - qreal prevOrigPercent = 0; - for (int ii = 0; ii < d->_attributePoints.count(); ++ii) { - qreal percent = qreal(i)/points; - 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); - - qreal spc = prevOrigPercent + elementPercent * point.scale; - - while (spc > epc) { - if (currElement > lastElement) - break; - currBez = nextBezier(d->_path, &currElement, &bezLength); - if (bezLength == 0.0) { - currLength = pathLength; - epc = 1.0; - break; - } - currLength += bezLength; - epc = currLength / pathLength; - } - qreal realT = (pathLength * spc - (currLength - bezLength)) / bezLength; - d->_pointCache[i] = currBez.pointAt(qBound(qreal(0), realT, qreal(1))); - break; - } - prevOrigPercent = point.origpercent; - prevPercent = point.percent; - } - } -} - -void QDeclarativePath::invalidateSequentialHistory() const -{ - Q_D(const QDeclarativePath); - d->prevBez.isValid = false; -} - -QPointF QDeclarativePath::sequentialPointAt(qreal p, qreal *angle) const -{ - Q_D(const QDeclarativePath); - return sequentialPointAt(d->_path, d->pathLength, d->_attributePoints, d->prevBez, p, angle); -} - -QPointF QDeclarativePath::sequentialPointAt(const QPainterPath &path, const qreal &pathLength, const QList<AttributePoint> &attributePoints, QDeclarativeCachedBezier &prevBez, qreal p, qreal *angle) -{ - if (!prevBez.isValid) - return p > .5 ? backwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle) : - forwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle); - - return p < prevBez.p ? backwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle) : - forwardsPointAt(path, pathLength, attributePoints, prevBez, p, angle); -} - -QPointF QDeclarativePath::forwardsPointAt(const QPainterPath &path, const qreal &pathLength, const QList<AttributePoint> &attributePoints, QDeclarativeCachedBezier &prevBez, qreal p, qreal *angle) -{ - if (pathLength <= 0 || qIsNaN(pathLength)) - return path.pointAtPercent(0); //expensive? - - const int lastElement = path.elementCount() - 1; - bool haveCachedBez = prevBez.isValid; - int currElement = haveCachedBez ? prevBez.element : -1; - qreal bezLength = haveCachedBez ? prevBez.bezLength : 0; - QBezier currBez = haveCachedBez ? prevBez.bezier : nextBezier(path, &currElement, &bezLength); - qreal currLength = haveCachedBez ? prevBez.currLength : bezLength; - qreal epc = currLength / pathLength; - - //find which set we are in - qreal prevPercent = 0; - qreal prevOrigPercent = 0; - for (int ii = 0; ii < attributePoints.count(); ++ii) { - qreal percent = p; - const AttributePoint &point = attributePoints.at(ii); - if (percent < point.percent || ii == attributePoints.count() - 1) { - qreal elementPercent = (percent - prevPercent); - - qreal spc = prevOrigPercent + elementPercent * point.scale; - - while (spc > epc) { - Q_ASSERT(!(currElement > lastElement)); - Q_UNUSED(lastElement); - currBez = nextBezier(path, &currElement, &bezLength); - currLength += bezLength; - epc = currLength / pathLength; - } - prevBez.element = currElement; - prevBez.bezLength = bezLength; - prevBez.currLength = currLength; - prevBez.bezier = currBez; - prevBez.p = p; - prevBez.isValid = true; - - qreal realT = (pathLength * spc - (currLength - bezLength)) / bezLength; - - if (angle) { - qreal m1 = slopeAt(realT, currBez.x1, currBez.x2, currBez.x3, currBez.x4); - qreal m2 = slopeAt(realT, currBez.y1, currBez.y2, currBez.y3, currBez.y4); - *angle = QLineF(0, 0, m1, m2).angle(); - } - - return currBez.pointAt(qBound(qreal(0), realT, qreal(1))); - } - prevOrigPercent = point.origpercent; - prevPercent = point.percent; - } - - return QPointF(0,0); -} - -//ideally this should be merged with forwardsPointAt -QPointF QDeclarativePath::backwardsPointAt(const QPainterPath &path, const qreal &pathLength, const QList<AttributePoint> &attributePoints, QDeclarativeCachedBezier &prevBez, qreal p, qreal *angle) -{ - if (pathLength <= 0 || qIsNaN(pathLength)) - return path.pointAtPercent(0); - - const int firstElement = 1; //element 0 is always a MoveTo, which we ignore - bool haveCachedBez = prevBez.isValid; - int currElement = haveCachedBez ? prevBez.element : path.elementCount(); - qreal bezLength = haveCachedBez ? prevBez.bezLength : 0; - QBezier currBez = haveCachedBez ? prevBez.bezier : nextBezier(path, &currElement, &bezLength, true /*reverse*/); - qreal currLength = haveCachedBez ? prevBez.currLength : pathLength; - qreal prevLength = currLength - bezLength; - qreal epc = prevLength / pathLength; - - for (int ii = attributePoints.count() - 1; ii > 0; --ii) { - qreal percent = p; - const AttributePoint &point = attributePoints.at(ii); - const AttributePoint &prevPoint = attributePoints.at(ii-1); - if (percent > prevPoint.percent || ii == 1) { - qreal elementPercent = (percent - prevPoint.percent); - - qreal spc = prevPoint.origpercent + elementPercent * point.scale; - - while (spc < epc) { - Q_ASSERT(!(currElement < firstElement)); - Q_UNUSED(firstElement); - currBez = nextBezier(path, &currElement, &bezLength, true /*reverse*/); - //special case for first element is to avoid floating point math - //causing an epc that never hits 0. - currLength = (currElement == firstElement) ? bezLength : prevLength; - prevLength = currLength - bezLength; - epc = prevLength / pathLength; - } - prevBez.element = currElement; - prevBez.bezLength = bezLength; - prevBez.currLength = currLength; - prevBez.bezier = currBez; - prevBez.p = p; - prevBez.isValid = true; - - qreal realT = (pathLength * spc - (currLength - bezLength)) / bezLength; - - if (angle) { - qreal m1 = slopeAt(realT, currBez.x1, currBez.x2, currBez.x3, currBez.x4); - qreal m2 = slopeAt(realT, currBez.y1, currBez.y2, currBez.y3, currBez.y4); - *angle = QLineF(0, 0, m1, m2).angle(); - } - - return currBez.pointAt(qBound(qreal(0), realT, qreal(1))); - } - } - - return QPointF(0,0); -} - -QPointF QDeclarativePath::pointAt(qreal p) const -{ - Q_D(const QDeclarativePath); - if (d->_pointCache.isEmpty()) { - createPointCache(); - if (d->_pointCache.isEmpty()) - return QPointF(); - } - - const int pointCacheSize = d->_pointCache.size(); - qreal idxf = p*pointCacheSize; - int idx1 = qFloor(idxf); - qreal delta = idxf - idx1; - if (idx1 >= pointCacheSize) - idx1 = pointCacheSize - 1; - else if (idx1 < 0) - idx1 = 0; - - if (delta == 0.0) - return d->_pointCache.at(idx1); - - // interpolate between the two points. - int idx2 = qCeil(idxf); - if (idx2 >= pointCacheSize) - idx2 = pointCacheSize - 1; - else if (idx2 < 0) - idx2 = 0; - - QPointF p1 = d->_pointCache.at(idx1); - QPointF p2 = d->_pointCache.at(idx2); - QPointF pos = p1 * (1.0-delta) + p2 * delta; - - return pos; -} - -qreal QDeclarativePath::attributeAt(const QString &name, qreal percent) const -{ - Q_D(const QDeclarativePath); - if (percent < 0 || percent > 1) - return 0; - - for (int ii = 0; ii < d->_attributePoints.count(); ++ii) { - const AttributePoint &point = d->_attributePoints.at(ii); - - if (point.percent == percent) { - return point.values.value(name); - } else if (point.percent > percent) { - qreal lastValue = - ii?(d->_attributePoints.at(ii - 1).values.value(name)):0; - qreal lastPercent = - ii?(d->_attributePoints.at(ii - 1).percent):0; - qreal curValue = point.values.value(name); - qreal curPercent = point.percent; - - return lastValue + (curValue - lastValue) * (percent - lastPercent) / (curPercent - lastPercent); - } - } - - return 0; -} - -/****************************************************************************/ - -qreal QDeclarativeCurve::x() const -{ - return _x.isNull ? 0 : _x.value; -} - -void QDeclarativeCurve::setX(qreal x) -{ - if (_x.isNull || _x != x) { - _x = x; - emit xChanged(); - emit changed(); - } -} - -bool QDeclarativeCurve::hasX() -{ - return _x.isValid(); -} - -qreal QDeclarativeCurve::y() const -{ - return _y.isNull ? 0 : _y.value; -} - -void QDeclarativeCurve::setY(qreal y) -{ - if (_y.isNull || _y != y) { - _y = y; - emit yChanged(); - emit changed(); - } -} - -bool QDeclarativeCurve::hasY() -{ - return _y.isValid(); -} - -qreal QDeclarativeCurve::relativeX() const -{ - return _relativeX; -} - -void QDeclarativeCurve::setRelativeX(qreal x) -{ - if (_relativeX.isNull || _relativeX != x) { - _relativeX = x; - emit relativeXChanged(); - emit changed(); - } -} - -bool QDeclarativeCurve::hasRelativeX() -{ - return _relativeX.isValid(); -} - -qreal QDeclarativeCurve::relativeY() const -{ - return _relativeY; -} - -void QDeclarativeCurve::setRelativeY(qreal y) -{ - if (_relativeY.isNull || _relativeY != y) { - _relativeY = y; - emit relativeYChanged(); - emit changed(); - } -} - -bool QDeclarativeCurve::hasRelativeY() -{ - return _relativeY.isValid(); -} - -/****************************************************************************/ - -/*! - \qmlclass PathAttribute QDeclarativePathAttribute - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathAttribute allows setting 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}. - The value of an attribute at any particular point along the path is interpolated - from the PathAttributes bounding that point. - - The example below shows a path with the items scaled to 30% with - opacity 50% at the top of the path and scaled 100% with opacity - 100% at the bottom. Note the use of the PathView.iconScale and - PathView.iconOpacity attached properties to set the scale and opacity - of the delegate. - - \table - \row - \o \image declarative-pathattribute.png - \o - \snippet doc/src/snippets/declarative/pathview/pathattributes.qml 0 - (see the PathView documentation for the specification of ContactModel.qml - used for ContactModel above.) - \endtable - - - \sa Path -*/ - -/*! - \qmlproperty string QtQuick2::PathAttribute::name - This property holds the name of the attribute to change. - - This attribute will be available to the delegate as PathView.<name> - - 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} - which in no way clashes with existing properties. -*/ - -/*! - the name of the attribute to change. -*/ - -QString QDeclarativePathAttribute::name() const -{ - return _name; -} - -void QDeclarativePathAttribute::setName(const QString &name) -{ - if (_name == name) - return; - _name = name; - emit nameChanged(); -} - -/*! - \qmlproperty real QtQuick2::PathAttribute::value - This property holds the value for the attribute. - - The value specified can be used to influence the visual appearance - of an item along the path. For example, the following Path specifies - an attribute named \e itemRotation, which has the value \e 0 at the - beginning of the path, and the value 90 at the end of the path. - - \qml - Path { - startX: 0 - startY: 0 - PathAttribute { name: "itemRotation"; value: 0 } - PathLine { x: 100; y: 100 } - PathAttribute { name: "itemRotation"; value: 90 } - } - \endqml - - In our delegate, we can then bind the \e rotation property to the - \l{qdeclarativeintroduction.html#attached-properties} {Attached Property} - \e PathView.itemRotation created for this attribute. - - \qml - Rectangle { - width: 10; height: 10 - rotation: PathView.itemRotation - } - \endqml - - As each item is positioned along the path, it will be rotated accordingly: - an item at the beginning of the path with be not be rotated, an item at - the end of the path will be rotated 90 degrees, and an item mid-way along - the path will be rotated 45 degrees. -*/ - -/*! - the new value of the attribute. -*/ -qreal QDeclarativePathAttribute::value() const -{ - return _value; -} - -void QDeclarativePathAttribute::setValue(qreal value) -{ - if (_value != value) { - _value = value; - emit valueChanged(); - emit changed(); - } -} - -/****************************************************************************/ - -/*! - \qmlclass PathLine QDeclarativePathLine - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathLine defines a straight line. - - The example below creates a path consisting of a straight line from - 0,100 to 200,100: - - \qml - Path { - startX: 0; startY: 100 - PathLine { x: 200; y: 100 } - } - \endqml - - \sa Path, PathQuad, PathCubic, PathArc, PathCurve, PathSvg -*/ - -/*! - \qmlproperty real QtQuick2::PathLine::x - \qmlproperty real QtQuick2::PathLine::y - - Defines the end point of the line. - - \sa relativeX, relativeY -*/ - -/*! - \qmlproperty real QtQuick2::PathLine::relativeX - \qmlproperty real QtQuick2::PathLine::relativeY - - Defines the end point of the line relative to its start. - - If both a relative and absolute end position are specified for a single axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative x - and an absolute y. - - \sa x, y -*/ - -inline QPointF positionForCurve(const QDeclarativePathData &data, const QPointF &prevPoint) -{ - QDeclarativeCurve *curve = data.curves.at(data.index); - bool isEnd = data.index == data.curves.size() - 1; - return QPointF(curve->hasRelativeX() ? prevPoint.x() + curve->relativeX() : !isEnd || curve->hasX() ? curve->x() : data.endPoint.x(), - curve->hasRelativeY() ? prevPoint.y() + curve->relativeY() : !isEnd || curve->hasY() ? curve->y() : data.endPoint.y()); -} - -void QDeclarativePathLine::addToPath(QPainterPath &path, const QDeclarativePathData &data) -{ - path.lineTo(positionForCurve(data, path.currentPosition())); -} - -/****************************************************************************/ - -/*! - \qmlclass PathQuad QDeclarativePathQuad - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathQuad 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 - \qml - Path { - startX: 0; startY: 0 - PathQuad { x: 200; y: 0; controlX: 100; controlY: 150 } - } - \endqml - \endtable - - \sa Path, PathCubic, PathLine, PathArc, PathCurve, PathSvg -*/ - -/*! - \qmlproperty real QtQuick2::PathQuad::x - \qmlproperty real QtQuick2::PathQuad::y - - Defines the end point of the curve. - - \sa relativeX, relativeY -*/ - -/*! - \qmlproperty real QtQuick2::PathQuad::relativeX - \qmlproperty real QtQuick2::PathQuad::relativeY - - Defines the end point of the curve relative to its start. - - If both a relative and absolute end position are specified for a single axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative x - and an absolute y. - - \sa x, y -*/ - -/*! - \qmlproperty real QtQuick2::PathQuad::controlX - \qmlproperty real QtQuick2::PathQuad::controlY - - Defines the position of the control point. -*/ - -/*! - the x position of the control point. -*/ -qreal QDeclarativePathQuad::controlX() const -{ - return _controlX; -} - -void QDeclarativePathQuad::setControlX(qreal x) -{ - if (_controlX != x) { - _controlX = x; - emit controlXChanged(); - emit changed(); - } -} - - -/*! - the y position of the control point. -*/ -qreal QDeclarativePathQuad::controlY() const -{ - return _controlY; -} - -void QDeclarativePathQuad::setControlY(qreal y) -{ - if (_controlY != y) { - _controlY = y; - emit controlYChanged(); - emit changed(); - } -} - -/*! - \qmlproperty real QtQuick2::PathCubic::relativeControlX - \qmlproperty real QtQuick2::PathCubic::relativeControlY - - Defines the position of the control point relative to the curve's start. - - If both a relative and absolute control position are specified for a single axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative control x - and an absolute control y. - - \sa controlX, controlY -*/ - -qreal QDeclarativePathQuad::relativeControlX() const -{ - return _relativeControlX; -} - -void QDeclarativePathQuad::setRelativeControlX(qreal x) -{ - if (_relativeControlX.isNull || _relativeControlX != x) { - _relativeControlX = x; - emit relativeControlXChanged(); - emit changed(); - } -} - -bool QDeclarativePathQuad::hasRelativeControlX() -{ - return _relativeControlX.isValid(); -} - -qreal QDeclarativePathQuad::relativeControlY() const -{ - return _relativeControlY; -} - -void QDeclarativePathQuad::setRelativeControlY(qreal y) -{ - if (_relativeControlY.isNull || _relativeControlY != y) { - _relativeControlY = y; - emit relativeControlYChanged(); - emit changed(); - } -} - -bool QDeclarativePathQuad::hasRelativeControlY() -{ - return _relativeControlY.isValid(); -} - -void QDeclarativePathQuad::addToPath(QPainterPath &path, const QDeclarativePathData &data) -{ - const QPointF &prevPoint = path.currentPosition(); - QPointF controlPoint(hasRelativeControlX() ? prevPoint.x() + relativeControlX() : controlX(), - hasRelativeControlY() ? prevPoint.y() + relativeControlY() : controlY()); - path.quadTo(controlPoint, positionForCurve(data, path.currentPosition())); -} - -/****************************************************************************/ - -/*! - \qmlclass PathCubic QDeclarativePathCubic - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathCubic 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 - \qml - Path { - startX: 20; startY: 0 - PathCubic { - x: 180; y: 0 - control1X: -10; control1Y: 90 - control2X: 210; control2Y: 90 - } - } - \endqml - \endtable - - \sa Path, PathQuad, PathLine, PathArc, PathCurve, PathSvg -*/ - -/*! - \qmlproperty real QtQuick2::PathCubic::x - \qmlproperty real QtQuick2::PathCubic::y - - Defines the end point of the curve. - - \sa relativeX, relativeY -*/ - -/*! - \qmlproperty real QtQuick2::PathCubic::relativeX - \qmlproperty real QtQuick2::PathCubic::relativeY - - Defines the end point of the curve relative to its start. - - If both a relative and absolute end position are specified for a single axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative x - and an absolute y. - - \sa x, y -*/ - -/*! - \qmlproperty real QtQuick2::PathCubic::control1X - \qmlproperty real QtQuick2::PathCubic::control1Y - - Defines the position of the first control point. -*/ -qreal QDeclarativePathCubic::control1X() const -{ - return _control1X; -} - -void QDeclarativePathCubic::setControl1X(qreal x) -{ - if (_control1X != x) { - _control1X = x; - emit control1XChanged(); - emit changed(); - } -} - -qreal QDeclarativePathCubic::control1Y() const -{ - return _control1Y; -} - -void QDeclarativePathCubic::setControl1Y(qreal y) -{ - if (_control1Y != y) { - _control1Y = y; - emit control1YChanged(); - emit changed(); - } -} - -/*! - \qmlproperty real QtQuick2::PathCubic::control2X - \qmlproperty real QtQuick2::PathCubic::control2Y - - Defines the position of the second control point. -*/ -qreal QDeclarativePathCubic::control2X() const -{ - return _control2X; -} - -void QDeclarativePathCubic::setControl2X(qreal x) -{ - if (_control2X != x) { - _control2X = x; - emit control2XChanged(); - emit changed(); - } -} - -qreal QDeclarativePathCubic::control2Y() const -{ - return _control2Y; -} - -void QDeclarativePathCubic::setControl2Y(qreal y) -{ - if (_control2Y != y) { - _control2Y = y; - emit control2YChanged(); - emit changed(); - } -} - -/*! - \qmlproperty real QtQuick2::PathCubic::relativeControl1X - \qmlproperty real QtQuick2::PathCubic::relativeControl1Y - \qmlproperty real QtQuick2::PathCubic::relativeControl2X - \qmlproperty real QtQuick2::PathCubic::relativeControl2Y - - Defines the positions of the control points relative to the curve's start. - - If both a relative and absolute control position are specified for a control point's axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative control1 x - and an absolute control1 y. - - \sa control1X, control1Y, control2X, control2Y -*/ - -qreal QDeclarativePathCubic::relativeControl1X() const -{ - return _relativeControl1X; -} - -void QDeclarativePathCubic::setRelativeControl1X(qreal x) -{ - if (_relativeControl1X.isNull || _relativeControl1X != x) { - _relativeControl1X = x; - emit relativeControl1XChanged(); - emit changed(); - } -} - -bool QDeclarativePathCubic::hasRelativeControl1X() -{ - return _relativeControl1X.isValid(); -} - -qreal QDeclarativePathCubic::relativeControl1Y() const -{ - return _relativeControl1Y; -} - -void QDeclarativePathCubic::setRelativeControl1Y(qreal y) -{ - if (_relativeControl1Y.isNull || _relativeControl1Y != y) { - _relativeControl1Y = y; - emit relativeControl1YChanged(); - emit changed(); - } -} - -bool QDeclarativePathCubic::hasRelativeControl1Y() -{ - return _relativeControl1Y.isValid(); -} - -qreal QDeclarativePathCubic::relativeControl2X() const -{ - return _relativeControl2X; -} - -void QDeclarativePathCubic::setRelativeControl2X(qreal x) -{ - if (_relativeControl2X.isNull || _relativeControl2X != x) { - _relativeControl2X = x; - emit relativeControl2XChanged(); - emit changed(); - } -} - -bool QDeclarativePathCubic::hasRelativeControl2X() -{ - return _relativeControl2X.isValid(); -} - -qreal QDeclarativePathCubic::relativeControl2Y() const -{ - return _relativeControl2Y; -} - -void QDeclarativePathCubic::setRelativeControl2Y(qreal y) -{ - if (_relativeControl2Y.isNull || _relativeControl2Y != y) { - _relativeControl2Y = y; - emit relativeControl2YChanged(); - emit changed(); - } -} - -bool QDeclarativePathCubic::hasRelativeControl2Y() -{ - return _relativeControl2Y.isValid(); -} - -void QDeclarativePathCubic::addToPath(QPainterPath &path, const QDeclarativePathData &data) -{ - const QPointF &prevPoint = path.currentPosition(); - QPointF controlPoint1(hasRelativeControl1X() ? prevPoint.x() + relativeControl1X() : control1X(), - hasRelativeControl1Y() ? prevPoint.y() + relativeControl1Y() : control1Y()); - QPointF controlPoint2(hasRelativeControl2X() ? prevPoint.x() + relativeControl2X() : control2X(), - hasRelativeControl2Y() ? prevPoint.y() + relativeControl2Y() : control2Y()); - path.cubicTo(controlPoint1, controlPoint2, positionForCurve(data, path.currentPosition())); -} - -/****************************************************************************/ - -/*! - \qmlclass PathCurve QDeclarativePathCurve - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathCurve 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/declarative/path/basiccurve.qml 0 - - This example produces the following path (with the starting point and PathCurve points - highlighted in red): - - \image declarative-pathcurve.png - - \sa Path, PathLine, PathQuad, PathCubic, PathArc, PathSvg -*/ - -/*! - \qmlproperty real QtQuick2::PathCurve::x - \qmlproperty real QtQuick2::PathCurve::y - - Defines the end point of the curve. - - \sa relativeX, relativeY -*/ - -/*! - \qmlproperty real QtQuick2::PathCurve::relativeX - \qmlproperty real QtQuick2::PathCurve::relativeY - - Defines the end point of the curve relative to its start. - - If both a relative and absolute end position are specified for a single axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative x - and an absolute y. - - \sa x, y -*/ - -inline QPointF previousPathPosition(const QPainterPath &path) -{ - int count = path.elementCount(); - if (count < 1) - return QPointF(); - - int index = path.elementAt(count-1).type == QPainterPath::CurveToDataElement ? count - 4 : count - 2; - return index > -1 ? QPointF(path.elementAt(index)) : path.pointAtPercent(0); -} - -void QDeclarativePathCatmullRomCurve::addToPath(QPainterPath &path, const QDeclarativePathData &data) -{ - //here we convert catmull-rom spline to bezier for use in QPainterPath. - //basic conversion algorithm: - // catmull-rom points * inverse bezier matrix * catmull-rom matrix = bezier points - //each point in the catmull-rom spline produces a bezier endpoint + 2 control points - //calculations for each point use a moving window of 4 points - // (previous 2 points + current point + next point) - QPointF prevFar, prev, point, next; - - //get previous points - int index = data.index - 1; - QDeclarativeCurve *curve = index == -1 ? 0 : data.curves.at(index); - if (qobject_cast<QDeclarativePathCatmullRomCurve*>(curve)) { - prev = path.currentPosition(); - prevFar = previousPathPosition(path); - } else { - prev = path.currentPosition(); - bool prevFarSet = false; - if (index == -1 && data.curves.count() > 1) { - if (qobject_cast<QDeclarativePathCatmullRomCurve*>(data.curves.at(data.curves.count()-1))) { - //TODO: profile and optimize - QPointF pos = prev; - QDeclarativePathData loopData; - loopData.endPoint = data.endPoint; - loopData.curves = data.curves; - for (int i = data.index; i < data.curves.count(); ++i) { - loopData.index = i; - pos = positionForCurve(loopData, pos); - if (i == data.curves.count()-2) - prevFar = pos; - } - if (pos == QPointF(path.elementAt(0))) { - //this is a closed path starting and ending with catmull-rom segments. - //we try to smooth the join point - prevFarSet = true; - } - } - } - if (!prevFarSet) - prevFar = prev; - } - - //get current point - point = positionForCurve(data, path.currentPosition()); - - //get next point - index = data.index + 1; - if (index < data.curves.count() && qobject_cast<QDeclarativePathCatmullRomCurve*>(data.curves.at(index))) { - QDeclarativePathData nextData; - nextData.index = index; - nextData.endPoint = data.endPoint; - nextData.curves = data.curves; - next = positionForCurve(nextData, point); - } else { - if (point == QPointF(path.elementAt(0)) && qobject_cast<QDeclarativePathCatmullRomCurve*>(data.curves.at(0))) { - //this is a closed path starting and ending with catmull-rom segments. - //we try to smooth the join point - next = QPointF(path.elementAt(3)); //the first catmull-rom point - } else - next = point; - } - - /* - full conversion matrix (inverse bezier * catmull-rom): - 0.000, 1.000, 0.000, 0.000, - -0.167, 1.000, 0.167, 0.000, - 0.000, 0.167, 1.000, -0.167, - 0.000, 0.000, 1.000, 0.000 - - conversion doesn't require full matrix multiplication, - so below we simplify - */ - QPointF control1(prevFar.x() * qreal(-0.167) + - prev.x() + - point.x() * qreal(0.167), - prevFar.y() * qreal(-0.167) + - prev.y() + - point.y() * qreal(0.167)); - - QPointF control2(prev.x() * qreal(0.167) + - point.x() + - next.x() * qreal(-0.167), - prev.y() * qreal(0.167) + - point.y() + - next.y() * qreal(-0.167)); - - path.cubicTo(control1, control2, point); -} - -/****************************************************************************/ - -/*! - \qmlclass PathArc QDeclarativePathArc - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathArc 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/declarative/path/basicarc.qml 0 - \endtable - - Note that a single PathArc cannot be used to specify a circle. Instead, you can - use two PathArc elements, each specifying half of the circle. - - \sa Path, PathLine, PathQuad, PathCubic, PathCurve, PathSvg -*/ - -/*! - \qmlproperty real QtQuick2::PathArc::x - \qmlproperty real QtQuick2::PathArc::y - - Defines the end point of the arc. - - \sa relativeX, relativeY -*/ - -/*! - \qmlproperty real QtQuick2::PathArc::relativeX - \qmlproperty real QtQuick2::PathArc::relativeY - - Defines the end point of the arc relative to its start. - - If both a relative and absolute end position are specified for a single axis, the relative - position will be used. - - Relative and absolute positions can be mixed, for example it is valid to set a relative x - and an absolute y. - - \sa x, y -*/ - -/*! - \qmlproperty real QtQuick2::PathArc::radiusX - \qmlproperty real QtQuick2::PathArc::radiusY - - Defines the radius of the arc. - - The following QML demonstrates how different radius values can be used to change - the shape of the arc: - \table - \row - \o \image declarative-arcradius.png - \o \snippet doc/src/snippets/declarative/path/arcradius.qml 0 - \endtable -*/ - -qreal QDeclarativePathArc::radiusX() const -{ - return _radiusX; -} - -void QDeclarativePathArc::setRadiusX(qreal radius) -{ - if (_radiusX == radius) - return; - - _radiusX = radius; - emit radiusXChanged(); -} - -qreal QDeclarativePathArc::radiusY() const -{ - return _radiusY; -} - -void QDeclarativePathArc::setRadiusY(qreal radius) -{ - if (_radiusY == radius) - return; - - _radiusY = radius; - emit radiusYChanged(); -} - -/*! - \qmlproperty bool QtQuick2::PathArc::useLargeArc - Whether to use a large arc as defined by the arc points. - - Given fixed start and end positions, radius, and direction, - there are two possible arcs that can fit the data. useLargeArc - is used to distinguish between these. For example, the following - QML can produce either of the two illustrated arcs below by - changing the value of useLargeArc. - - \table - \row - \o \image declarative-largearc.png - \o \snippet doc/src/snippets/declarative/path/largearc.qml 0 - \endtable - - The default value is false. -*/ - -bool QDeclarativePathArc::useLargeArc() const -{ - return _useLargeArc; -} - -void QDeclarativePathArc::setUseLargeArc(bool largeArc) -{ - if (_useLargeArc == largeArc) - return; - - _useLargeArc = largeArc; - emit useLargeArcChanged(); -} - -/*! - \qmlproperty enum QtQuick2::PathArc::direction - - Defines the direction of the arc. Possible values are - PathArc.Clockwise (default) and PathArc.Counterclockwise. - - The following QML can produce either of the two illustrated arcs below - by changing the value of direction. - \table - \row - \o \image declarative-arcdirection.png - \o \snippet doc/src/snippets/declarative/path/arcdirection.qml 0 - \endtable - - \sa useLargeArc -*/ - -QDeclarativePathArc::ArcDirection QDeclarativePathArc::direction() const -{ - return _direction; -} - -void QDeclarativePathArc::setDirection(ArcDirection direction) -{ - if (_direction == direction) - return; - - _direction = direction; - emit directionChanged(); -} - -void QDeclarativePathArc::addToPath(QPainterPath &path, const QDeclarativePathData &data) -{ - const QPointF &startPoint = path.currentPosition(); - const QPointF &endPoint = positionForCurve(data, startPoint); - QDeclarativeSvgParser::pathArc(path, - _radiusX, - _radiusY, - 0, //xAxisRotation - _useLargeArc, - _direction == Clockwise ? 1 : 0, - endPoint.x(), - endPoint.y(), - startPoint.x(), startPoint.y()); -} - -/****************************************************************************/ - -/*! - \qmlclass PathSvg QDeclarativePathSvg - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathSvg 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 - \qml - Path { - startX: 50; startY: 50 - PathSvg { path: "L 150 50 L 100 150 z" } - } - \endqml - \endtable - - \sa Path, PathLine, PathQuad, PathCubic, PathArc, PathCurve -*/ - -/*! - \qmlproperty string QtQuick2::PathSvg::path - - The SVG path data string specifying the path. - - See \l {http://www.w3.org/TR/SVG/paths.html#PathData}{W3C SVG Path Data} - for more details on this format. -*/ - -QString QDeclarativePathSvg::path() const -{ - return _path; -} - -void QDeclarativePathSvg::setPath(const QString &path) -{ - if (_path == path) - return; - - _path = path; - emit pathChanged(); -} - -void QDeclarativePathSvg::addToPath(QPainterPath &path, const QDeclarativePathData &) -{ - QDeclarativeSvgParser::parsePathDataFast(_path, path); -} - -/****************************************************************************/ - -/*! - \qmlclass PathPercent QDeclarativePathPercent - \inqmlmodule QtQuick 2 - \ingroup qml-view-elements - \brief The PathPercent 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 - the path, and spread them out on other parts of the path. - - The examples below show the normal distribution of items along a path - compared to a distribution which places 50% of the items along the - PathLine section of the path. - \table - \row - \o \image declarative-nopercent.png - \o - \qml - PathView { - // ... - Path { - startX: 20; startY: 0 - PathQuad { x: 50; y: 80; controlX: 0; controlY: 80 } - PathLine { x: 150; y: 80 } - PathQuad { x: 180; y: 0; controlX: 200; controlY: 80 } - } - } - \endqml - \row - \o \image declarative-percent.png - \o - \qml - PathView { - // ... - Path { - startX: 20; startY: 0 - PathQuad { x: 50; y: 80; controlX: 0; controlY: 80 } - PathPercent { value: 0.25 } - PathLine { x: 150; y: 80 } - PathPercent { value: 0.75 } - PathQuad { x: 180; y: 0; controlX: 200; controlY: 80 } - PathPercent { value: 1 } - } - } - \endqml - \endtable - - \sa Path -*/ - -/*! - \qmlproperty real QtQuick2::PathPercent::value - The proportion of items that should be laid out up to this point. - - This value should always be higher than the last value specified - by a PathPercent at a previous position in the Path. - - In the following example we have a Path made up of three PathLines. - Normally, the items of the PathView would be laid out equally along - this path, with an equal number of items per line segment. PathPercent - allows us to specify that the first and third lines should each hold - 10% of the laid out items, while the second line should hold the remaining - 80%. - - \qml - PathView { - // ... - Path { - startX: 0; startY: 0 - PathLine { x:100; y: 0; } - PathPercent { value: 0.1 } - PathLine { x: 100; y: 100 } - PathPercent { value: 0.9 } - PathLine { x: 100; y: 0 } - PathPercent { value: 1 } - } - } - \endqml -*/ - -qreal QDeclarativePathPercent::value() const -{ - return _value; -} - -void QDeclarativePathPercent::setValue(qreal value) -{ - if (_value != value) { - _value = value; - emit valueChanged(); - emit changed(); - } -} -QT_END_NAMESPACE |