diff --git a/Modules/XNAT/files.cmake b/Modules/XNAT/files.cmake index 92a5df99d1..d07b910d8d 100644 --- a/Modules/XNAT/files.cmake +++ b/Modules/XNAT/files.cmake @@ -1,21 +1,23 @@ file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") set(CPP_FILES mitkXnatSessionTracker.cpp - QmitkXnatProjectInfoWidget.cpp - QmitkXnatSubjectInfoWidget.cpp - QmitkXnatExperimentInfoWidget.cpp + QmitkXnatProjectWidget.cpp + QmitkXnatSubjectWidget.cpp + QmitkXnatExperimentWidget.cpp + QmitkXnatCreateObjectDialog.cpp ) set(MOC_H_FILES include/mitkXnatSessionTracker.h - include/QmitkXnatProjectInfoWidget.h - include/QmitkXnatSubjectInfoWidget.h - include/QmitkXnatExperimentInfoWidget.h + include/QmitkXnatProjectWidget.h + include/QmitkXnatSubjectWidget.h + include/QmitkXnatExperimentWidget.h + include/QmitkXnatCreateObjectDialog.h ) set(UI_FILES - src/QmitkXnatProjectInfoWidgetControls.ui - src/QmitkXnatSubjectInfoWidgetControls.ui - src/QmitkXnatExperimentInfoWidgetControls.ui + src/QmitkXnatProjectWidgetControls.ui + src/QmitkXnatSubjectWidgetControls.ui + src/QmitkXnatExperimentWidgetControls.ui ) diff --git a/Modules/XNAT/include/QmitkXnatCreateObjectDialog.h b/Modules/XNAT/include/QmitkXnatCreateObjectDialog.h new file mode 100644 index 0000000000..4a7afe8f21 --- /dev/null +++ b/Modules/XNAT/include/QmitkXnatCreateObjectDialog.h @@ -0,0 +1,57 @@ +/*=================================================================== + +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 QMITKXNATCREATEOBJECTDIALOG_H +#define QMITKXNATCREATEOBJECTDIALOG_H + +#include + +// Qt +#include +#include + +class ctkXnatObject; + +class MITKXNAT_EXPORT QmitkXnatCreateObjectDialog : public QDialog +{ + Q_OBJECT + +public: + enum SpecificType + { + //PROJECT, + SUBJECT, + EXPERIMENT + }; + + QmitkXnatCreateObjectDialog(SpecificType type, QWidget* parent = 0); + virtual ~QmitkXnatCreateObjectDialog(); + + // Returns a specific xnat object like SpecificType + ctkXnatObject* GetXnatObject(); + + protected slots: + + void OnAcceptClicked(); + void OnCancelClicked(); + +private: + SpecificType m_Type; + ctkXnatObject* m_Object; + QWidget* m_Widget; +}; + +#endif // QMITKXNATCREATEOBJECTDIALOG_H diff --git a/Modules/XNAT/include/QmitkXnatExperimentInfoWidget.h b/Modules/XNAT/include/QmitkXnatExperimentWidget.h similarity index 61% rename from Modules/XNAT/include/QmitkXnatExperimentInfoWidget.h rename to Modules/XNAT/include/QmitkXnatExperimentWidget.h index 0ab20dc767..e0cc54f7f3 100644 --- a/Modules/XNAT/include/QmitkXnatExperimentInfoWidget.h +++ b/Modules/XNAT/include/QmitkXnatExperimentWidget.h @@ -1,48 +1,56 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. +Division of Medical and Biological rmatics. 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 +#ifndef QMITKXNATEXPERIMENTWIDGET_H +#define QMITKXNATEXPERIMENTWIDGET_H // XNATUI -#include +#include #include // Qt #include // CTK XNAT Core class ctkXnatExperiment; -class MITKXNAT_EXPORT QmitkXnatExperimentInfoWidget : public QWidget +class MITKXNAT_EXPORT QmitkXnatExperimentWidget : public QWidget { Q_OBJECT public: - QmitkXnatExperimentInfoWidget(ctkXnatExperiment* experiment = 0, QWidget* parent = 0); - ~QmitkXnatExperimentInfoWidget(); + + enum Mode + { + INFO, + CREATE + }; + + QmitkXnatExperimentWidget(Mode mode, QWidget* parent = 0); + ~QmitkXnatExperimentWidget(); void SetExperiment(ctkXnatExperiment* experiment); ctkXnatExperiment* GetExperiment() const; protected: - Ui::QmitkXnatExperimentInfoWidgetControls m_Controls; + Ui::QmitkXnatExperimentWidgetControls m_Controls; private: + Mode m_Mode; ctkXnatExperiment* m_Experiment; }; -#endif // QMITKXNATEXPERIMENTINFOWIDGET_H +#endif // QMITKXNATEXPERIMENTWIDGET_H diff --git a/Modules/XNAT/include/QmitkXnatProjectInfoWidget.h b/Modules/XNAT/include/QmitkXnatProjectWidget.h similarity index 57% rename from Modules/XNAT/include/QmitkXnatProjectInfoWidget.h rename to Modules/XNAT/include/QmitkXnatProjectWidget.h index 91969824b0..0dddc24f17 100644 --- a/Modules/XNAT/include/QmitkXnatProjectInfoWidget.h +++ b/Modules/XNAT/include/QmitkXnatProjectWidget.h @@ -1,47 +1,56 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, -Division of Medical and Biological Informatics. +Division of Medical and Biological rmatics. 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 +#ifndef QMITKXNATPROJECTWIDGET_H +#define QMITKXNATPROJECTWIDGET_H // XNATUI -#include +#include #include // Qt #include // CTK XNAT Core class ctkXnatProject; -class MITKXNAT_EXPORT QmitkXnatProjectInfoWidget : public QWidget +class MITKXNAT_EXPORT QmitkXnatProjectWidget : public QWidget { Q_OBJECT public: - QmitkXnatProjectInfoWidget(ctkXnatProject* project, QWidget* parent = 0); - ~QmitkXnatProjectInfoWidget(); + enum Mode + { + INFO, + CREATE + }; + + QmitkXnatProjectWidget(Mode mode, QWidget* parent = 0); + ~QmitkXnatProjectWidget(); + + void SetProject(ctkXnatProject* project); ctkXnatProject* GetProject() const; protected: - Ui::QmitkXnatProjectInfoWidgetControls m_Controls; + Ui::QmitkXnatProjectWidgetControls m_Controls; private: + Mode m_Mode; ctkXnatProject* m_Project; }; -#endif // QMITKXNATPROJECTINFOWIDGET_H +#endif // QMITKXNATPROJECTWIDGET_H diff --git a/Modules/XNAT/include/QmitkXnatSubjectInfoWidget.h b/Modules/XNAT/include/QmitkXnatSubjectWidget.h similarity index 65% rename from Modules/XNAT/include/QmitkXnatSubjectInfoWidget.h rename to Modules/XNAT/include/QmitkXnatSubjectWidget.h index 23674ee13e..545319c015 100644 --- a/Modules/XNAT/include/QmitkXnatSubjectInfoWidget.h +++ b/Modules/XNAT/include/QmitkXnatSubjectWidget.h @@ -1,48 +1,55 @@ /*=================================================================== 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 +#ifndef QMITKXNATSUBJECTWIDGET_H +#define QMITKXNATSUBJECTWIDGET_H -// XNATUI -#include +#include #include // Qt #include // CTK XNAT Core class ctkXnatSubject; -class MITKXNAT_EXPORT QmitkXnatSubjectInfoWidget : public QWidget +class MITKXNAT_EXPORT QmitkXnatSubjectWidget : public QWidget { Q_OBJECT public: - QmitkXnatSubjectInfoWidget(ctkXnatSubject* subject, QWidget* parent = 0); - ~QmitkXnatSubjectInfoWidget(); + + enum Mode + { + INFO, + CREATE + }; + + QmitkXnatSubjectWidget(Mode mode, QWidget* parent = 0); + ~QmitkXnatSubjectWidget(); void SetSubject(ctkXnatSubject* subject); ctkXnatSubject* GetSubject() const; protected: - Ui::QmitkXnatSubjectInfoWidgetControls m_Controls; + Ui::QmitkXnatSubjectWidgetControls m_Controls; private: + Mode m_Mode; ctkXnatSubject* m_Subject; }; -#endif // QMITKXNATSUBJECTINFOWIDGET_H +#endif // QMITKXNATSUBJECTWIDGET_H diff --git a/Modules/XNAT/src/QmitkXnatCreateObjectDialog.cpp b/Modules/XNAT/src/QmitkXnatCreateObjectDialog.cpp new file mode 100644 index 0000000000..42a4caabdc --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatCreateObjectDialog.cpp @@ -0,0 +1,161 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological rmatics. +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 "QmitkXnatCreateObjectDialog.h" + +// XNAT +#include +#include +#include + +// CTK XNAT Core +//#include +#include +#include + +// Qt +#include +#include +#include + +// Testing +#include +#include + +QmitkXnatCreateObjectDialog::QmitkXnatCreateObjectDialog(SpecificType type, QWidget* parent) + : QDialog(parent) + , m_Type(type) +{ + switch (m_Type) + { + //case PROJECT: + // m_Object = new ctkXnatProject(); + // m_Widget = new QmitkXnatProjectWidget(dynamic_cast(m_Object)); + // break; + case SUBJECT: + m_Object = new ctkXnatSubject(); + m_Widget = new QmitkXnatSubjectWidget(QmitkXnatSubjectWidget::Mode::CREATE, parent); + dynamic_cast(m_Widget)->SetSubject(dynamic_cast(m_Object)); + break; + case EXPERIMENT: + m_Object = new ctkXnatExperiment(); + m_Widget = new QmitkXnatExperimentWidget(QmitkXnatExperimentWidget::Mode::CREATE, parent); + dynamic_cast(m_Widget)->SetExperiment(dynamic_cast(m_Object)); + break; + default: + break; + } + + QList children = m_Widget->findChildren(); + foreach(QLineEdit* child, children) + { + child->setReadOnly(false); + } + + QGridLayout* grid = dynamic_cast(m_Widget->layout()); + + QPushButton* btnOk = new QPushButton("Create"); + QPushButton* btnCancel = new QPushButton("Cancel"); + + QHBoxLayout* hLayout = new QHBoxLayout(); + hLayout->addWidget(btnOk); + hLayout->addWidget(btnCancel); + + connect(btnOk, SIGNAL(clicked()), this, SLOT(OnAcceptClicked())); + connect(btnCancel, SIGNAL(clicked()), this, SLOT(OnCancelClicked())); + + grid->addLayout(hLayout, grid->rowCount() + 1, 1); + + // Fill the dialog + setLayout(grid); +} + +QmitkXnatCreateObjectDialog::~QmitkXnatCreateObjectDialog() +{ + delete m_Widget; +} + +ctkXnatObject* QmitkXnatCreateObjectDialog::GetXnatObject() +{ + return m_Object; +} + +void QmitkXnatCreateObjectDialog::OnAcceptClicked() +{ + //ctkXnatProject* project; + ctkXnatSubject* subject; + ctkXnatExperiment* experiment; + + switch (m_Type) + { + //case PROJECT: + // project = dynamic_cast(m_Widget)->GetProject(); + + // // Check mandatory field + // if (project->property("label").isEmpty()) + // { + // QMessageBox msgBox; + // msgBox.setIcon(QMessageBox::Warning); + // msgBox.setText("Please fill in an ID to create a new project!"); + // msgBox.exec(); + // return; + // } + + // m_Object = project; + // break; + + case SUBJECT: + subject = dynamic_cast(m_Widget)->GetSubject(); + + // Check mandatory field + if (subject->property("label").isEmpty()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Warning); + msgBox.setText("Please fill in an ID to create a new subject!"); + msgBox.exec(); + return; + } + + m_Object = subject; + break; + + case EXPERIMENT: + experiment = dynamic_cast(m_Widget)->GetExperiment(); + + // Check mandatory field + if (experiment->property("label").isEmpty()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Warning); + msgBox.setText("Please fill in an ID to create a new experiment!"); + msgBox.exec(); + return; + } + + m_Object = experiment; + break; + + default: + break; + } + accept(); +} + +void QmitkXnatCreateObjectDialog::OnCancelClicked() +{ + reject(); +} diff --git a/Modules/XNAT/src/QmitkXnatExperimentInfoWidget.cpp b/Modules/XNAT/src/QmitkXnatExperimentInfoWidget.cpp deleted file mode 100644 index b56af509d9..0000000000 --- a/Modules/XNAT/src/QmitkXnatExperimentInfoWidget.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/*=================================================================== - -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 deleted file mode 100644 index 4b9a6e4312..0000000000 --- a/Modules/XNAT/src/QmitkXnatExperimentInfoWidgetControls.ui +++ /dev/null @@ -1,123 +0,0 @@ - - - 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/QmitkXnatExperimentWidget.cpp b/Modules/XNAT/src/QmitkXnatExperimentWidget.cpp new file mode 100644 index 0000000000..b5ff67b4ad --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatExperimentWidget.cpp @@ -0,0 +1,84 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological rmatics. +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 "QmitkXnatExperimentWidget.h" + +#include + +QmitkXnatExperimentWidget::QmitkXnatExperimentWidget(Mode mode, QWidget* parent) + : QWidget(parent) + , m_Mode(mode) +{ + // Create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi(this); + + if (m_Mode == Mode::INFO) + { + // make not needed row invisible + m_Controls.labelLabel->setText("ID:"); + m_Controls.mandatoryLabel->setVisible(false); + } +} + +QmitkXnatExperimentWidget::~QmitkXnatExperimentWidget() +{ +} + +void QmitkXnatExperimentWidget::SetExperiment(ctkXnatExperiment* experiment) +{ + m_Experiment = experiment; + + // Set the UI labels + if (m_Experiment->parent()) + { + m_Controls.breadcrumbLabel->setText("Project:" + m_Experiment->parent()->parent()->property("name") + + " > Subject:" + m_Experiment->parent()->property("label")); + } + m_Controls.labelLineEdit->setText(m_Experiment->property("label")); + m_Controls.modalityLineEdit->setText(m_Experiment->property("modality")); + m_Controls.dateLineEdit->setText(m_Experiment->property("date")); + m_Controls.timeLineEdit->setText(m_Experiment->property("time")); + m_Controls.scannerLineEdit->setText(m_Experiment->property("scanner")); +} + +ctkXnatExperiment* QmitkXnatExperimentWidget::GetExperiment() const +{ + if (m_Mode == Mode::CREATE) + { + if (!m_Controls.labelLineEdit->text().isEmpty()) + { + m_Experiment->setProperty("label", m_Controls.labelLineEdit->text()); + } + if (!m_Controls.modalityLineEdit->text().isEmpty()) + { + m_Experiment->setProperty("label", m_Controls.modalityLineEdit->text()); + } + if (!m_Controls.dateLineEdit->text().isEmpty()) + { + m_Experiment->setProperty("label", m_Controls.dateLineEdit->text()); + } + if (!m_Controls.dateLineEdit->text().isEmpty()) + { + m_Experiment->setProperty("label", m_Controls.dateLineEdit->text()); + } + if (!m_Controls.scannerLineEdit->text().isEmpty()) + { + m_Experiment->setProperty("label", m_Controls.scannerLineEdit->text()); + } + } + + return m_Experiment; +} diff --git a/Modules/XNAT/src/QmitkXnatExperimentWidgetControls.ui b/Modules/XNAT/src/QmitkXnatExperimentWidgetControls.ui new file mode 100644 index 0000000000..fd28f9b97e --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatExperimentWidgetControls.ui @@ -0,0 +1,150 @@ + + + QmitkXnatExperimentWidgetControls + + + true + + + + 0 + 0 + 350 + 225 + + + + Qmitk Template + + + + + + Time: + + + + + + + Date: + + + + + + + Scanner: + + + + + + + + 75 + false + true + + + + Experiment Information + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Modality: + + + + + + + Name: + + + + + + + + true + + + + + + + + + + + ID*: + + + + + + + * mandatory field + + + + + + + true + + + + + + + true + + + + + + + true + + + YYYY-MM-DD + + + + + + + true + + + hh:mm:ss + + + + + + + true + + + + + + + true + + + + + + + + diff --git a/Modules/XNAT/src/QmitkXnatProjectInfoWidget.cpp b/Modules/XNAT/src/QmitkXnatProjectInfoWidget.cpp deleted file mode 100644 index f010ee5230..0000000000 --- a/Modules/XNAT/src/QmitkXnatProjectInfoWidget.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/*=================================================================== - -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) - : m_Project(project) - , QWidget(parent) -{ - // 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 deleted file mode 100644 index b288021548..0000000000 --- a/Modules/XNAT/src/QmitkXnatProjectInfoWidgetControls.ui +++ /dev/null @@ -1,82 +0,0 @@ - - - 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/QmitkXnatProjectWidget.cpp b/Modules/XNAT/src/QmitkXnatProjectWidget.cpp new file mode 100644 index 0000000000..3c564608bc --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatProjectWidget.cpp @@ -0,0 +1,73 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological rmatics. +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 "QmitkXnatProjectWidget.h" + +#include + +QmitkXnatProjectWidget::QmitkXnatProjectWidget(Mode mode, QWidget* parent) + : m_Mode(mode) + , QWidget(parent) +{ + // Create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi(this); + + if (m_Mode == Mode::INFO) + { + // make not needed row invisible + m_Controls.idLabel->setVisible(false); + m_Controls.idLineEdit->setVisible(false); + m_Controls.mandatoryLabel->setVisible(false); + } +} + +QmitkXnatProjectWidget::~QmitkXnatProjectWidget() +{ +} + +void QmitkXnatProjectWidget::SetProject(ctkXnatProject* project) +{ + m_Project = project; + + // Set the UI labels + m_Controls.nameLineEdit->setText(m_Project->property("name")); + m_Controls.descriptionLineEdit->setText(m_Project->property("description")); + if (!m_Project->property("pi_lastname").isEmpty()) + { + m_Controls.piLineEdit->setText(m_Project->property("pi_lastname") + ", " + m_Project->property("pi_firstname")); + } +} + +ctkXnatProject* QmitkXnatProjectWidget::GetProject() const +{ + if (m_Mode == Mode::CREATE) + { + if (!m_Controls.idLineEdit->text().isEmpty()) + { + m_Project->setProperty("ID", m_Controls.idLineEdit->text()); + } + if (!m_Controls.nameLineEdit->text().isEmpty()) + { + m_Project->setProperty("name", m_Controls.nameLineEdit->text()); + } + if (!m_Controls.descriptionLineEdit->text().isEmpty()) + { + m_Project->setProperty("description", m_Controls.descriptionLineEdit->text()); + } + // pi name needs to be inserted separated + } + return m_Project; +} diff --git a/Modules/XNAT/src/QmitkXnatProjectWidgetControls.ui b/Modules/XNAT/src/QmitkXnatProjectWidgetControls.ui new file mode 100644 index 0000000000..dbdbe09c2e --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatProjectWidgetControls.ui @@ -0,0 +1,103 @@ + + + QmitkXnatProjectWidgetControls + + + true + + + + 0 + 0 + 350 + 154 + + + + Qmitk Template + + + + + + Description: + + + + + + + Name: + + + + + + + PI: + + + + + + + + 75 + true + + + + Project Information + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + true + + + + + + + true + + + + + + + ID*: + + + + + + + true + + + + + + + true + + + + + + + * mandatory field + + + + + + + + diff --git a/Modules/XNAT/src/QmitkXnatSubjectInfoWidget.cpp b/Modules/XNAT/src/QmitkXnatSubjectInfoWidget.cpp deleted file mode 100644 index 284773a517..0000000000 --- a/Modules/XNAT/src/QmitkXnatSubjectInfoWidget.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/*=================================================================== - -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 - 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 deleted file mode 100644 index e23bfce1b8..0000000000 --- a/Modules/XNAT/src/QmitkXnatSubjectInfoWidgetControls.ui +++ /dev/null @@ -1,136 +0,0 @@ - - - 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/Modules/XNAT/src/QmitkXnatSubjectWidget.cpp b/Modules/XNAT/src/QmitkXnatSubjectWidget.cpp new file mode 100644 index 0000000000..b76c213ab8 --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatSubjectWidget.cpp @@ -0,0 +1,89 @@ +/*=================================================================== + +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 "QmitkXnatSubjectWidget.h" + +#include +#include + +QmitkXnatSubjectWidget::QmitkXnatSubjectWidget(Mode mode, QWidget* parent) + : m_Mode(mode) + , QWidget(parent) +{ + // Create GUI widgets from the Qt Designer's .ui file + m_Controls.setupUi(this); + + if (m_Mode == Mode::INFO) + { + // make not needed row invisible + m_Controls.labelLabel->setText("ID:"); + m_Controls.mandatoryLabel->setVisible(false); + } +} + +QmitkXnatSubjectWidget::~QmitkXnatSubjectWidget() +{ +} + +void QmitkXnatSubjectWidget::SetSubject(ctkXnatSubject* subject) +{ + m_Subject = subject; + + // Set the UI labels + if (m_Subject->parent()) + { + m_Controls.breadcrumbLabel->setText("Project:" + m_Subject->parent()->property("name")); + } + m_Controls.labelLineEdit->setText(m_Subject->property("label")); + m_Controls.birthdateLineEdit->setText(m_Subject->property("dob")); + m_Controls.genderLineEdit->setText(m_Subject->property("gender")); + m_Controls.handednessLineEdit->setText(m_Subject->property("handedness")); + m_Controls.heightLineEdit->setText(m_Subject->property("height")); + m_Controls.weightLineEdit->setText(m_Subject->property("weight")); +} + +ctkXnatSubject* QmitkXnatSubjectWidget::GetSubject() const +{ + if (m_Mode == CREATE) + { + if (!m_Controls.labelLineEdit->text().isEmpty()) + { + m_Subject->setProperty("label", m_Controls.labelLineEdit->text()); + } + if (!m_Controls.birthdateLineEdit->text().isEmpty()) + { + m_Subject->setProperty("label", m_Controls.birthdateLineEdit->text()); + } + if (!m_Controls.genderLineEdit->text().isEmpty()) + { + m_Subject->setProperty("label", m_Controls.genderLineEdit->text()); + } + if (!m_Controls.handednessLineEdit->text().isEmpty()) + { + m_Subject->setProperty("label", m_Controls.handednessLineEdit->text()); + } + if (!m_Controls.heightLineEdit->text().isEmpty()) + { + m_Subject->setProperty("label", m_Controls.heightLineEdit->text()); + } + if (!m_Controls.weightLineEdit->text().isEmpty()) + { + m_Subject->setProperty("label", m_Controls.weightLineEdit->text()); + } + } + + return m_Subject; +} diff --git a/Modules/XNAT/src/QmitkXnatSubjectWidgetControls.ui b/Modules/XNAT/src/QmitkXnatSubjectWidgetControls.ui new file mode 100644 index 0000000000..3145e9a88b --- /dev/null +++ b/Modules/XNAT/src/QmitkXnatSubjectWidgetControls.ui @@ -0,0 +1,146 @@ + + + QmitkXnatSubjectWidgetControls + + + true + + + + 0 + 0 + 350 + 225 + + + + Qmitk Template + + + + + + Gender: + + + + + + + Birthdate: + + + + + + + Handedness: + + + + + + + Height (inches): + + + + + + + Weight (lbs) + + + + + + + + 75 + true + + + + Subject Information + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + true + + + + + + + + + + + true + + + YYYY-MM-DD + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + ID*: + + + + + + + * mandatory field + + + + + + + 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 b842b65f00..bdd062b7ee 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.cpp @@ -1,452 +1,499 @@ /*=================================================================== 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 +// MITK XNAT +#include +#include +#include +#include // Qt #include #include #include #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()); } + ctkXnatProject* project = dynamic_cast(variant.value()); + if (project != NULL) + { + QAction* actCreateSubject = new QAction("Create new subject", m_NodeMenu); + m_NodeMenu->addAction(actCreateSubject); + connect(actCreateSubject, SIGNAL(triggered()), this, SLOT(OnContextMenuCreateNewSubject())); + 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); + 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); } } - QmitkXnatSubjectInfoWidget* widget = new QmitkXnatSubjectInfoWidget(subject); + 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); } } - QmitkXnatExperimentInfoWidget* widget = new QmitkXnatExperimentInfoWidget(experiment); + 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) + { + ctkXnatSubject* subject = dynamic_cast(dialog->GetXnatObject()); + subject->setParent(dynamic_cast(variant.value())); + subject->save(); + } + } +} + +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) + { + ctkXnatExperiment* experiment = dynamic_cast(dialog->GetXnatObject()); + experiment->setParent(dynamic_cast(variant.value())); + experiment->save(); + } + } +} 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 5c44a77dbc..82919401cf 100644 --- a/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h +++ b/Plugins/org.mitk.gui.qt.xnat/src/internal/QmitkXnatTreeBrowserView.h @@ -1,100 +1,102 @@ /*=================================================================== 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 "ctkXnatTreeModel.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); 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 itemSelected(const QModelIndex& index); void NodeTableViewContextMenuRequested(const QPoint & pos); void OnContextMenuDownloadAndOpenFile(); void OnContextMenuDownloadFile(); + void OnContextMenuCreateNewSubject(); + void OnContextMenuCreateNewExperiment(); protected: virtual void SetFocus(); Ui::QmitkXnatTreeBrowserViewControls m_Controls; private: void InternalFileDownload(const QModelIndex& index, bool loadData); berry::QtSelectionProvider::Pointer m_SelectionProvider; void SetSelectionProvider(); ctkServiceTracker m_DataStorageServiceTracker; ctkXnatTreeModel* m_TreeModel; mitk::XnatSessionTracker* m_Tracker; QString m_DownloadPath; QMenu* m_NodeMenu; }; #endif // QMITKXNATTREEBROWSERVIEW_H