diff --git a/Modules/XNAT/CMakeLists.txt b/Modules/XNAT/CMakeLists.txt index 7ebf7a6c6a..ac2e07b0c1 100644 --- a/Modules/XNAT/CMakeLists.txt +++ b/Modules/XNAT/CMakeLists.txt @@ -1,6 +1,6 @@ MITK_CREATE_MODULE( DEPENDS MitkCore MitkQtWidgets PACKAGE_DEPENDS PUBLIC CTK|CTKXNATCore - PRIVATE Qt4|QtGui Qt5|UiTools+XmlPatterns + PRIVATE Qt4|QtGui Qt5|UiTools+XmlPatterns+Widgets ) diff --git a/Modules/XNAT/files.cmake b/Modules/XNAT/files.cmake index dc73aa11da..94d30e7529 100644 --- a/Modules/XNAT/files.cmake +++ b/Modules/XNAT/files.cmake @@ -1,15 +1,28 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES mitkXnatSessionTracker.cpp QmitkXnatTreeModel.cpp + QmitkXnatProjectInfoWidget.cpp + QmitkXnatSubjectInfoWidget.cpp + QmitkXnatExperimentInfoWidget.cpp ) set(MOC_H_FILES include/mitkXnatSessionTracker.h include/QmitkXnatTreeModel.h + include/QmitkXnatProjectInfoWidget.h + include/QmitkXnatSubjectInfoWidget.h + include/QmitkXnatExperimentInfoWidget.h ) set(QRC_FILES resources/xnat.qrc ) + + +set(UI_FILES + src/QmitkXnatProjectInfoWidgetControls.ui + src/QmitkXnatSubjectInfoWidgetControls.ui + src/QmitkXnatExperimentInfoWidgetControls.ui +) diff --git a/Modules/XNAT/include/QmitkXnatExperimentInfoWidget.h b/Modules/XNAT/include/QmitkXnatExperimentInfoWidget.h new file mode 100644 index 0000000000..0ab20dc767 --- /dev/null +++ b/Modules/XNAT/include/QmitkXnatExperimentInfoWidget.h @@ -0,0 +1,48 @@ +/*=================================================================== + +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 QMITKXNATEXPERIMENTINFOWIDGET_H +#define QMITKXNATEXPERIMENTINFOWIDGET_H + +// XNATUI +#include +#include + +// Qt +#include + +// CTK XNAT Core +class ctkXnatExperiment; + +class MITKXNAT_EXPORT QmitkXnatExperimentInfoWidget : public QWidget +{ + Q_OBJECT + +public: + QmitkXnatExperimentInfoWidget(ctkXnatExperiment* experiment = 0, QWidget* parent = 0); + ~QmitkXnatExperimentInfoWidget(); + + void SetExperiment(ctkXnatExperiment* experiment); + ctkXnatExperiment* GetExperiment() const; + +protected: + Ui::QmitkXnatExperimentInfoWidgetControls m_Controls; + +private: + ctkXnatExperiment* m_Experiment; +}; + +#endif // QMITKXNATEXPERIMENTINFOWIDGET_H diff --git a/Modules/XNAT/include/QmitkXnatProjectInfoWidget.h b/Modules/XNAT/include/QmitkXnatProjectInfoWidget.h new file mode 100644 index 0000000000..91969824b0 --- /dev/null +++ b/Modules/XNAT/include/QmitkXnatProjectInfoWidget.h @@ -0,0 +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. + +===================================================================*/ + +#ifndef QMITKXNATPROJECTINFOWIDGET_H +#define QMITKXNATPROJECTINFOWIDGET_H + +// XNATUI +#include +#include + +// Qt +#include + +// CTK XNAT Core +class ctkXnatProject; + +class MITKXNAT_EXPORT QmitkXnatProjectInfoWidget : public QWidget +{ + Q_OBJECT + +public: + QmitkXnatProjectInfoWidget(ctkXnatProject* project, QWidget* parent = 0); + ~QmitkXnatProjectInfoWidget(); + + ctkXnatProject* GetProject() const; + +protected: + Ui::QmitkXnatProjectInfoWidgetControls m_Controls; + +private: + ctkXnatProject* m_Project; +}; + +#endif // QMITKXNATPROJECTINFOWIDGET_H diff --git a/Modules/XNAT/include/QmitkXnatSubjectInfoWidget.h b/Modules/XNAT/include/QmitkXnatSubjectInfoWidget.h new file mode 100644 index 0000000000..23674ee13e --- /dev/null +++ b/Modules/XNAT/include/QmitkXnatSubjectInfoWidget.h @@ -0,0 +1,48 @@ +/*=================================================================== + +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 QMITKXNATSUBJECTINFOWIDGET_H +#define QMITKXNATSUBJECTINFOWIDGET_H + +// XNATUI +#include +#include + +// Qt +#include + +// CTK XNAT Core +class ctkXnatSubject; + +class MITKXNAT_EXPORT QmitkXnatSubjectInfoWidget : public QWidget +{ + Q_OBJECT + +public: + QmitkXnatSubjectInfoWidget(ctkXnatSubject* subject, QWidget* parent = 0); + ~QmitkXnatSubjectInfoWidget(); + + void SetSubject(ctkXnatSubject* subject); + ctkXnatSubject* GetSubject() const; + +protected: + Ui::QmitkXnatSubjectInfoWidgetControls m_Controls; + +private: + ctkXnatSubject* m_Subject; +}; + +#endif // QMITKXNATSUBJECTINFOWIDGET_H diff --git a/Modules/XNAT/src/QmitkXnatExperimentInfoWidget.cpp b/Modules/XNAT/src/QmitkXnatExperimentInfoWidget.cpp new file mode 100644 index 0000000000..b56af509d9 --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatExperimentInfoWidget.cpp @@ -0,0 +1,50 @@ +/*=================================================================== + +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.breadcrumbLabel->setText("Project:" + m_Experiment->parent()->parent()->property("name") + + " > Subject:" + m_Experiment->parent()->property("label")); + m_Controls.nameLabel->setText(m_Experiment->property("label")); + 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/XNAT/src/QmitkXnatExperimentInfoWidgetControls.ui b/Modules/XNAT/src/QmitkXnatExperimentInfoWidgetControls.ui new file mode 100644 index 0000000000..4b9a6e4312 --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatExperimentInfoWidgetControls.ui @@ -0,0 +1,123 @@ + + + QmitkXnatExperimentInfoWidgetControls + + + true + + + + 0 + 0 + 350 + 145 + + + + Qmitk Template + + + + + + + + + + + + + Time: + + + + + + + Date: + + + + + + + + + + + + + + Scanner: + + + + + + + + + + + + + + + + + + + + + + 75 + false + true + + + + Experiment Information + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Modality: + + + + + + + Name: + + + + + + + + + + + + + + + true + + + + + + + + + + + + diff --git a/Modules/XNAT/src/QmitkXnatProjectInfoWidget.cpp b/Modules/XNAT/src/QmitkXnatProjectInfoWidget.cpp new file mode 100644 index 0000000000..edccb538cf --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatProjectInfoWidget.cpp @@ -0,0 +1,44 @@ +/*=================================================================== + +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 "QmitkXnatProjectInfoWidget.h" + +#include + +QmitkXnatProjectInfoWidget::QmitkXnatProjectInfoWidget(ctkXnatProject* project, QWidget* parent) + : QWidget(parent) + , m_Project(project) +{ + // Create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi(this); + + // Set the UI labels + m_Controls.idLabel->setText(m_Project->property("name")); + m_Controls.descriptionLabel->setText(m_Project->property("description")); + if (!m_Project->property("pi_lastname").isEmpty()) + { + m_Controls.piLabel->setText(m_Project->property("pi_lastname") + ", " + m_Project->property("pi_firstname")); + } +} + +QmitkXnatProjectInfoWidget::~QmitkXnatProjectInfoWidget() +{ +} + +ctkXnatProject* QmitkXnatProjectInfoWidget::GetProject() const +{ + return m_Project; +} diff --git a/Modules/XNAT/src/QmitkXnatProjectInfoWidgetControls.ui b/Modules/XNAT/src/QmitkXnatProjectInfoWidgetControls.ui new file mode 100644 index 0000000000..b288021548 --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatProjectInfoWidgetControls.ui @@ -0,0 +1,82 @@ + + + QmitkXnatProjectInfoWidgetControls + + + true + + + + 0 + 0 + 350 + 88 + + + + Qmitk Template + + + + + + + + + + + + + Description: + + + + + + + Name: + + + + + + + + + + + + + + PI: + + + + + + + + + + + + + + + 75 + true + + + + Project Information + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + diff --git a/Modules/XNAT/src/QmitkXnatSubjectInfoWidget.cpp b/Modules/XNAT/src/QmitkXnatSubjectInfoWidget.cpp new file mode 100644 index 0000000000..3ea0616a62 --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatSubjectInfoWidget.cpp @@ -0,0 +1,51 @@ +/*=================================================================== + +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) + : QWidget(parent) + , m_Subject(subject) +{ + // Create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi(this); + + // Set the UI labels + m_Controls.breadcrumbLabel->setText("Project:" + m_Subject->parent()->property("name")); + m_Controls.nameLabel->setText(m_Subject->property("label")); + 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/XNAT/src/QmitkXnatSubjectInfoWidgetControls.ui b/Modules/XNAT/src/QmitkXnatSubjectInfoWidgetControls.ui new file mode 100644 index 0000000000..e23bfce1b8 --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatSubjectInfoWidgetControls.ui @@ -0,0 +1,136 @@ + + + QmitkXnatSubjectInfoWidgetControls + + + true + + + + 0 + 0 + 350 + 164 + + + + Qmitk Template + + + + + + + + + + + + + Gender: + + + + + + + Birthdate: + + + + + + + + + + + + + + Handedness: + + + + + + + Heigth (inches): + + + + + + + + + + + + + + + + + + + + + Weight (lbs) + + + + + + + + + + + + + + + 75 + true + + + + Subject Information + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + + + + + Name: + + + + + + + + true + + + + + + + + + + + + diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp index e53676181a..eef0543255 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatConnectionPreferencePage.cpp @@ -1,280 +1,277 @@ /*=================================================================== 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 "QmitkXnatConnectionPreferencePage.h" #include "org_mitk_gui_qt_xnatinterface_Activator.h" #include "berryIPreferencesService.h" #include "berryPlatform.h" #include #include #include #include #include #include #include #include "ctkXnatSession.h" #include "ctkXnatLoginProfile.h" #include "ctkXnatException.h" #include using namespace berry; QmitkXnatConnectionPreferencePage::QmitkXnatConnectionPreferencePage() : m_Control(0) { - } -void QmitkXnatConnectionPreferencePage::Init(berry::IWorkbench::Pointer ) +void QmitkXnatConnectionPreferencePage::Init(berry::IWorkbench::Pointer) { - } void QmitkXnatConnectionPreferencePage::CreateQtControl(QWidget* parent) { IPreferencesService* prefService = Platform::GetPreferencesService(); berry::IPreferences::Pointer _XnatConnectionPreferencesNode = prefService->GetSystemPreferences()->Node("/XnatConnection"); m_XnatConnectionPreferencesNode = _XnatConnectionPreferencesNode; m_Controls.setupUi(parent); m_Control = new QWidget(parent); m_Control->setLayout(m_Controls.gridLayout); 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) + catch (std::invalid_argument) { session = 0; } - if(session != 0) + if (session != 0) { - if(session->isOpen()) + if (session->isOpen()) { m_Controls.testConnectionButton->setText("Disconnect"); } else { m_Controls.testConnectionButton->setText("Connect"); } } const QIntValidator *portV = new QIntValidator(0, 65535, parent); m_Controls.inPort->setValidator(portV); const QRegExp hostRx("^(https?)://[^ /](\\S)+$"); const QRegExpValidator *hostV = new QRegExpValidator(hostRx, parent); m_Controls.inHostAddress->setValidator(hostV); - connect( m_Controls.testConnectionButton, SIGNAL(clicked()), this, SLOT(ToggleConnection()) ); + connect(m_Controls.testConnectionButton, SIGNAL(clicked()), this, SLOT(ToggleConnection())); connect(m_Controls.inHostAddress, SIGNAL(editingFinished()), this, SLOT(UrlChanged())); connect(m_Controls.inDownloadPath, SIGNAL(editingFinished()), this, SLOT(DownloadPathChanged())); this->Update(); } QWidget* QmitkXnatConnectionPreferencePage::GetQtControl() const { return m_Control; } bool QmitkXnatConnectionPreferencePage::PerformOk() { - if(!UserInformationEmpty()) + if (!UserInformationEmpty()) { IPreferences::Pointer _XnatConnectionPreferencesNode = m_XnatConnectionPreferencesNode.Lock(); - if(_XnatConnectionPreferencesNode.IsNotNull()) + if (_XnatConnectionPreferencesNode.IsNotNull()) { _XnatConnectionPreferencesNode->Put(m_Controls.hostAddressLabel->text(), m_Controls.inHostAddress->text()); _XnatConnectionPreferencesNode->Put(m_Controls.portLabel->text(), m_Controls.inPort->text()); _XnatConnectionPreferencesNode->Put(m_Controls.usernameLabel->text(), m_Controls.inUsername->text()); _XnatConnectionPreferencesNode->Put(m_Controls.passwortLabel->text(), m_Controls.inPassword->text()); _XnatConnectionPreferencesNode->Put(m_Controls.downloadPathLabel->text(), m_Controls.inDownloadPath->text()); _XnatConnectionPreferencesNode->Flush(); return true; } } else { QMessageBox::critical(QApplication::activeWindow(), "Saving Preferences failed", "The connection parameters in XNAT Preferences were empty.\nPlease use the 'Connect' button to validate the connection parameters."); } return false; } void QmitkXnatConnectionPreferencePage::PerformCancel() { - } bool QmitkXnatConnectionPreferencePage::UserInformationEmpty() { // To check empty QLineEdits in the following QString errString; - if(m_Controls.inHostAddress->text().isEmpty()) + if (m_Controls.inHostAddress->text().isEmpty()) { errString += "Server Address is empty.\n"; } - if(m_Controls.inUsername->text().isEmpty()) + if (m_Controls.inUsername->text().isEmpty()) { errString += "Username is empty.\n"; } - if(m_Controls.inPassword->text().isEmpty()) + if (m_Controls.inPassword->text().isEmpty()) { errString += "Password is empty.\n"; } // if something is empty - if(!errString.isEmpty()) + if (!errString.isEmpty()) { m_Controls.testConnectionLabel->setStyleSheet("QLabel { color: red; }"); m_Controls.testConnectionLabel->setText("Connecting failed.\n" + errString); return true; } else { return false; } } void QmitkXnatConnectionPreferencePage::Update() { IPreferences::Pointer _XnatConnectionPreferencesNode = m_XnatConnectionPreferencesNode.Lock(); - if(_XnatConnectionPreferencesNode.IsNotNull()) + if (_XnatConnectionPreferencesNode.IsNotNull()) { m_Controls.inHostAddress->setText(_XnatConnectionPreferencesNode->Get( m_Controls.hostAddressLabel->text(), m_Controls.inHostAddress->text())); m_Controls.inPort->setText(_XnatConnectionPreferencesNode->Get( m_Controls.portLabel->text(), m_Controls.inPort->text())); m_Controls.inUsername->setText(_XnatConnectionPreferencesNode->Get( m_Controls.usernameLabel->text(), m_Controls.inUsername->text())); m_Controls.inPassword->setText(_XnatConnectionPreferencesNode->Get( m_Controls.passwortLabel->text(), m_Controls.inPassword->text())); m_Controls.inDownloadPath->setText(_XnatConnectionPreferencesNode->Get( m_Controls.downloadPathLabel->text(), m_Controls.inDownloadPath->text())); } } void QmitkXnatConnectionPreferencePage::UrlChanged() { m_Controls.inHostAddress->setStyleSheet("QLineEdit { background-color: white; }"); QString str = m_Controls.inHostAddress->text(); - while(str.endsWith("/")) + while (str.endsWith("/")) { - str = str.left(str.length()-1); + str = str.left(str.length() - 1); } m_Controls.inHostAddress->setText(str); QUrl url(m_Controls.inHostAddress->text()); - if(!url.isValid()) + if (!url.isValid()) { m_Controls.inHostAddress->setStyleSheet("QLineEdit { background-color: red; }"); } } void QmitkXnatConnectionPreferencePage::DownloadPathChanged() { m_Controls.inDownloadPath->setStyleSheet("QLineEdit { background-color: white; }"); QString downloadPath = m_Controls.inDownloadPath->text(); - if(!downloadPath.isEmpty()) + if (!downloadPath.isEmpty()) { - if (downloadPath.lastIndexOf("/") != downloadPath.size()-1) + if (downloadPath.lastIndexOf("/") != downloadPath.size() - 1) { downloadPath.append("/"); m_Controls.inDownloadPath->setText(downloadPath); } QFileInfo path(m_Controls.inDownloadPath->text()); - if(!path.isDir()) + if (!path.isDir()) { m_Controls.inDownloadPath->setStyleSheet("QLineEdit { background-color: red; }"); } } } void QmitkXnatConnectionPreferencePage::ToggleConnection() { ctkXnatSession* session = 0; try { session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); } - catch(std::invalid_argument) + catch (std::invalid_argument) { - if(!UserInformationEmpty()) + if (!UserInformationEmpty()) { PerformOk(); mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatSessionManager()->CreateXnatSession(); session = mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetService( mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatModuleContext()->GetServiceReference()); } } - if(session != 0 && session->isOpen()) + if (session != 0 && session->isOpen()) { mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatSessionManager()->CloseXnatSession(); m_Controls.testConnectionButton->setText("Connect"); m_Controls.testConnectionLabel->clear(); } - else if(session != 0 && !session->isOpen()) + else if (session != 0 && !session->isOpen()) { m_Controls.testConnectionButton->setEnabled(false); try { mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatSessionManager()->OpenXnatSession(); m_Controls.testConnectionButton->setText("Disconnect"); m_Controls.testConnectionLabel->setStyleSheet("QLabel { color: green; }"); m_Controls.testConnectionLabel->setText("Connecting successful."); } - catch(const ctkXnatAuthenticationException& auth) + catch (const ctkXnatAuthenticationException& auth) { m_Controls.testConnectionLabel->setStyleSheet("QLabel { color: red; }"); m_Controls.testConnectionLabel->setText("Connecting failed:\nAuthentication error."); MITK_INFO << auth.message().toStdString(); mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatSessionManager()->CloseXnatSession(); } - catch(const ctkException& e) + catch (const ctkException& e) { m_Controls.testConnectionLabel->setStyleSheet("QLabel { color: red; }"); m_Controls.testConnectionLabel->setText("Connecting failed:\nInvalid Server Adress"); MITK_INFO << e.message().toStdString(); mitk::org_mitk_gui_qt_xnatinterface_Activator::GetXnatSessionManager()->CloseXnatSession(); } m_Controls.testConnectionButton->setEnabled(true); } } 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 4bca0689eb..07a39ad486 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp @@ -1,560 +1,685 @@ /*=================================================================== 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 #include "ctkXnatFile.h" #include #include #include #include #include #include #include #include + +// MITK XNAT UI +#include +#include +#include + // Qt #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_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(activated(const QModelIndex&)), this, SLOT(OnActivatedNode(const QModelIndex&))); connect(m_TreeModel, SIGNAL(ResourceDropped(const QList&, ctkXnatObject*)), this, SLOT(OnUploadResource(const QList&, ctkXnatObject*))); } 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()); connect(session, SIGNAL(progress(QUuid,double)), this, SLOT(OnProgress(QUuid,double))); connect(session, SIGNAL(uploadFinished()), 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 (currentProgress < 1) mitk::ProgressBar::GetInstance()->AddStepsToDo(100); else mitk::ProgressBar::GetInstance()->Progress(); } 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::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) { try { file->save(); } catch (ctkXnatException &e) { QMessageBox msgbox; msgbox.setText(e.what()); msgbox.setIcon(QMessageBox::Critical); msgbox.exec(); } } 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()); file->setFileFormat("some format"); file->setFileContent("some content"); file->setFileTags("some, tags"); file->save(); m_TreeModel->addChildNode(index, file); } } #include void QmitkXnatTreeBrowserView::OnUploadResource(const QList& droppedNodes, ctkXnatObject* parentObject) { if (parentObject == nullptr) return; if (dynamic_cast(parentObject)) MITK_INFO<<"SESSION"; else if (dynamic_cast(parentObject)) MITK_INFO<<"DATAMODEL"; else if (dynamic_cast(parentObject)) MITK_INFO<<"PROJECT"; else if (dynamic_cast(parentObject)) MITK_INFO<<"SUBJECT"; //1. If not dropped on a resource, create a new folder //2. Save file locally //3. Upload file ctkXnatResource* resource = dynamic_cast(parentObject); if (resource == nullptr) { resource = this->InternalAddResourceFolder(parentObject); } if (resource == nullptr) { MITK_WARN << "Could not upload file! No resource available!"; } 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"); } 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); // xnatFile->setFileFormat("some format"); xnatFile->setFileContent("some content"); xnatFile->setFileTags("some, tags"); // xnatFile->save(); m_TreeModel->addChildNode(m_Controls.treeView->currentIndex(), xnatFile); parentObject->fetch(); // 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()); // TODO delete file!!! } } 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); } 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) + { + 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(); + + // 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(); + + 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); + } + } + + QmitkXnatExperimentInfoWidget* widget = new QmitkXnatExperimentInfoWidget(experiment); + layout->addWidget(widget); + } + } +} diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h index dd47cdb39c..8c5ec59303 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h @@ -1,108 +1,110 @@ /*=================================================================== 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 QMITKXNATTREEBROWSERVIEW_H #define QMITKXNATTREEBROWSERVIEW_H #include #include #include "ui_QmitkXnatTreeBrowserViewControls.h" // ctkXnatCore #include "ctkXnatSession.h" // ctkXnatWidget #include "QmitkXnatTreeModel.h" // MitkXNAT Module #include "mitkXnatSessionTracker.h" #include #include class QMenu; /*! \brief QmitkXnatTreeBrowserView \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. \sa QmitkFunctionality \ingroup ${plugin_target}_internal */ class QmitkXnatTreeBrowserView : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: QmitkXnatTreeBrowserView(); ~QmitkXnatTreeBrowserView(); static const std::string VIEW_ID; virtual void CreateQtPartControl(QWidget *parent) override; protected slots: /// \brief Opens or reuses the xnat editor with the activated node as root item. void OnActivatedNode(const QModelIndex& index); /// \brief Updates the ctkXnatSession and the user interface void UpdateSession(ctkXnatSession* session); /// \brief Cleans the tree model void CleanTreeModel(ctkXnatSession* session); void OnContextMenuRequested(const QPoint & pos); + void itemSelected(const QModelIndex& index); + void OnContextMenuDownloadAndOpenFile(); void OnContextMenuDownloadFile(); void OnContextMenuCreateResourceFolder(); void OnContextMenuUploadFile(); void OnUploadResource(const QList& , ctkXnatObject *); void OnProgress(QUuid, double); protected: virtual void SetFocus() override; Ui::QmitkXnatTreeBrowserViewControls m_Controls; private: void InternalFileDownload(const QModelIndex& index, bool loadData); void InternalFileUpload(ctkXnatFile *file); ctkXnatResource* InternalAddResourceFolder(ctkXnatObject* parent); berry::QtSelectionProvider::Pointer m_SelectionProvider; void SetSelectionProvider() override; ctkServiceTracker m_DataStorageServiceTracker; QmitkXnatTreeModel* m_TreeModel; mitk::XnatSessionTracker* m_Tracker; QString m_DownloadPath; QMenu* m_ContextMenu; }; #endif // QMITKXNATTREEBROWSERVIEW_H diff --git a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui index 326b50c01a..a8e0c93d34 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserViewControls.ui @@ -1,54 +1,66 @@ QmitkXnatTreeBrowserViewControls 0 0 455 975 0 0 QmitkTemplate - + + 0 + + + 0 + + + 0 + + 0 Qt::AlignCenter 5 0 - - - - + + + + + + 6 +