QModelIndex InventoryItemModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); AbstractInventoryItem *childItem = GetItem(index); assert(childItem); InventoryFolder *parentItem = static_cast<InventoryFolder *>(childItem->GetParent()); if (parentItem == static_cast<InventoryFolder *>(dataModel_->GetRoot())) return QModelIndex(); return createIndex(parentItem->Row(), 0, reinterpret_cast<void *>(static_cast<AbstractInventoryItem*>(parentItem))); /* if (!index.isValid()) return QModelIndex(); TreeItem *childItem = getItem(index); TreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->childNumber(), 0, parentItem); */ }
QMimeData *InventoryItemModel::mimeData(const QModelIndexList &indexes) const { QMimeData *mimeData = new QMimeData(); QByteArray encodedData; QDataStream stream(&encodedData, QIODevice::WriteOnly); foreach(QModelIndex index, indexes) { if (index.isValid()) { QString info, asset_type, asset_ref; AbstractInventoryItem *item = GetItem(index); InventoryAsset *asset = dynamic_cast<InventoryAsset *>(item); if (asset) { asset_type.append(QString("%1").arg(asset->GetAssetType())); asset_ref = asset->GetAssetReference(); } else { asset_type.append(QString("%1").arg(RexTypes::RexAT_None)); asset_ref = RexUUID().ToString().c_str(); } info.append(asset_type + ";" + item->GetID() + ";" + item->GetName() + ";" + asset_ref); stream << info; } } mimeData->setData("application/vnd.inventory.item", encodedData); return mimeData; }
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; }
bool InventoryItemModel::canFetchMore(const QModelIndex & parent) const { AbstractInventoryItem *item = GetItem(parent); if (item && item->GetItemType() == AbstractInventoryItem::Type_Folder) { InventoryFolder *folder = dynamic_cast<InventoryFolder*>(item); if (folder) return folder->IsDirty(); } return false; }
bool InventoryItemModel::Open(const QModelIndex &index) { AbstractInventoryItem *item = GetItem(index); if (item->GetItemType() == AbstractInventoryItem::Type_Folder) { fetchMore(index); return canFetchMore(index); } if (item->GetItemType() == AbstractInventoryItem::Type_Asset) return dataModel_->OpenItem(item); return false; }
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(); }
int InventoryItemModel::rowCount(const QModelIndex &parent) const { if (parent.column() > 0 || !dataModel_->GetRoot()) return 0; if (!parent.isValid()) dynamic_cast<InventoryFolder *>(dataModel_->GetRoot())->ChildCount(); AbstractInventoryItem *item = GetItem(parent); if (item->GetItemType() == AbstractInventoryItem::Type_Folder) { InventoryFolder *parentFolder = static_cast<InventoryFolder *>(item); return parentFolder->ChildCount(); } return 0; }
QVariant InventoryItemModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); AbstractInventoryItem *item = GetItem(index); if (role == Qt::DecorationRole) { if (item->GetItemType() == AbstractInventoryItem::Type_Folder) return QIcon(":images/iconFolderClosed.png"); if (item->GetItemType() == AbstractInventoryItem::Type_Asset) return QIcon(":images/iconResource.png"); } if (role != Qt::DisplayRole) return QVariant(); return QVariant(item->GetName()); }
bool InventoryItemModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (role != Qt::EditRole) return false; AbstractInventoryItem *item = GetItem(index); InventoryFolder *folder = dynamic_cast<InventoryFolder *>(item); if (folder && !folder->IsEditable()) return false; if (item->GetName() == value.toString()) return false; QString oldName = item->GetName(); item->SetName(value.toString()); // Is this needed anymore? emit dataChanged(index, index); // Notify server. Give updated item and old name (webdav needs this at least) dataModel_->NotifyServerAboutItemUpdate(item, oldName); return true; }
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; }