diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-12-30 13:20:24 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-01-16 15:46:28 +0000 |
commit | 8eada7ae7d41a2d93142ea1a6454ab2bbb0998ed (patch) | |
tree | 7cb0ecfa2f7036b4a25a0e147d07313d7fa64a40 /src | |
parent | 09dc5a0c4c08e8f13ddc81d82a9fc2d2af047165 (diff) |
ListView: allow flicking to both directions
Previously flicking was restricted to the orientation of the ListView.
[ChangeLog][QtQuick][ListView] Made it possible to enable horizontal
flicking in a vertical ListView, and vice versa. The only thing apps
must do is to specify the desired flick direction and the content
width (vertical ListView) or content height (horizontal ListView),
which is not calculated by ListView.
Change-Id: Ic370e57f5d18679940d48e7a2c20c200b2ef36d1
Task-number: QTBUG-52553
Task-number: QTBUG-56501
Reviewed-by: Robin Burchell <robin.burchell@crimson.no>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/doc/snippets/qml/listview/listview.qml | 15 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 54 | ||||
-rw-r--r-- | src/quick/items/qquicklistview_p.h | 2 |
3 files changed, 65 insertions, 6 deletions
diff --git a/src/quick/doc/snippets/qml/listview/listview.qml b/src/quick/doc/snippets/qml/listview/listview.qml index 31896626a4..ecb5fea076 100644 --- a/src/quick/doc/snippets/qml/listview/listview.qml +++ b/src/quick/doc/snippets/qml/listview/listview.qml @@ -146,4 +146,19 @@ ListView { } //![isCurrentItem] +//![flickBothDirections] +ListView { + width: 180; height: 200 + + contentWidth: 320 + flickableDirection: Flickable.AutoFlickDirection + + model: ContactModel {} + delegate: Row { + Text { text: '<b>Name:</b> ' + name; width: 160 } + Text { text: '<b>Number:</b> ' + number; width: 160 } + } +} +//![flickBothDirections] + } diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index f89a995e76..9419d3cf96 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -1462,9 +1462,15 @@ void QQuickListViewPrivate::fixupPosition() void QQuickListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExtent) { - if ((orient == QQuickListView::Horizontal && &data == &vData) - || (orient == QQuickListView::Vertical && &data == &hData)) + if (orient == QQuickListView::Horizontal && &data == &vData) { + if (flickableDirection != QQuickFlickable::HorizontalFlick) + QQuickItemViewPrivate::fixup(data, minExtent, maxExtent); + return; + } else if (orient == QQuickListView::Vertical && &data == &hData) { + if (flickableDirection != QQuickFlickable::VerticalFlick) + QQuickItemViewPrivate::fixup(data, minExtent, maxExtent); return; + } correctFlick = false; fixupMode = moveReason == Mouse ? fixupMode : Immediate; @@ -1813,6 +1819,19 @@ bool QQuickListViewPrivate::flick(AxisData &data, qreal minExtent, qreal maxExte \image listview-layout-righttoleft.png \endtable + \section1 Flickable Direction + + By default, a vertical ListView sets \l {Flickable::}{flickableDirection} to \e Flickable.Vertical, + and a horizontal ListView sets it to \e Flickable.Horizontal. Furthermore, a vertical ListView only + calculates (estimates) the \l {Flickable::}{contentHeight}, and a horizontal ListView only calculates + the \l {Flickable::}{contentWidth}. The other dimension is set to \e -1. + + Since Qt 5.9 (Qt Quick 2.9), it is possible to make a ListView that can be flicked to both directions. + In order to do this, the \l {Flickable::}{flickableDirection} can be set to \e Flickable.AutoFlickDirection + or \e Flickable.AutoFlickIfNeeded, and the desired \e contentWidth or \e contentHeight must be provided. + + \snippet qml/listview/listview.qml flickBothDirections + \sa {QML Data Models}, GridView, PathView, {Qt Quick Examples - Views} */ QQuickListView::QQuickListView(QQuickItem *parent) @@ -2099,6 +2118,8 @@ void QQuickListView::setSpacing(qreal spacing) \li Vertical orientation: \image listview-highlight.png \endtable + + \sa {Flickable Direction} */ QQuickListView::Orientation QQuickListView::orientation() const { @@ -2112,12 +2133,18 @@ void QQuickListView::setOrientation(QQuickListView::Orientation orientation) if (d->orient != orientation) { d->orient = orientation; if (d->orient == Vertical) { - setContentWidth(-1); - setFlickableDirection(VerticalFlick); + if (d->flickableDirection == HorizontalFlick) { + setFlickableDirection(VerticalFlick); + if (isComponentComplete()) + setContentWidth(-1); + } setContentX(0); } else { - setContentHeight(-1); - setFlickableDirection(HorizontalFlick); + if (d->flickableDirection == VerticalFlick) { + setFlickableDirection(HorizontalFlick); + if (isComponentComplete()) + setContentHeight(-1); + } setContentY(0); } d->regenerate(true); @@ -3042,6 +3069,21 @@ void QQuickListView::initItem(int index, QObject *object) } } +qreal QQuickListView::maxYExtent() const +{ + Q_D(const QQuickListView); + if (d->layoutOrientation() == Qt::Horizontal && d->flickableDirection != HorizontalFlick) + return QQuickFlickable::maxYExtent(); + return QQuickItemView::maxYExtent(); +} + +qreal QQuickListView::maxXExtent() const +{ + Q_D(const QQuickListView); + if (d->layoutOrientation() == Qt::Vertical && d->flickableDirection != VerticalFlick) + return QQuickFlickable::maxXExtent(); + return QQuickItemView::maxXExtent(); +} /*! \qmlmethod QtQuick::ListView::incrementCurrentIndex() diff --git a/src/quick/items/qquicklistview_p.h b/src/quick/items/qquicklistview_p.h index 3a871e88e9..dbed8dfed4 100644 --- a/src/quick/items/qquicklistview_p.h +++ b/src/quick/items/qquicklistview_p.h @@ -196,6 +196,8 @@ protected: void keyPressEvent(QKeyEvent *) Q_DECL_OVERRIDE; void geometryChanged(const QRectF &newGeometry,const QRectF &oldGeometry) Q_DECL_OVERRIDE; void initItem(int index, QObject *item) Q_DECL_OVERRIDE; + qreal maxYExtent() const Q_DECL_OVERRIDE; + qreal maxXExtent() const Q_DECL_OVERRIDE; }; class QQuickListViewAttached : public QQuickItemViewAttached |