Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
QmitkDicomLocalStorageWidget.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 // Qmitk
15 //#include <mitkLogMacros.h>
16 
17 // Qt
18 #include <QLabel>
19 #include <QMessageBox>
20 #include <QProgressDialog>
21 #include <QVariant>
22 
23 const std::string QmitkDicomLocalStorageWidget::Widget_ID = "org.mitk.Widgets.QmitkDicomLocalStorageWidget";
24 
26  : QWidget(parent), m_LocalIndexer(new ctkDICOMIndexer(parent)), m_Controls(nullptr)
27 {
28  CreateQtPartControl(this);
29 }
30 
32 {
33  m_LocalDatabase->closeDatabase();
34 }
35 
37 {
38  if (!m_Controls)
39  {
40  m_Controls = new Ui::QmitkDicomLocalStorageWidgetControls;
41  m_Controls->setupUi(parent);
42 
43  connect(m_Controls->deleteButton, SIGNAL(clicked()), this, SLOT(OnDeleteButtonClicked()));
44  connect(m_Controls->viewInternalDataButton, SIGNAL(clicked()), this, SLOT(OnViewButtonClicked()));
45 
46  connect(m_Controls->ctkDicomBrowser,
47  SIGNAL(seriesSelectionChanged(const QStringList &)),
48  this,
49  SLOT(OnSeriesSelectionChanged(const QStringList &)));
50  connect(m_Controls->ctkDicomBrowser,
51  SIGNAL(seriesSelectionChanged(const QStringList &)),
52  this,
53  SLOT(OnSeriesSelectionChanged(const QStringList &)));
54  connect(
55  m_Controls->ctkDicomBrowser, SIGNAL(seriesDoubleClicked(const QModelIndex &)), this, SLOT(OnViewButtonClicked()));
56 
57  connect(m_LocalIndexer, SIGNAL(indexingComplete()), this, SIGNAL(SignalFinishedImport()));
58 
59  m_Controls->ctkDicomBrowser->setTableOrientation(Qt::Vertical);
60  }
61 }
62 
64 {
65  if (m_LocalDatabase->isOpen())
66  {
67  m_LocalIndexer->addDirectory(dicomData);
68  }
69 }
70 
71 void QmitkDicomLocalStorageWidget::OnStartDicomImport(const QStringList &dicomData)
72 {
73  if (m_LocalDatabase->isOpen())
74  {
75  m_LocalIndexer->addListOfFiles( dicomData);
76  }
77 }
78 
80 {
81  if (!this->DeletePatients())
82  {
83  if (!this->DeleteStudies())
84  {
85  this->DeleteSeries();
86  }
87  }
88 
89  m_Controls->ctkDicomBrowser->updateTableViews();
90 }
91 
93 {
94  auto selectedPatientUIDs = m_Controls->ctkDicomBrowser->currentPatientsSelection();
95 
96  if (!selectedPatientUIDs.empty())
97  {
98  QStringList studyUIDs;
99 
100  for (const auto &patientUID : selectedPatientUIDs)
101  studyUIDs.append(m_LocalDatabase->studiesForPatient(patientUID));
102 
103  QStringList seriesUIDs;
104 
105  for (const auto &studyUID : studyUIDs)
106  seriesUIDs.append(m_LocalDatabase->seriesForStudy(studyUID));
107 
108  auto answer = QMessageBox::question(nullptr,
109  "Delete Patients",
110  QString("Do you really want to delete %1 %2, containing %3 series in %4 %5?")
111  .arg(selectedPatientUIDs.count())
112  .arg(selectedPatientUIDs.count() != 1 ? "patients" : "patient")
113  .arg(seriesUIDs.count())
114  .arg(studyUIDs.count())
115  .arg(studyUIDs.count() != 1 ? "studies" : "study"),
116  QMessageBox::Yes | QMessageBox::No,
117  QMessageBox::No);
118 
119  if (answer == QMessageBox::Yes)
120  {
121  for (const auto &patientUID : selectedPatientUIDs)
122  m_LocalDatabase->removePatient(patientUID);
123  }
124 
125  return true;
126  }
127 
128  return false;
129 }
130 
132 {
133  auto selectedStudyUIDs = m_Controls->ctkDicomBrowser->currentStudiesSelection();
134 
135  if (!selectedStudyUIDs.empty())
136  {
137  QStringList seriesUIDs;
138 
139  for (const auto &studyUID : selectedStudyUIDs)
140  seriesUIDs.append(m_LocalDatabase->seriesForStudy(studyUID));
141 
142  auto answer = QMessageBox::question(nullptr,
143  "Delete Studies",
144  QString("Do you really want to delete %1 %2, containing %3 series?")
145  .arg(selectedStudyUIDs.count())
146  .arg(selectedStudyUIDs.count() != 1 ? "studies" : "study")
147  .arg(seriesUIDs.count()),
148  QMessageBox::Yes | QMessageBox::No,
149  QMessageBox::No);
150 
151  if (answer == QMessageBox::Yes)
152  {
153  for (const auto &studyUID : selectedStudyUIDs)
154  m_LocalDatabase->removeStudy(studyUID);
155  }
156 
157  return true;
158  }
159 
160  return false;
161 }
162 
164 {
165  auto selectedSeriesUIDs = m_Controls->ctkDicomBrowser->currentSeriesSelection();
166 
167  if (!selectedSeriesUIDs.empty())
168  {
169  auto answer =
170  QMessageBox::question(nullptr,
171  "Delete Series",
172  QString("Do you really want to delete %1 series?").arg(selectedSeriesUIDs.count()),
173  QMessageBox::Yes | QMessageBox::No,
174  QMessageBox::No);
175 
176  if (answer == QMessageBox::Yes)
177  {
178  for (const auto &seriesUID : selectedSeriesUIDs)
179  m_LocalDatabase->removeSeries(seriesUID);
180  }
181 
182  return true;
183  }
184 
185  return false;
186 }
187 
189 {
190  QStringList uids = m_Controls->ctkDicomBrowser->currentSeriesSelection();
191  QString uid;
192  foreach (uid, uids)
193  {
194  QStringList filesForSeries = m_LocalDatabase->filesForSeries(uid);
195  QHash<QString, QVariant> eventProperty;
196  eventProperty.insert("FilesForSeries", filesForSeries);
197  if (!filesForSeries.isEmpty())
198  {
199  QString modality = m_LocalDatabase->fileValue(filesForSeries.at(0), "0008,0060");
200  eventProperty.insert("Modality", modality);
201  }
202  emit SignalDicomToDataManager(eventProperty);
203  }
204 }
205 
206 void QmitkDicomLocalStorageWidget::SetDatabaseDirectory(QString newDatatbaseDirectory)
207 {
208  QDir databaseDirecory = QDir(newDatatbaseDirectory);
209  if (!databaseDirecory.exists())
210  {
211  databaseDirecory.mkpath(databaseDirecory.absolutePath());
212  }
213  QString newDatatbaseFile = databaseDirecory.absolutePath() + QString("/ctkDICOM.sql");
214  this->SetDatabase(newDatatbaseFile);
215 }
216 
218 {
219  m_LocalDatabase = new ctkDICOMDatabase(databaseFile);
220  m_LocalDatabase->setParent(this);
221  m_Controls->ctkDicomBrowser->setDICOMDatabase(m_LocalDatabase);
222  m_LocalIndexer->setDatabase(m_LocalDatabase);
223 }
224 
226 {
227  m_Controls->viewInternalDataButton->setEnabled((s.size() != 0));
228 }
QmitkDicomLocalStorageWidget(QWidget *parent)
QmitkDicomLocalStorageWidget(QWidget *parent) constructor.
void OnDeleteButtonClicked()
Called delete button was clicked.
~QmitkDicomLocalStorageWidget() override
QmitkDicomExternalDataWidget destructor.
virtual void CreateQtPartControl(QWidget *parent)
CreateQtPartControl(QWidget *parent) sets the view objects from ui_QmitkDicomExternalDataWidgetContro...
void SignalFinishedImport()
emitted when import into database is finished.
void SignalDicomToDataManager(QHash< QString, QVariant >)
emitted when view button is clicked.
void OnSeriesSelectionChanged(const QStringList &)
Called when the selection in the series table has changed.
void SetDatabaseDirectory(QString newDatabaseDirectory)
SetDatabaseDirectory sets database directory.
void OnStartDicomImport(const QString &dicomData)
Called when adding a dicom directory. Starts a thread adding the directory.
void OnViewButtonClicked()
Called when view button was clicked.
Ui::QmitkDicomLocalStorageWidgetControls * m_Controls