aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktableview_p_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/items/qquicktableview_p_p.h')
-rw-r--r--src/quick/items/qquicktableview_p_p.h591
1 files changed, 455 insertions, 136 deletions
diff --git a/src/quick/items/qquicktableview_p_p.h b/src/quick/items/qquicktableview_p_p.h
index 8a02d23694..ea49a3309b 100644
--- a/src/quick/items/qquicktableview_p_p.h
+++ b/src/quick/items/qquicktableview_p_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QQUICKTABLEVIEW_P_P_H
#define QQUICKTABLEVIEW_P_P_H
@@ -54,13 +18,23 @@
#include "qquicktableview_p.h"
#include <QtCore/qtimer.h>
-#include <QtQml/private/qqmltableinstancemodel_p.h>
+#include <QtCore/qitemselectionmodel.h>
+#include <QtQmlModels/private/qqmltableinstancemodel_p.h>
#include <QtQml/private/qqmlincubator_p.h>
-#include <QtQml/private/qqmlchangeset_p.h>
+#include <QtQmlModels/private/qqmlchangeset_p.h>
#include <QtQml/qqmlinfo.h>
+#include <QtGui/qdrag.h>
#include <QtQuick/private/qquickflickable_p_p.h>
#include <QtQuick/private/qquickitemviewfxitem_p_p.h>
+#include <QtQuick/private/qquickanimation_p.h>
+#include <QtQuick/private/qquickselectable_p.h>
+#include <QtQuick/private/qquicksinglepointhandler_p.h>
+#include <QtQuick/private/qquickhoverhandler_p.h>
+#include <QtQuick/private/qquicktaphandler_p.h>
+#include <QtQuick/private/qquickdroparea_p.h>
+
+#include <QtCore/private/qminimalflatset_p.h>
QT_BEGIN_NAMESPACE
@@ -68,14 +42,145 @@ Q_DECLARE_LOGGING_CATEGORY(lcTableViewDelegateLifecycle)
static const qreal kDefaultRowHeight = 50;
static const qreal kDefaultColumnWidth = 50;
+static const int kEdgeIndexNotSet = -2;
+static const int kEdgeIndexAtEnd = -3;
class FxTableItem;
+class QQuickTableSectionSizeProviderPrivate;
+
+/*! \internal
+ * TableView uses QQuickTableViewHoverHandler to track where the pointer is
+ * on top of the table, and change the cursor at the places where a drag
+ * would start a resize of a row or a column.
+ */
+class QQuickTableViewHoverHandler : public QQuickHoverHandler
+{
+ Q_OBJECT
+
+public:
+ QQuickTableViewHoverHandler(QQuickTableView *view);
+ inline bool isHoveringGrid() const { return m_row != -1 || m_column != -1; };
+
+ int m_row = -1;
+ int m_column = -1;
+
+ friend class QQuickTableViewPrivate;
-class Q_QML_AUTOTEST_EXPORT QQuickTableViewPrivate : public QQuickFlickablePrivate
+protected:
+ void handleEventPoint(QPointerEvent *event, QEventPoint &point) override;
+};
+
+class QQuickTableViewPointerHandler : public QQuickSinglePointHandler
{
- Q_DECLARE_PUBLIC(QQuickTableView)
+ Q_OBJECT
+
+public:
+ enum State {
+ Listening, // the pointer is not being pressed between the cells
+ Tracking, // the pointer is being pressed between the cells
+ DraggingStarted, // dragging started
+ Dragging, // a drag is ongoing
+ DraggingFinished // dragging was finished
+ };
+
+ QQuickTableViewPointerHandler(QQuickTableView *view);
+
+ State m_state = Listening;
+ State state() { return m_state; }
+
+protected:
+ bool wantsEventPoint(const QPointerEvent *event, const QEventPoint &point) override;
+};
+
+/*! \internal
+ * TableView uses QQuickTableViewResizeHandler to enable the user to resize
+ * rows and columns. By using a custom pointer handler, we can get away with
+ * using a single pointer handler for the whole content item, rather than
+ * e.g having to split it up into multiple items with drag handlers placed
+ * between the cells.
+ */
+class QQuickTableViewResizeHandler : public QQuickTableViewPointerHandler
+{
+ Q_OBJECT
+
+public:
+ QQuickTableViewResizeHandler(QQuickTableView *view);
+
+ int m_row = -1;
+ qreal m_rowStartY = -1;
+ qreal m_rowStartHeight = -1;
+
+ int m_column = -1;
+ qreal m_columnStartX = -1;
+ qreal m_columnStartWidth = -1;
+
+ void updateState(QEventPoint &point);
+ void updateDrag(QPointerEvent *event, QEventPoint &point);
+
+ friend class QQuickTableViewPrivate;
+
+protected:
+ void handleEventPoint(QPointerEvent *event, QEventPoint &point) override;
+ void onGrabChanged(QQuickPointerHandler *grabber, QPointingDevice::GrabTransition transition,
+ QPointerEvent *ev, QEventPoint &point) override;
+};
+
+class QQuickTableViewSectionDragHandler : public QQuickTableViewPointerHandler
+{
+ Q_OBJECT
public:
+ QQuickTableViewSectionDragHandler(QQuickTableView *view);
+ ~QQuickTableViewSectionDragHandler();
+
+ void grabSection();
+
+ void handleDrag(QQuickDragEvent *event);
+ void handleDrop(QQuickDragEvent *event);
+ void handleDragDropAction(Qt::DropAction action);
+
+ void setSectionOrientation(Qt::Orientation orientation) { m_sectionOrientation = orientation; }
+
+ friend class QQuickTableViewPrivate;
+
+protected:
+ void handleEventPoint(QPointerEvent *event, QEventPoint &point) override;
+
+private:
+ void resetDragData();
+ void resetSectionOverlay();
+
+ QSharedPointer<QQuickItemGrabResult> m_grabResult;
+ QPointer<QDrag> m_drag;
+ int m_source = -1;
+ int m_destination = -1;
+ QPointer<QQuickDropArea> m_dropArea;
+ Qt::Orientation m_sectionOrientation;
+
+ QPointF m_dragPoint;
+ QSizeF m_step = QSizeF(1, 1);
+ QTimer m_scrollTimer;
+};
+
+/*! \internal
+ * QQuickTableViewTapHandler used to handle tap events explicitly for table view
+ */
+class QQuickTableViewTapHandler : public QQuickTapHandler
+{
+ Q_OBJECT
+
+public:
+ explicit QQuickTableViewTapHandler(QQuickTableView *view);
+ bool wantsEventPoint(const QPointerEvent *event, const QEventPoint &point) override;
+
+ friend class QQuickTableViewPrivate;
+};
+
+class Q_QUICK_EXPORT QQuickTableViewPrivate : public QQuickFlickablePrivate, public QQuickSelectable
+{
+public:
+ Q_DECLARE_PUBLIC(QQuickTableView)
+
class TableEdgeLoadRequest
{
// Whenever we need to load new rows or columns in the
@@ -88,54 +193,52 @@ public:
public:
void begin(const QPoint &cell, const QPointF &pos, QQmlIncubator::IncubationMode incubationMode)
{
- Q_ASSERT(!active);
- active = true;
- tableEdge = Qt::Edge(0);
- tableCells = QLine(cell, cell);
- mode = incubationMode;
- cellCount = 1;
- currentIndex = 0;
- startPos = pos;
+ Q_ASSERT(!m_active);
+ m_active = true;
+ m_edge = Qt::Edge(0);
+ m_mode = incubationMode;
+ m_edgeIndex = cell.x();
+ m_visibleCellsInEdge.clear();
+ m_visibleCellsInEdge.append(cell.y());
+ m_currentIndex = 0;
+ m_startPos = pos;
qCDebug(lcTableViewDelegateLifecycle()) << "begin top-left:" << toString();
}
- void begin(const QLine cellsToLoad, Qt::Edge edgeToLoad, QQmlIncubator::IncubationMode incubationMode)
+ void begin(Qt::Edge edgeToLoad, int edgeIndex, const QVector<int> visibleCellsInEdge, QQmlIncubator::IncubationMode incubationMode)
{
- Q_ASSERT(!active);
- active = true;
- tableEdge = edgeToLoad;
- tableCells = cellsToLoad;
- mode = incubationMode;
- cellCount = tableCells.x2() - tableCells.x1() + tableCells.y2() - tableCells.y1() + 1;
- currentIndex = 0;
+ Q_ASSERT(!m_active);
+ m_active = true;
+ m_edge = edgeToLoad;
+ m_edgeIndex = edgeIndex;
+ m_visibleCellsInEdge = visibleCellsInEdge;
+ m_mode = incubationMode;
+ m_currentIndex = 0;
qCDebug(lcTableViewDelegateLifecycle()) << "begin:" << toString();
}
- inline void markAsDone() { active = false; }
- inline bool isActive() { return active; }
+ inline void markAsDone() { m_active = false; }
+ inline bool isActive() const { return m_active; }
- inline QPoint firstCell() { return tableCells.p1(); }
- inline QPoint lastCell() { return tableCells.p2(); }
- inline QPoint currentCell() { return cellAt(currentIndex); }
- inline QPoint previousCell() { return cellAt(currentIndex - 1); }
+ inline QPoint currentCell() const { return cellAt(m_currentIndex); }
+ inline bool hasCurrentCell() const { return m_currentIndex < m_visibleCellsInEdge.size(); }
+ inline void moveToNextCell() { ++m_currentIndex; }
- inline bool atBeginning() { return currentIndex == 0; }
- inline bool hasCurrentCell() { return currentIndex < cellCount; }
- inline void moveToNextCell() { ++currentIndex; }
+ inline Qt::Edge edge() const { return m_edge; }
+ inline int row() const { return cellAt(0).y(); }
+ inline int column() const { return cellAt(0).x(); }
+ inline QQmlIncubator::IncubationMode incubationMode() const { return m_mode; }
- inline Qt::Edge edge() { return tableEdge; }
- inline QQmlIncubator::IncubationMode incubationMode() { return mode; }
+ inline QPointF startPosition() const { return m_startPos; }
- inline QPointF startPosition() { return startPos; }
-
- QString toString()
+ QString toString() const
{
QString str;
QDebug dbg(&str);
dbg.nospace() << "TableSectionLoadRequest(" << "edge:"
- << tableEdge << " cells:" << tableCells << " incubation:";
+ << m_edge << ", edgeIndex:" << m_edgeIndex << ", incubation:";
- switch (mode) {
+ switch (m_mode) {
case QQmlIncubator::Asynchronous:
dbg << "Asynchronous";
break;
@@ -151,40 +254,60 @@ public:
}
private:
- Qt::Edge tableEdge = Qt::Edge(0);
- QLine tableCells;
- int currentIndex = 0;
- int cellCount = 0;
- bool active = false;
- QQmlIncubator::IncubationMode mode = QQmlIncubator::AsynchronousIfNested;
- QPointF startPos;
-
- QPoint cellAt(int index)
- {
- int x = tableCells.p1().x() + (tableCells.dx() ? index : 0);
- int y = tableCells.p1().y() + (tableCells.dy() ? index : 0);
- return QPoint(x, y);
+ Qt::Edge m_edge = Qt::Edge(0);
+ QVector<int> m_visibleCellsInEdge;
+ int m_edgeIndex = 0;
+ int m_currentIndex = 0;
+ bool m_active = false;
+ QQmlIncubator::IncubationMode m_mode = QQmlIncubator::AsynchronousIfNested;
+ QPointF m_startPos;
+
+ inline QPoint cellAt(int index) const {
+ return !m_edge || (m_edge & (Qt::LeftEdge | Qt::RightEdge))
+ ? QPoint(m_edgeIndex, m_visibleCellsInEdge[index])
+ : QPoint(m_visibleCellsInEdge[index], m_edgeIndex);
}
};
+ class EdgeRange {
+ public:
+ EdgeRange();
+ bool containsIndex(Qt::Edge edge, int index);
+
+ int startIndex;
+ int endIndex;
+ qreal size;
+ };
+
enum class RebuildState {
Begin = 0,
LoadInitalTable,
VerifyTable,
LayoutTable,
- LoadAndUnloadAfterLayout,
+ CancelOvershoot,
+ UpdateContentSize,
PreloadColumns,
PreloadRows,
MovePreloadedItemsToPool,
Done
};
+ enum class SectionState {
+ Idle = 0,
+ Moving
+ };
+
enum class RebuildOption {
None = 0,
- ViewportOnly = 0x1,
- CalculateNewTopLeftRow = 0x2,
- CalculateNewTopLeftColumn = 0x4,
- All = 0x8,
+ All = 0x1,
+ LayoutOnly = 0x2,
+ ViewportOnly = 0x4,
+ CalculateNewTopLeftRow = 0x8,
+ CalculateNewTopLeftColumn = 0x10,
+ CalculateNewContentWidth = 0x20,
+ CalculateNewContentHeight = 0x40,
+ PositionViewAtRow = 0x80,
+ PositionViewAtColumn = 0x100,
};
Q_DECLARE_FLAGS(RebuildOptions, RebuildOption)
@@ -211,18 +334,22 @@ public:
// When the applications assignes a new model or delegate to the view, we keep them
// around until we're ready to take them into use (syncWithPendingChanges).
QVariant assignedModel = QVariant(int(0));
- QQmlComponent *assignedDelegate = nullptr;
+ QQmlGuard<QQmlComponent> assignedDelegate;
- // loadedTable describes the table cells that are currently loaded (from top left
+ // loadedRows/Columns describes the rows and columns that are currently loaded (from top left
// row/column to bottom right row/column). loadedTableOuterRect describes the actual
- // pixels that those cells cover, and is matched agains the viewport to determine when
+ // pixels that all the loaded delegate items cover, and is matched agains the viewport to determine when
// we need to fill up with more rows/columns. loadedTableInnerRect describes the pixels
// that the loaded table covers if you remove one row/column on each side of the table, and
// is used to determine rows/columns that are no longer visible and can be unloaded.
- QRect loadedTable;
+ QMinimalFlatSet<int> loadedColumns;
+ QMinimalFlatSet<int> loadedRows;
QRectF loadedTableOuterRect;
QRectF loadedTableInnerRect;
+ QPointF origin = QPointF(0, 0);
+ QSizeF endExtent = QSizeF(0, 0);
+
QRectF viewportRect = QRectF(0, 0, -1, -1);
QSize tableSize;
@@ -233,20 +360,41 @@ public:
TableEdgeLoadRequest loadRequest;
- QPoint contentSizeBenchMarkPoint = QPoint(-1, -1);
QSizeF cellSpacing = QSizeF(0, 0);
QQmlTableInstanceModel::ReusableFlag reusableFlag = QQmlTableInstanceModel::Reusable;
bool blockItemCreatedCallback = false;
- bool columnRowPositionsInvalid = false;
- bool layoutWarningIssued = false;
+ mutable bool layoutWarningIssued = false;
bool polishing = false;
- bool rebuildScheduled = true;
+ bool syncVertically = false;
+ bool syncHorizontally = false;
+ bool inSetLocalViewportPos = false;
+ bool inSyncViewportPosRecursive = false;
+ bool inUpdateContentSize = false;
+ bool animate = true;
+ bool keyNavigationEnabled = true;
+ bool pointerNavigationEnabled = true;
+ bool alternatingRows = true;
+ bool resizableColumns = false;
+ bool resizableRows = false;
+#if QT_CONFIG(cursor)
+ bool m_cursorSet = false;
+#endif
+
+ // isTransposed is currently only used by HeaderView.
+ // Consider making it public.
+ bool isTransposed = false;
+
+ bool warnNoSelectionModel = true;
QJSValue rowHeightProvider;
QJSValue columnWidthProvider;
+ mutable EdgeRange cachedNextVisibleEdgeIndex[4];
+ mutable EdgeRange cachedColumnWidth;
+ mutable EdgeRange cachedRowHeight;
+
// TableView uses contentWidth/height to report the size of the table (this
// will e.g make scrollbars written for Flickable work out of the box). This
// value is continuously calculated, and will change/improve as more columns
@@ -261,29 +409,107 @@ public:
QSizeF averageEdgeSize;
- const static QPoint kLeft;
- const static QPoint kRight;
- const static QPoint kUp;
- const static QPoint kDown;
+ QPointer<QQuickTableView> assignedSyncView;
+ QPointer<QQuickTableView> syncView;
+ QList<QPointer<QQuickTableView> > syncChildren;
+ Qt::Orientations assignedSyncDirection = Qt::Horizontal | Qt::Vertical;
+
+ QPointer<QItemSelectionModel> selectionModel;
+ QQuickTableView::SelectionBehavior selectionBehavior = QQuickTableView::SelectCells;
+ QQuickTableView::SelectionMode selectionMode = QQuickTableView::ExtendedSelection;
+ QItemSelectionModel::SelectionFlag selectionFlag = QItemSelectionModel::NoUpdate;
+ std::function<void(CallBackFlag)> selectableCallbackFunction;
+ bool inSelectionModelUpdate = false;
+
+ int assignedPositionViewAtRowAfterRebuild = 0;
+ int assignedPositionViewAtColumnAfterRebuild = 0;
+ int positionViewAtRowAfterRebuild = 0;
+ int positionViewAtColumnAfterRebuild = 0;
+ qreal positionViewAtRowOffset = 0;
+ qreal positionViewAtColumnOffset = 0;
+ QRectF positionViewAtRowSubRect;
+ QRectF positionViewAtColumnSubRect;
+ Qt::Alignment positionViewAtRowAlignment = Qt::AlignTop;
+ Qt::Alignment positionViewAtColumnAlignment = Qt::AlignLeft;
+
+ QQuickPropertyAnimation positionXAnimation;
+ QQuickPropertyAnimation positionYAnimation;
+
+ QPoint selectionStartCell = {-1, -1};
+ QPoint selectionEndCell = {-1, -1};
+ QItemSelection existingSelection;
+
+ QMargins edgesBeforeRebuild;
+ QSize tableSizeBeforeRebuild;
+
+ int currentRow = -1;
+ int currentColumn = -1;
+
+ QHash<int, qreal> explicitColumnWidths;
+ QHash<int, qreal> explicitRowHeights;
+
+ QQuickTableViewHoverHandler *hoverHandler = nullptr;
+ QQuickTableViewResizeHandler *resizeHandler = nullptr;
+ QQuickTableViewSectionDragHandler *sectionDragHandler = nullptr;
+ QQuickTableViewPointerHandler *activePtrHandler = nullptr;
+
+ QQmlTableInstanceModel *editModel = nullptr;
+ QQuickItem *editItem = nullptr;
+ QPersistentModelIndex editIndex;
+ QQuickTableView::EditTriggers editTriggers = QQuickTableView::DoubleTapped | QQuickTableView::EditKeyPressed;
#ifdef QT_DEBUG
QString forcedIncubationMode = qEnvironmentVariable("QT_TABLEVIEW_INCUBATION_MODE");
#endif
+ struct SectionData {
+ int index = -1;
+ int prevIndex = -1;
+ };
+
+ QList<SectionData> visualIndices[Qt::Vertical];
+ QList<SectionData> logicalIndices[Qt::Vertical];
+
+ SectionState m_sectionState = SectionState::Idle;
+
public:
+ void init();
+
QQuickTableViewAttached *getAttachedObject(const QObject *object) const;
int modelIndexAtCell(const QPoint &cell) const;
QPoint cellAtModelIndex(int modelIndex) const;
-
- qreal sizeHintForColumn(int column);
- qreal sizeHintForRow(int row);
- void calculateTableSize();
-
- qreal resolveColumnWidth(int column);
- qreal resolveRowHeight(int row);
-
- void relayoutTable();
+ int modelIndexToCellIndex(const QModelIndex &modelIndex, bool visualIndex = true) const;
+ inline bool cellIsValid(const QPoint &cell) const { return cell.x() != -1 && cell.y() != -1; }
+
+ qreal sizeHintForColumn(int column) const;
+ qreal sizeHintForRow(int row) const;
+ QSize calculateTableSize();
+ void updateTableSize();
+
+ inline bool isColumnHidden(int column) const;
+ inline bool isRowHidden(int row) const;
+
+ qreal getColumnLayoutWidth(int column);
+ qreal getRowLayoutHeight(int row);
+ qreal getColumnWidth(int column) const;
+ qreal getRowHeight(int row) const;
+ qreal getEffectiveRowY(int row) const;
+ qreal getEffectiveRowHeight(int row) const;
+ qreal getEffectiveColumnX(int column) const;
+ qreal getEffectiveColumnWidth(int column) const;
+ qreal getAlignmentContentX(int column, Qt::Alignment alignment, const qreal offset, const QRectF &subRect);
+ qreal getAlignmentContentY(int row, Qt::Alignment alignment, const qreal offset, const QRectF &subRect);
+
+ int topRow() const { return *loadedRows.cbegin(); }
+ int bottomRow() const { return *loadedRows.crbegin(); }
+ int leftColumn() const { return *loadedColumns.cbegin(); }
+ int rightColumn() const { return *loadedColumns.crbegin(); }
+
+ QQuickTableView *rootSyncView() const;
+
+ bool updateTableRecursive();
+ bool updateTable();
void relayoutTableItems();
void layoutVerticalEdge(Qt::Edge tableEdge);
@@ -293,22 +519,32 @@ public:
void updateContentWidth();
void updateContentHeight();
- void updateAverageEdgeSize();
+ void updateAverageColumnWidth();
+ void updateAverageRowHeight();
+ RebuildOptions checkForVisibilityChanges();
+ void forceLayout(bool immediate);
- void enforceTableAtOrigin();
+ void updateExtents();
void syncLoadedTableRectFromLoadedTable();
void syncLoadedTableFromLoadRequest();
+ void shiftLoadedTableRect(const QPointF newPosition);
+
+ int nextVisibleEdgeIndex(Qt::Edge edge, int startIndex) const;
+ int nextVisibleEdgeIndexAroundLoadedTable(Qt::Edge edge) const;
+ inline bool atTableEnd(Qt::Edge edge) const { return nextVisibleEdgeIndexAroundLoadedTable(edge) == kEdgeIndexAtEnd; }
+ inline bool atTableEnd(Qt::Edge edge, int startIndex) const { return nextVisibleEdgeIndex(edge, startIndex) == kEdgeIndexAtEnd; }
+ inline int edgeToArrayIndex(Qt::Edge edge) const;
+ void clearEdgeSizeCache();
bool canLoadTableEdge(Qt::Edge tableEdge, const QRectF fillRect) const;
bool canUnloadTableEdge(Qt::Edge tableEdge, const QRectF fillRect) const;
Qt::Edge nextEdgeToLoad(const QRectF rect);
Qt::Edge nextEdgeToUnload(const QRectF rect);
- qreal cellWidth(const QPoint &cell);
- qreal cellHeight(const QPoint &cell);
+ qreal cellWidth(const QPoint &cell) const;
+ qreal cellHeight(const QPoint &cell) const;
FxTableItem *loadedTableItem(const QPoint &cell) const;
- FxTableItem *itemNextTo(const FxTableItem *fxTableItem, const QPoint &direction) const;
FxTableItem *createFxTableItem(const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
FxTableItem *loadFxTableItem(const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
@@ -316,36 +552,48 @@ public:
void releaseLoadedItems(QQmlTableInstanceModel::ReusableFlag reusableFlag);
void unloadItem(const QPoint &cell);
- void unloadItems(const QLine &items);
-
- void loadInitialTopLeftItem(const QPoint &cell, const QPointF &pos);
void loadEdge(Qt::Edge edge, QQmlIncubator::IncubationMode incubationMode);
void unloadEdge(Qt::Edge edge);
- void loadAndUnloadVisibleEdges();
+ void loadAndUnloadVisibleEdges(QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested);
void drainReusePoolAfterLoadRequest();
- void cancelLoadRequest();
void processLoadRequest();
void processRebuildTable();
bool moveToNextRebuildState();
- void beginRebuildTable();
+ void calculateTopLeft(QPoint &topLeft, QPointF &topLeftPos);
+ void loadInitialTable();
+
void layoutAfterLoadingInitialTable();
+ void adjustViewportXAccordingToAlignment();
+ void adjustViewportYAccordingToAlignment();
+ void cancelOvershootAfterLayout();
void scheduleRebuildTable(QQuickTableViewPrivate::RebuildOptions options);
- void invalidateColumnRowPositions();
-
- int resolveImportVersion();
- void createWrapperModel();
- void initItemCallback(int modelIndex, QObject *item);
- void itemCreatedCallback(int modelIndex, QObject *object);
- void itemPooledCallback(int modelIndex, QObject *object);
- void itemReusedCallback(int modelIndex, QObject *object);
- void modelUpdated(const QQmlChangeSet &changeSet, bool reset);
+#if QT_CONFIG(cursor)
+ void updateCursor();
+#endif
+ void updateEditItem();
+ void updateContentSize();
- inline void syncWithPendingChanges();
- inline void syncDelegate();
- inline void syncModel();
+ QTypeRevision resolveImportVersion();
+ void createWrapperModel();
+ QAbstractItemModel *qaim(QVariant modelAsVariant) const;
+
+ virtual void initItemCallback(int modelIndex, QObject *item);
+ virtual void itemCreatedCallback(int modelIndex, QObject *object);
+ virtual void itemPooledCallback(int modelIndex, QObject *object);
+ virtual void itemReusedCallback(int modelIndex, QObject *object);
+ virtual void modelUpdated(const QQmlChangeSet &changeSet, bool reset);
+
+ virtual void syncWithPendingChanges();
+ virtual void syncDelegate();
+ virtual QVariant modelImpl() const;
+ virtual void setModelImpl(const QVariant &newModel);
+ virtual void syncModel();
+ virtual void syncSyncView();
+ virtual void syncPositionView();
+ virtual QAbstractItemModel *selectionSourceModel();
inline void syncRebuildOptions();
void connectToModel();
@@ -359,12 +607,81 @@ public:
void columnsRemovedCallback(const QModelIndex &parent, int begin, int end);
void layoutChangedCallback(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint);
void modelResetCallback();
+ bool compareModel(const QVariant& model1, const QVariant& model2) const;
+
+ void positionViewAtRow(int row, Qt::Alignment alignment, qreal offset, const QRectF subRect = QRectF());
+ void positionViewAtColumn(int column, Qt::Alignment alignment, qreal offset, const QRectF subRect = QRectF());
+ bool scrollToRow(int row, Qt::Alignment alignment, qreal offset, const QRectF subRect = QRectF());
+ bool scrollToColumn(int column, Qt::Alignment alignment, qreal offset, const QRectF subRect = QRectF());
+
+ void scheduleRebuildIfFastFlick();
+ void setLocalViewportX(qreal contentX);
+ void setLocalViewportY(qreal contentY);
+ void syncViewportRect();
+ void syncViewportPosRecursive();
+
+ bool selectedInSelectionModel(const QPoint &cell) const;
+ void selectionChangedInSelectionModel(const QItemSelection &selected, const QItemSelection &deselected);
+ void updateSelectedOnAllDelegateItems();
+ void setSelectedOnDelegateItem(const QModelIndex &modelIndex, bool select);
+
+ bool currentInSelectionModel(const QPoint &cell) const;
+ void currentChangedInSelectionModel(const QModelIndex &current, const QModelIndex &previous);
+ void setCurrentOnDelegateItem(const QModelIndex &index, bool isCurrent);
+ void updateCurrentRowAndColumn();
+
+ void fetchMoreData();
void _q_componentFinalized();
void registerCallbackWhenBindingsAreEvaluated();
inline QString tableLayoutToString() const;
void dumpTable() const;
+
+ void setRequiredProperty(const char *property,
+ const QVariant &value,
+ int serializedModelIndex,
+ QObject *object, bool init);
+
+ void handleTap(const QQuickHandlerPoint &point);
+ void setCurrentIndexFromTap(const QPointF &pos);
+ void setCurrentIndex(const QPoint &cell);
+ bool setCurrentIndexFromKeyEvent(QKeyEvent *e);
+ bool canEdit(const QModelIndex tappedIndex, bool warn);
+ bool editFromKeyEvent(QKeyEvent *e);
+
+ // QQuickSelectable
+ QQuickItem *selectionPointerHandlerTarget() const override;
+ bool startSelection(const QPointF &pos, Qt::KeyboardModifiers modifiers) override;
+ void setSelectionStartPos(const QPointF &pos) override;
+ void setSelectionEndPos(const QPointF &pos) override;
+ void clearSelection() override;
+ void normalizeSelection() override;
+ QRectF selectionRectangle() const override;
+ QSizeF scrollTowardsPoint(const QPointF &pos, const QSizeF &step) override;
+ void setCallback(std::function<void(CallBackFlag)> func) override;
+ void cancelSelectionTracking();
+
+ QPoint clampedCellAtPos(const QPointF &pos) const;
+ virtual void updateSelection(const QRect &oldSelection, const QRect &newSelection);
+ QRect selection() const;
+ // ----------------
+
+ // Section drag handler
+ void initSectionDragHandler(Qt::Orientation orientation);
+ void destroySectionDragHandler();
+ inline void setActivePointerHandler(QQuickTableViewPointerHandler *handler) { activePtrHandler = handler; }
+ inline QQuickTableViewPointerHandler* activePointerHandler() const { return activePtrHandler; }
+ // Row/Column reordering
+ void moveSection(int source , int destination, Qt::Orientations orientation);
+ void initializeIndexMapping();
+ void clearIndexMapping();
+ void clearSection(Qt::Orientations orientation);
+ virtual int logicalRowIndex(const int visualIndex) const;
+ virtual int logicalColumnIndex(const int visualIndex) const;
+ virtual int visualRowIndex(const int logicalIndex) const;
+ virtual int visualColumnIndex(const int logicalIndex) const;
+ void setContainsDragOnDelegateItem(const QModelIndex &modelIndex, bool overlay);
};
class FxTableItem : public QQuickItemViewFxItem
@@ -384,6 +701,8 @@ public:
QPoint cell;
};
+Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickTableViewPrivate::RebuildOptions)
+
QT_END_NAMESPACE
#endif