ctkDICOMAppWidget.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. // std includes
  2. #include <iostream>
  3. #include <dcmimage.h>
  4. // Qt includes
  5. #include <QDebug>
  6. #include <QTreeView>
  7. #include <QTabBar>
  8. #include <QSettings>
  9. #include <QAction>
  10. #include <QModelIndex>
  11. #include <QCheckBox>
  12. // ctkDICOMCore includes
  13. #include "ctkDICOMDatabase.h"
  14. #include "ctkDICOMIndexer.h"
  15. // ctkDICOMWidgets includes
  16. #include "ctkDICOMImage.h"
  17. #include "ctkDICOMModel.h"
  18. #include "ctkDICOMAppWidget.h"
  19. #include "ctkDICOMQueryResultsTabWidget.h"
  20. #include "ui_ctkDICOMAppWidget.h"
  21. #include "ctkDirectoryButton.h"
  22. #include "ctkFileDialog.h"
  23. #include "ctkDICOMQueryRetrieveWidget.h"
  24. #include "ctkDICOMImportWidget.h"
  25. #include "ctkDICOMThumbnailWidget.h"
  26. //logger
  27. #include <ctkLogger.h>
  28. static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
  29. //----------------------------------------------------------------------------
  30. class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
  31. {
  32. public:
  33. ctkDICOMAppWidgetPrivate();
  34. ctkFileDialog* ImportDialog;
  35. ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
  36. QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
  37. ctkDICOMModel DICOMModel;
  38. QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
  39. };
  40. //----------------------------------------------------------------------------
  41. // ctkDICOMAppWidgetPrivate methods
  42. ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
  43. DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
  44. DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
  45. }
  46. //----------------------------------------------------------------------------
  47. // ctkDICOMAppWidget methods
  48. //----------------------------------------------------------------------------
  49. ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
  50. d_ptr(new ctkDICOMAppWidgetPrivate)
  51. {
  52. Q_D(ctkDICOMAppWidget);
  53. d->setupUi(this);
  54. //Enable sorting in tree view
  55. d->treeView->setSortingEnabled(true);
  56. d->treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
  57. //Set toolbar button style
  58. d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  59. //Initialize Q/R widget
  60. d->QueryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
  61. d->QueryRetrieveWidget->setWindowModality ( Qt::ApplicationModal );
  62. //initialize directory from settings, then listen for changes
  63. QSettings settings;
  64. if ( settings.value("DatabaseDirectory", "") == "" )
  65. {
  66. QString directory = QString("./ctkDICOM-Database");
  67. settings.setValue("DatabaseDirectory", directory);
  68. settings.sync();
  69. }
  70. QString databaseDirectory = settings.value("DatabaseDirectory").toString();
  71. this->setDatabaseDirectory(databaseDirectory);
  72. d->directoryButton->setDirectory(databaseDirectory);
  73. connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(setDatabaseDirectory(const QString&)));
  74. //Initialize import widget
  75. d->ImportDialog = new ctkFileDialog();
  76. QCheckBox* importCheckbox = new QCheckBox("Copy on import", d->ImportDialog);
  77. d->ImportDialog->setBottomWidget(importCheckbox);
  78. d->ImportDialog->setFileMode(QFileDialog::Directory);
  79. d->ImportDialog->setLabelText(QFileDialog::Accept,"Import");
  80. d->ImportDialog->setWindowTitle("Import DICOM files from directory ...");
  81. d->ImportDialog->setWindowModality(Qt::ApplicationModal);
  82. //connect signal and slots
  83. connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), d->thumbnailsWidget, SLOT(onModelSelected(const QModelIndex &)));
  84. connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), d->imagePreview, SLOT(onModelSelected(const QModelIndex &)));
  85. connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
  86. connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
  87. connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
  88. connect(d->QueryRetrieveWidget, SIGNAL( canceled() ), d->QueryRetrieveWidget, SLOT( hide() ) );
  89. }
  90. //----------------------------------------------------------------------------
  91. ctkDICOMAppWidget::~ctkDICOMAppWidget()
  92. {
  93. Q_D(ctkDICOMAppWidget);
  94. d->QueryRetrieveWidget->deleteLater();
  95. d->ImportDialog->deleteLater();
  96. }
  97. //----------------------------------------------------------------------------
  98. void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
  99. {
  100. Q_D(ctkDICOMAppWidget);
  101. QSettings settings;
  102. settings.setValue("DatabaseDirectory", directory);
  103. settings.sync();
  104. //close the active DICOM database
  105. d->DICOMDatabase->closeDatabase();
  106. //open DICOM database on the directory
  107. QString databaseFileName = directory + QString("/ctkDICOM.sql");
  108. try { d->DICOMDatabase->openDatabase( databaseFileName ); }
  109. catch (std::exception e)
  110. {
  111. std::cerr << "Database error: " << qPrintable(d->DICOMDatabase->lastError()) << "\n";
  112. d->DICOMDatabase->closeDatabase();
  113. return;
  114. }
  115. d->DICOMModel.setDatabase(d->DICOMDatabase->database());
  116. d->treeView->setModel(&d->DICOMModel);
  117. //pass DICOM database instance to Import widget
  118. // d->ImportDialog->setDICOMDatabase(d->DICOMDatabase);
  119. d->QueryRetrieveWidget->setRetrieveDatabase(d->DICOMDatabase);
  120. // update the button and let any connected slots know about the change
  121. d->directoryButton->setDirectory(directory);
  122. d->thumbnailsWidget->setDatabaseDirectory(directory);
  123. d->imagePreview->setDatabaseDirectory(directory);
  124. emit databaseDirectoryChanged(directory);
  125. }
  126. //----------------------------------------------------------------------------
  127. QString ctkDICOMAppWidget::databaseDirectory() const
  128. {
  129. QSettings settings;
  130. return settings.value("DatabaseDirectory").toString();
  131. }
  132. void ctkDICOMAppWidget::onAddToDatabase()
  133. {
  134. //Q_D(ctkDICOMAppWidget);
  135. //d->
  136. }
  137. //----------------------------------------------------------------------------
  138. void ctkDICOMAppWidget::openImportDialog()
  139. {
  140. Q_D(ctkDICOMAppWidget);
  141. d->ImportDialog->show();
  142. d->ImportDialog->raise();
  143. }
  144. //----------------------------------------------------------------------------
  145. void ctkDICOMAppWidget::openExportDialog()
  146. {
  147. }
  148. //----------------------------------------------------------------------------
  149. void ctkDICOMAppWidget::openQueryDialog()
  150. {
  151. Q_D(ctkDICOMAppWidget);
  152. d->QueryRetrieveWidget->show();
  153. d->QueryRetrieveWidget->raise();
  154. }
  155. //----------------------------------------------------------------------------
  156. void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget)
  157. {
  158. Q_D(ctkDICOMAppWidget);
  159. logger.debug("Thumbnail selected");
  160. d->imagePreview->onModelSelected(widget.sourceIndex());
  161. }
  162. //----------------------------------------------------------------------------
  163. void ctkDICOMAppWidget::onImportDirectory(QString directory)
  164. {
  165. Q_D(ctkDICOMAppWidget);
  166. if (QDir(directory).exists())
  167. {
  168. QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
  169. QString targetDirectory;
  170. if (copyOnImport->isEnabled())
  171. {
  172. targetDirectory = d->DICOMDatabase->databaseDirectory();
  173. }
  174. d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
  175. d->DICOMModel.reset();
  176. }
  177. }