191 Q_DECLARE_PUBLIC(QQuickTableView)
193 class TableEdgeLoadRequest
203 void begin(
const QPoint &cell,
const QPointF &pos, QQmlIncubator::IncubationMode incubationMode)
207 m_edge = Qt::Edge(0);
208 m_mode = incubationMode;
209 m_edgeIndex = cell.x();
210 m_visibleCellsInEdge.clear();
211 m_visibleCellsInEdge.append(cell.y());
214 qCDebug(lcTableViewDelegateLifecycle()) <<
"begin top-left:" << toString();
217 void begin(Qt::Edge edgeToLoad,
int edgeIndex,
const QList<
int> visibleCellsInEdge, QQmlIncubator::IncubationMode incubationMode)
222 m_edgeIndex = edgeIndex;
223 m_visibleCellsInEdge = visibleCellsInEdge;
224 m_mode = incubationMode;
226 qCDebug(lcTableViewDelegateLifecycle()) <<
"begin:" << toString();
229 inline void markAsDone() { m_active =
false; }
230 inline bool isActive()
const {
return m_active; }
232 inline QPoint currentCell()
const {
return cellAt(m_currentIndex); }
233 inline bool hasCurrentCell()
const {
return m_currentIndex < m_visibleCellsInEdge.size(); }
234 inline void moveToNextCell() { ++m_currentIndex; }
236 inline Qt::Edge edge()
const {
return m_edge; }
237 inline int row()
const {
return cellAt(0).y(); }
238 inline int column()
const {
return cellAt(0).x(); }
239 inline QQmlIncubator::IncubationMode incubationMode()
const {
return m_mode; }
241 inline QPointF startPosition()
const {
return m_startPos; }
243 QString toString()
const
247 dbg.nospace() <<
"TableSectionLoadRequest(" <<
"edge:"
248 << m_edge <<
", edgeIndex:" << m_edgeIndex <<
", incubation:";
251 case QQmlIncubator::Asynchronous:
252 dbg <<
"Asynchronous";
254 case QQmlIncubator::AsynchronousIfNested:
255 dbg <<
"AsynchronousIfNested";
257 case QQmlIncubator::Synchronous:
258 dbg <<
"Synchronous";
266 Qt::Edge m_edge = Qt::Edge(0);
267 QList<
int> m_visibleCellsInEdge;
269 int m_currentIndex = 0;
270 bool m_active =
false;
271 QQmlIncubator::IncubationMode m_mode = QQmlIncubator::AsynchronousIfNested;
274 inline QPoint cellAt(
int index)
const {
275 return !m_edge || (m_edge & (Qt::LeftEdge | Qt::RightEdge))
276 ? QPoint(m_edgeIndex, m_visibleCellsInEdge[index])
277 : QPoint(m_visibleCellsInEdge[index], m_edgeIndex);
284 bool containsIndex(Qt::Edge edge,
int index);
291 enum class RebuildState {
300 MovePreloadedItemsToPool,
304 enum class SectionState {
309 enum class RebuildOption {
314 CalculateNewTopLeftRow = 0x8,
315 CalculateNewTopLeftColumn = 0x10,
316 CalculateNewContentWidth = 0x20,
317 CalculateNewContentHeight = 0x40,
318 PositionViewAtRow = 0x80,
319 PositionViewAtColumn = 0x100,
321 Q_DECLARE_FLAGS(RebuildOptions, RebuildOption)
324 QQuickTableViewPrivate();
325 ~QQuickTableViewPrivate() override;
327 static inline QQuickTableViewPrivate *get(QQuickTableView *q) {
return q->d_func(); }
329 void updatePolish() override;
330 void fixup(AxisData &data, qreal minExtent, qreal maxExtent) override;
333 QHash<
int, FxTableItem *> loadedItems;
339 QQmlInstanceModel* model =
nullptr;
340 QPointer<QQmlTableInstanceModel> tableModel =
nullptr;
344 QVariant assignedModel = QVariant(
int(0));
345 QQmlGuard<QQmlComponent> assignedDelegate;
353 QMinimalFlatSet<
int> loadedColumns;
354 QMinimalFlatSet<
int> loadedRows;
355 QRectF loadedTableOuterRect;
356 QRectF loadedTableInnerRect;
358 QPointF origin = QPointF(0, 0);
359 QSizeF endExtent = QSizeF(0, 0);
361 QRectF viewportRect = QRectF(0, 0, -1, -1);
365 RebuildState rebuildState = RebuildState::Done;
366 RebuildOptions rebuildOptions = RebuildOption::All;
367 RebuildOptions scheduledRebuildOptions = RebuildOption::All;
369 TableEdgeLoadRequest loadRequest;
371 QSizeF cellSpacing = QSizeF(0, 0);
373 QQmlTableInstanceModel::ReusableFlag reusableFlag = QQmlTableInstanceModel::Reusable;
375 bool blockItemCreatedCallback =
false;
376 mutable bool layoutWarningIssued =
false;
377 bool polishing =
false;
378 bool syncVertically =
false;
379 bool syncHorizontally =
false;
380 bool inSetLocalViewportPos =
false;
381 bool inSyncViewportPosRecursive =
false;
382 bool inUpdateContentSize =
false;
384 bool keyNavigationEnabled =
true;
385 bool pointerNavigationEnabled =
true;
386 bool alternatingRows =
true;
387 bool resizableColumns =
false;
388 bool resizableRows =
false;
390 bool m_cursorSet =
false;
395 bool isTransposed =
false;
397 bool warnNoSelectionModel =
true;
399 QQmlDelegateModel::DelegateModelAccess assignedDelegateModelAccess
400 = QQmlDelegateModel::Qt5ReadWrite;
402 bool componentFinalized =
false;
405 void requestSort(
int logicalColumn,
bool clearable);
406 void sortByColumn(
int column, Qt::SortOrder order);
407 void updateSortState(
int column, Qt::SortOrder order);
409 bool sortingEnabled =
false;
411 Qt::SortOrder sortOrder = Qt::AscendingOrder;
413 QJSValue rowHeightProvider;
414 QJSValue columnWidthProvider;
416 mutable EdgeRange cachedNextVisibleEdgeIndex[4];
417 mutable EdgeRange cachedColumnWidth;
418 mutable EdgeRange cachedRowHeight;
429 QQmlNullableValue<qreal> explicitContentWidth;
430 QQmlNullableValue<qreal> explicitContentHeight;
432 QSizeF averageEdgeSize;
434 QPointer<QQuickTableView> assignedSyncView;
435 QPointer<QQuickTableView> syncView;
436 QList<QPointer<QQuickTableView> > syncChildren;
437 Qt::Orientations assignedSyncDirection = Qt::Horizontal | Qt::Vertical;
439 QPointer<QItemSelectionModel> selectionModel;
440 QQuickTableView::SelectionBehavior selectionBehavior = QQuickTableView::SelectCells;
441 QQuickTableView::SelectionMode selectionMode = QQuickTableView::ExtendedSelection;
442 QItemSelectionModel::SelectionFlag selectionFlag = QItemSelectionModel::NoUpdate;
443 std::function<
void(CallBackFlag)> selectableCallbackFunction;
444 bool inSelectionModelUpdate =
false;
445 bool needsModelSynchronization =
false;
447 int assignedPositionViewAtRowAfterRebuild = 0;
448 int assignedPositionViewAtColumnAfterRebuild = 0;
449 int positionViewAtRowAfterRebuild = 0;
450 int positionViewAtColumnAfterRebuild = 0;
451 qreal positionViewAtRowOffset = 0;
452 qreal positionViewAtColumnOffset = 0;
453 QRectF positionViewAtRowSubRect;
454 QRectF positionViewAtColumnSubRect;
455 Qt::Alignment positionViewAtRowAlignment = Qt::AlignTop;
456 Qt::Alignment positionViewAtColumnAlignment = Qt::AlignLeft;
458 QQuickPropertyAnimation positionXAnimation;
459 QQuickPropertyAnimation positionYAnimation;
461 QPoint selectionStartCell = {-1, -1};
462 QPoint selectionEndCell = {-1, -1};
463 QItemSelection existingSelection;
465 QMargins edgesBeforeRebuild;
466 QSize tableSizeBeforeRebuild;
469 int currentColumn = -1;
471 QHash<
int, qreal> explicitColumnWidths;
472 QHash<
int, qreal> explicitRowHeights;
474 QQuickTableViewHoverHandler *hoverHandler =
nullptr;
475 QQuickTableViewResizeHandler *resizeHandler =
nullptr;
476#if QT_CONFIG(quick_draganddrop)
477 QQuickTableViewSectionDragHandler *sectionDragHandler =
nullptr;
479 QQuickTableViewPointerHandler *activePtrHandler =
nullptr;
481 QQmlTableInstanceModel *editModel =
nullptr;
482 QQuickItem *editItem =
nullptr;
483 QPersistentModelIndex editIndex;
484 QQuickTableView::EditTriggers editTriggers = QQuickTableView::DoubleTapped | QQuickTableView::EditKeyPressed;
487 QString forcedIncubationMode = qEnvironmentVariable(
"QT_TABLEVIEW_INCUBATION_MODE");
495 std::vector<SectionData> horizontalVisualIndices;
496 std::vector<SectionData> verticalVisualIndices;
497 std::vector<SectionData> horizontalLogicalIndices;
498 std::vector<SectionData> verticalLogicalIndices;
500 std::vector<SectionData> &visualIndicesForOrientation(Qt::Orientation orientation)
502 return orientation == Qt::Horizontal ? horizontalVisualIndices : verticalVisualIndices;
504 std::vector<SectionData> &logicalIndicesForOrientation(Qt::Orientation orientation)
506 return orientation == Qt::Horizontal ? horizontalLogicalIndices : verticalLogicalIndices;
509 SectionState m_sectionState = SectionState::Idle;
514 QQuickTableViewAttached *getAttachedObject(
const QObject *object)
const;
516 int modelIndexAtCell(
const QPoint &cell)
const;
517 QPoint cellAtModelIndex(
int modelIndex)
const;
518 int modelIndexToCellIndex(
const QModelIndex &modelIndex,
bool visualIndex =
true)
const;
519 inline bool cellIsValid(
const QPoint &cell)
const {
return cell.x() != -1 && cell.y() != -1; }
521 qreal sizeHintForColumn(
int column)
const;
522 qreal sizeHintForRow(
int row)
const;
523 QSize calculateTableSize();
524 void updateTableSize();
526 inline bool isColumnHidden(
int column)
const;
527 inline bool isRowHidden(
int row)
const;
529 qreal getColumnLayoutWidth(
int column);
530 qreal getRowLayoutHeight(
int row);
531 qreal getColumnWidth(
int column)
const;
532 qreal getRowHeight(
int row)
const;
533 qreal getEffectiveRowY(
int row)
const;
534 qreal getEffectiveRowHeight(
int row)
const;
535 qreal getEffectiveColumnX(
int column)
const;
536 qreal getEffectiveColumnWidth(
int column)
const;
537 qreal getAlignmentContentX(
int column, Qt::Alignment alignment,
const qreal offset,
const QRectF &subRect);
538 qreal getAlignmentContentY(
int row, Qt::Alignment alignment,
const qreal offset,
const QRectF &subRect);
540 int topRow()
const {
return *loadedRows.cbegin(); }
541 int bottomRow()
const {
return *loadedRows.crbegin(); }
542 int leftColumn()
const {
return *loadedColumns.cbegin(); }
543 int rightColumn()
const {
return *loadedColumns.crbegin(); }
545 QQuickTableView *rootSyncView()
const;
547 bool updateTableRecursive();
549 void relayoutTableItems();
551 void layoutVerticalEdge(Qt::Edge tableEdge);
552 void layoutHorizontalEdge(Qt::Edge tableEdge);
553 void layoutTopLeftItem();
554 void layoutTableEdgeFromLoadRequest();
556 void updateContentWidth();
557 void updateContentHeight();
558 void updateAverageColumnWidth();
559 void updateAverageRowHeight();
560 RebuildOptions checkForVisibilityChanges();
561 void forceLayout(
bool immediate);
563 void updateExtents();
564 void syncLoadedTableRectFromLoadedTable();
565 void syncLoadedTableFromLoadRequest();
567 int nextVisibleEdgeIndex(Qt::Edge edge,
int startIndex)
const;
568 int nextVisibleEdgeIndexAroundLoadedTable(Qt::Edge edge)
const;
569 inline bool atTableEnd(Qt::Edge edge)
const {
return nextVisibleEdgeIndexAroundLoadedTable(edge) == kEdgeIndexAtEnd; }
570 inline bool atTableEnd(Qt::Edge edge,
int startIndex)
const {
return nextVisibleEdgeIndex(edge, startIndex) == kEdgeIndexAtEnd; }
571 inline int edgeToArrayIndex(Qt::Edge edge)
const;
572 void clearEdgeSizeCache();
574 bool canLoadTableEdge(Qt::Edge tableEdge,
const QRectF fillRect)
const;
575 bool canUnloadTableEdge(Qt::Edge tableEdge,
const QRectF fillRect)
const;
576 Qt::Edge nextEdgeToLoad(
const QRectF rect);
577 Qt::Edge nextEdgeToUnload(
const QRectF rect);
579 qreal cellWidth(
const QPoint &cell)
const;
580 qreal cellHeight(
const QPoint &cell)
const;
582 FxTableItem *loadedTableItem(
const QPoint &cell)
const;
583 FxTableItem *createFxTableItem(
const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
584 FxTableItem *loadFxTableItem(
const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
586 void releaseItem(FxTableItem *fxTableItem, QQmlTableInstanceModel::ReusableFlag reusableFlag);
587 void releaseLoadedItems(QQmlTableInstanceModel::ReusableFlag reusableFlag);
589 void unloadItem(
const QPoint &cell);
590 void loadEdge(Qt::Edge edge, QQmlIncubator::IncubationMode incubationMode);
591 void unloadEdge(Qt::Edge edge);
592 void loadAndUnloadVisibleEdges(QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested);
593 void drainReusePoolAfterLoadRequest();
594 void processLoadRequest();
596 void processRebuildTable();
597 bool moveToNextRebuildState();
598 void calculateTopLeft(QPoint &topLeft, QPointF &topLeftPos);
599 void loadInitialTable();
601 void layoutAfterLoadingInitialTable();
602 void adjustViewportXAccordingToAlignment();
603 void adjustViewportYAccordingToAlignment();
604 void cancelOvershootAfterLayout();
606 void scheduleRebuildTable(QQuickTableViewPrivate::RebuildOptions options);
611 void updateEditItem();
612 void updateContentSize();
614 QTypeRevision resolveImportVersion();
615 void createWrapperModel();
616 QAbstractItemModel *qaim(QVariant modelAsVariant)
const;
618 virtual void initItemCallback(
int modelIndex, QObject *item);
619 virtual void itemCreatedCallback(
int modelIndex, QObject *object);
620 virtual void itemPooledCallback(
int modelIndex, QObject *object);
621 virtual void itemReusedCallback(
int modelIndex, QObject *object);
622 virtual void modelUpdated(
const QQmlChangeSet &changeSet,
bool reset);
623 virtual void updateItemProperties(
int flatIndex, QObject *object,
bool init);
625 virtual void syncWithPendingChanges();
626 virtual void syncDelegate();
627 virtual void syncDelegateModelAccess();
628 virtual QVariant modelImpl()
const;
629 virtual void setModelImpl(
const QVariant &newModel);
630 virtual void syncModel();
631 virtual void syncSyncView();
632 virtual void syncPositionView();
633 virtual QAbstractItemModel *selectionSourceModel();
634 inline void syncRebuildOptions();
636 void connectToModel();
637 void disconnectFromModel();
639 void rowsMovedCallback(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row);
640 void columnsMovedCallback(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int column);
641 void rowsInsertedCallback(
const QModelIndex &parent,
int begin,
int end);
642 void rowsRemovedCallback(
const QModelIndex &parent,
int begin,
int end);
643 void columnsInsertedCallback(
const QModelIndex &parent,
int begin,
int end);
644 void columnsRemovedCallback(
const QModelIndex &parent,
int begin,
int end);
645 void layoutChangedCallback(
const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint);
646 void modelResetCallback();
647 void dataChangedCallback(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
const QList<
int> &roles);
648 bool compareModel(
const QVariant& model1,
const QVariant& model2)
const;
650 void positionViewAtRow(
int row, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
651 void positionViewAtColumn(
int column, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
652 bool scrollToRow(
int row, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
653 bool scrollToColumn(
int column, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
655 void scheduleRebuildIfFastFlick();
656 void setLocalViewportX(qreal contentX);
657 void setLocalViewportY(qreal contentY);
658 void syncViewportRect();
659 void syncViewportPosRecursive();
661 bool selectedInSelectionModel(
const QPoint &cell)
const;
662 void selectionChangedInSelectionModel(
const QItemSelection &selected,
const QItemSelection &deselected);
663 void updateSelectedOnAllDelegateItems();
664 void setSelectedOnDelegateItem(
const QModelIndex &modelIndex,
bool select);
666 bool currentInSelectionModel(
const QPoint &cell)
const;
667 void currentChangedInSelectionModel(
const QModelIndex ¤t,
const QModelIndex &previous);
668 void setCurrentOnDelegateItem(
const QModelIndex &index,
bool isCurrent);
669 void updateCurrentRowAndColumn();
671 void fetchMoreData();
673 void _q_componentFinalized();
674 void registerCallbackWhenBindingsAreEvaluated();
676 inline QString tableLayoutToString()
const;
677 void dumpTable()
const;
679 void setRequiredProperty(
const char *property,
680 const QVariant &value,
681 int serializedModelIndex,
682 QObject *object,
bool init);
684 void handleTap(
const QQuickHandlerPoint &point);
685 virtual void executeTap(
const QQuickHandlerPoint &point);
686 void setCurrentIndexFromTap(
const QPointF &pos);
687 void setCurrentIndex(
const QPoint &cell);
688 bool setCurrentIndexFromKeyEvent(QKeyEvent *e);
689 bool canEdit(
const QModelIndex tappedIndex,
bool warn);
690 bool editFromKeyEvent(QKeyEvent *e);
691 void closeEditorAndCommit();
692 QObject *installEventFilterOnFocusObjectInsideEditItem();
695 QQuickItem *selectionPointerHandlerTarget()
const override;
696 bool hasSelection()
const override;
697 bool startSelection(
const QPointF &pos, Qt::KeyboardModifiers modifiers) override;
698 void setSelectionStartPos(
const QPointF &pos) override;
699 void setSelectionEndPos(
const QPointF &pos) override;
700 void clearSelection() override;
701 void normalizeSelection() override;
702 QRectF selectionRectangle()
const override;
703 QSizeF scrollTowardsPoint(
const QPointF &pos,
const QSizeF &step) override;
704 void setCallback(std::function<
void(CallBackFlag)> func) override;
705 void cancelSelectionTracking();
707 QPoint clampedCellAtPos(
const QPointF &pos)
const;
708 virtual void updateSelection(
const QRect &oldSelection,
const QRect &newSelection);
709 QRect selection()
const;
713#if QT_CONFIG(quick_draganddrop)
714 void initSectionDragHandler(Qt::Orientation orientation);
715 void destroySectionDragHandler();
717 inline void setActivePointerHandler(QQuickTableViewPointerHandler *handler) { activePtrHandler = handler; }
718 inline QQuickTableViewPointerHandler* activePointerHandler()
const {
return activePtrHandler; }
720 void moveSection(
int source ,
int destination, Qt::Orientation orientation);
721 void initializeIndexMapping();
722 void clearIndexMapping();
723 void clearSection(Qt::Orientation orientation);
724 virtual int logicalRowIndex(
const int visualIndex)
const;
725 virtual int logicalColumnIndex(
const int visualIndex)
const;
726 virtual int visualRowIndex(
const int logicalIndex)
const;
727 virtual int visualColumnIndex(
const int logicalIndex)
const;
728 void setContainsDragOnDelegateItem(
const QModelIndex &modelIndex,
bool overlay);
729 int getEditCellIndex(
const QModelIndex &index)
const;