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); */ }
void WebDavInventoryDataModel::UploadFile(const QString &file_path, AbstractInventoryItem *parent_folder) { if (!parent_folder) parent_folder = GetFirstChildFolderByName("My Inventory"); InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(parent_folder); if (!parentFolder) return; QString filePath = file_path; QString filename = filePath.split("/").last(); QString parentPath = ValidateFolderPath(parentFolder->GetID()); QStringList result = webdavclient_.call("uploadFile", QVariantList() << filePath << parentPath << filename).toStringList(); if (result.count() >= 1) { if (result[0] == "True") { FetchInventoryDescendents(parent_folder); InventoryModule::LogInfo(QString("Webdav | Upload of file %1 to path %2%3 succeeded\n").arg(filePath, parentPath, filename).toStdString()); } else InventoryModule::LogInfo(QString("Webdav | Upload of file %1 to path %2%3 failed\n").arg(filePath, parentPath, filename).toStdString()); } }
bool InventoryItemModel::InsertFolder(int position, const QModelIndex &parent, const QString &name) { InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(GetItem(parent)); if (!parentFolder) return false; if (parentFolder->IsLibraryItem()) return false; beginInsertRows(parent, position, position ); RexUUID id; bool unique = false; while(!unique) { id.Random(); AbstractInventoryItem *existing = dataModel_->GetChildFolderById(id.ToQString()); if (!existing) unique = true; else InventoryModule::LogWarning("Generated an UUID that already exists! Generating a new one..."); } dataModel_->GetOrCreateNewFolder(id.ToQString(), *parentFolder, name); endInsertRows(); return true; }
void WebDavInventoryDataModel::FetchRootFolder() { webdavclient_ = pythonQtMainModule_.evalScript("connection.WebDavClient()\n", Py_eval_input); if (!webdavclient_) { ErrorOccurredCreateEmptyRootFolder(); return; } // Set urls webdavclient_.call("setHostAndUser", QVariantList() << webdavIdentityUrl_ << webdavUrl_); // Connect to webdav webdavclient_.call("setupConnection"); // Fetch root resources QStringList rootResources = webdavclient_.call("listResources").toStringList(); if (rootResources.count() < 1) { ErrorOccurredCreateEmptyRootFolder(); return; } QMap<QString, QString> folders; InventoryFolder *parentFolder; for (int index=0; index<=rootResources.count(); index++) { folders[rootResources.value(index)] = rootResources.value(index+1); index++; } if (!rootFolder_) { rootFolder_ = new InventoryFolder("root", "Webdav Inventory", false, 0); parentFolder = new InventoryFolder("", QString("My Inventory"), false, rootFolder_); rootFolder_->AddChild(parentFolder); rootFolder_->SetDirty(true); } AbstractInventoryItem *newItem = 0; QString path; QString name; QString type; for (QMap<QString, QString>::iterator iter = folders.begin(); iter!=folders.end(); ++iter) { path = iter.key(); name = path.midRef(0, path.lastIndexOf("/")).toString(); name = path.midRef(path.lastIndexOf("/")).toString(); type = iter.value(); if (name != "") { if (type == "resource") newItem = new InventoryAsset(path, "", name, parentFolder); else newItem = new InventoryFolder(path, name, parentFolder, true); parentFolder->AddChild(newItem); } } }
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; }
foreach (AbstractInventoryItem *item, children) { if (item->GetItemType() == AbstractInventoryItem::Type_Folder) { InventoryFolder *folder = dynamic_cast<InventoryFolder*>(item); if (!folder) continue; CheckChildrenForDirtys(folder->GetChildren()); if (!folder->IsDirty()) continue; QModelIndexList all_items = persistentIndexList(); foreach (QModelIndex index, all_items) if (item == reinterpret_cast<AbstractInventoryItem *>(index.internalPointer())) emit IndexModelIsDirty(index); folder->SetDirty(false); }
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; }
bool WebDavInventoryDataModel::FetchInventoryDescendents(AbstractInventoryItem *item) { InventoryFolder *selected = dynamic_cast<InventoryFolder *>(item); if (!selected) return false; // Delete children selected->GetChildren().clear(); QString itemPath = selected->GetID(); QStringList children = webdavclient_.call("listResources", QVariantList() << itemPath).toStringList(); if ( children.count() >=1 ) { // Process child list to map QMap<QString, QString> childMap; for (int index=0; index<=children.count(); index++) { childMap[children.value(index)] = children.value(index+1); index++; } AbstractInventoryItem *newItem = 0; QString path, name, type; for (QMap<QString, QString>::iterator iter = childMap.begin(); iter!=childMap.end(); ++iter) { path = iter.key(); name = path.midRef(path.lastIndexOf("/")+1).toString(); type = iter.value(); if (name != "") { if (type == "resource") newItem = new InventoryAsset(path, "", name, selected); else newItem = new InventoryFolder(path, name, selected, true); selected->AddChild(newItem); } } InventoryModule::LogInfo(QString("Webdav | Fetched %1 children to path /%2").arg(QString::number(childMap.count()), itemPath).toStdString()); } return true; }
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::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; }
void InventoryItemModel::CheckTreeForDirtys() { InventoryFolder *root = dynamic_cast<InventoryFolder*>(dataModel_->GetRoot()); if (root) CheckChildrenForDirtys(root->GetChildren()); }
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; }
AbstractInventoryItem *WebDavInventoryDataModel::GetOrCreateNewFolder(const QString &id, AbstractInventoryItem &parentFolder, const QString &name, const bool ¬ify_server) { InventoryFolder *parent = dynamic_cast<InventoryFolder *>(&parentFolder); if (!parent) return 0; if (RexUUID::IsValid(id.toStdString())) { // This is a new folder if the id is RexUUID // RexUUID generated in data model, cant do nothing about this... QString parentPath = parent->GetID(); QString newFolderName = name; QStringList result = webdavclient_.call("createDirectory", QVariantList() << parentPath << newFolderName).toStringList(); if (result.count() >= 1) { if (result[0] == "True") { FetchInventoryDescendents(parent); InventoryModule::LogInfo(QString("Webdav | Created folder named %1 to path %2\n").arg(newFolderName, parentPath).toStdString()); } else InventoryModule::LogInfo(QString("Webdav | Could not create folder named %1 to path %2\n").arg(newFolderName, parentPath).toStdString()); } } else { // If its not RexUUID or and existing item in this folder, // then its a move command. Lets do that to the webdav server then... InventoryFolder *existingItem = parent->GetChildFolderById(id); if (!existingItem) { InventoryFolder *currentFolder = rootFolder_->GetChildFolderById(name); if (!currentFolder) return 0; QString currentPath = ValidateFolderPath(currentFolder->GetParent()->GetID()); QString newPath = ValidateFolderPath(parent->GetID()); QString folderName = name; QString deepCopy = "False"; if (currentFolder->HasChildren()) deepCopy = "True"; QStringList result = webdavclient_.call("moveResource", QVariantList() << currentPath << newPath << folderName).toStringList(); if (result.count() >= 1) { if (result[0] == "True") { FetchInventoryDescendents(parent); InventoryModule::LogInfo(QString("Webdav | Moved folder %1 from %2 to %3\nNote: This fucntionality is experimental,").append( "dont assume it went succesfull\n").arg(folderName, currentPath, newPath).toStdString()); } else { InventoryModule::LogInfo(QString("Webdav | Failed to move folder %1 from %2 to %3\n").arg( folderName, currentPath, newPath).toStdString()); } } } else return existingItem; } // Return 0 to data model, we just updated // folder content from webdav, no need to return the real item return 0; }