diff --git a/Modules/XNAT/src/QmitkXnatTreeModel.cpp b/Modules/XNAT/src/QmitkXnatTreeModel.cpp index 7aab2859bb..77ea63de39 100644 --- a/Modules/XNAT/src/QmitkXnatTreeModel.cpp +++ b/Modules/XNAT/src/QmitkXnatTreeModel.cpp @@ -1,217 +1,223 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkXnatTreeModel.h" #include #include #include #include #include #include #include #include #include #include #include #include QmitkXnatTreeModel::QmitkXnatTreeModel () : ctkXnatTreeModel() { } QVariant QmitkXnatTreeModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } if (role == Qt::DecorationRole) { ctkXnatObject* xnatObject = this->xnatObject(index); QString path; if(dynamic_cast(xnatObject)) { path = ":/xnat/server.ico"; } else if(dynamic_cast(xnatObject)) { path = ":/xnat/project.png"; } else if(dynamic_cast(xnatObject)) { path = ":/xnat/subject.ico"; } else if(dynamic_cast(xnatObject)) { path = ":/xnat/experiment.ico"; } else if (dynamic_cast(xnatObject)) { path = ":/xnat/folder.ico"; } else if (dynamic_cast(xnatObject)) { path = ":/xnat/resource.png"; } else if (dynamic_cast(xnatObject)) { path = ":/xnat/folder.ico"; } else if (dynamic_cast(xnatObject)) { path = ":/xnat/scan.png"; } else if (dynamic_cast(xnatObject)) { path = ":/xnat/file.png"; } return QIcon(path); } return ctkXnatTreeModel::data(index, role); } bool QmitkXnatTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int /*row*/, int /*column*/, const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; // Return true if data can be handled bool returnVal (false); if (data->hasFormat(QmitkMimeTypes::DataNodePtrs)) { returnVal = true; QList droppedNodes = QmitkMimeTypes::ToDataNodePtrList(data); ctkXnatObject* parentXnatObj = this->xnatObject(parent); emit ResourceDropped(droppedNodes, parentXnatObj, parent); } return returnVal; } Qt::DropActions QmitkXnatTreeModel::supportedDropActions() { return Qt::CopyAction; } Qt::ItemFlags QmitkXnatTreeModel::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = ctkXnatTreeModel::flags(index); if (index.isValid()) { bool droppingAllowed = dynamic_cast(this->xnatObject(index)) != nullptr; droppingAllowed |= dynamic_cast(this->xnatObject(index)) != nullptr; droppingAllowed |= dynamic_cast(this->xnatObject(index)) != nullptr; droppingAllowed |= dynamic_cast(this->xnatObject(index)) != nullptr; // No dropping at project, session or data model level allowed if (droppingAllowed) { return Qt::ItemIsDropEnabled | defaultFlags; } else { return defaultFlags; } } else return defaultFlags; } ctkXnatObject* QmitkXnatTreeModel::InternalGetXnatObjectFromUrl(const QString & xnatObjectType, const QString & url, ctkXnatObject* parent) { // 1. Find project int start = url.lastIndexOf(xnatObjectType); if (start == -1) return nullptr; start += xnatObjectType.length(); int length = url.indexOf("/",start); length -= start; parent->fetch(); QList children = parent->children(); foreach (ctkXnatObject* child, children) { if(url.indexOf(child->resourceUri()) != -1) { return child; } } return nullptr; } ctkXnatObject* QmitkXnatTreeModel::GetXnatObjectFromUrl(const QString& url) { QModelIndex index = this->index(0,0,QModelIndex()); ctkXnatObject* currentXnatObject = nullptr; currentXnatObject = this->xnatObject(index); if (currentXnatObject != nullptr) { // 1. Find project ctkXnatObject* project = nullptr; project = this->InternalGetXnatObjectFromUrl("projects/", url, currentXnatObject); // 2. Find subject ctkXnatObject* subject = nullptr; if (project != nullptr) { currentXnatObject = project; subject = this->InternalGetXnatObjectFromUrl("subjects/", url, project); } // 3. Find experiment ctkXnatObject* experiment = nullptr; if (subject != nullptr) { currentXnatObject = subject; experiment = this->InternalGetXnatObjectFromUrl("experiments/", url, subject); } // 4. Find scan + ctkXnatObject* scan = nullptr; if (experiment != nullptr) { - currentXnatObject = this->InternalGetXnatObjectFromUrl("scans/", url, experiment); - currentXnatObject->fetch(); - QList scans = currentXnatObject->children(); + currentXnatObject = experiment; + scan = this->InternalGetXnatObjectFromUrl("scans/", url, experiment); + } + + if (scan != nullptr) + { + scan->fetch(); + QList scans = scan->children(); foreach (ctkXnatObject* child, scans) { if (url.indexOf(child->resourceUri()) != -1) { return child; } } } currentXnatObject->fetch(); QList bla = currentXnatObject->children(); foreach (ctkXnatObject* child, bla) { if (child->name() == "Resources") return child; } } return nullptr; }