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 QJSValue rowHeightProvider;
403 QJSValue columnWidthProvider;
405 mutable EdgeRange cachedNextVisibleEdgeIndex[4];
406 mutable EdgeRange cachedColumnWidth;
407 mutable EdgeRange cachedRowHeight;
418 QQmlNullableValue<qreal> explicitContentWidth;
419 QQmlNullableValue<qreal> explicitContentHeight;
421 QSizeF averageEdgeSize;
423 QPointer<QQuickTableView> assignedSyncView;
424 QPointer<QQuickTableView> syncView;
425 QList<QPointer<QQuickTableView> > syncChildren;
426 Qt::Orientations assignedSyncDirection = Qt::Horizontal | Qt::Vertical;
428 QPointer<QItemSelectionModel> selectionModel;
429 QQuickTableView::SelectionBehavior selectionBehavior = QQuickTableView::SelectCells;
430 QQuickTableView::SelectionMode selectionMode = QQuickTableView::ExtendedSelection;
431 QItemSelectionModel::SelectionFlag selectionFlag = QItemSelectionModel::NoUpdate;
432 std::function<
void(CallBackFlag)> selectableCallbackFunction;
433 bool inSelectionModelUpdate =
false;
434 bool needsModelSynchronization =
false;
436 int assignedPositionViewAtRowAfterRebuild = 0;
437 int assignedPositionViewAtColumnAfterRebuild = 0;
438 int positionViewAtRowAfterRebuild = 0;
439 int positionViewAtColumnAfterRebuild = 0;
440 qreal positionViewAtRowOffset = 0;
441 qreal positionViewAtColumnOffset = 0;
442 QRectF positionViewAtRowSubRect;
443 QRectF positionViewAtColumnSubRect;
444 Qt::Alignment positionViewAtRowAlignment = Qt::AlignTop;
445 Qt::Alignment positionViewAtColumnAlignment = Qt::AlignLeft;
447 QQuickPropertyAnimation positionXAnimation;
448 QQuickPropertyAnimation positionYAnimation;
450 QPoint selectionStartCell = {-1, -1};
451 QPoint selectionEndCell = {-1, -1};
452 QItemSelection existingSelection;
454 QMargins edgesBeforeRebuild;
455 QSize tableSizeBeforeRebuild;
458 int currentColumn = -1;
460 QHash<
int, qreal> explicitColumnWidths;
461 QHash<
int, qreal> explicitRowHeights;
463 QQuickTableViewHoverHandler *hoverHandler =
nullptr;
464 QQuickTableViewResizeHandler *resizeHandler =
nullptr;
465#if QT_CONFIG(quick_draganddrop)
466 QQuickTableViewSectionDragHandler *sectionDragHandler =
nullptr;
468 QQuickTableViewPointerHandler *activePtrHandler =
nullptr;
470 QQmlTableInstanceModel *editModel =
nullptr;
471 QQuickItem *editItem =
nullptr;
472 QPersistentModelIndex editIndex;
473 QQuickTableView::EditTriggers editTriggers = QQuickTableView::DoubleTapped | QQuickTableView::EditKeyPressed;
476 QString forcedIncubationMode = qEnvironmentVariable(
"QT_TABLEVIEW_INCUBATION_MODE");
484 std::vector<SectionData> horizontalVisualIndices;
485 std::vector<SectionData> verticalVisualIndices;
486 std::vector<SectionData> horizontalLogicalIndices;
487 std::vector<SectionData> verticalLogicalIndices;
489 std::vector<SectionData> &visualIndicesForOrientation(Qt::Orientation orientation)
491 return orientation == Qt::Horizontal ? horizontalVisualIndices : verticalVisualIndices;
493 std::vector<SectionData> &logicalIndicesForOrientation(Qt::Orientation orientation)
495 return orientation == Qt::Horizontal ? horizontalLogicalIndices : verticalLogicalIndices;
498 SectionState m_sectionState = SectionState::Idle;
503 QQuickTableViewAttached *getAttachedObject(
const QObject *object)
const;
505 int modelIndexAtCell(
const QPoint &cell)
const;
506 QPoint cellAtModelIndex(
int modelIndex)
const;
507 int modelIndexToCellIndex(
const QModelIndex &modelIndex,
bool visualIndex =
true)
const;
508 inline bool cellIsValid(
const QPoint &cell)
const {
return cell.x() != -1 && cell.y() != -1; }
510 qreal sizeHintForColumn(
int column)
const;
511 qreal sizeHintForRow(
int row)
const;
512 QSize calculateTableSize();
513 void updateTableSize();
515 inline bool isColumnHidden(
int column)
const;
516 inline bool isRowHidden(
int row)
const;
518 qreal getColumnLayoutWidth(
int column);
519 qreal getRowLayoutHeight(
int row);
520 qreal getColumnWidth(
int column)
const;
521 qreal getRowHeight(
int row)
const;
522 qreal getEffectiveRowY(
int row)
const;
523 qreal getEffectiveRowHeight(
int row)
const;
524 qreal getEffectiveColumnX(
int column)
const;
525 qreal getEffectiveColumnWidth(
int column)
const;
526 qreal getAlignmentContentX(
int column, Qt::Alignment alignment,
const qreal offset,
const QRectF &subRect);
527 qreal getAlignmentContentY(
int row, Qt::Alignment alignment,
const qreal offset,
const QRectF &subRect);
529 int topRow()
const {
return *loadedRows.cbegin(); }
530 int bottomRow()
const {
return *loadedRows.crbegin(); }
531 int leftColumn()
const {
return *loadedColumns.cbegin(); }
532 int rightColumn()
const {
return *loadedColumns.crbegin(); }
534 QQuickTableView *rootSyncView()
const;
536 bool updateTableRecursive();
538 void relayoutTableItems();
540 void layoutVerticalEdge(Qt::Edge tableEdge);
541 void layoutHorizontalEdge(Qt::Edge tableEdge);
542 void layoutTopLeftItem();
543 void layoutTableEdgeFromLoadRequest();
545 void updateContentWidth();
546 void updateContentHeight();
547 void updateAverageColumnWidth();
548 void updateAverageRowHeight();
549 RebuildOptions checkForVisibilityChanges();
550 void forceLayout(
bool immediate);
552 void updateExtents();
553 void syncLoadedTableRectFromLoadedTable();
554 void syncLoadedTableFromLoadRequest();
556 int nextVisibleEdgeIndex(Qt::Edge edge,
int startIndex)
const;
557 int nextVisibleEdgeIndexAroundLoadedTable(Qt::Edge edge)
const;
558 inline bool atTableEnd(Qt::Edge edge)
const {
return nextVisibleEdgeIndexAroundLoadedTable(edge) == kEdgeIndexAtEnd; }
559 inline bool atTableEnd(Qt::Edge edge,
int startIndex)
const {
return nextVisibleEdgeIndex(edge, startIndex) == kEdgeIndexAtEnd; }
560 inline int edgeToArrayIndex(Qt::Edge edge)
const;
561 void clearEdgeSizeCache();
563 bool canLoadTableEdge(Qt::Edge tableEdge,
const QRectF fillRect)
const;
564 bool canUnloadTableEdge(Qt::Edge tableEdge,
const QRectF fillRect)
const;
565 Qt::Edge nextEdgeToLoad(
const QRectF rect);
566 Qt::Edge nextEdgeToUnload(
const QRectF rect);
568 qreal cellWidth(
const QPoint &cell)
const;
569 qreal cellHeight(
const QPoint &cell)
const;
571 FxTableItem *loadedTableItem(
const QPoint &cell)
const;
572 FxTableItem *createFxTableItem(
const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
573 FxTableItem *loadFxTableItem(
const QPoint &cell, QQmlIncubator::IncubationMode incubationMode);
575 void releaseItem(FxTableItem *fxTableItem, QQmlTableInstanceModel::ReusableFlag reusableFlag);
576 void releaseLoadedItems(QQmlTableInstanceModel::ReusableFlag reusableFlag);
578 void unloadItem(
const QPoint &cell);
579 void loadEdge(Qt::Edge edge, QQmlIncubator::IncubationMode incubationMode);
580 void unloadEdge(Qt::Edge edge);
581 void loadAndUnloadVisibleEdges(QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested);
582 void drainReusePoolAfterLoadRequest();
583 void processLoadRequest();
585 void processRebuildTable();
586 bool moveToNextRebuildState();
587 void calculateTopLeft(QPoint &topLeft, QPointF &topLeftPos);
588 void loadInitialTable();
590 void layoutAfterLoadingInitialTable();
591 void adjustViewportXAccordingToAlignment();
592 void adjustViewportYAccordingToAlignment();
593 void cancelOvershootAfterLayout();
595 void scheduleRebuildTable(QQuickTableViewPrivate::RebuildOptions options);
600 void updateEditItem();
601 void updateContentSize();
603 QTypeRevision resolveImportVersion();
604 void createWrapperModel();
605 QAbstractItemModel *qaim(QVariant modelAsVariant)
const;
607 virtual void initItemCallback(
int modelIndex, QObject *item);
608 virtual void itemCreatedCallback(
int modelIndex, QObject *object);
609 virtual void itemPooledCallback(
int modelIndex, QObject *object);
610 virtual void itemReusedCallback(
int modelIndex, QObject *object);
611 virtual void modelUpdated(
const QQmlChangeSet &changeSet,
bool reset);
613 virtual void syncWithPendingChanges();
614 virtual void syncDelegate();
615 virtual void syncDelegateModelAccess();
616 virtual QVariant modelImpl()
const;
617 virtual void setModelImpl(
const QVariant &newModel);
618 virtual void syncModel();
619 virtual void syncSyncView();
620 virtual void syncPositionView();
621 virtual QAbstractItemModel *selectionSourceModel();
622 inline void syncRebuildOptions();
624 void connectToModel();
625 void disconnectFromModel();
627 void rowsMovedCallback(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row);
628 void columnsMovedCallback(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int column);
629 void rowsInsertedCallback(
const QModelIndex &parent,
int begin,
int end);
630 void rowsRemovedCallback(
const QModelIndex &parent,
int begin,
int end);
631 void columnsInsertedCallback(
const QModelIndex &parent,
int begin,
int end);
632 void columnsRemovedCallback(
const QModelIndex &parent,
int begin,
int end);
633 void layoutChangedCallback(
const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint);
634 void modelResetCallback();
635 void dataChangedCallback(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
const QList<
int> &roles);
636 bool compareModel(
const QVariant& model1,
const QVariant& model2)
const;
638 void positionViewAtRow(
int row, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
639 void positionViewAtColumn(
int column, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
640 bool scrollToRow(
int row, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
641 bool scrollToColumn(
int column, Qt::Alignment alignment, qreal offset,
const QRectF subRect = QRectF());
643 void scheduleRebuildIfFastFlick();
644 void setLocalViewportX(qreal contentX);
645 void setLocalViewportY(qreal contentY);
646 void syncViewportRect();
647 void syncViewportPosRecursive();
649 bool selectedInSelectionModel(
const QPoint &cell)
const;
650 void selectionChangedInSelectionModel(
const QItemSelection &selected,
const QItemSelection &deselected);
651 void updateSelectedOnAllDelegateItems();
652 void setSelectedOnDelegateItem(
const QModelIndex &modelIndex,
bool select);
654 bool currentInSelectionModel(
const QPoint &cell)
const;
655 void currentChangedInSelectionModel(
const QModelIndex ¤t,
const QModelIndex &previous);
656 void setCurrentOnDelegateItem(
const QModelIndex &index,
bool isCurrent);
657 void updateCurrentRowAndColumn();
659 void fetchMoreData();
661 void _q_componentFinalized();
662 void registerCallbackWhenBindingsAreEvaluated();
664 inline QString tableLayoutToString()
const;
665 void dumpTable()
const;
667 void setRequiredProperty(
const char *property,
668 const QVariant &value,
669 int serializedModelIndex,
670 QObject *object,
bool init);
672 void handleTap(
const QQuickHandlerPoint &point);
673 void setCurrentIndexFromTap(
const QPointF &pos);
674 void setCurrentIndex(
const QPoint &cell);
675 bool setCurrentIndexFromKeyEvent(QKeyEvent *e);
676 bool canEdit(
const QModelIndex tappedIndex,
bool warn);
677 bool editFromKeyEvent(QKeyEvent *e);
678 void closeEditorAndCommit();
679 QObject *installEventFilterOnFocusObjectInsideEditItem();
682 QQuickItem *selectionPointerHandlerTarget()
const override;
683 bool hasSelection()
const override;
684 bool startSelection(
const QPointF &pos, Qt::KeyboardModifiers modifiers) override;
685 void setSelectionStartPos(
const QPointF &pos) override;
686 void setSelectionEndPos(
const QPointF &pos) override;
687 void clearSelection() override;
688 void normalizeSelection() override;
689 QRectF selectionRectangle()
const override;
690 QSizeF scrollTowardsPoint(
const QPointF &pos,
const QSizeF &step) override;
691 void setCallback(std::function<
void(CallBackFlag)> func) override;
692 void cancelSelectionTracking();
694 QPoint clampedCellAtPos(
const QPointF &pos)
const;
695 virtual void updateSelection(
const QRect &oldSelection,
const QRect &newSelection);
696 QRect selection()
const;
700#if QT_CONFIG(quick_draganddrop)
701 void initSectionDragHandler(Qt::Orientation orientation);
702 void destroySectionDragHandler();
704 inline void setActivePointerHandler(QQuickTableViewPointerHandler *handler) { activePtrHandler = handler; }
705 inline QQuickTableViewPointerHandler* activePointerHandler()
const {
return activePtrHandler; }
707 void moveSection(
int source ,
int destination, Qt::Orientation orientation);
708 void initializeIndexMapping();
709 void clearIndexMapping();
710 void clearSection(Qt::Orientation orientation);
711 virtual int logicalRowIndex(
const int visualIndex)
const;
712 virtual int logicalColumnIndex(
const int visualIndex)
const;
713 virtual int visualRowIndex(
const int logicalIndex)
const;
714 virtual int visualColumnIndex(
const int logicalIndex)
const;
715 void setContainsDragOnDelegateItem(
const QModelIndex &modelIndex,
bool overlay);
716 int getEditCellIndex(
const QModelIndex &index)
const;