ctkDICOMAppWidget.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. //logger
  26. #include <ctkLogger.h>
  27. static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
  28. //----------------------------------------------------------------------------
  29. class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
  30. {
  31. public:
  32. ctkDICOMAppWidgetPrivate();
  33. ctkFileDialog* ImportDialog;
  34. ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
  35. QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
  36. ctkDICOMModel DICOMModel;
  37. QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
  38. };
  39. //----------------------------------------------------------------------------
  40. // ctkDICOMAppWidgetPrivate methods
  41. ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
  42. DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
  43. DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
  44. }
  45. //----------------------------------------------------------------------------
  46. // ctkDICOMAppWidget methods
  47. //----------------------------------------------------------------------------
  48. ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
  49. d_ptr(new ctkDICOMAppWidgetPrivate)
  50. {
  51. Q_D(ctkDICOMAppWidget);
  52. d->setupUi(this);
  53. //Set toolbar button style
  54. d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  55. //Initialize Q/R widget
  56. d->QueryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
  57. d->QueryRetrieveWidget->setWindowModality ( Qt::ApplicationModal );
  58. connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(setDatabaseDirectory(const QString&)));
  59. //Initialize import widget
  60. d->ImportDialog = new ctkFileDialog();
  61. QCheckBox* importCheckbox = new QCheckBox("Copy on import", d->ImportDialog);
  62. d->ImportDialog->setBottomWidget(importCheckbox);
  63. d->ImportDialog->setFileMode(QFileDialog::Directory);
  64. d->ImportDialog->setLabelText(QFileDialog::Accept,"Import");
  65. d->ImportDialog->setWindowTitle("Import DICOM files from directory ...");
  66. d->ImportDialog->setWindowModality(Qt::ApplicationModal);
  67. //Set thumbnails width in thumbnail widget
  68. //d->thumbnailsWidget->setThumbnailWidth(128);
  69. //Test add thumbnails
  70. //d->thumbnailsWidget->addTestThumbnail();
  71. //connect signal and slots
  72. connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onDICOMModelSelected(const QModelIndex &)));
  73. connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
  74. connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
  75. connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
  76. }
  77. //----------------------------------------------------------------------------
  78. ctkDICOMAppWidget::~ctkDICOMAppWidget()
  79. {
  80. Q_D(ctkDICOMAppWidget);
  81. d->QueryRetrieveWidget->deleteLater();
  82. d->ImportDialog->deleteLater();
  83. }
  84. //----------------------------------------------------------------------------
  85. void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
  86. {
  87. Q_D(ctkDICOMAppWidget);
  88. QSettings settings;
  89. settings.setValue("DatabaseDirectory", directory);
  90. settings.sync();
  91. //close the active DICOM database
  92. d->DICOMDatabase->closeDatabase();
  93. //open DICOM database on the directory
  94. QString databaseFileName = directory + QString("/ctkDICOM.sql");
  95. try { d->DICOMDatabase->openDatabase( databaseFileName ); }
  96. catch (std::exception e)
  97. {
  98. std::cerr << "Database error: " << qPrintable(d->DICOMDatabase->lastError()) << "\n";
  99. d->DICOMDatabase->closeDatabase();
  100. return;
  101. }
  102. d->DICOMModel.setDatabase(d->DICOMDatabase->database());
  103. d->treeView->setModel(&d->DICOMModel);
  104. //pass DICOM database instance to Import widget
  105. // d->ImportDialog->setDICOMDatabase(d->DICOMDatabase);
  106. d->QueryRetrieveWidget->setRetrieveDatabase(d->DICOMDatabase);
  107. }
  108. void ctkDICOMAppWidget::onAddToDatabase()
  109. {
  110. //Q_D(ctkDICOMAppWidget);
  111. //d->
  112. }
  113. //----------------------------------------------------------------------------
  114. void ctkDICOMAppWidget::onImport(){
  115. Q_D(ctkDICOMAppWidget);
  116. d->ImportDialog->show();
  117. d->ImportDialog->raise();
  118. }
  119. void ctkDICOMAppWidget::onExport(){
  120. }
  121. void ctkDICOMAppWidget::onQuery(){
  122. Q_D(ctkDICOMAppWidget);
  123. d->QueryRetrieveWidget->show();
  124. d->QueryRetrieveWidget->raise();
  125. }
  126. void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index)
  127. {
  128. Q_D(ctkDICOMAppWidget);
  129. //TODO: update thumbnails and previewer
  130. d->thumbnailsWidget->setModelIndex(index);
  131. // TODO: this could check the type of the model entries
  132. QString thumbnailPath = d->DICOMDatabase->databaseDirectory();
  133. thumbnailPath.append("/dicom/").append(d->DICOMModel.data(index.parent().parent() ,ctkDICOMModel::UIDRole).toString());
  134. thumbnailPath.append("/").append(d->DICOMModel.data(index.parent() ,ctkDICOMModel::UIDRole).toString());
  135. thumbnailPath.append("/").append(d->DICOMModel.data(index ,ctkDICOMModel::UIDRole).toString());
  136. //thumbnailPath.append(".png");
  137. if (QFile(thumbnailPath).exists())
  138. {
  139. DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
  140. ctkDICOMImage ctkImage( & dcmImage );
  141. d->imagePreview->addImage( ctkImage );
  142. }
  143. else
  144. {
  145. d->imagePreview->clearImages();
  146. }
  147. }
  148. void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget){
  149. //TODO: update previewer
  150. }
  151. void ctkDICOMAppWidget::onImportDirectory(QString directory)
  152. {
  153. Q_D(ctkDICOMAppWidget);
  154. if (QDir(directory).exists())
  155. {
  156. QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
  157. QString targetDirectory;
  158. if (copyOnImport->isEnabled())
  159. {
  160. targetDirectory = d->DICOMDatabase->databaseDirectory();
  161. }
  162. d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
  163. d->DICOMModel.reset();
  164. }
  165. }