Qt::ItemFlags InventoryItemModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = Qt::ItemIsEnabled; if (!index.isValid()) return flags; AbstractInventoryItem *item = GetItem(index); AbstractInventoryItem::InventoryItemType type = item->GetItemType(); if (type == AbstractInventoryItem::Type_Asset) { if (!item->IsLibraryItem()) flags |= Qt::ItemIsDropEnabled; flags |= Qt::ItemIsDragEnabled; } if (type == AbstractInventoryItem::Type_Folder) if (!item->IsLibraryItem()) flags |= Qt::ItemIsDropEnabled; if (!item->IsEditable()) return flags; flags |= Qt::ItemIsSelectable; if (type == AbstractInventoryItem::Type_Folder) flags |= Qt::ItemIsDragEnabled; flags |= Qt::ItemIsEditable; return flags; }
void InventoryTreeView::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("application/vnd.inventory.item")) { if (event->source() == this) { InventoryItemModel *itemModel = checked_static_cast<InventoryItemModel *>(model()); assert(itemModel); AbstractInventoryItem *draggedItem = itemModel->GetItem(selectionModel()->currentIndex()); assert(draggedItem); QModelIndex destIndex = indexAt(event->pos()); if (!destIndex.isValid()) { event->ignore(); return; } AbstractInventoryItem *destItem = 0; if (itemModel->GetItem(destIndex)->GetItemType() == AbstractInventoryItem::Type_Asset) destItem = itemModel->GetItem(destIndex)->GetParent(); else destItem = itemModel->GetItem(destIndex); if (!destItem || destItem->IsLibraryItem() || (draggedItem->GetParent() == destItem)) { event->ignore(); return; } if (draggedItem ->IsLibraryItem()) event->setDropAction(Qt::CopyAction); else event->setDropAction(Qt::MoveAction); event->accept(); } else event->acceptProposedAction(); } else if(event->mimeData()->hasUrls()) event->accept(); else event->ignore(); }
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; }