void MapDocument::onMapObjectModelRowsInsertedOrRemoved(const QModelIndex &parent, int first, int last) { Q_UNUSED(first) ObjectGroup *objectGroup = mMapObjectModel->toObjectGroup(parent); if (!objectGroup) return; // Inserting or removing objects changes the index of any that come after const int lastIndex = objectGroup->objectCount() - 1; if (last < lastIndex) emit objectsIndexChanged(objectGroup, last + 1, lastIndex); }
QModelIndex MapObjectModel::index(int row, int column, const QModelIndex &parent) const { if (!parent.isValid()) { if (row < mObjectGroups.count()) return createIndex(row, column, mGroups[mObjectGroups.at(row)]); return QModelIndex(); } ObjectGroup *og = toObjectGroup(parent); // happens when deleting the last item in a parent if (row >= og->objectCount()) return QModelIndex(); // Paranoia: sometimes "fake" objects are in use (see createobjecttool) if (!mObjects.contains(og->objects().at(row))) return QModelIndex(); return createIndex(row, column, mObjects[og->objects()[row]]); }
void MapDocument::moveObjectsUp(const QList<MapObject *> &objects) { if (objects.isEmpty()) return; const auto ranges = computeRanges(objects); QScopedPointer<QUndoCommand> command(new QUndoCommand(tr("Move %n Object(s) Up", "", objects.size()))); RangesIterator rangesIterator(ranges); while (rangesIterator.hasNext()) { rangesIterator.next(); ObjectGroup *group = rangesIterator.key(); const RangeSet<int> &rangeSet = rangesIterator.value(); const RangeSet<int>::Range it_begin = rangeSet.begin(); RangeSet<int>::Range it = rangeSet.end(); Q_ASSERT(it != it_begin); do { --it; int from = it.first(); int count = it.length(); int to = from + count + 1; if (to <= group->objectCount()) new ChangeMapObjectsOrder(this, group, from, to, count, command.data()); } while (it != it_begin); } if (command->childCount() > 0) mUndoStack->push(command.take()); }