7#include <QtCore/qloggingcategory.h>
8#include <QtQml/qqmlcomponent.h>
9#include <QtQuick/private/qquickitem_p.h>
10#include <QtQuick/private/qquicklistview_p.h>
11#include <QtQuick/private/qquickpathview_p.h>
13#include <QtQuickTemplates2/private/qquicktumbler_p.h>
14#include <QtQuickTemplates2/private/qquicktumbler_p_p.h>
18Q_STATIC_LOGGING_CATEGORY(lcTumblerView,
"qt.quick.controls.tumblerview")
20QQuickTumblerView::QQuickTumblerView(QQuickItem *parent) :
27QVariant QQuickTumblerView::model()
const
32void QQuickTumblerView::setModel(
const QVariant &model)
34 qCDebug(lcTumblerView) <<
"setting model to:" << model <<
"on"
35 << (m_pathView ?
static_cast<QObject*>(m_pathView) :
static_cast<QObject*>(m_listView));
42 m_pathView->setModel(m_model);
43 }
else if (m_listView) {
46 const int oldCurrentIndex = m_listView->currentIndex();
47 m_listView->setModel(m_model);
48 if (!isComponentComplete())
49 m_listView->setCurrentIndex(oldCurrentIndex);
55QQmlComponent *QQuickTumblerView::delegate()
const
60void QQuickTumblerView::setDelegate(QQmlComponent *delegate)
62 qCDebug(lcTumblerView) <<
"setting delegate to:" << delegate <<
"on"
63 << (m_pathView ?
static_cast<QObject*>(m_pathView) :
static_cast<QObject*>(m_listView));
64 if (delegate == m_delegate)
67 m_delegate = delegate;
70 m_pathView->setDelegate(m_delegate);
72 m_listView->setDelegate(m_delegate);
74 emit delegateChanged();
77QQuickPath *QQuickTumblerView::path()
const
82void QQuickTumblerView::setPath(QQuickPath *path)
91void QQuickTumblerView::createView()
97 if (m_tumbler->wrap()) {
103 m_listView->deleteLater();
104 QQml_setParent_noEvent(m_listView,
nullptr);
107 m_listView->setParentItem(
nullptr);
108 m_listView->setVisible(
false);
109 m_listView->setModel(QVariant());
110 m_listView =
nullptr;
114 qCDebug(lcTumblerView) <<
"creating PathView";
116 m_pathView =
new QQuickPathView;
117 QQmlEngine::setContextForObject(m_pathView, qmlContext(
this));
118 QQml_setParent_noEvent(m_pathView,
this);
119 m_pathView->setParentItem(
this);
120 m_pathView->setPath(m_path);
121 m_pathView->setDelegate(m_delegate);
122 m_pathView->setPreferredHighlightBegin(0.5);
123 m_pathView->setPreferredHighlightEnd(0.5);
124 m_pathView->setHighlightMoveDuration(1000);
125 m_pathView->setClip(
true);
126 m_pathView->setFlickDeceleration(m_tumbler->flickDeceleration());
133 qCDebug(lcTumblerView) <<
"finished creating PathView";
137 m_pathView->deleteLater();
138 QQml_setParent_noEvent(m_pathView,
nullptr);
139 m_pathView->setParentItem(
nullptr);
140 m_pathView->setVisible(
false);
141 m_pathView->setModel(QVariant());
142 m_pathView =
nullptr;
146 qCDebug(lcTumblerView) <<
"creating ListView";
148 m_listView =
new QQuickListView;
149 QQmlEngine::setContextForObject(m_listView, qmlContext(
this));
150 QQml_setParent_noEvent(m_listView,
this);
151 m_listView->setParentItem(
this);
152 m_listView->setSnapMode(QQuickListView::SnapToItem);
153 m_listView->setClip(
true);
154 m_listView->setFlickDeceleration(m_tumbler->flickDeceleration());
165 m_listView->setDelegate(m_delegate);
167 QQuickTumblerPrivate *tumblerPrivate = QQuickTumblerPrivate::get(m_tumbler);
171 tumblerPrivate->ignoreCurrentIndexChanges =
true;
173 m_listView->setHighlightRangeMode(QQuickListView::StrictlyEnforceRange);
174 m_listView->setHighlightMoveDuration(1000);
175 tumblerPrivate->ignoreCurrentIndexChanges =
false;
183 if (m_listView->currentIndex() != tumblerPrivate->currentIndex)
184 m_listView->setCurrentIndex(tumblerPrivate->currentIndex);
186 qCDebug(lcTumblerView) <<
"finished creating ListView";
191void QQuickTumblerView::updateFlickDeceleration()
194 m_pathView->setFlickDeceleration(m_tumbler->flickDeceleration());
196 m_listView->setFlickDeceleration(m_tumbler->flickDeceleration());
200void QQuickTumblerView::updateView()
202 QQuickItem *theView = view();
206 theView->setSize(QSizeF(width(), height()));
214 m_pathView->setPathItemCount(m_tumbler->visibleItemCount() + 1);
215 m_pathView->setDragMargin(width() / 2);
217 m_listView->setPreferredHighlightBegin(height() / 2 - (height() / m_tumbler->visibleItemCount() / 2));
218 m_listView->setPreferredHighlightEnd(height() / 2 + (height() / m_tumbler->visibleItemCount() / 2));
222void QQuickTumblerView::updateModel()
224 if (m_pathView && !m_pathView->model().isValid() && m_model.isValid()) {
227 const int oldHighlightMoveDuration = m_pathView->highlightMoveDuration();
228 m_pathView->setHighlightMoveDuration(0);
234 QQuickTumblerPrivate *tumblerPrivate = QQuickTumblerPrivate::get(m_tumbler);
235 tumblerPrivate->beginSetModel();
236 m_pathView->setModel(m_model);
237 tumblerPrivate->endSetModel();
242 m_pathView->setHighlightMoveDuration(oldHighlightMoveDuration);
243 }
else if (m_listView && !m_listView->model().isValid() && m_model.isValid()) {
244 const int currentIndex = m_tumbler->currentIndex();
245 QQuickTumblerPrivate *tumblerPrivate = QQuickTumblerPrivate::get(m_tumbler);
263 tumblerPrivate->ignoreSignals =
true;
264 m_listView->setModel(m_model);
265 m_listView->setCurrentIndex(currentIndex);
267 tumblerPrivate->_q_onViewCountChanged();
268 tumblerPrivate->ignoreSignals =
false;
272void QQuickTumblerView::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
274 QQuickItem::geometryChange(newGeometry, oldGeometry);
278void QQuickTumblerView::componentComplete()
280 QQuickItem::componentComplete();
284void QQuickTumblerView::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &data)
286 QQuickItem::itemChange(change, data);
288 if (change == QQuickItem::ItemParentHasChanged && data.item) {
290 m_tumbler->disconnect(
this);
292 m_tumbler = qobject_cast<QQuickTumbler*>(parentItem());
296 connect(m_tumbler, &QQuickTumbler::wrapChanged,
this, &QQuickTumblerView::createView);
297 connect(m_tumbler, &QQuickTumbler::flickDecelerationChanged,
this, &QQuickTumblerView::updateFlickDeceleration);
298 connect(m_tumbler, &QQuickTumbler::visibleItemCountChanged,
this, &QQuickTumblerView::updateView);
303QQuickItem *QQuickTumblerView::view()
308 if (m_tumbler->wrap())
316#include "moc_qquicktumblerview_p.cpp"