188 Q_DECLARE_PUBLIC(QQuickTableView)
190 class TableEdgeLoadRequest
200 void begin(
const QPoint &cell,
const QPointF &pos, QQmlIncubator::IncubationMode incubationMode)
204 m_edge = Qt::Edge(0);
205 m_mode = incubationMode;
206 m_edgeIndex = cell.x();
207 m_visibleCellsInEdge.clear();
208 m_visibleCellsInEdge.append(cell.y());
211 qCDebug(lcTableViewDelegateLifecycle()) <<
"begin top-left:" << toString();
214 void begin(Qt::Edge edgeToLoad,
int edgeIndex,
const QVector<
int> visibleCellsInEdge, QQmlIncubator::IncubationMode incubationMode)
219 m_edgeIndex = edgeIndex;
220 m_visibleCellsInEdge = visibleCellsInEdge;
221 m_mode = incubationMode;
223 qCDebug(lcTableViewDelegateLifecycle()) <<
"begin:" << toString();
226 inline void markAsDone() { m_active =
false; }
227 inline bool isActive()
const {
return m_active; }
229 inline QPoint currentCell()
const {
return cellAt(m_currentIndex); }
230 inline bool hasCurrentCell()
const {
return m_currentIndex < m_visibleCellsInEdge.size(); }
231 inline void moveToNextCell() { ++m_currentIndex; }
233 inline Qt::Edge edge()
const {
return m_edge; }
234 inline int row()
const {
return cellAt(0).y(); }
235 inline int column()
const {
return cellAt(0).x(); }
236 inline QQmlIncubator::IncubationMode incubationMode()
const {
return m_mode; }
238 inline QPointF startPosition()
const {
return m_startPos; }
240 QString toString()
const
244 dbg.nospace() <<
"TableSectionLoadRequest(" <<
"edge:"
245 << m_edge <<
", edgeIndex:" << m_edgeIndex <<
", incubation:";
248 case QQmlIncubator::Asynchronous:
249 dbg <<
"Asynchronous";
251 case QQmlIncubator::AsynchronousIfNested:
252 dbg <<
"AsynchronousIfNested";
254 case QQmlIncubator::Synchronous:
255 dbg <<
"Synchronous";
263 Qt::Edge m_edge = Qt::Edge(0);
264 QVector<
int> m_visibleCellsInEdge;
266 int m_currentIndex = 0;
267 bool m_active =
false;
268 QQmlIncubator::IncubationMode m_mode = QQmlIncubator::AsynchronousIfNested;
271 inline QPoint cellAt(
int index)
const {
272 return !m_edge || (m_edge & (Qt::LeftEdge | Qt::RightEdge))
273 ? QPoint(m_edgeIndex, m_visibleCellsInEdge[index])
274 : QPoint(m_visibleCellsInEdge[index], m_edgeIndex);
281 bool containsIndex(Qt::Edge edge,
int index);
288 enum class RebuildState {
297 MovePreloadedItemsToPool,
301 enum class SectionState {
306 enum class RebuildOption {
311 CalculateNewTopLeftRow = 0x8,
312 CalculateNewTopLeftColumn = 0x10,
313 CalculateNewContentWidth = 0x20,
314 CalculateNewContentHeight = 0x40,
315 PositionViewAtRow = 0x80,
316 PositionViewAtColumn = 0x100,
318 Q_DECLARE_FLAGS(RebuildOptions, RebuildOption)
321 QQuickTableViewPrivate();
322 ~QQuickTableViewPrivate() override;
324 static inline QQuickTableViewPrivate *get(QQuickTableView *q) {
return q->d_func(); }
326 void updatePolish() override;
327 void fixup(AxisData &data, qreal minExtent, qreal maxExtent) override;
330 QHash<
int, FxTableItem *> loadedItems;
336 QQmlInstanceModel* model =
nullptr;
337 QPointer<QQmlTableInstanceModel> tableModel =
nullptr;
341 QVariant assignedModel = QVariant(
int(0));
342 QQmlGuard<QQmlComponent> assignedDelegate;
350 QMinimalFlatSet<
int> loadedColumns;
351 QMinimalFlatSet<
int> loadedRows;
352 QRectF loadedTableOuterRect;
353 QRectF loadedTableInnerRect;
355 QPointF origin = QPointF(0, 0);
356 QSizeF endExtent = QSizeF(0, 0);
358 QRectF viewportRect = QRectF(0, 0, -1, -1);
362 RebuildState rebuildState = RebuildState::Done;
363 RebuildOptions rebuildOptions = RebuildOption::All;
364 RebuildOptions scheduledRebuildOptions = RebuildOption::All;
366 TableEdgeLoadRequest loadRequest;
368 QSizeF cellSpacing = QSizeF(0, 0);
370 QQmlTableInstanceModel::ReusableFlag reusableFlag = QQmlTableInstanceModel::Reusable;
372 bool blockItemCreatedCallback =
false;
373 mutable bool layoutWarningIssued =
false;
374 bool polishing =
false;
375 bool syncVertically =
false;
376 bool syncHorizontally =
false;
377 bool inSetLocalViewportPos =
false;
378 bool inSyncViewportPosRecursive =
false;
379 bool inUpdateContentSize =
false;
381 bool keyNavigationEnabled =
true;
382 bool pointerNavigationEnabled =
true;
383 bool alternatingRows =
true;
384 bool resizableColumns =
false;
385 bool resizableRows =
false;
387 bool m_cursorSet =
false;
392 bool isTransposed =
false;
394 bool warnNoSelectionModel =
true;
396 QQmlDelegateModel::DelegateModelAccess assignedDelegateModelAccess
397 = QQmlDelegateModel::Qt5ReadWrite;
399 QJSValue rowHeightProvider;
400 QJSValue columnWidthProvider;
402 mutable EdgeRange cachedNextVisibleEdgeIndex[4];
403 mutable EdgeRange cachedColumnWidth;
404 mutable EdgeRange cachedRowHeight;
415 QQmlNullableValue<qreal> explicitContentWidth;
416 QQmlNullableValue<qreal> explicitContentHeight;
418 QSizeF averageEdgeSize;
420 QPointer<QQuickTableView> assignedSyncView;
421 QPointer<QQuickTableView> syncView;
422 QList<QPointer<QQuickTableView> > syncChildren;
423 Qt::Orientations assignedSyncDirection = Qt::Horizontal | Qt::Vertical;
425 QPointer<QItemSelectionModel> selectionModel;
426 QQuickTableView::SelectionBehavior selectionBehavior = QQuickTableView::SelectCells;
427 QQuickTableView::SelectionMode selectionMode = QQuickTableView::ExtendedSelection;
428 QItemSelectionModel::SelectionFlag selectionFlag = QItemSelectionModel::NoUpdate;
429 std::function<
void(CallBackFlag)> selectableCallbackFunction;
430 bool inSelectionModelUpdate =
false;
431 bool needsModelSynchronization =
false;
433 int assignedPositionViewAtRowAfterRebuild = 0;
434 int assignedPositionViewAtColumnAfterRebuild = 0;
435 int positionViewAtRowAfterRebuild = 0;
436 int positionViewAtColumnAfterRebuild = 0;
437 qreal positionViewAtRowOffset = 0;
438 qreal positionViewAtColumnOffset = 0;
439 QRectF positionViewAtRowSubRect;
440 QRectF positionViewAtColumnSubRect;
441 Qt::Alignment positionViewAtRowAlignment = Qt::AlignTop;
442 Qt::Alignment positionViewAtColumnAlignment = Qt::AlignLeft;
444 QQuickPropertyAnimation positionXAnimation;
445 QQuickPropertyAnimation positionYAnimation;
447 QPoint selectionStartCell = {-1, -1};
448 QPoint selectionEndCell = {-1, -1};
449 QItemSelection existingSelection;
451 QMargins edgesBeforeRebuild;
452 QSize tableSizeBeforeRebuild;
455 int currentColumn = -1;
457 QHash<
int, qreal> explicitColumnWidths;
458 QHash<
int, qreal> explicitRowHeights;
460 QQuickTableViewHoverHandler *hoverHandler =
nullptr;
461 QQuickTableViewResizeHandler *resizeHandler =
nullptr;
462#if QT_CONFIG(quick_draganddrop)
463 QQuickTableViewSectionDragHandler *sectionDragHandler =
nullptr;
465 QQuickTableViewPointerHandler *activePtrHandler =
nullptr;
467 QQmlTableInstanceModel *editModel =
nullptr;
468 QQuickItem *editItem =
nullptr;
469 QPersistentModelIndex editIndex;
470 QQuickTableView::EditTriggers editTriggers = QQuickTableView::DoubleTapped | QQuickTableView::EditKeyPressed;
473 QString forcedIncubationMode = qEnvironmentVariable(
"QT_TABLEVIEW_INCUBATION_MODE");
481 QList<SectionData> visualIndices[Qt::Vertical];
482 QList<SectionData> logicalIndices[Qt::Vertical];
484 SectionState m_sectionState = SectionState::Idle;
489 QQuickTableViewAttached *getAttachedObject(
const QObject *object)
const;
491 int modelIndexAtCell(
const QPoint &cell)
const;
492 QPoint cellAtModelIndex(
int modelIndex)
const;
493 int modelIndexToCellIndex(
const QModelIndex &modelIndex,
bool visualIndex =
true)
const;
494 inline bool cellIsValid(
const QPoint &cell)
const {
return cell.x() != -1 && cell.y() != -1; }
496 qreal sizeHintForColumn(
int column)
const;
497 qreal sizeHintForRow(
int row)
const;
498 QSize calculateTableSize();
499 void updateTableSize();
501 inline bool isColumnHidden(
int column)
const;
502 inline bool isRowHidden(
int row)
const;
504 qreal getColumnLayoutWidth(
int column);
505 qreal getRowLayoutHeight(
int row);
506 qreal getColumnWidth(
int column)
const;
507 qreal getRowHeight(
int row)
const;
508 qreal getEffectiveRowY(
int row)
const;
509 qreal getEffectiveRowHeight(
int row)
const;
510 qreal getEffectiveColumnX(
int column)
const;
511 qreal getEffectiveColumnWidth(
int column)
const;
512 qreal getAlignmentContentX(
int column, Qt::Alignment alignment,
const qreal offset,
const QRectF &subRect);
513 qreal getAlignmentContentY(
int row, Qt::Alignment alignment,
const qreal offset,
const QRectF &subRect);
515 int topRow()
const {
return *loadedRows.cbegin(); }
516 int bottomRow()
const {
return *loadedRows.crbegin(); }
517 int leftColumn()
const {
return *loadedColumns.cbegin(); }
518 int rightColumn()
const {
return *loadedColumns.crbegin(); }
520 QQuickTableView *rootSyncView()
const;
522 bool updateTableRecursive();
524 void relayoutTableItems();
526 void layoutVerticalEdge(Qt::Edge tableEdge);
527 void layoutHorizontalEdge(Qt::Edge tableEdge);
528 void layoutTopLeftItem();
529 void layoutTableEdgeFromLoadRequest();
531 void updateContentWidth();
532 void updateContentHeight();
533 void updateAverageColumnWidth();
534 void updateAverageRowHeight();
535 RebuildOptions checkForVisibilityChanges();
536 void forceLayout(
bool immediate);
538 void updateExtents();
539 void syncLoadedTableRectFromLoadedTable();
540 void syncLoadedTableFromLoadRequest();
542 int nextVisibleEdgeIndex(Qt::Edge edge,
int startIndex)
const;
543 int nextVisibleEdgeIndexAroundLoadedTable(Qt::Edge edge)
const;
544 inline bool atTableEnd(Qt::Edge edge)
const {
return nextVisibleEdgeIndexAroundLoadedTable(edge) == kEdgeIndexAtEnd; }
545 inline bool atTableEnd(Qt::Edge edge,
int startIndex)
const {
return nextVisibleEdgeIndex(edge, startIndex) == kEdgeIndexAtEnd; }
546 inline int edgeToArrayIndex(Qt::Edge edge)
const;
547 void clearEdgeSizeCache();
549 bool canLoadTableEdge(Qt::Edge tableEdge,
const QRectF fillRect)
const;
550 bool canUnloadTableEdge(Qt::Edge tableEdge,
const QRectF fillRect)
const;
551 Qt::Edge nextEdgeToLoad(
const QRectF rect);
552 Qt::Edge nextEdgeToUnload(
const QRectF rect);
554 qreal cellWidth(
const QPoint &cell)
const;
555 qreal cellHeight(
const QPoint &cell)
const;
557 FxTableItem *loadedTableItem(
const QPoint &cell)
const;
558 FxTableItem *createFxTableItem(
const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
559 FxTableItem *loadFxTableItem(
const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
561 void releaseItem(FxTableItem *fxTableItem, QQmlTableInstanceModel::ReusableFlag reusableFlag);
562 void releaseLoadedItems(QQmlTableInstanceModel::ReusableFlag reusableFlag);
564 void unloadItem(
const QPoint &cell);
565 void loadEdge(Qt::Edge edge, QQmlIncubator::IncubationMode incubationMode);
566 void unloadEdge(Qt::Edge edge);
567 void loadAndUnloadVisibleEdges(QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested);
568 void drainReusePoolAfterLoadRequest();
569 void processLoadRequest();
571 void processRebuildTable();
572 bool moveToNextRebuildState();
573 void calculateTopLeft(QPoint &topLeft, QPointF &topLeftPos);
574 void loadInitialTable();
576 void layoutAfterLoadingInitialTable();
577 void adjustViewportXAccordingToAlignment();
578 void adjustViewportYAccordingToAlignment();
579 void cancelOvershootAfterLayout();
581 void scheduleRebuildTable(QQuickTableViewPrivate::RebuildOptions options);
586 void updateEditItem();
587 void updateContentSize();
589 QTypeRevision resolveImportVersion();
590 void createWrapperModel();
591 QAbstractItemModel *qaim(QVariant modelAsVariant)
const;
593 virtual void initItemCallback(
int modelIndex, QObject *item);
594 virtual void itemCreatedCallback(
int modelIndex, QObject *object);
595 virtual void itemPooledCallback(
int modelIndex, QObject *object);
596 virtual void itemReusedCallback(
int modelIndex, QObject *object);
597 virtual void modelUpdated(
const QQmlChangeSet &changeSet,
bool reset);
599 virtual void syncWithPendingChanges();
600 virtual void syncDelegate();
601 virtual void syncDelegateModelAccess();
602 virtual QVariant modelImpl()
const;
603 virtual void setModelImpl(
const QVariant &newModel);
604 virtual void syncModel();
605 virtual void syncSyncView();
606 virtual void syncPositionView();
607 virtual QAbstractItemModel *selectionSourceModel();
608 inline void syncRebuildOptions();
610 void connectToModel();
611 void disconnectFromModel();
613 void rowsMovedCallback(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row);
614 void columnsMovedCallback(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int column);
615 void rowsInsertedCallback(
const QModelIndex &parent,
int begin,
int end);
616 void rowsRemovedCallback(
const QModelIndex &parent,
int begin,
int end);
617 void columnsInsertedCallback(
const QModelIndex &parent,
int begin,
int end);
618 void columnsRemovedCallback(
const QModelIndex &parent,
int begin,
int end);
619 void layoutChangedCallback(
const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint);
620 void modelResetCallback();
621 bool compareModel(
const QVariant& model1,
const QVariant& model2)
const;
623 void positionViewAtRow(
int row, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
624 void positionViewAtColumn(
int column, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
625 bool scrollToRow(
int row, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
626 bool scrollToColumn(
int column, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
628 void scheduleRebuildIfFastFlick();
629 void setLocalViewportX(qreal contentX);
630 void setLocalViewportY(qreal contentY);
631 void syncViewportRect();
632 void syncViewportPosRecursive();
634 bool selectedInSelectionModel(
const QPoint &cell)
const;
635 void selectionChangedInSelectionModel(
const QItemSelection &selected,
const QItemSelection &deselected);
636 void updateSelectedOnAllDelegateItems();
637 void setSelectedOnDelegateItem(
const QModelIndex &modelIndex,
bool select);
639 bool currentInSelectionModel(
const QPoint &cell)
const;
640 void currentChangedInSelectionModel(
const QModelIndex ¤t,
const QModelIndex &previous);
641 void setCurrentOnDelegateItem(
const QModelIndex &index,
bool isCurrent);
642 void updateCurrentRowAndColumn();
644 void fetchMoreData();
646 void _q_componentFinalized();
647 void registerCallbackWhenBindingsAreEvaluated();
649 inline QString tableLayoutToString()
const;
650 void dumpTable()
const;
652 void setRequiredProperty(
const char *property,
653 const QVariant &value,
654 int serializedModelIndex,
655 QObject *object,
bool init);
657 void handleTap(
const QQuickHandlerPoint &point);
658 void setCurrentIndexFromTap(
const QPointF &pos);
659 void setCurrentIndex(
const QPoint &cell);
660 bool setCurrentIndexFromKeyEvent(QKeyEvent *e);
661 bool canEdit(
const QModelIndex tappedIndex,
bool warn);
662 bool editFromKeyEvent(QKeyEvent *e);
663 void closeEditorAndCommit();
664 QObject *installEventFilterOnFocusObjectInsideEditItem();
667 QQuickItem *selectionPointerHandlerTarget()
const override;
668 bool hasSelection()
const override;
669 bool startSelection(
const QPointF &pos, Qt::KeyboardModifiers modifiers) override;
670 void setSelectionStartPos(
const QPointF &pos) override;
671 void setSelectionEndPos(
const QPointF &pos) override;
672 void clearSelection() override;
673 void normalizeSelection() override;
674 QRectF selectionRectangle()
const override;
675 QSizeF scrollTowardsPoint(
const QPointF &pos,
const QSizeF &step) override;
676 void setCallback(std::function<
void(CallBackFlag)> func) override;
677 void cancelSelectionTracking();
679 QPoint clampedCellAtPos(
const QPointF &pos)
const;
680 virtual void updateSelection(
const QRect &oldSelection,
const QRect &newSelection);
681 QRect selection()
const;
685#if QT_CONFIG(quick_draganddrop)
686 void initSectionDragHandler(Qt::Orientation orientation);
687 void destroySectionDragHandler();
689 inline void setActivePointerHandler(QQuickTableViewPointerHandler *handler) { activePtrHandler = handler; }
690 inline QQuickTableViewPointerHandler* activePointerHandler()
const {
return activePtrHandler; }
692 void moveSection(
int source ,
int destination, Qt::Orientations orientation);
693 void initializeIndexMapping();
694 void clearIndexMapping();
695 void clearSection(Qt::Orientations orientation);
696 virtual int logicalRowIndex(
const int visualIndex)
const;
697 virtual int logicalColumnIndex(
const int visualIndex)
const;
698 virtual int visualRowIndex(
const int logicalIndex)
const;
699 virtual int visualColumnIndex(
const int logicalIndex)
const;
700 void setContainsDragOnDelegateItem(
const QModelIndex &modelIndex,
bool overlay);
701 int getEditCellIndex(
const QModelIndex &index)
const;