bool TreeModel::insertRows(int row, int count, const QModelIndex &parent) { if (!rootItem) rootItem = new TaskItem; TaskItem *parentItem = parent.isValid() ? itemForIndex(parent) : rootItem; beginInsertRows(parent, row, row + count - 1); for (int i = 0; i < count; ++i) { TaskItem *item = new TaskItem(tr("New Task"), false); parentItem->insertChild(row, item); } endInsertRows(); return true; }
QModelIndex TreeModel::paste(const QModelIndex &index) { if (!index.isValid() || !cutItem) return index; TaskItem *sibling = itemForIndex(index); Q_ASSERT(sibling); TaskItem *parent = sibling->parent(); Q_ASSERT(parent); int row = parent->rowOfChild(sibling) + 1; beginInsertRows(index.parent(), row, row); parent->insertChild(row, cutItem); TaskItem *child = cutItem; cutItem = 0; endInsertRows(); return createIndex(row, 0, child); }
QModelIndex TreeModel::promote(const QModelIndex &index) { if (!index.isValid()) return index; TaskItem *item = itemForIndex(index); Q_ASSERT(item); TaskItem *parent = item->parent(); Q_ASSERT(parent); if (parent == rootItem) return index; // Already a top-level item int row = parent->rowOfChild(item); TaskItem *child = parent->takeChild(row); Q_ASSERT(child == item); TaskItem *grandParent = parent->parent(); Q_ASSERT(grandParent); row = grandParent->rowOfChild(parent) + 1; grandParent->insertChild(row, child); QModelIndex newIndex = createIndex(row, 0, child); emit dataChanged(newIndex, newIndex); return newIndex; }