diff options
Diffstat (limited to 'src/imports/timeline/qquicktimeline.cpp')
-rw-r--r-- | src/imports/timeline/qquicktimeline.cpp | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/src/imports/timeline/qquicktimeline.cpp b/src/imports/timeline/qquicktimeline.cpp new file mode 100644 index 0000000..9f9c977 --- /dev/null +++ b/src/imports/timeline/qquicktimeline.cpp @@ -0,0 +1,219 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd +** All rights reserved. +** For any questions to The Qt Company, please use contact form at http://www.qt.io/contact-us +** +** This file is part of the Qt Enterprise Qt Quick Timeline Add-on. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. +** +** If you have questions regarding the use of this file, please use +** contact form at http://www.qt.io/contact-us +** +****************************************************************************/ + +#include "qquicktimeline_p.h" + +#include <QtCore/qmath.h> +#include <QtGui/qpainter.h> +#include <QtQuick/private/qquickitem_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickTimelinePrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QQuickTimeline) +public: + QQuickTimelinePrivate() + : startFrame(0), + endFrame(0), + currentFrame(0), + enabled(false), + componentComplete(true) + { + } + + qreal startFrame; + qreal endFrame; + qreal currentFrame; + + bool enabled:1; + bool componentComplete:1; + +protected: + void init(); + void disable(); + + static void append_keyframe(QQmlListProperty<QQuickKeyframes> *list, QQuickKeyframes *a); + static int keyframe_count(QQmlListProperty<QQuickKeyframes> *list); + static QQuickKeyframes* keyframe_at(QQmlListProperty<QQuickKeyframes> *list, int pos); + static void clear_keyframes(QQmlListProperty<QQuickKeyframes> *list); + + QList<QQuickKeyframes *> keyframes; +}; + +void QQuickTimelinePrivate::init() +{ + for (auto keyFrames : keyframes) { + keyFrames->init(); + keyFrames->setProperty(currentFrame); + } +} + +void QQuickTimelinePrivate::disable() +{ + for (auto keyFrames : keyframes) + keyFrames->resetDefaultValue(); +} + +void QQuickTimelinePrivate::append_keyframe(QQmlListProperty<QQuickKeyframes> *list, QQuickKeyframes *a) +{ + QQuickTimeline *q = static_cast<QQuickTimeline *>(list->object); + q->d_func()->keyframes.append(a); +} + +int QQuickTimelinePrivate::keyframe_count(QQmlListProperty<QQuickKeyframes> *list) +{ + QQuickTimeline *q = static_cast<QQuickTimeline *>(list->object); + return q->d_func()->keyframes.count(); +} + +QQuickKeyframes* QQuickTimelinePrivate::keyframe_at(QQmlListProperty<QQuickKeyframes> *list, int pos) +{ + QQuickTimeline *q = static_cast<QQuickTimeline *>(list->object); + return q->d_func()->keyframes.at(pos); +} + +void QQuickTimelinePrivate::clear_keyframes(QQmlListProperty<QQuickKeyframes> *list) +{ + QQuickTimeline *q = static_cast<QQuickTimeline *>(list->object); + while (q->d_func()->keyframes.count()) { + QQuickKeyframes *firstKeyframe = q->d_func()->keyframes.at(0); + q->d_func()->keyframes.removeAll(firstKeyframe); + } +} + +QQuickTimeline::QQuickTimeline(QObject *parent) : QObject(*(new QQuickTimelinePrivate), parent) +{ + +} + +QQmlListProperty<QQuickKeyframes> QQuickTimeline::keyframes() +{ + Q_D(QQuickTimeline); + + return QQmlListProperty<QQuickKeyframes>(this, &d->keyframes, QQuickTimelinePrivate::append_keyframe, + QQuickTimelinePrivate::keyframe_count, + QQuickTimelinePrivate::keyframe_at, + QQuickTimelinePrivate::clear_keyframes); +} + +bool QQuickTimeline::enabled() const +{ + Q_D(const QQuickTimeline); + return d->enabled; +} + +void QQuickTimeline::setEnabled(bool b) +{ + Q_D(QQuickTimeline); + if (d->enabled == b) + return; + d->enabled = b; + + if (d->componentComplete) { + if (b) + init(); + else + reset(); + } + + emit enabledChanged(); +} + +qreal QQuickTimeline::startFrame() const +{ + Q_D(const QQuickTimeline); + return d->startFrame; +} + +void QQuickTimeline::setStartFrame(qreal frame) +{ + Q_D(QQuickTimeline); + if (d->startFrame == frame) + return; + d->startFrame = frame; + emit startFrameChanged(); +} + +qreal QQuickTimeline::endFrame() const +{ + Q_D(const QQuickTimeline); + return d->endFrame; +} + +void QQuickTimeline::setEndFrame(qreal frame) +{ + Q_D(QQuickTimeline); + if (d->endFrame == frame) + return; + d->endFrame = frame; + emit endFrameChanged(); +} + +qreal QQuickTimeline::currentFrame() const +{ + Q_D(const QQuickTimeline); + return d->currentFrame; +} + +void QQuickTimeline::setCurrentFrame(qreal frame) +{ + Q_D(QQuickTimeline); + if (d->currentFrame == frame) + return; + d->currentFrame = frame; + + if (d->componentComplete && d->enabled) + for (auto keyFrames : d->keyframes) + keyFrames->setProperty(d->currentFrame); + + emit currentFrameChanged(); +} + +void QQuickTimeline::init() +{ + Q_D(QQuickTimeline); + + if (d->componentComplete) + d->init(); +} + +void QQuickTimeline::reset() +{ + Q_D(QQuickTimeline); + + if (d->componentComplete) + d->disable(); +} + +void QQuickTimeline::classBegin() +{ + Q_D(QQuickTimeline); + d->componentComplete = false; +} + +void QQuickTimeline::componentComplete() +{ + Q_D(QQuickTimeline); + d->componentComplete = true; + + if (d->enabled) + init(); +} + +QT_END_NAMESPACE |