diff --git a/Modules/XNAT/include/QmitkSelectXnatUploadDestinationDialog.h b/Modules/XNAT/include/QmitkSelectXnatUploadDestinationDialog.h index 5307d73cad..02e6e53b96 100644 --- a/Modules/XNAT/include/QmitkSelectXnatUploadDestinationDialog.h +++ b/Modules/XNAT/include/QmitkSelectXnatUploadDestinationDialog.h @@ -1,45 +1,46 @@ #ifndef QMITKSELECTXNATUPLOADDESTINATIONDIALOG_H #define QMITKSELECTXNATUPLOADDESTINATIONDIALOG_H #include #include namespace Ui { class QmitkSelectXnatUploadDestinationDialog; } -class ctkXnatResource; +class ctkXnatObject; class ctkXnatSession; class QModelIndex; class QmitkXnatTreeModel; class MITKXNAT_EXPORT QmitkSelectXnatUploadDestinationDialog : public QDialog { Q_OBJECT public: - explicit QmitkSelectXnatUploadDestinationDialog(ctkXnatSession* session, /*const QStringList&, */QWidget *parent = 0); + explicit QmitkSelectXnatUploadDestinationDialog(ctkXnatSession* session, const QStringList&, QWidget *parent = 0); ~QmitkSelectXnatUploadDestinationDialog(); - ctkXnatResource* GetUploadDestination(); + ctkXnatObject *GetUploadDestination(); void SetXnatResourceFolderUrl(const QString& url); protected slots: void OnUpload(); void OnSelectResource(bool selectResource); void OnSelectFromTreeView(bool selectFromTreeView); void OnResourceEntered(const QString &resourceEntered); void OnResourceSelected(const QString &resource); void OnXnatNodeSelected(const QModelIndex&); void OnCancel(); private: QmitkXnatTreeModel* m_TreeModel; - - ctkXnatResource* m_SelectedResource; + QString m_Url; + QString m_ResourceName; + bool m_CreateNewFolder; Ui::QmitkSelectXnatUploadDestinationDialog *ui; }; #endif // QMITKSELECTXNATUPLOADDESTINATIONDIALOG_H diff --git a/Modules/XNAT/include/QmitkXnatTreeModel.h b/Modules/XNAT/include/QmitkXnatTreeModel.h index fc680f6e71..90ae878886 100644 --- a/Modules/XNAT/include/QmitkXnatTreeModel.h +++ b/Modules/XNAT/include/QmitkXnatTreeModel.h @@ -1,51 +1,56 @@ /*=================================================================== 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. ===================================================================*/ #ifndef QMITKXNATTREEMODEL_H #define QMITKXNATTREEMODEL_H // CTK includes #include // MITK includes #include "MitkXNATExports.h" namespace mitk { class DataNode; } class MITKXNAT_EXPORT QmitkXnatTreeModel : public ctkXnatTreeModel { Q_OBJECT public: QmitkXnatTreeModel(); virtual QVariant data(const QModelIndex& index, int role) const; virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); using QAbstractItemModel::supportedDropActions; virtual Qt::DropActions supportedDropActions(); virtual Qt::ItemFlags flags(const QModelIndex &index) const; + ctkXnatObject* GetXnatObjectFromUrl(const QString&); + signals: void ResourceDropped(const QList&, ctkXnatObject*, const QModelIndex&); +private: + ctkXnatObject *InternalGetXnatObjectFromUrl(const QString &xnatObjectType, const QString &url, ctkXnatObject *parent); + }; #endif // QMITKXNATTREEMODEL_H diff --git a/Modules/XNAT/src/QmitkSelectXnatUploadDestinationDialog.cpp b/Modules/XNAT/src/QmitkSelectXnatUploadDestinationDialog.cpp index b3af9ddf2d..f7d5168ece 100644 --- a/Modules/XNAT/src/QmitkSelectXnatUploadDestinationDialog.cpp +++ b/Modules/XNAT/src/QmitkSelectXnatUploadDestinationDialog.cpp @@ -1,127 +1,145 @@ #include "QmitkSelectXnatUploadDestinationDialog.h" #include "ui_QmitkSelectXnatUploadDestinationDialog.h" #include #include +#include #include #include "QmitkXnatTreeModel.h" #include -QmitkSelectXnatUploadDestinationDialog::QmitkSelectXnatUploadDestinationDialog(ctkXnatSession* session, QWidget *parent) : +QmitkSelectXnatUploadDestinationDialog::QmitkSelectXnatUploadDestinationDialog(ctkXnatSession* session, const QStringList& availableResources, QWidget *parent) : QDialog(parent), - ui(new Ui::QmitkSelectXnatUploadDestinationDialog) + ui(new Ui::QmitkSelectXnatUploadDestinationDialog), + m_Url(""), + m_ResourceName(""), + m_CreateNewFolder(false) { ui->setupUi(this); m_TreeModel = new QmitkXnatTreeModel(); m_TreeModel->addDataModel(session->dataModel()); ui->treeView->setModel(m_TreeModel); connect(ui->cbSelectResources, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnResourceSelected(const QString&))); connect(ui->treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(OnXnatNodeSelected(const QModelIndex&))); connect(ui->rbSelectResource, SIGNAL(toggled(bool)), this, SLOT(OnSelectResource(bool))); connect(ui->rbSelectFromTreeView, SIGNAL(toggled(bool)), this, SLOT(OnSelectFromTreeView(bool))); connect(ui->leResourceName, SIGNAL(textChanged(const QString&)), this, SLOT(OnResourceEntered(const QString&))); connect(ui->pbCancel, SIGNAL(clicked()), this, SLOT(OnCancel())); connect(ui->pbUpload, SIGNAL(clicked()), this, SLOT(OnUpload())); // Initial Setup ui->pbUpload->setEnabled(false); ui->leResourceName->setVisible(false); - ui->rbSelectFromTreeView->hide(); - ui->rbSelectResource->hide(); - ui->cbSelectResources->hide(); - -// Temporarily disabled, only selection via treeview possible -// if (availableResources.isEmpty()) -// { -// ui->rbSelectFromTreeView->setChecked(true); -// ui->rbSelectResource->setEnabled(false); -// } -// else -// { -// foreach (QString resourceName, availableResources) -// { -// ui->cbSelectResources->addItem(resourceName); -// } -// ui->cbSelectResources->addItem("Create new resource folder..."); -// } + ui->treeView->hide(); + + if (availableResources.isEmpty()) + { + ui->rbSelectFromTreeView->setChecked(true); + ui->rbSelectResource->setEnabled(false); + } + else + { + foreach (QString resourceName, availableResources) + { + ui->cbSelectResources->addItem(resourceName); + } + ui->cbSelectResources->addItem("Create new resource folder..."); + } } QmitkSelectXnatUploadDestinationDialog::~QmitkSelectXnatUploadDestinationDialog() { delete ui; } void QmitkSelectXnatUploadDestinationDialog::OnCancel() { this->done(QDialog::Rejected); } void QmitkSelectXnatUploadDestinationDialog::OnUpload() { this->done(QDialog::Accepted); } void QmitkSelectXnatUploadDestinationDialog::OnSelectResource(bool selectResource) { ui->pbUpload->setEnabled(false); ui->cbSelectResources->setVisible(selectResource); ui->leResourceName->setVisible(!selectResource); ui->treeView->setVisible(!selectResource); if (selectResource) ui->cbSelectResources->setCurrentIndex(0); } void QmitkSelectXnatUploadDestinationDialog::OnSelectFromTreeView(bool selectFromTreeView) { ui->pbUpload->setEnabled(false); ui->cbSelectResources->setVisible(!selectFromTreeView); ui->leResourceName->setVisible(!selectFromTreeView); ui->treeView->setVisible(selectFromTreeView); } -void QmitkSelectXnatUploadDestinationDialog::SetXnatResourceFolderUrl(const QString &/*url*/) +void QmitkSelectXnatUploadDestinationDialog::SetXnatResourceFolderUrl(const QString &url) { -// m_XnatResourceFolderUrl = url; + m_Url = url; } -ctkXnatResource *QmitkSelectXnatUploadDestinationDialog::GetUploadDestination() +ctkXnatObject* QmitkSelectXnatUploadDestinationDialog::GetUploadDestination() { - return m_SelectedResource; + if (ui->rbSelectResource->isChecked() && !m_Url.isEmpty() && !m_ResourceName.isEmpty()) + { + ctkXnatObject* selectedXnatObject = m_TreeModel->GetXnatObjectFromUrl(m_Url); + + ctkXnatResource* resource = new ctkXnatResource(); + resource->setName(m_ResourceName); + resource->setParent(selectedXnatObject); + if(!resource->exists()) + resource->save(); + return resource; + } + else + { + QModelIndex index = ui->treeView->selectionModel()->currentIndex(); + return m_TreeModel->xnatObject(index); + } } void QmitkSelectXnatUploadDestinationDialog::OnResourceSelected(const QString& resource) { if (resource.isEmpty()) ui->pbUpload->setEnabled(false); if (resource != "Create new resource folder...") { ui->pbUpload->setEnabled(true); + m_ResourceName = resource; ui->leResourceName->hide(); } else if (resource == "Create new resource folder...") { ui->pbUpload->setEnabled(false); ui->leResourceName->show(); } } void QmitkSelectXnatUploadDestinationDialog::OnResourceEntered(const QString& resourceEntered) { - ui->pbUpload->setEnabled(!resourceEntered.isEmpty()); + m_CreateNewFolder = !resourceEntered.isEmpty(); + ui->pbUpload->setEnabled(m_CreateNewFolder); + m_ResourceName = resourceEntered; } void QmitkSelectXnatUploadDestinationDialog::OnXnatNodeSelected(const QModelIndex& index) { if (!index.isValid()) return; ctkXnatObject* selectedObject = m_TreeModel->xnatObject(index); - m_SelectedResource = dynamic_cast(selectedObject); - ui->pbUpload->setEnabled(m_SelectedResource != nullptr); + ui->pbUpload->setEnabled(dynamic_cast(selectedObject) != nullptr); } diff --git a/Modules/XNAT/src/QmitkXnatTreeModel.cpp b/Modules/XNAT/src/QmitkXnatTreeModel.cpp index 1c22560a11..229757b3a7 100644 --- a/Modules/XNAT/src/QmitkXnatTreeModel.cpp +++ b/Modules/XNAT/src/QmitkXnatTreeModel.cpp @@ -1,116 +1,193 @@ /*=================================================================== 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 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.ico"; } else if(dynamic_cast(xnatObject)) { path = ":/xnat/subject.ico"; } else if(dynamic_cast(xnatObject)) { path = ":/xnat/experiment.ico"; } 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 + if (experiment != nullptr) + { + currentXnatObject = this->InternalGetXnatObjectFromUrl("scans/", url, experiment); + currentXnatObject->fetch(); + QList scans = currentXnatObject->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; +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkUploadToXNATAction.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkUploadToXNATAction.cpp index b81511a7a8..03c43a9a95 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkUploadToXNATAction.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkUploadToXNATAction.cpp @@ -1,208 +1,199 @@ /*=================================================================== 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 "QmitkUploadToXNATAction.h" //needed for qApp #include #include "org_mitk_gui_qt_xnatinterface_Activator.h" #include #include #include #include #include #include #include #include #include #include #include #include #include void ShowInfoMessage() { QMessageBox infoBox; infoBox.setIcon(QMessageBox::Information); infoBox.setText("You are not connected to a XNAT server!"); infoBox.setInformativeText("Please use the 'Connect' button in the Preferences."); infoBox.exec(); } QmitkUploadToXNATAction::QmitkUploadToXNATAction() { } QmitkUploadToXNATAction::~QmitkUploadToXNATAction() { } void QmitkUploadToXNATAction::Run( const QList &selectedNodes ) { if (selectedNodes.size() != 1) { QMessageBox infoBox; infoBox.setIcon(QMessageBox::Information); infoBox.setText("Please select only one data node for upload"); infoBox.exec(); } // Try to get the XNAT session us::ServiceReference modServiceRef = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference(); if (!modServiceRef) { ShowInfoMessage(); return; } us::ModuleContext* xnatModuleContext = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext(); if (xnatModuleContext == nullptr) { ShowInfoMessage(); return; } ctkXnatSession *session(nullptr); session = xnatModuleContext->GetService(modServiceRef); if (session == nullptr || !session->isOpen()) { ShowInfoMessage(); return; } mitk::DataNode* selectedNode = selectedNodes.at(0); if (selectedNode == nullptr) return; -///////////////////////////////////////////////////////////////////////////////////// - /* - * TODO - * Preselect possible upload destination by evaluating the xnat.url property of a parent node - * Problem here: We need a valid ctkXnatObject as parent for uploading the file - */ -///////////////////////////////////////////////////////////////////////////////////// -// ctkServiceTracker dataStorageServiceTracker (mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()); -// dataStorageServiceTracker.open(); -// mitk::IDataStorageService* dsService = dataStorageServiceTracker.getService(); -// mitk::DataStorage::Pointer dataStorage = dsService->GetDataStorage()->GetDataStorage(); - -// mitk::NodePredicateProperty::Pointer pred = mitk::NodePredicateProperty::New("xnat.url"); -// mitk::DataStorage::SetOfObjects::ConstPointer result = dataStorage->GetSources(selectedNode, pred); -// mitk::DataStorage::SetOfObjects::ConstIterator it = result->Begin(); - -// QList resourceFolders; -// QStringList resourceNames; -// QString url; -// for (;it != result->End(); ++it) -// { -// mitk::DataNode::Pointer node = it->Value(); - -// std::string xnatUrl(""); -// node->GetStringProperty("xnat.url", xnatUrl); -// url = QString::fromStdString(xnatUrl); - -// int start = url.lastIndexOf("resources/") + 10; //length of "resources/" -// url = url.left(start); - -// std::cout<<"node: "<GetName()<<" --- URL: "<httpGet(url); -// resourceFolders = session->httpResults(uid, ctkXnatDefaultSchemaTypes::XSI_RESOURCE); - -// foreach (ctkXnatObject* obj, resourceFolders) -// { -// resourceNames << obj->name(); -// } -// } -///////////////////////////////////////////////////////////////////////////////////// + ctkServiceTracker dataStorageServiceTracker (mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()); + dataStorageServiceTracker.open(); + mitk::IDataStorageService* dsService = dataStorageServiceTracker.getService(); + mitk::DataStorage::Pointer dataStorage = dsService->GetDataStorage()->GetDataStorage(); + + mitk::NodePredicateProperty::Pointer pred = mitk::NodePredicateProperty::New("xnat.url"); + mitk::DataStorage::SetOfObjects::ConstPointer result = dataStorage->GetSources(selectedNode, pred); + mitk::DataStorage::SetOfObjects::ConstIterator it = result->Begin(); + + QList resourceFolders; + QStringList resourceNames; + QString url; + for (;it != result->End(); ++it) + { + mitk::DataNode::Pointer node = it->Value(); + + std::string xnatUrl(""); + node->GetStringProperty("xnat.url", xnatUrl); + url = QString::fromStdString(xnatUrl); + + int start = url.lastIndexOf("resources/") + 10; //length of "resources/" + url = url.left(start); + + QUuid uid = session->httpGet(url); + resourceFolders = session->httpResults(uid, ctkXnatDefaultSchemaTypes::XSI_RESOURCE); + + foreach (ctkXnatObject* obj, resourceFolders) + { + resourceNames << obj->name(); + } + } // Dialog for selecting the upload destination - QmitkSelectXnatUploadDestinationDialog dialog(session); + QmitkSelectXnatUploadDestinationDialog dialog(session, resourceNames); dialog.setWindowTitle("Select XNAT upload destination"); + dialog.SetXnatResourceFolderUrl(url); int returnValue = dialog.exec(); if (returnValue == QDialog::Accepted) { // Save node QString fileName (QString::fromStdString(selectedNode->GetName())); if (dynamic_cast(selectedNode->GetData())) { fileName.append(".nrrd"); } else if (dynamic_cast(selectedNode->GetData())) { fileName.append(".vtk"); } else if (dynamic_cast(selectedNode->GetData())) { fileName.append(".mps"); } else { MITK_WARN << "Could not upload file! File-type not supported"; QMessageBox msgbox; msgbox.setText("Could not upload file! File-type not supported"); msgbox.setIcon(QMessageBox::Critical); msgbox.exec(); return; } QString xnatFolder = "XNAT_UPLOADS"; QDir dir(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()->getDataFile("").absoluteFilePath()); dir.mkdir(xnatFolder); fileName = dir.path().append("/" + fileName); mitk::IOUtil::Save (selectedNode->GetData(), fileName.toStdString()); // Upload the file to XNAT - ctkXnatResource* uploadDestination = dialog.GetUploadDestination(); + ctkXnatObject* uploadDestination = dialog.GetUploadDestination(); if (uploadDestination != nullptr) { ctkXnatFile* file = new ctkXnatFile(uploadDestination); file->setLocalFilePath(fileName); QFileInfo fileInfo (fileName); file->setName(fileInfo.fileName()); file->save(); } } -// dataStorageServiceTracker.close(); + dataStorageServiceTracker.close(); } void QmitkUploadToXNATAction::SetDataStorage(mitk::DataStorage* /*dataStorage*/) { //not needed } void QmitkUploadToXNATAction::SetFunctionality(berry::QtViewPart* /*functionality*/) { //not needed } void QmitkUploadToXNATAction::SetSmoothed(bool /*smoothed*/) { //not needed } void QmitkUploadToXNATAction::SetDecimated(bool /*smoothed*/) { //not needed } diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp index a357aa4d60..474452c092 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp @@ -1,909 +1,910 @@ /*=================================================================== 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 "QmitkXnatTreeBrowserView.h" // Qmitk #include "org_mitk_gui_qt_xnatinterface_Activator.h" // Blueberry #include #include // CTK XNAT Core #include #include #include #include #include #include "ctkXnatFile.h" #include #include #include #include #include #include #include #include // MITK XNAT #include #include #include #include // Qt #include #include #include #include #include #include #include #include #include #include // MITK #include #include #include // Poco #include const std::string QmitkXnatTreeBrowserView::VIEW_ID = "org.mitk.views.xnat.treebrowser"; QmitkXnatTreeBrowserView::QmitkXnatTreeBrowserView() : m_DataStorageServiceTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()), m_TreeModel(new QmitkXnatTreeModel()), m_Tracker(0), m_DownloadPath(berry::Platform::GetPreferencesService()->GetSystemPreferences()->Node("/XnatConnection")->Get("Download Path", "")) { m_DataStorageServiceTracker.open(); // Set DownloadPath if (m_DownloadPath.isEmpty()) { QString xnatFolder = "XNAT_DOWNLOADS"; QDir dir(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()->getDataFile("").absoluteFilePath()); dir.mkdir(xnatFolder); dir.setPath(dir.path() + "/" + xnatFolder); m_DownloadPath = dir.path() + "/"; } } QmitkXnatTreeBrowserView::~QmitkXnatTreeBrowserView() { m_DataStorageServiceTracker.close(); delete m_TreeModel; delete m_Tracker; } void QmitkXnatTreeBrowserView::SetFocus() { } void QmitkXnatTreeBrowserView::CreateQtPartControl(QWidget *parent) { // Create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); m_Controls.treeView->setModel(m_TreeModel); m_Controls.treeView->header()->hide(); m_Controls.treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); m_Controls.treeView->setAcceptDrops(true); m_Controls.treeView->setDropIndicatorShown(true); m_Controls.labelError->setText("Please use the 'Connect' button in the Preferences."); m_Controls.labelError->setStyleSheet("QLabel { color: red; }"); m_SelectionProvider = new berry::QtSelectionProvider(); this->SetSelectionProvider(); m_Controls.treeView->setSelectionMode(QAbstractItemView::SingleSelection); m_Controls.treeView->setContextMenuPolicy(Qt::CustomContextMenu); m_Controls.groupBox->hide(); m_Tracker = new mitk::XnatSessionTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()); m_ContextMenu = new QMenu(m_Controls.treeView); connect(m_Controls.treeView, SIGNAL(clicked(const QModelIndex&)), SLOT(itemSelected(const QModelIndex&))); connect(m_Controls.treeView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OnContextMenuRequested(const QPoint&))); connect(m_Tracker, SIGNAL(AboutToBeClosed(ctkXnatSession*)), this, SLOT(CleanTreeModel(ctkXnatSession*))); connect(m_Tracker, SIGNAL(Opened(ctkXnatSession*)), this, SLOT(UpdateSession(ctkXnatSession*))); m_Tracker->Open(); ctkXnatSession* session; try { session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); } catch (std::invalid_argument) { session = 0; } if (session != 0) { m_Controls.labelError->setVisible(false); } else { m_Controls.labelError->setVisible(true); } connect(m_Controls.treeView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(OnActivatedNode(const QModelIndex&))); connect(m_Controls.treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(OnXnatNodeSelected(const QModelIndex&))); connect(m_TreeModel, SIGNAL(ResourceDropped(const QList&, ctkXnatObject*, const QModelIndex&)), this, SLOT(OnUploadResource(const QList&, ctkXnatObject*, const QModelIndex&))); connect(m_Controls.btnXnatUpload, SIGNAL(clicked()), this, SLOT(OnUploadFromDataStorage())); connect(m_Controls.btnXnatDownload, SIGNAL(clicked()), this, SLOT(OnDownloadSelectedXnatFile())); connect(m_Controls.btnCreateXnatFolder, SIGNAL(clicked()), this, SLOT(OnCreateResourceFolder())); } void QmitkXnatTreeBrowserView::OnCreateResourceFolder() { QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); if(!index.isValid()) return; ctkXnatObject* parent = index.data(Qt::UserRole).value(); this->InternalAddResourceFolder(parent); m_TreeModel->refresh(index); } void QmitkXnatTreeBrowserView::OnDownloadSelectedXnatFile() { QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); if(!index.isValid()) return; ctkXnatObject* selectedXnatObject = index.data(Qt::UserRole).value(); bool enableDownload = dynamic_cast(selectedXnatObject) != nullptr; enableDownload |= dynamic_cast(selectedXnatObject) != nullptr; if (enableDownload) { this->InternalFileDownload(index, true); } } void QmitkXnatTreeBrowserView::OnUploadFromDataStorage() { QmitkXnatUploadFromDataStorageDialog dialog; dialog.SetDataStorage(this->GetDataStorage()); int result = dialog.exec(); if (result == QDialog::Accepted) { QList nodes; nodes << dialog.GetSelectedNode().GetPointer(); QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); if (!index.isValid()) return; ctkXnatObject* parent = m_TreeModel->xnatObject(index); this->OnUploadResource(nodes, parent, index); } } void QmitkXnatTreeBrowserView::OnXnatNodeSelected(const QModelIndex& index) { // Enable download button if (!index.isValid()) return; ctkXnatObject* selectedXnatObject = index.data(Qt::UserRole).value(); bool enableDownload = dynamic_cast(selectedXnatObject) != nullptr; enableDownload |= dynamic_cast(selectedXnatObject) != nullptr; m_Controls.btnXnatDownload->setEnabled(enableDownload); bool enableCreateFolder = dynamic_cast(selectedXnatObject) != nullptr; enableCreateFolder |= dynamic_cast(selectedXnatObject) != nullptr; enableCreateFolder |= dynamic_cast(selectedXnatObject) != nullptr; m_Controls.btnCreateXnatFolder->setEnabled(enableCreateFolder); bool enableUpload = dynamic_cast(selectedXnatObject) != nullptr; m_Controls.btnXnatUpload->setEnabled(enableUpload); } void QmitkXnatTreeBrowserView::OnActivatedNode(const QModelIndex& index) { if (!index.isValid()) return; ctkXnatObject* selectedXnatObject = index.data(Qt::UserRole).value(); bool enableDownload = dynamic_cast(selectedXnatObject) != nullptr; enableDownload |= dynamic_cast(selectedXnatObject) != nullptr; if (enableDownload) { QMessageBox msgBox; QString msg ("Do you want to download "+selectedXnatObject->name()+"?"); msgBox.setWindowTitle("MITK XNAT upload"); msgBox.setText(msg); msgBox.setIcon(QMessageBox::Question); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); int result = msgBox.exec(); if (result == QMessageBox::Ok) InternalFileDownload(index, true); } } void QmitkXnatTreeBrowserView::SetSelectionProvider() { GetSite()->SetSelectionProvider(m_SelectionProvider); } void QmitkXnatTreeBrowserView::UpdateSession(ctkXnatSession* session) { if (session != 0 && session->isOpen()) { m_Controls.labelError->setVisible(false); // Fill model and show in the GUI m_TreeModel->addDataModel(session->dataModel()); m_Controls.treeView->reset(); m_SelectionProvider->SetItemSelectionModel(m_Controls.treeView->selectionModel()); connect(session, SIGNAL(progress(QUuid,double)), this, SLOT(OnProgress(QUuid,double))); } } void QmitkXnatTreeBrowserView::CleanTreeModel(ctkXnatSession* session) { if (session != 0) { m_TreeModel->removeDataModel(session->dataModel()); m_Controls.treeView->reset(); } } void QmitkXnatTreeBrowserView::OnProgress(QUuid /*queryID*/, double progress) { unsigned int currentProgress = progress*100; if (m_Controls.groupBox->isHidden()) { m_Controls.groupBox->show(); m_Controls.progressBar->setValue(0); } m_Controls.progressBar->setValue(currentProgress); } void QmitkXnatTreeBrowserView::InternalFileDownload(const QModelIndex& index, bool loadData) { if (!index.isValid()) return; ctkXnatObject* xnatObject = m_TreeModel->xnatObject(index); if (xnatObject != nullptr) { // The path to the downloaded file QString filePath; QDir downloadPath (m_DownloadPath); QString serverURL = berry::Platform::GetPreferencesService()->GetSystemPreferences()->Node("/XnatConnection")->Get("Server Address", ""); bool isDICOM (false); // If a scan was selected, downloading the contained DICOM folder as ZIP ctkXnatScan* scan = dynamic_cast(xnatObject); if (scan != nullptr) { isDICOM = true; if (!scan->isFetched()) scan->fetch(); QList children = scan->children(); foreach (ctkXnatObject* obj, children) { if (obj->name() == "DICOM") { QString folderName = obj->resourceUri(); folderName.replace("/","_"); downloadPath = m_DownloadPath + folderName; this->InternalDICOMDownload(obj, downloadPath); serverURL = obj->resourceUri(); } } } else { ctkXnatFile* file = dynamic_cast(xnatObject); if (file == nullptr) { MITK_ERROR << "Selected XNAT object not downloadable!"; return; } filePath = m_DownloadPath + file->name(); // Checking if the file exists already if (downloadPath.exists(file->name())) { MITK_INFO << "File '" << file->name().toStdString() << "' already exists!"; + serverURL = file->parent()->resourceUri(); } else { if (file->property("collection") == QString("DICOM")) { isDICOM = true; ctkXnatObject* parent = file->parent(); QString folderName = parent->resourceUri(); folderName.replace("/","_"); downloadPath = m_DownloadPath + folderName; this->InternalDICOMDownload(parent, downloadPath); serverURL = parent->resourceUri(); } else { this->SetStatusInformation("Downloading file " + file->name()); file->download(filePath); serverURL = file->parent()->resourceUri(); // Checking if the file exists now if (downloadPath.exists(file->name())) { MITK_INFO << "Download of " << file->name().toStdString() << " completed!"; QMessageBox msgBox; msgBox.setText("Download of " + file->name() + " completed!"); msgBox.setIcon(QMessageBox::Information); msgBox.exec(); m_Controls.groupBox->hide(); } else { MITK_INFO << "Download of " << file->name().toStdString() << " failed!"; QMessageBox msgBox; msgBox.setText("Download of " + file->name() + " failed!"); msgBox.setIcon(QMessageBox::Critical); msgBox.exec(); m_Controls.groupBox->hide(); return; } } } } if (loadData) { QFileInfoList fileList; if (isDICOM) { fileList = downloadPath.entryInfoList(QDir::Files); } else { QFileInfo fileInfo(filePath); fileList << fileInfo; } mitk::StringProperty::Pointer xnatURL = mitk::StringProperty::New(serverURL.toStdString()); this->InternalOpenFiles(fileList, xnatURL); } } } void QmitkXnatTreeBrowserView::InternalDICOMDownload(ctkXnatObject *obj, QDir &DICOMDirPath) { QString filePath = m_DownloadPath + obj->property("label") + ".zip"; this->SetStatusInformation("Downloading DICOM series " + obj->parent()->name()); obj->download(filePath); std::ifstream in(filePath.toStdString().c_str(), std::ios::binary); poco_assert(in); // decompress to XNAT_DOWNLOAD dir Poco::Zip::Decompress dec(in, Poco::Path(DICOMDirPath.path().toStdString()), true); dec.decompressAllFiles(); in.close(); QFile::remove(filePath); // Checking if the file exists now if (DICOMDirPath.exists()) { MITK_INFO << "Download of DICOM series " << obj->parent()->name().toStdString() << " completed!"; QMessageBox msgBox; msgBox.setText("Download of DICOM series " + obj->parent()->name() + " completed!"); msgBox.setIcon(QMessageBox::Information); msgBox.exec(); m_Controls.groupBox->hide(); } else { MITK_INFO << "Download of DICOM series " << obj->parent()->name().toStdString() << " failed!"; QMessageBox msgBox; msgBox.setText("Download of DICOM series " + obj->parent()->name() + " failed!"); msgBox.setIcon(QMessageBox::Critical); msgBox.exec(); m_Controls.groupBox->hide(); } } void QmitkXnatTreeBrowserView::InternalOpenFiles(const QFileInfoList & fileList, mitk::StringProperty::Pointer xnatURL) { if (fileList.isEmpty()) { MITK_WARN << "No files available for laoding!"; return; } mitk::IDataStorageService* dsService = m_DataStorageServiceTracker.getService(); mitk::DataStorage::Pointer dataStorage = dsService->GetDataStorage()->GetDataStorage(); QStringList list; list << fileList.at(0).absoluteFilePath(); try { mitk::DataStorage::SetOfObjects::Pointer nodes = QmitkIOUtil::Load(list, *dataStorage); if (nodes->size() == 1) { mitk::DataNode* node = nodes->at(0); node->SetProperty("xnat.url", xnatURL); } } catch (const mitk::Exception& e) { MITK_INFO << e; return; } mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects( dsService->GetDataStorage()->GetDataStorage()); } void QmitkXnatTreeBrowserView::OnContextMenuDownloadFile() { QModelIndex index = m_Controls.treeView->currentIndex(); InternalFileDownload(index, false); } void QmitkXnatTreeBrowserView::OnContextMenuDownloadAndOpenFile() { QModelIndex index = m_Controls.treeView->currentIndex(); InternalFileDownload(index, true); } void QmitkXnatTreeBrowserView::OnContextMenuCreateResourceFolder() { const QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); ctkXnatObject* parentObject = m_TreeModel->xnatObject(index); if (parentObject != nullptr) { this->InternalAddResourceFolder(parentObject); } } ctkXnatResource* QmitkXnatTreeBrowserView::InternalAddResourceFolder(ctkXnatObject *parent) { bool ok; QString folderName = QInputDialog::getText(m_Controls.treeView, tr("Create XNAT resource folder"), tr("Folder name:"), QLineEdit::Normal, tr("data"), &ok); if (ok) { if (folderName.isEmpty()) folderName = "NO LABEL"; return parent->addResourceFolder(folderName); } else { return nullptr; } } void QmitkXnatTreeBrowserView::InternalFileUpload(ctkXnatFile* file) { m_Controls.groupBox->setTitle("Uploading file..."); m_Controls.groupBox->show(); try { file->save(); MITK_INFO << "Upload of " << file->name().toStdString() << " completed!"; QMessageBox msgBox; msgBox.setText("Upload of " + file->name() + " completed!"); msgBox.setIcon(QMessageBox::Information); msgBox.show(); msgBox.exec(); } catch (ctkXnatException &e) { QMessageBox msgbox; msgbox.setText(e.what()); msgbox.setIcon(QMessageBox::Critical); msgbox.exec(); m_Controls.progressBar->setValue(0); } m_Controls.groupBox->hide(); } void QmitkXnatTreeBrowserView::OnContextMenuUploadFile() { QString filename = QFileDialog::getOpenFileName(m_Controls.treeView, tr("Open File"), QDir::homePath()); const QModelIndex index = m_Controls.treeView->selectionModel()->currentIndex(); ctkXnatResource* resource = dynamic_cast(m_TreeModel->xnatObject(index)); if (resource) { ctkXnatFile* file = new ctkXnatFile(resource); file->setLocalFilePath(filename); QFileInfo fileInfo (filename); file->setName(fileInfo.fileName()); this->InternalFileUpload(file); m_TreeModel->addChildNode(index, file); } } void QmitkXnatTreeBrowserView::OnUploadResource(const QList& droppedNodes, ctkXnatObject* parentObject, const QModelIndex& parentIndex) { if (parentObject == nullptr) return; //1. If not dropped on a resource, create a new folder ctkXnatResource* resource = dynamic_cast(parentObject); if (resource == nullptr) { resource = this->InternalAddResourceFolder(parentObject); } if (resource == nullptr) { MITK_WARN << "Could not upload file! No resource available!"; QMessageBox msgbox; msgbox.setText("Could not upload file! No resource available!"); msgbox.setIcon(QMessageBox::Critical); msgbox.exec(); return; } //2. Save files locally //3. Upload file mitk::DataNode* node = NULL; foreach (node, droppedNodes) { mitk::BaseData* data = node->GetData(); if (!data) return; QString fileName (QString::fromStdString(node->GetName())); ctkXnatFile* xnatFile = new ctkXnatFile(resource); if (dynamic_cast(data)) { fileName.append(".nrrd"); } else if (dynamic_cast(data)) { fileName.append(".vtk"); } else if (dynamic_cast(data)) { fileName.append(".mps"); } else { MITK_WARN << "Could not upload file! File-type not supported"; QMessageBox msgbox; msgbox.setText("Could not upload file! File-type not supported"); msgbox.setIcon(QMessageBox::Critical); msgbox.exec(); return; } xnatFile->setName(fileName); QString xnatFolder = "XNAT_UPLOADS"; QDir dir(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()->getDataFile("").absoluteFilePath()); dir.mkdir(xnatFolder); fileName = dir.path().append("/" + fileName); mitk::IOUtil::Save (data, fileName.toStdString()); // TODO Check if file exists // AbstractFileReader::SetDefaultDataNodeProperties // und in die andere SetDefaultDataNodeProperties // PropertyName klein: mtime.initial + Kommentar mitk::StringProperty::Pointer orignalFilePath = mitk::StringProperty::New(); node->GetProperty(orignalFilePath, "path"); xnatFile->setLocalFilePath(fileName); this->InternalFileUpload(xnatFile); QFile::remove(fileName); m_TreeModel->refresh(parentIndex); // The filename for uploading // QFileInfo fileInfo; // if (surface) // { // // Save surface // fileName.append(".stl"); // xnatFile->setName(fileName); // dir.setPath(dir.path().append("/" + fileName)); // QString origFile = QString::fromStdString(orignalFilePath->GetValueAsString()); // origFile.append("/" + fileName); // origFile.append(".stl"); // fileInfo.setFile(origFile); // if (!fileInfo.exists()) // mitk::IOUtil::SaveSurface(surface, dir.path().toStdString()); // } // this->uploadFileToXnat(xnatFile, dir.path()); } } void QmitkXnatTreeBrowserView::OnContextMenuRequested(const QPoint & pos) { m_ContextMenu->clear(); QModelIndex index = m_Controls.treeView->indexAt(pos); ctkXnatObject* xnatObject = m_TreeModel->xnatObject(index); bool downloadable = false; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; downloadable |= dynamic_cast(xnatObject)!=NULL; bool canHaveResourceFolder = false; canHaveResourceFolder |= dynamic_cast(xnatObject) != NULL; canHaveResourceFolder |= dynamic_cast(xnatObject) != NULL; canHaveResourceFolder |= dynamic_cast(xnatObject) != NULL; bool uploadFilePossible = false; uploadFilePossible |= dynamic_cast(xnatObject) != NULL; uploadFilePossible |= dynamic_cast(xnatObject) != NULL; uploadFilePossible |= dynamic_cast(xnatObject) != NULL; if (downloadable) { QAction* actDownload = new QAction("Download", m_ContextMenu); connect(actDownload, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadFile())); m_ContextMenu->addAction(actDownload); ctkXnatFile* file = dynamic_cast(xnatObject); if (file) { QAction* actView = new QAction("Download and Open", m_ContextMenu); connect(actView, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadAndOpenFile())); m_ContextMenu->addAction(actView); } } if (canHaveResourceFolder) { QAction* actCreateResource = new QAction("Add resource folder", m_ContextMenu); connect(actCreateResource, SIGNAL(triggered()), this, SLOT(OnContextMenuCreateResourceFolder())); m_ContextMenu->addAction(actCreateResource); } if (uploadFilePossible) { QAction* actUploadFile = new QAction("Upload File", m_ContextMenu); connect(actUploadFile, SIGNAL(triggered()), this, SLOT(OnContextMenuUploadFile())); m_ContextMenu->addAction(actUploadFile); } ctkXnatProject* project = dynamic_cast(xnatObject); if (project != NULL) { QAction* actCreateSubject = new QAction("Create new subject", m_ContextMenu); m_ContextMenu->addAction(actCreateSubject); connect(actCreateSubject, SIGNAL(triggered()), this, SLOT(OnContextMenuCreateNewSubject())); m_ContextMenu->popup(QCursor::pos()); } ctkXnatSubject* subject = dynamic_cast(xnatObject); if (subject != NULL) { QAction* actCreateExperiment = new QAction("Create new experiment", m_ContextMenu); m_ContextMenu->addAction(actCreateExperiment); connect(actCreateExperiment, SIGNAL(triggered()), this, SLOT(OnContextMenuCreateNewExperiment())); m_ContextMenu->popup(QCursor::pos()); } m_ContextMenu->popup(QCursor::pos()); } void QmitkXnatTreeBrowserView::itemSelected(const QModelIndex& index) { QLayout* layout = m_Controls.infoVerticalLayout; QLayoutItem *child; while ((child = layout->takeAt(0)) != 0) { delete child->widget(); } QVariant variant = m_TreeModel->data(index, Qt::UserRole); if (variant.isValid()) { ctkXnatSession *session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); ctkXnatObject* object = variant.value(); ctkXnatProject* project = dynamic_cast(object); ctkXnatSubject* subject = dynamic_cast(object); ctkXnatExperiment* experiment = dynamic_cast(object); if (project != NULL) { QmitkXnatProjectWidget* widget = new QmitkXnatProjectWidget(QmitkXnatProjectWidget::Mode::INFO); widget->SetProject(project); layout->addWidget(widget); } else if (subject != NULL) { QMap paramMap; paramMap.insert("columns", "dob,gender,handedness,weight,height"); QUuid requestID = session->httpGet(QString("%1/subjects").arg(subject->parent()->resourceUri()), paramMap); QList results = session->httpSync(requestID); foreach(const QVariantMap& propertyMap, results) { QMapIterator it(propertyMap); bool isConcretSubject = false; if (it.hasNext()) { it.next(); QString str = it.key().toLatin1().data(); QVariant var = it.value(); // After CTK Change (subjectID = name) to (subjectID = ID) // CHANGE TO: if (var == subject->property("ID")) if (var == subject->property("URI").right(11)) { isConcretSubject = true; } else { isConcretSubject = false; } it.toFront(); } while (it.hasNext() && isConcretSubject) { it.next(); QString str = it.key().toLatin1().data(); QVariant var = it.value(); subject->setProperty(str, var); } } QmitkXnatSubjectWidget* widget = new QmitkXnatSubjectWidget(QmitkXnatSubjectWidget::Mode::INFO); widget->SetSubject(subject); layout->addWidget(widget); } else if (experiment != NULL) { QMap paramMap; paramMap.insert("columns", "date,time,scanner,modality"); QUuid requestID = session->httpGet(QString("%1/experiments").arg(experiment->parent()->resourceUri()), paramMap); QList results = session->httpSync(requestID); foreach(const QVariantMap& propertyMap, results) { QMapIterator it(propertyMap); bool isConcretExperiment = false; if (it.hasNext()) { it.next(); QString str = it.key().toLatin1().data(); QVariant var = it.value(); if (var == experiment->property("URI")) { isConcretExperiment = true; } else { isConcretExperiment = false; } it.toFront(); } while (it.hasNext() && isConcretExperiment) { it.next(); QString str = it.key().toLatin1().data(); QVariant var = it.value(); experiment->setProperty(str, var); } } QmitkXnatExperimentWidget* widget = new QmitkXnatExperimentWidget(QmitkXnatExperimentWidget::Mode::INFO); widget->SetExperiment(experiment); layout->addWidget(widget); } } } void QmitkXnatTreeBrowserView::OnContextMenuCreateNewSubject() { QModelIndex index = m_Controls.treeView->currentIndex(); QVariant variant = m_TreeModel->data(index, Qt::UserRole); if (variant.isValid()) { QmitkXnatCreateObjectDialog* dialog = new QmitkXnatCreateObjectDialog(QmitkXnatCreateObjectDialog::SpecificType::SUBJECT); if (dialog->exec() == QDialog::Accepted) { ctkXnatProject* project = dynamic_cast(variant.value()); ctkXnatSubject* subject = dynamic_cast(dialog->GetXnatObject()); subject->setParent(project); subject->save(); // Get xnat session from micro service ctkXnatSession* session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); // Update View m_TreeModel->removeDataModel(session->dataModel()); UpdateSession(session); } } } void QmitkXnatTreeBrowserView::OnContextMenuCreateNewExperiment() { QModelIndex index = m_Controls.treeView->currentIndex(); QVariant variant = m_TreeModel->data(index, Qt::UserRole); if (variant.isValid()) { QmitkXnatCreateObjectDialog* dialog = new QmitkXnatCreateObjectDialog(QmitkXnatCreateObjectDialog::SpecificType::EXPERIMENT); if (dialog->exec() == QDialog::Accepted) { ctkXnatSubject* subject = dynamic_cast(variant.value()); ctkXnatExperiment* experiment = dynamic_cast(dialog->GetXnatObject()); experiment->setParent(subject); experiment->setProperty("xsiType", experiment->imageModality()); experiment->save(); // Get xnat session from micro service ctkXnatSession* session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); // Update View m_TreeModel->removeDataModel(session->dataModel()); UpdateSession(session); } } } void QmitkXnatTreeBrowserView::SetStatusInformation(const QString& text) { m_Controls.groupBox->setTitle(text); m_Controls.progressBar->setValue(0); m_Controls.groupBox->show(); }