28 #include <QCoreApplication>
31 #include <QMessageBox>
33 #include <QModelIndex>
34 #include <QPersistentModelIndex>
35 #include <QProgressDialog>
42 #include <QHBoxLayout>
46 #include "ctkDirectoryButton.h"
47 #include "ctkFileDialog.h"
50 #include "ctkDICOMDatabase.h"
51 #include "ctkDICOMFilterProxyModel.h"
52 #include "ctkDICOMIndexer.h"
58 #include "ctkThumbnailLabel.h"
59 #include "ctkDICOMQueryResultsTabWidget.h"
60 #include "ctkDICOMQueryRetrieveWidget.h"
61 #include "ctkDICOMQueryWidget.h"
73 #include <ctkLogger.h>
74 static ctkLogger logger(
"org.commontk.DICOM.Widgets.DICOMAppWidget");
114 std::map<ctkDICOMModel::IndexType, QStringList>
getSelection()
const;
124 DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (
new ctkDICOMDatabase);
126 DICOMDatabase->setThumbnailGenerator(ThumbnailGenerator.data());
142 QHBoxLayout* layout =
new QHBoxLayout(parent);
143 layout->setMargin(0);
144 layout->addWidget(
this);
152 ActionImport->setToolTip(
"Open and load a DICOM file or folder");
157 ActionQuery->setToolTip(
"Query and Retrieve DICOM studies from a DICOM node");
158 q->connect(
ActionQuery, SIGNAL(triggered()), q, SLOT(openQueryDialog()));
162 ActionRemove->setToolTip(
"Remove selection from database");
163 q->connect(
ActionRemove, SIGNAL(triggered()), q, SLOT(onRemoveAction()));
166 QSplitter* splitter =
new QSplitter;
167 splitter->setOrientation(Qt::Vertical);
171 TreeView->setAlternatingRowColors(
true);
174 QWidget* ThumbnailsFullWidget =
new QWidget;
175 splitter->addWidget(ThumbnailsFullWidget);
176 QVBoxLayout* ThumbnailsFullWidgetLayout =
new QVBoxLayout(ThumbnailsFullWidget);
177 ThumbnailsFullWidgetLayout->setMargin(0);
180 ThumbnailsWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
189 connect(
ThumbnailWidthSlider, SIGNAL(valueChanged(
int)), q, SLOT(onThumbnailWidthSliderValueChanged(
int)));
198 q->connect(db, SIGNAL(schemaUpdateStarted(
int)), q, SLOT(schemaUpdateStarted(
int)));
199 q->connect(db, SIGNAL(schemaUpdateProgress(
int)), q, SLOT(schemaUpdateProgress(
int)));
200 q->connect(db, SIGNAL(schemaUpdateProgress(QString)), q, SLOT(schemaUpdateProgress(QString)));
201 q->connect(db, SIGNAL(schemaUpdated()), q, SLOT(schemaUpdated()));
243 void DICOMAppWidget::schemaUpdateStarted(
int)
247 void DICOMAppWidget::schemaUpdateProgress(QString val)
250 void DICOMAppWidget::schemaUpdateProgress(
int val)
253 void DICOMAppWidget::schemaUpdated()
260 QModelIndexList selection =
TreeView->selectionModel()->selectedIndexes();
263 foreach(index,selection)
265 if (index.column()!=0)
275 std::map<ctkDICOMModel::IndexType, QStringList> retval;
276 QModelIndexList selection =
TreeView->selectionModel()->selectedIndexes();
279 foreach(index,selection)
281 QModelIndex index0 = index.sibling(index.row(), 0);
285 if (!retval.count(type))
304 connect(&d->Importer, SIGNAL(indexingCompleted()),
305 &d->mDICOMModel, SLOT(reset()));
310 d->TreeView->setSortingEnabled(
true);
311 d->TreeView->setSelectionBehavior(QAbstractItemView::SelectRows);
312 d->DICOMProxyModel.setSourceModel(&d->mDICOMModel);
313 d->TreeView->setModel(&d->mDICOMModel);
315 d->ThumbnailsWidget->setThumbnailSize(
316 QSize(d->ThumbnailWidthSlider->value(), d->ThumbnailWidthSlider->value()));
319 connect(d->TreeView, SIGNAL(collapsed(QModelIndex)),
this, SLOT(
onTreeCollapsed(QModelIndex)));
320 connect(d->TreeView, SIGNAL(expanded(QModelIndex)),
this, SLOT(
onTreeExpanded(QModelIndex)));
323 d->ToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
326 d->QueryRetrieveWidget =
new ctkDICOMQueryRetrieveWidget();
327 d->QueryRetrieveWidget->setWindowModality ( Qt::ApplicationModal );
329 connect(d->TreeView->selectionModel(),
330 SIGNAL(selectionChanged(
const QItemSelection&,
const QItemSelection&)),
333 connect(d->TreeView->selectionModel(),
334 SIGNAL(currentChanged(
const QModelIndex&,
const QModelIndex&)),
339 connect(d->TreeView, SIGNAL(clicked(QModelIndex)),
this, SLOT(
onModelSelected(QModelIndex)));
341 connect(d->QueryRetrieveWidget, SIGNAL(canceled()), d->QueryRetrieveWidget, SLOT(hide()) );
349 d->QueryRetrieveWidget->deleteLater();
356 return d->Importer.displayImportSummary();
363 return d->Importer.setDisplayImportSummary(onOff);
370 return d->Importer.patientsAddedDuringImport();
377 return d->Importer.studiesAddedDuringImport();
384 return d->Importer.seriesAddedDuringImport();
391 return d->Importer.instancesAddedDuringImport();
399 d->showUpdateSchemaDialog();
400 d->DICOMDatabase->updateSchemaIfNeeded();
409 settings.
setValue(
"DatabaseDirectory", directory);
413 d->DICOMDatabase->closeDatabase();
416 QString databaseFileName = directory + QString(
"/ctkDICOM.sql");
419 d->DICOMDatabase->openDatabase( databaseFileName );
421 CX_LOG_CHANNEL_INFO(
"dicom") <<
"open database " << databaseFileName.toStdString() <<
", open= " << d->DICOMDatabase->isOpen();
424 catch (std::exception e)
426 CX_LOG_CHANNEL_ERROR(
"dicom") <<
"Database error: " << qPrintable(d->DICOMDatabase->lastError());
428 d->DICOMDatabase->closeDatabase();
435 d->mDICOMModel.setDatabase(d->DICOMDatabase);
437 d->TreeView->resizeColumnToContents(0);
438 d->Importer.setDatabase(d->DICOMDatabase);
440 d->QueryRetrieveWidget->setRetrieveDatabase(d->DICOMDatabase);
441 d->ThumbnailsWidget->setDatabaseDirectory(directory);
442 d->ThumbnailsWidget->setDatabase(d->DICOMDatabase);
450 return settings.
value(
"DatabaseDirectory").toString();
457 d->DICOMDatabase->setTagsToPrecache(tags);
464 return d->DICOMDatabase->tagsToPrecache();
470 return d->DICOMDatabase.data();
478 d->QueryRetrieveWidget->show();
479 d->QueryRetrieveWidget->raise();
487 d->mDICOMModel.reset();
511 d->removeSelection();
518 d->mDICOMModel.setDatabase(d->DICOMDatabase);
525 d->mDICOMModel.reset();
532 d->Importer.onImportDirectory(directory);
542 d->ThumbnailsWidget->addThumbnails(next);
553 QModelIndex index0 = index.sibling(index.row(), 0);
555 d->ActionRemove->setEnabled(
562 d->ActionRemove->setEnabled(
false);
570 d->TreeView->resizeColumnToContents(0);
577 d->TreeView->resizeColumnToContents(0);
578 d->TreeView->resizeColumnToContents(1);
585 d->ThumbnailsWidget->setThumbnailSize(QSize(val, val));
591 d->ToolBar->addAction(action);
#define CX_LOG_CHANNEL_INFO(channel)
virtual bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
void setValue(const QString &key, const QVariant &value)
Settings * settings()
Shortcut for accessing the settings instance.
thumbnail generator class
#define CX_LOG_CHANNEL_ERROR(channel)