diff options
-rw-r--r-- | src/quick/items/items.pri | 2 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 106 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 37 | ||||
-rw-r--r-- | src/quick/items/qquickitemviewfxitem.cpp | 165 | ||||
-rw-r--r-- | src/quick/items/qquickitemviewfxitem_p_p.h | 108 |
5 files changed, 279 insertions, 139 deletions
diff --git a/src/quick/items/items.pri b/src/quick/items/items.pri index 1acb3b5265..ca90f80cb8 100644 --- a/src/quick/items/items.pri +++ b/src/quick/items/items.pri @@ -122,9 +122,11 @@ qtConfig(quick-gridview) { qtConfig(quick-itemview) { HEADERS += \ + $$PWD/qquickitemviewfxitem_p_p.h \ $$PWD/qquickitemview_p.h \ $$PWD/qquickitemview_p_p.h SOURCES += \ + $$PWD/qquickitemviewfxitem.cpp \ $$PWD/qquickitemview.cpp } diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index f2e055e874..4e4881ce19 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qquickitemview_p_p.h" +#include "qquickitemviewfxitem_p_p.h" #include <QtQuick/private/qquicktransition_p.h> #include <QtQml/QQmlInfo> #include "qplatformdefs.h" @@ -52,117 +53,14 @@ Q_LOGGING_CATEGORY(lcItemViewDelegateLifecycle, "qt.quick.itemview.lifecycle") #endif FxViewItem::FxViewItem(QQuickItem *i, QQuickItemView *v, bool own, QQuickItemViewAttached *attached) - : item(i) + : QQuickItemViewFxItem(i, own, QQuickItemViewPrivate::get(v)) , view(v) - , transitionableItem(nullptr) , attached(attached) - , ownItem(own) - , releaseAfterTransition(false) - , trackGeom(false) { if (attached) // can be null for default components (see createComponentItem) attached->setView(view); } -FxViewItem::~FxViewItem() -{ - delete transitionableItem; - if (ownItem && item) { - trackGeometry(false); - item->setParentItem(nullptr); - item->deleteLater(); - item = nullptr; - } -} - -qreal FxViewItem::itemX() const -{ - return transitionableItem ? transitionableItem->itemX() : (item ? item->x() : 0); -} - -qreal FxViewItem::itemY() const -{ - return transitionableItem ? transitionableItem->itemY() : (item ? item->y() : 0); -} - -void FxViewItem::moveTo(const QPointF &pos, bool immediate) -{ - if (transitionableItem) - transitionableItem->moveTo(pos, immediate); - else if (item) - item->setPosition(pos); -} - -void FxViewItem::setVisible(bool visible) -{ - if (!visible && transitionableItem && transitionableItem->transitionScheduledOrRunning()) - return; - if (item) - QQuickItemPrivate::get(item)->setCulled(!visible); -} - -void FxViewItem::trackGeometry(bool track) -{ - if (track) { - if (!trackGeom) { - if (item) { - QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); - itemPrivate->addItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); - } - trackGeom = true; - } - } else { - if (trackGeom) { - if (item) { - QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); - itemPrivate->removeItemChangeListener(QQuickItemViewPrivate::get(view), QQuickItemPrivate::Geometry); - } - trackGeom = false; - } - } -} - -QQuickItemViewTransitioner::TransitionType FxViewItem::scheduledTransitionType() const -{ - return transitionableItem ? transitionableItem->nextTransitionType : QQuickItemViewTransitioner::NoTransition; -} - -bool FxViewItem::transitionScheduledOrRunning() const -{ - return transitionableItem ? transitionableItem->transitionScheduledOrRunning() : false; -} - -bool FxViewItem::transitionRunning() const -{ - return transitionableItem ? transitionableItem->transitionRunning() : false; -} - -bool FxViewItem::isPendingRemoval() const -{ - return transitionableItem ? transitionableItem->isPendingRemoval() : false; -} - -void FxViewItem::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) -{ - if (!transitioner) - return; - if (!transitionableItem) - transitionableItem = new QQuickItemViewTransitionableItem(item); - transitioner->transitionNextReposition(transitionableItem, type, asTarget); -} - -bool FxViewItem::prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds) -{ - return transitionableItem ? transitionableItem->prepareTransition(transitioner, index, viewBounds) : false; -} - -void FxViewItem::startTransition(QQuickItemViewTransitioner *transitioner) -{ - if (transitionableItem) - transitionableItem->startTransition(transitioner, index); -} - - QQuickItemViewChangeSet::QQuickItemViewChangeSet() : active(false) { diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index e250cf0ccb..ea5b5df9c6 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -56,6 +56,7 @@ QT_REQUIRE_CONFIG(quick_itemview); #include "qquickitemview_p.h" +#include "qquickitemviewfxitem_p_p.h" #include "qquickitemviewtransition_p.h" #include "qquickflickable_p_p.h" #include <QtQml/private/qqmlobjectmodel_p.h> @@ -65,47 +66,13 @@ QT_REQUIRE_CONFIG(quick_itemview); QT_BEGIN_NAMESPACE - -class Q_AUTOTEST_EXPORT FxViewItem +class Q_AUTOTEST_EXPORT FxViewItem : public QQuickItemViewFxItem { public: FxViewItem(QQuickItem *, QQuickItemView *, bool own, QQuickItemViewAttached *attached); - virtual ~FxViewItem(); - - qreal itemX() const; - qreal itemY() const; - inline qreal itemWidth() const { return item ? item->width() : 0; } - inline qreal itemHeight() const { return item ? item->height() : 0; } - - void moveTo(const QPointF &pos, bool immediate); - void setVisible(bool visible); - void trackGeometry(bool track); - - QQuickItemViewTransitioner::TransitionType scheduledTransitionType() const; - bool transitionScheduledOrRunning() const; - bool transitionRunning() const; - bool isPendingRemoval() const; - - void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); - bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); - void startTransition(QQuickItemViewTransitioner *transitioner); - - // these are positions and sizes along the current direction of scrolling/flicking - virtual qreal position() const = 0; - virtual qreal endPosition() const = 0; - virtual qreal size() const = 0; - virtual qreal sectionSize() const = 0; - - virtual bool contains(qreal x, qreal y) const = 0; - QPointer<QQuickItem> item; QQuickItemView *view; - QQuickItemViewTransitionableItem *transitionableItem; QQuickItemViewAttached *attached; - int index; - bool ownItem; - bool releaseAfterTransition; - bool trackGeom; }; diff --git a/src/quick/items/qquickitemviewfxitem.cpp b/src/quick/items/qquickitemviewfxitem.cpp new file mode 100644 index 0000000000..f9c65967ea --- /dev/null +++ b/src/quick/items/qquickitemviewfxitem.cpp @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qquickitemviewfxitem_p_p.h" +#include "qquickitem_p.h" +#include "qquickitemview_p_p.h" + +QT_BEGIN_NAMESPACE + +QQuickItemViewFxItem::QQuickItemViewFxItem(QQuickItem *item, bool ownItem, QQuickItemChangeListener* changeListener) + : item(item) + , ownItem(ownItem) + , changeListener(changeListener) + , transitionableItem(nullptr) + , releaseAfterTransition(false) + , trackGeom(false) +{ +} + +QQuickItemViewFxItem::~QQuickItemViewFxItem() +{ + delete transitionableItem; + if (ownItem && item) { + trackGeometry(false); + item->setParentItem(0); + item->deleteLater(); + } +} + +qreal QQuickItemViewFxItem::itemX() const +{ + return transitionableItem ? transitionableItem->itemX() : (item ? item->x() : 0); +} + +qreal QQuickItemViewFxItem::itemY() const +{ + return transitionableItem ? transitionableItem->itemY() : (item ? item->y() : 0); +} + +void QQuickItemViewFxItem::moveTo(const QPointF &pos, bool immediate) +{ + if (transitionableItem) + transitionableItem->moveTo(pos, immediate); + else if (item) + item->setPosition(pos); +} + +void QQuickItemViewFxItem::setVisible(bool visible) +{ + if (!visible && transitionableItem && transitionableItem->transitionScheduledOrRunning()) + return; + if (item) + QQuickItemPrivate::get(item)->setCulled(!visible); +} + +void QQuickItemViewFxItem::trackGeometry(bool track) +{ + if (track) { + if (!trackGeom) { + if (item) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->addItemChangeListener(changeListener, QQuickItemPrivate::Geometry); + } + trackGeom = true; + } + } else { + if (trackGeom) { + if (item) { + QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + itemPrivate->removeItemChangeListener(changeListener, QQuickItemPrivate::Geometry); + } + trackGeom = false; + } + } +} + +QRectF QQuickItemViewFxItem::geometry() const +{ + return QRectF(item->position(), item->size()); +} + +void QQuickItemViewFxItem::setGeometry(const QRectF &geometry) +{ + item->setPosition(geometry.topLeft()); + item->setSize(geometry.size()); +} + +QQuickItemViewTransitioner::TransitionType QQuickItemViewFxItem::scheduledTransitionType() const +{ + return transitionableItem ? transitionableItem->nextTransitionType : QQuickItemViewTransitioner::NoTransition; +} + +bool QQuickItemViewFxItem::transitionScheduledOrRunning() const +{ + return transitionableItem ? transitionableItem->transitionScheduledOrRunning() : false; +} + +bool QQuickItemViewFxItem::transitionRunning() const +{ + return transitionableItem ? transitionableItem->transitionRunning() : false; +} + +bool QQuickItemViewFxItem::isPendingRemoval() const +{ + return transitionableItem ? transitionableItem->isPendingRemoval() : false; +} + +void QQuickItemViewFxItem::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) +{ + if (!transitioner) + return; + if (!transitionableItem) + transitionableItem = new QQuickItemViewTransitionableItem(item); + transitioner->transitionNextReposition(transitionableItem, type, asTarget); +} + +bool QQuickItemViewFxItem::prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds) +{ + return transitionableItem ? transitionableItem->prepareTransition(transitioner, index, viewBounds) : false; +} + +void QQuickItemViewFxItem::startTransition(QQuickItemViewTransitioner *transitioner) +{ + if (transitionableItem) + transitionableItem->startTransition(transitioner, index); +} + +QT_END_NAMESPACE + diff --git a/src/quick/items/qquickitemviewfxitem_p_p.h b/src/quick/items/qquickitemviewfxitem_p_p.h new file mode 100644 index 0000000000..79c3a00a66 --- /dev/null +++ b/src/quick/items/qquickitemviewfxitem_p_p.h @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQuick 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QQUICKFXVIEWITEM_P_P_H +#define QQUICKFXVIEWITEM_P_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtQuick/private/qtquickglobal_p.h> +#include <QtQuick/private/qquickitem_p.h> +#include <QtQuick/private/qquickitemviewtransition_p.h> + +QT_REQUIRE_CONFIG(quick_itemview); + +QT_BEGIN_NAMESPACE + +class Q_AUTOTEST_EXPORT QQuickItemViewFxItem +{ +public: + QQuickItemViewFxItem(QQuickItem *item, bool ownItem, QQuickItemChangeListener *changeListener); + virtual ~QQuickItemViewFxItem(); + + qreal itemX() const; + qreal itemY() const; + inline qreal itemWidth() const { return item ? item->width() : 0; } + inline qreal itemHeight() const { return item ? item->height() : 0; } + + void moveTo(const QPointF &pos, bool immediate); + void setVisible(bool visible); + void trackGeometry(bool track); + + QRectF geometry() const; + void setGeometry(const QRectF &geometry); + + QQuickItemViewTransitioner::TransitionType scheduledTransitionType() const; + bool transitionScheduledOrRunning() const; + bool transitionRunning() const; + bool isPendingRemoval() const; + + void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget); + bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds); + void startTransition(QQuickItemViewTransitioner *transitioner); + + // these are positions and sizes along the current direction of scrolling/flicking + virtual qreal position() const = 0; + virtual qreal endPosition() const = 0; + virtual qreal size() const = 0; + virtual qreal sectionSize() const = 0; + + virtual bool contains(qreal x, qreal y) const = 0; + + int index; + QPointer<QQuickItem> item; + bool ownItem; + QQuickItemChangeListener *changeListener; + QQuickItemViewTransitionableItem *transitionableItem; + bool releaseAfterTransition; + bool trackGeom; +}; + +QT_END_NAMESPACE + +#endif // QQUICKFXVIEWITEM_P_P_H |