- // out of range check
- if(row + count - 1 > rowCount(parent) || row < 0 || count < 0)
- return false;
-
- AbstractTreeItem *item;
- if(!parent.isValid())
- item = rootItem;
- else
- item = static_cast<AbstractTreeItem *>(parent.internalPointer());
-
-
- beginRemoveRows(parent, row, row + count - 1);
-
- for(int i = row + count - 1; i >= 0; i--) {
- item->removeChild(parent.column(), i);
- }
- endRemoveRows();
- return true;
-}
-
-void TreeModel::clear() {
- removeRows(0, rowCount());
- reset();
+ beginRemoveRows(parent, firstRow, lastRow);
+}
+
+void TreeModel::endRemoveChilds()
+{
+ auto* parentItem = qobject_cast<AbstractTreeItem*>(sender());
+ if (!parentItem) {
+ qWarning() << "TreeModel::endRemoveChilds(): cannot remove Children from unknown parent";
+ return;
+ }
+
+ // concistency checks
+ Q_ASSERT(_aboutToRemoveOrInsert);
+#ifndef QT_NO_DEBUG
+ ChildStatus cs = _childStatus;
+ QModelIndex parent = indexByItem(parentItem);
+ Q_ASSERT(cs.parent == parent);
+ Q_ASSERT(rowCount(parent) == cs.childCount - cs.end + cs.start - 1);
+#endif
+ _aboutToRemoveOrInsert = false;
+
+ endRemoveRows();
+}
+
+void TreeModel::clear()
+{
+ rootItem->removeAllChilds();
+}
+
+void TreeModel::debug_rowsAboutToBeInserted(const QModelIndex& parent, int start, int end)
+{
+ qDebug() << "debug_rowsAboutToBeInserted" << parent << parent.internalPointer() << parent.data().toString() << rowCount(parent) << start
+ << end;
+}
+
+void TreeModel::debug_rowsAboutToBeRemoved(const QModelIndex& parent, int start, int end)
+{
+ AbstractTreeItem* parentItem;
+ parentItem = static_cast<AbstractTreeItem*>(parent.internalPointer());
+ if (!parentItem)
+ parentItem = rootItem;
+ qDebug() << "debug_rowsAboutToBeRemoved" << parent << parentItem << parent.data().toString() << rowCount(parent) << start << end;
+
+ // Make sure model is valid first
+ if (!parent.model()) {
+ qDebug() << "Parent model is not valid!" << end;
+ return;
+ }
+
+ QModelIndex child;
+ for (int i = end; i >= start; i--) {
+ child = parent.model()->index(i, 0, parent);
+ Q_ASSERT(parentItem->child(i));
+ qDebug() << ">>>" << i << child << child.data().toString();
+ }
+}
+
+void TreeModel::debug_rowsInserted(const QModelIndex& parent, int start, int end)
+{
+ AbstractTreeItem* parentItem;
+ parentItem = static_cast<AbstractTreeItem*>(parent.internalPointer());
+ if (!parentItem)
+ parentItem = rootItem;
+ qDebug() << "debug_rowsInserted:" << parent << parentItem << parent.data().toString() << rowCount(parent) << start << end;
+
+ // Make sure model is valid first
+ if (!parent.model()) {
+ qDebug() << "Parent model is not valid!" << end;
+ return;
+ }
+
+ QModelIndex child;
+ for (int i = start; i <= end; i++) {
+ child = parent.model()->index(i, 0, parent);
+ Q_ASSERT(parentItem->child(i));
+ qDebug() << "<<<" << i << child << child.data().toString();
+ }
+}
+
+void TreeModel::debug_rowsRemoved(const QModelIndex& parent, int start, int end)
+{
+ qDebug() << "debug_rowsRemoved" << parent << parent.internalPointer() << parent.data().toString() << rowCount(parent) << start << end;
+}
+
+void TreeModel::debug_dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
+{
+ qDebug() << "debug_dataChanged" << topLeft << bottomRight;
+ QStringList displayData;
+ for (int row = topLeft.row(); row <= bottomRight.row(); row++) {
+ displayData = QStringList();
+ for (int column = topLeft.column(); column <= bottomRight.column(); column++) {
+ displayData << data(topLeft.sibling(row, column), Qt::DisplayRole).toString();
+ }
+ qDebug() << " row:" << row << displayData;
+ }