diff --git a/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidget.cpp b/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidget.cpp index 039926cb5a..48fba39b8a 100644 --- a/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidget.cpp +++ b/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidget.cpp @@ -1,41 +1,47 @@ /*=================================================================== 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 "QmitkXnatExperimentInfoWidget.h" #include QmitkXnatExperimentInfoWidget::QmitkXnatExperimentInfoWidget(ctkXnatExperiment* experiment, QWidget* parent) : QWidget(parent) , m_Experiment(experiment) { // Create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(this); + + // Set the UI labels + m_Controls.modalityLabel->setText(m_Experiment->property("modality")); + m_Controls.dateLabel->setText(m_Experiment->property("date")); + m_Controls.timeLabel->setText(m_Experiment->property("time")); + m_Controls.scannerLabel->setText(m_Experiment->property("scanner")); } QmitkXnatExperimentInfoWidget::~QmitkXnatExperimentInfoWidget() { } void QmitkXnatExperimentInfoWidget::SetExperiment(ctkXnatExperiment* experiment) { m_Experiment = experiment; } ctkXnatExperiment* QmitkXnatExperimentInfoWidget::GetExperiment() const { return m_Experiment; } diff --git a/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidgetControls.ui b/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidgetControls.ui index 32eb56ba88..79481e9cff 100644 --- a/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidgetControls.ui +++ b/Modules/XNATUI/Qmitk/QmitkXnatExperimentInfoWidgetControls.ui @@ -1,97 +1,97 @@ QmitkXnatExperimentInfoWidgetControls true 0 0 350 107 Qmitk Template Time: Date: Scanner: - - - - Acquisition Site: - - - - + 75 false true Experiment Information Qt::AlignCenter + + + + Modality: + + + diff --git a/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidget.cpp b/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidget.cpp index 8551b8868e..b3045f881c 100644 --- a/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidget.cpp +++ b/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidget.cpp @@ -1,48 +1,49 @@ /*=================================================================== 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 "QmitkXnatSubjectInfoWidget.h" #include #include QmitkXnatSubjectInfoWidget::QmitkXnatSubjectInfoWidget(ctkXnatSubject* subject, QWidget* parent) : m_Subject(subject) , QWidget(parent) { // Create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(this); // Set the UI labels - for (int i = 0; i < m_Subject->properties().count(); i++) - { - std::cout << "KEY: " << m_Subject->properties().keys().at(i).toStdString() << " --- " << "VALUE: " << m_Subject->properties().values().at(i).toStdString() << "\n"; - } + m_Controls.birthyearLabel->setText(m_Subject->property("dob")); + m_Controls.genderLabel->setText(m_Subject->property("gender")); + m_Controls.handednessLabel->setText(m_Subject->property("handedness")); + m_Controls.heightLabel->setText(m_Subject->property("height")); + m_Controls.weightLabel->setText(m_Subject->property("weight")); } QmitkXnatSubjectInfoWidget::~QmitkXnatSubjectInfoWidget() { } void QmitkXnatSubjectInfoWidget::SetSubject(ctkXnatSubject* subject) { m_Subject = subject; } ctkXnatSubject* QmitkXnatSubjectInfoWidget::GetSubject() const { return m_Subject; } diff --git a/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidgetControls.ui b/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidgetControls.ui index 78db5d5064..843a2e3062 100644 --- a/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidgetControls.ui +++ b/Modules/XNATUI/Qmitk/QmitkXnatSubjectInfoWidgetControls.ui @@ -1,110 +1,110 @@ QmitkXnatSubjectInfoWidgetControls true 0 0 350 126 Qmitk Template Gender: - Birthyear: + Birthdate: Handedness: Heigth (inches): Weight (lbs) 75 true Subject Information Qt::AlignCenter 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 2e36acdbaa..fc07d82654 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp @@ -1,369 +1,458 @@ /*=================================================================== 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 "QmitkXnatObjectEditorInput.h" #include "QmitkXnatEditor.h" #include "org_mitk_gui_qt_xnatinterface_Activator.h" // Blueberry #include #include // CTK XNAT Core #include #include #include #include // MITK XNAT UI #include #include #include // Qt #include #include #include #include // MITK #include #include // Poco #include const std::string QmitkXnatTreeBrowserView::VIEW_ID = "org.mitk.views.xnat.treebrowser"; QmitkXnatTreeBrowserView::QmitkXnatTreeBrowserView() : m_TreeModel(new ctkXnatTreeModel()), m_Tracker(0), m_DownloadPath(berry::Platform::GetPreferencesService()->GetSystemPreferences()->Node("/XnatConnection")->Get("Download Path", "")), m_DataStorageServiceTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetContext()) { 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.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_Tracker = new mitk::XnatSessionTracker(mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()); m_NodeMenu = 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(NodeTableViewContextMenuRequested(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(activated(const QModelIndex&)), this, SLOT(OnActivatedNode(const QModelIndex&))); } void QmitkXnatTreeBrowserView::OnActivatedNode(const QModelIndex& index) { if (!index.isValid()) return; berry::IWorkbenchPage::Pointer page = GetSite()->GetPage(); QmitkXnatObjectEditorInput::Pointer oPtr(new QmitkXnatObjectEditorInput(index.data(Qt::UserRole).value())); berry::IEditorInput::Pointer editorInput(oPtr); berry::IEditorPart::Pointer reuseEditor = page->FindEditor(editorInput); if (reuseEditor) { // Just set it activ page->Activate(reuseEditor); } else { QList editors = page->FindEditors(berry::IEditorInput::Pointer(0), QmitkXnatEditor::EDITOR_ID, berry::IWorkbenchPage::MATCH_ID); if (editors.isEmpty()) { ctkXnatFile* file = dynamic_cast(oPtr->GetXnatObject()); if (file != NULL) { // If the selected node is a file, so show it in MITK InternalFileDownload(index, true); } else { // No XnatEditor is currently open, create a new one page->OpenEditor(editorInput, QmitkXnatEditor::EDITOR_ID); } } else { // Reuse an existing editor reuseEditor = editors.front()->GetEditor(true); page->ReuseEditor(reuseEditor.Cast(), editorInput); page->Activate(reuseEditor); } } } 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()); } } void QmitkXnatTreeBrowserView::CleanTreeModel(ctkXnatSession* session) { if (session != 0) { m_TreeModel->removeDataModel(session->dataModel()); m_Controls.treeView->reset(); } } void QmitkXnatTreeBrowserView::InternalFileDownload(const QModelIndex& index, bool loadData) { QVariant variant = m_TreeModel->data(index, Qt::UserRole); if (variant.isValid()) { ctkXnatFile* file = dynamic_cast(variant.value()); if (file != NULL) { QDir downDir(m_DownloadPath); QString filePath = m_DownloadPath + file->name(); // Testing if the file exists already if (downDir.exists(file->name())) { MITK_INFO << "File '" << file->name().toStdString() << "' already exists!"; } else { if (file->property("collection") == QString("DICOM")) { ctkXnatObject* parent = file->parent(); filePath = m_DownloadPath + parent->property("label") + ".zip"; parent->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(m_DownloadPath.toStdString())); dec.decompressAllFiles(); in.close(); QFile::remove(filePath); } else { MITK_INFO << "Download started ..."; MITK_INFO << "..."; file->download(filePath); // Testing if the file exists now if (downDir.exists(file->name())) { MITK_INFO << "Download of " << file->name().toStdString() << " was completed!"; } else { MITK_INFO << "Download of " << file->name().toStdString() << " failed!"; } } } if (downDir.exists(file->name()) || file->property("collection") == "DICOM") { if (loadData) { if (file->property("collection") == "DICOM") { // Search for the downloaded file an its file path QDirIterator it(m_DownloadPath, QStringList() << file->name(), QDir::Files, QDirIterator::Subdirectories); while (it.hasNext()) { it.next(); filePath = it.filePath(); } } if (filePath.isEmpty()) { MITK_INFO << "Decompressing failed!"; return; } else if (!QFile(filePath).exists()) { MITK_INFO << "Decompressing failed!"; return; } mitk::IDataStorageService* dsService = m_DataStorageServiceTracker.getService(); mitk::DataStorage::Pointer dataStorage = dsService->GetDataStorage()->GetDataStorage(); QStringList list; list << filePath; try { QmitkIOUtil::Load(list, *dataStorage); } catch (const mitk::Exception& e) { MITK_INFO << e; return; } mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects( dsService->GetDataStorage()->GetDataStorage()); } } } else { MITK_INFO << "Selection was not a file!"; } } } 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::NodeTableViewContextMenuRequested(const QPoint & pos) { m_NodeMenu->clear(); QModelIndex index = m_Controls.treeView->indexAt(pos); QVariant variant = m_TreeModel->data(index, Qt::UserRole); if (variant.isValid()) { ctkXnatFile* file = dynamic_cast(variant.value()); if (file != NULL) { QAction* actShow = new QAction("Download and Open", m_NodeMenu); QAction* actDownload = new QAction("Download", m_NodeMenu); m_NodeMenu->addAction(actShow); m_NodeMenu->addAction(actDownload); connect(actShow, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadAndOpenFile())); connect(actDownload, SIGNAL(triggered()), this, SLOT(OnContextMenuDownloadFile())); m_NodeMenu->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) { QmitkXnatProjectInfoWidget* widget = new QmitkXnatProjectInfoWidget(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(); + + MITK_INFO << str.toStdString() << ": " << var.toString().toStdString(); + + // 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); + } + } + QmitkXnatSubjectInfoWidget* widget = new QmitkXnatSubjectInfoWidget(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(); + + MITK_INFO << str.toStdString() << ": " << var.toString().toStdString(); + MITK_INFO << experiment->property("ID").toStdString(); + + 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(); + + MITK_INFO << str.toStdString() << ": " << var.toString().toStdString(); + experiment->setProperty(str, var); + } + } + QmitkXnatExperimentInfoWidget* widget = new QmitkXnatExperimentInfoWidget(experiment); layout->addWidget(widget); } } }