QModelIndex InventoryItemModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); ///\todo Use AbstractInventoryItem? InventoryFolder *parentItem = 0; if (!parent.isValid()) parentItem = static_cast<InventoryFolder *>(dataModel_->GetRoot()); else parentItem = static_cast<InventoryFolder *>(reinterpret_cast<AbstractInventoryItem *>(parent.internalPointer())); AbstractInventoryItem *childItem = parentItem->Child(row); if (childItem) return createIndex(row, column, reinterpret_cast<void *>(childItem)); else return QModelIndex(); return QModelIndex(); }
bool InventoryItemModel::removeRows(int position, int rows, const QModelIndex &parent) { InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(GetItem(parent)); if (!parentFolder) return false; AbstractInventoryItem *childItem = parentFolder->Child(position); if (!childItem) return false; if (childItem->GetItemType() == AbstractInventoryItem::Type_Folder) if (!static_cast<InventoryFolder *>(childItem)->IsEditable()) return false; bool removeRow = false; if (itemMoveFlag_) { // We don't want to notify server if we're just moving (i.e. deleting temporarily from one location). int idx = itemsToBeMoved_.indexOf(childItem->GetID()); if (idx != -1) { // Do not remove library items from the model. if (!childItem->IsLibraryItem()) removeRow = true; itemsToBeMoved_.remove(idx); } } //else if(!itemMoveFlag_ && itemsToBeMoved_.size() == 0) else { removeRow = true; if(useTrash_) { // When deleting items, we move them first to the Trash folder. InventoryFolder *trashFolder = static_cast<InventoryFolder *>(dataModel_->GetTrashFolder()); if (parentFolder == trashFolder) { // If the folder is already in the trash folder, delete it for good. dataModel_->NotifyServerAboutItemRemove(childItem); } else { // Move to the Trash folder. dataModel_->NotifyServerAboutItemMove(childItem); InsertExistingItem(position, trashFolder, childItem); } } else dataModel_->NotifyServerAboutItemRemove(childItem); } if (itemsToBeMoved_.size() <= 0) itemMoveFlag_ = false; if (removeRow) { beginRemoveRows(parent, position, position + rows - 1); bool success = parentFolder->RemoveChildren(position, rows); endRemoveRows(); return success; } return false; }