54 Q_DECLARE_PUBLIC(QTreeView)
58 : QAbstractItemViewPrivate(),
59 header(
nullptr), indent(20), lastViewedItem(0), defaultItemHeight(-1),
60 uniformRowHeights(
false), rootDecoration(
true),
61 itemsExpandable(
true), sortingEnabled(
false),
62 expandsOnDoubleClick(
true),
63 allColumnsShowFocus(
false), customIndent(
false), current(0), spanning(
false),
64 animationsEnabled(
false),
65 autoExpandDelay(-1), hoverBranch(-1), geometryRecursionBlock(
false), hasRemovedItems(
false),
68 ~QTreeViewPrivate() {}
70 void clearConnections();
71 int logicalIndexForTree()
const;
72 inline bool isTreePosition(
int logicalIndex)
const
74 return logicalIndex == logicalIndexForTree();
77 QItemViewPaintPairs draggablePaintPairs(
const QModelIndexList &indexes, QRect *r)
const override;
78 void adjustViewOptionsForIndex(QStyleOptionViewItem *option,
const QModelIndex ¤t)
const override;
80#if QT_CONFIG(animation)
81 struct AnimatedOperation :
public QVariantAnimation
87 AnimatedOperation() : item(0) { setEasingCurve(QEasingCurve::InOutQuad); }
88 int top()
const {
return startValue().toInt(); }
89 QRect rect()
const { QRect rect = viewport->rect(); rect.moveTop(top());
return rect; }
90 void updateCurrentValue(
const QVariant &) override { viewport->update(rect()); }
91 void updateState(State state, State) override {
if (state == Stopped) before = after = QPixmap(); }
93 void prepareAnimatedOperation(
int item, QVariantAnimation::Direction d);
94 void beginAnimatedOperation();
95 void drawAnimatedOperation(QPainter *painter)
const;
96 QPixmap renderTreeToPixmapForAnimation(
const QRect &rect)
const;
97 void endAnimatedOperation();
100 void expand(
int item,
bool emitSignal);
101 void collapse(
int item,
bool emitSignal);
103 void columnsAboutToBeRemoved(
const QModelIndex &,
int,
int) override;
104 void columnsRemoved(
const QModelIndex &,
int,
int) override;
105 void modelAboutToBeReset();
106 void sortIndicatorChanged(
int column, Qt::SortOrder order);
107 void modelDestroyed() override;
108 QRect intersectedRect(
const QRect rect,
const QModelIndex &topLeft,
const QModelIndex &bottomRight)
const override;
110 void layout(
int item,
bool recusiveExpanding =
false,
bool afterIsUninitialized =
false);
112 int pageUp(
int item)
const;
113 int pageDown(
int item)
const;
114 int itemForKeyHome()
const;
115 int itemForKeyEnd()
const;
117 int itemHeight(
int item)
const;
118 int indentationForItem(
int item)
const;
119 int coordinateForItem(
int item)
const;
120 int itemAtCoordinate(
int coordinate)
const;
122 int viewIndex(
const QModelIndex &index)
const;
123 QModelIndex modelIndex(
int i,
int column = 0)
const;
125 void insertViewItems(
int pos,
int count,
const QTreeViewItem &viewItem);
126 void removeViewItems(
int pos,
int count);
128 bool checkViewItems()
const;
131 int firstVisibleItem(
int *offset =
nullptr)
const;
132 int lastVisibleItem(
int firstVisual = -1,
int offset = -1)
const;
133 int columnAt(
int x)
const;
134 bool hasVisibleChildren(
const QModelIndex& parent)
const;
136 bool expandOrCollapseItemAtPos(
const QPoint &pos);
138 void updateScrollBars();
140 int itemDecorationAt(
const QPoint &pos)
const;
141 QRect itemDecorationRect(
const QModelIndex &index)
const;
143 QList<std::pair<
int,
int>> columnRanges(
const QModelIndex &topIndex,
144 const QModelIndex &bottomIndex)
const;
145 void select(
const QModelIndex &start,
const QModelIndex &stop, QItemSelectionModel::SelectionFlags command);
147 std::pair<
int,
int> startAndEndColumns(
const QRect &rect)
const;
149 void updateChildCount(
const int parentItem,
const int delta);
151 void paintAlternatingRowColors(QPainter *painter, QStyleOptionViewItem *option,
int y,
int bottom)
const;
155 void calcLogicalIndices(QList<
int> *logicalIndices,
156 QList<QStyleOptionViewItem::ViewItemPosition> *itemPositions,
int left,
158 int widthHintForIndex(
const QModelIndex &index,
int hint,
const QStyleOptionViewItem &option,
int i)
const;
163 AddRowIndicatorToFirstSection
167 QRect visualRect(
const QModelIndex &index)
const override
169 return visualRect(index, AddRowIndicatorToFirstSection);
172 QRect visualRect(
const QModelIndex &index, RectRule rule)
const;
177 mutable QList<QTreeViewItem> viewItems;
178 mutable int lastViewedItem;
179 int defaultItemHeight;
180 bool uniformRowHeights;
182 bool itemsExpandable;
184 bool expandsOnDoubleClick;
185 bool allColumnsShowFocus;
189 mutable std::pair<
int,
int> leftAndRight;
191 mutable bool spanning;
194 QSet<QPersistentModelIndex> expandedIndexes;
195 bool animationsEnabled;
197 inline bool storeExpanded(
const QPersistentModelIndex &idx) {
198 if (expandedIndexes.contains(idx))
200 expandedIndexes.insert(idx);
204 inline bool isIndexExpanded(
const QModelIndex &idx)
const {
206 return !(idx.flags() & Qt::ItemNeverHasChildren) && isPersistent(idx) && expandedIndexes.contains(idx);
210 QSet<QPersistentModelIndex> hiddenIndexes;
212 inline bool isRowHidden(
const QModelIndex &idx)
const {
213 if (hiddenIndexes.isEmpty())
216 return isPersistent(idx) && hiddenIndexes.contains(idx);
219 inline bool isItemHiddenOrDisabled(
int i)
const {
220 if (i < 0 || i >= viewItems.size())
222 const QModelIndex index = viewItems.at(i).index;
223 return isRowHidden(index) || !isIndexEnabled(index);
226 inline int above(
int item)
const
227 {
int i = item;
while (isItemHiddenOrDisabled(--item)){}
return item < 0 ? i : item; }
228 inline int below(
int item)
const
229 {
int i = item;
while (isItemHiddenOrDisabled(++item)){}
return item >= viewItems.size() ? i : item; }
230 inline void invalidateHeightCache(
int item)
const
231 { viewItems[item].height = 0; }
233 inline int accessibleTable2Index(
const QModelIndex &index)
const {
234 return (viewIndex(index) + (header ? 1 : 0)) * model->columnCount()+index.column();
237 int accessibleTree2Index(
const QModelIndex &index)
const;
239 void updateIndentationFromStyle();
242 QSet<QPersistentModelIndex> spanningIndexes;
245 QBasicTimer columnResizeTimer;
246 QList<
int> columnsToUpdate;
250 QBasicTimer openTimer;
253 mutable int hoverBranch;
256 bool geometryRecursionBlock;
259 bool hasRemovedItems;
265#if QT_CONFIG(accessibility)
266 bool pendingAccessibilityUpdate =
false;
268 void updateAccessibility();
270 QMetaObject::Connection animationConnection;
271 QMetaObject::Connection selectionmodelConnection;
272 std::array<QMetaObject::Connection, 2> modelConnections;
273 std::array<QMetaObject::Connection, 5> headerConnections;
274 QMetaObject::Connection sortHeaderConnection;