5#include <private/qtreewidgetitemiterator_p.h>
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
35
36
37
39QTreeWidgetItemIterator::QTreeWidgetItemIterator(
const QTreeWidgetItemIterator &it)
40 : d_ptr(
new QTreeWidgetItemIteratorPrivate(*(it.d_ptr))),
41 current(it.current), flags(it.flags)
43 Q_D(QTreeWidgetItemIterator);
45 d->m_model->iterators.append(
this);
49
50
51
52
53
54
55
57QTreeWidgetItemIterator::QTreeWidgetItemIterator(QTreeWidget *widget, IteratorFlags flags)
58: current(
nullptr), flags(flags)
61 QTreeModel *model = qobject_cast<QTreeModel*>(widget->model());
63 d_ptr.reset(
new QTreeWidgetItemIteratorPrivate(
this, model));
64 model->iterators.append(
this);
65 if (!model->rootItem->children.isEmpty()) current = model->rootItem->child(0);
66 if (current && !matchesFlags(current))
71
72
73
74
75
76
77
79QTreeWidgetItemIterator::QTreeWidgetItemIterator(QTreeWidgetItem *item, IteratorFlags flags)
80 : d_ptr(
new QTreeWidgetItemIteratorPrivate(
81 this, qobject_cast<QTreeModel*>(item->view->model()))),
82 current(item), flags(flags)
84 Q_D(QTreeWidgetItemIterator);
86 QTreeModel *model = qobject_cast<QTreeModel*>(item->view->model());
88 model->iterators.append(
this);
92 QTreeWidgetItem *parent = item;
93 parent = parent->parent();
94 QTreeWidgetItem *root = d->m_model->rootItem;
95 d->m_currentIndex = (parent ? parent : root)->indexOfChild(item);
98 QTreeWidgetItem *itm = parent;
99 parent = parent->parent();
100 const int index = (parent ? parent : root)->indexOfChild(itm);
101 d->m_parentIndex.prepend(index);
104 if (current && !matchesFlags(current))
109
110
112QTreeWidgetItemIterator::~QTreeWidgetItemIterator()
114 d_func()->m_model->iterators.removeAll(
this);
118
119
120
122QTreeWidgetItemIterator &QTreeWidgetItemIterator::operator=(
const QTreeWidgetItemIterator &it)
124 Q_D(QTreeWidgetItemIterator);
125 if (d_func()->m_model != it.d_func()->m_model) {
126 d_func()->m_model->iterators.removeAll(
this);
127 it.d_func()->m_model->iterators.append(
this);
129 current = it.current;
131 d->operator=(*it.d_func());
136
137
138
139
141QTreeWidgetItemIterator &QTreeWidgetItemIterator::operator++()
145 current = d_func()->next(current);
146 }
while (current && !matchesFlags(current));
151
152
153
154
156QTreeWidgetItemIterator &QTreeWidgetItemIterator::operator--()
160 current = d_func()->previous(current);
161 }
while (current && !matchesFlags(current));
166
167
168bool QTreeWidgetItemIterator::matchesFlags(
const QTreeWidgetItem *item)
const
177 Qt::ItemFlags itemFlags = item->flags();
178 if ((flags & Selectable) && !(itemFlags & Qt::ItemIsSelectable))
180 if ((flags & NotSelectable) && (itemFlags & Qt::ItemIsSelectable))
182 if ((flags & DragEnabled) && !(itemFlags & Qt::ItemIsDragEnabled))
184 if ((flags & DragDisabled) && (itemFlags & Qt::ItemIsDragEnabled))
186 if ((flags & DropEnabled) && !(itemFlags & Qt::ItemIsDropEnabled))
188 if ((flags & DropDisabled) && (itemFlags & Qt::ItemIsDropEnabled))
190 if ((flags & Enabled) && !(itemFlags & Qt::ItemIsEnabled))
192 if ((flags & Disabled) && (itemFlags & Qt::ItemIsEnabled))
194 if ((flags & Editable) && !(itemFlags & Qt::ItemIsEditable))
196 if ((flags & NotEditable) && (itemFlags & Qt::ItemIsEditable))
200 if (flags & (Checked|NotChecked)) {
202 Qt::CheckState check = item->checkState(0);
204 if ((flags & Checked) && (check == Qt::Unchecked))
206 if ((flags & NotChecked) && (check != Qt::Unchecked))
210 if ((flags & HasChildren) && !item->childCount())
212 if ((flags & NoChildren) && item->childCount())
215 if ((flags & Hidden) && !item->isHidden())
217 if ((flags & NotHidden) && item->isHidden())
220 if ((flags & Selected) && !item->isSelected())
222 if ((flags & Unselected) && item->isSelected())
229
230
231QTreeWidgetItem* QTreeWidgetItemIteratorPrivate::nextSibling(
const QTreeWidgetItem* item)
const
234 QTreeWidgetItem *next =
nullptr;
235 if (QTreeWidgetItem *par = item->parent()) {
236 int i = par->indexOfChild(
const_cast<QTreeWidgetItem*>(item));
237 next = par->child(i + 1);
239 QTreeWidget *tw = item->treeWidget();
240 int i = tw->indexOfTopLevelItem(
const_cast<QTreeWidgetItem*>(item));
241 next = tw->topLevelItem(i + 1);
246QTreeWidgetItem *QTreeWidgetItemIteratorPrivate::next(
const QTreeWidgetItem *current)
248 if (!current)
return nullptr;
250 QTreeWidgetItem *next =
nullptr;
251 if (current->childCount()) {
253 m_parentIndex.push(m_currentIndex);
255 next = current->child(0);
258 QTreeWidgetItem *parent = current->parent();
259 next = parent ? parent->child(m_currentIndex + 1)
260 : m_model->rootItem->child(m_currentIndex + 1);
261 while (!next && parent) {
263 parent = parent->parent();
264 m_currentIndex = m_parentIndex.pop();
265 next = parent ? parent->child(m_currentIndex + 1)
266 : m_model->rootItem->child(m_currentIndex + 1);
268 if (next) ++(m_currentIndex);
273QTreeWidgetItem *QTreeWidgetItemIteratorPrivate::previous(
const QTreeWidgetItem *current)
275 if (!current)
return nullptr;
277 QTreeWidgetItem *prev =
nullptr;
279 QTreeWidgetItem *parent = current->parent();
280 prev = parent ? parent->child(m_currentIndex - 1)
281 : m_model->rootItem->child(m_currentIndex - 1);
285 while (prev && prev->childCount()) {
286 m_parentIndex.push(m_currentIndex);
287 m_currentIndex = prev->childCount() - 1;
288 prev = prev->child(m_currentIndex);
291 m_currentIndex = m_parentIndex.pop();
297void QTreeWidgetItemIteratorPrivate::ensureValidIterator(
const QTreeWidgetItem *itemToBeRemoved)
299 Q_Q(QTreeWidgetItemIterator);
300 Q_ASSERT(itemToBeRemoved);
302 if (!q->current)
return;
303 QTreeWidgetItem *nextItem = q->current;
306 if (nextItem->parent() != itemToBeRemoved->parent()) {
307 while (nextItem->parent() && nextItem != itemToBeRemoved) {
308 nextItem = nextItem->parent();
313 if (nextItem == itemToBeRemoved) {
314 QTreeWidgetItem *parent = nextItem;
316 while (parent && !nextItem) {
317 nextItem = nextSibling(parent);
318 parent = parent->parent();
322 *q = QTreeWidgetItemIterator(nextItem, q->flags);
323 if (!(q->matchesFlags(nextItem))) ++(*q);
326 q->current =
nullptr;
327 m_parentIndex.clear();
331 if (nextItem->parent() == itemToBeRemoved->parent()) {
335 QTreeWidgetItem *par = itemToBeRemoved->parent();
336 QTreeWidget *tw = itemToBeRemoved->treeWidget();
337 int indexOfItemToBeRemoved = par ? par->indexOfChild(
const_cast<QTreeWidgetItem *>(itemToBeRemoved))
338 : tw->indexOfTopLevelItem(
const_cast<QTreeWidgetItem *>(itemToBeRemoved));
339 int indexOfNextItem = par ? par->indexOfChild(nextItem) : tw->indexOfTopLevelItem(nextItem);
341 if (indexOfItemToBeRemoved <= indexOfNextItem) {
350
351
352
353
354
357
358
359
360
361
362
363
364
367
368
369
370
373
374
375
376
377
378
379
380
383
384
385
386
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416