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");
115 std::map<ctkDICOMModel::IndexType, QStringList>
getSelection()
const;
126 DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (
new ctkDICOMDatabase);
128 DICOMDatabase->setThumbnailGenerator(ThumbnailGenerator.data());
154 ActionImport->setToolTip(
"Open and load a DICOM file or folder");
159 ActionQuery->setToolTip(
"Query and Retrieve DICOM studies from a DICOM node");
160 q->connect(
ActionQuery, SIGNAL(triggered()), q, SLOT(openQueryDialog()));
164 ActionRemove->setToolTip(
"Remove selection from database");
165 q->connect(
ActionRemove, SIGNAL(triggered()), q, SLOT(onRemoveAction()));
168 QSplitter* splitter =
new QSplitter;
169 splitter->setOrientation(Qt::Vertical);
173 TreeView->setAlternatingRowColors(
true);
176 QWidget* ThumbnailsFullWidget =
new QWidget;
177 splitter->addWidget(ThumbnailsFullWidget);
178 QVBoxLayout* ThumbnailsFullWidgetLayout =
new QVBoxLayout(ThumbnailsFullWidget);
179 ThumbnailsFullWidgetLayout->setMargin(0);
182 ThumbnailsWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
191 connect(
ThumbnailWidthSlider, SIGNAL(valueChanged(
int)), q, SLOT(onThumbnailWidthSliderValueChanged(
int)));
200 q->connect(db, SIGNAL(schemaUpdateStarted(
int)), q, SLOT(schemaUpdateStarted(
int)));
201 q->connect(db, SIGNAL(schemaUpdateProgress(
int)), q, SLOT(schemaUpdateProgress(
int)));
202 q->connect(db, SIGNAL(schemaUpdateProgress(QString)), q, SLOT(schemaUpdateProgress(QString)));
203 q->connect(db, SIGNAL(schemaUpdated()), q, SLOT(schemaUpdated()));
245 void DICOMAppWidget::schemaUpdateStarted(
int)
249 void DICOMAppWidget::schemaUpdateProgress(QString val)
252 void DICOMAppWidget::schemaUpdateProgress(
int val)
255 void DICOMAppWidget::schemaUpdated()
262 QModelIndexList selection =
TreeView->selectionModel()->selectedIndexes();
265 foreach(index,selection)
267 if (index.column()!=0)
277 std::map<ctkDICOMModel::IndexType, QStringList> retval;
278 QModelIndexList selection =
TreeView->selectionModel()->selectedIndexes();
281 foreach(index,selection)
283 QModelIndex index0 = index.sibling(index.row(), 0);
288 retval[type].removeDuplicates();
324 connect(&d->Importer, SIGNAL(indexingCompleted()),
325 &d->mDICOMModel, SLOT(reset()));
330 d->TreeView->setSortingEnabled(
true);
331 d->TreeView->setSelectionBehavior(QAbstractItemView::SelectRows);
332 d->TreeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
333 d->DICOMProxyModel.setSourceModel(&d->mDICOMModel);
334 d->TreeView->setModel(&d->mDICOMModel);
336 d->ThumbnailsWidget->setThumbnailSize(
337 QSize(d->ThumbnailWidthSlider->value(), d->ThumbnailWidthSlider->value()));
340 connect(d->TreeView, SIGNAL(collapsed(QModelIndex)),
this, SLOT(
onTreeCollapsed(QModelIndex)));
341 connect(d->TreeView, SIGNAL(expanded(QModelIndex)),
this, SLOT(
onTreeExpanded(QModelIndex)));
344 d->ToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
350 connect(d->TreeView->selectionModel(),
351 SIGNAL(selectionChanged(
const QItemSelection&,
const QItemSelection&)),
354 connect(d->TreeView->selectionModel(),
355 SIGNAL(currentChanged(
const QModelIndex&,
const QModelIndex&)),
360 connect(d->TreeView, SIGNAL(clicked(QModelIndex)),
this, SLOT(
onModelSelected(QModelIndex)));
378 return d->Importer.displayImportSummary();
385 return d->Importer.setDisplayImportSummary(onOff);
392 return d->Importer.patientsAddedDuringImport();
399 return d->Importer.studiesAddedDuringImport();
406 return d->Importer.seriesAddedDuringImport();
413 return d->Importer.instancesAddedDuringImport();
421 d->showUpdateSchemaDialog();
422 d->DICOMDatabase->updateSchemaIfNeeded();
431 settings.
setValue(
"DatabaseDirectory", directory);
435 d->DICOMDatabase->closeDatabase();
438 QString databaseFileName = directory + QString(
"/ctkDICOM.sql");
441 d->DICOMDatabase->openDatabase( databaseFileName );
443 CX_LOG_CHANNEL_INFO(
"dicom") <<
"Open Database " << databaseFileName.toStdString() <<
", open= " << d->DICOMDatabase->isOpen();
446 catch (std::exception e)
448 CX_LOG_CHANNEL_ERROR(
"dicom") <<
"Database error: " << qPrintable(d->DICOMDatabase->lastError());
450 d->DICOMDatabase->closeDatabase();
457 d->mDICOMModel.setDatabase(d->DICOMDatabase);
459 d->TreeView->resizeColumnToContents(0);
460 d->Importer.setDatabase(d->DICOMDatabase);
463 d->ThumbnailsWidget->setDatabaseDirectory(directory);
464 d->ThumbnailsWidget->setDatabase(d->DICOMDatabase);
472 return settings.
value(
"DatabaseDirectory").toString();
479 d->DICOMDatabase->setTagsToPrecache(tags);
486 return d->DICOMDatabase->tagsToPrecache();
492 return d->DICOMDatabase.data();
500 d->getQueryRetrieveWidget()->show();
501 d->getQueryRetrieveWidget()->raise();
509 d->mDICOMModel.reset();
533 d->removeSelection();
540 d->mDICOMModel.setDatabase(d->DICOMDatabase);
547 d->mDICOMModel.reset();
554 d->Importer.onImportDirectory(directory);
564 d->ThumbnailsWidget->addThumbnails(next);
575 QModelIndex index0 = index.sibling(index.row(), 0);
577 d->ActionRemove->setEnabled(
584 d->ActionRemove->setEnabled(
false);
592 d->TreeView->resizeColumnToContents(0);
599 d->TreeView->resizeColumnToContents(0);
600 d->TreeView->resizeColumnToContents(1);
607 d->ThumbnailsWidget->setThumbnailSize(QSize(val, val));
613 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)