ctkDICOMAppWidget.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // std includes
  2. #include <iostream>
  3. // Qt includes
  4. #include <QDebug>
  5. #include <QTreeView>
  6. #include <QTabBar>
  7. #include <QSettings>
  8. #include <QAction>
  9. #include <QModelIndex>
  10. #include <QCheckBox>
  11. // ctkDICOMCore includes
  12. #include "ctkDICOMDatabase.h"
  13. #include "ctkDICOMIndexer.h"
  14. // ctkDICOMWidgets includes
  15. #include "ctkDICOMModel.h"
  16. #include "ctkDICOMAppWidget.h"
  17. #include "ctkDICOMQueryResultsTabWidget.h"
  18. #include "ui_ctkDICOMAppWidget.h"
  19. #include "ctkDirectoryButton.h"
  20. #include "ctkFileDialog.h"
  21. #include "ctkDICOMQueryRetrieveWidget.h"
  22. #include "ctkDICOMImportWidget.h"
  23. //logger
  24. #include <ctkLogger.h>
  25. static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
  26. //----------------------------------------------------------------------------
  27. class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
  28. {
  29. public:
  30. ctkDICOMAppWidgetPrivate();
  31. ctkFileDialog* ImportDialog;
  32. ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
  33. QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
  34. ctkDICOMModel DICOMModel;
  35. QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
  36. };
  37. //----------------------------------------------------------------------------
  38. // ctkDICOMAppWidgetPrivate methods
  39. ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
  40. DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
  41. DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
  42. }
  43. //----------------------------------------------------------------------------
  44. // ctkDICOMAppWidget methods
  45. //----------------------------------------------------------------------------
  46. ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
  47. d_ptr(new ctkDICOMAppWidgetPrivate)
  48. {
  49. Q_D(ctkDICOMAppWidget);
  50. d->setupUi(this);
  51. //Set toolbar button style
  52. d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  53. //Initialize Q/R widget
  54. d->QueryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
  55. connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(setDatabaseDirectory(const QString&)));
  56. //Initialize import widget
  57. d->ImportDialog = new ctkFileDialog();
  58. QCheckBox* importCheckbox = new QCheckBox("Copy on import", d->ImportDialog);
  59. d->ImportDialog->setBottomWidget(importCheckbox);
  60. d->ImportDialog->setFileMode(QFileDialog::Directory);
  61. d->ImportDialog->setLabelText(QFileDialog::Accept,"Import");
  62. d->ImportDialog->setWindowTitle("Import DICOM files from directory ...");
  63. d->ImportDialog->setWindowModality(Qt::ApplicationModal);
  64. //Set thumbnails width in thumbnail widget
  65. //d->thumbnailsWidget->setThumbnailWidth(128);
  66. //Test add thumbnails
  67. //d->thumbnailsWidget->addTestThumbnail();
  68. //connect signal and slots
  69. connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onDICOMModelSelected(const QModelIndex &)));
  70. connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
  71. connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
  72. }
  73. //----------------------------------------------------------------------------
  74. ctkDICOMAppWidget::~ctkDICOMAppWidget()
  75. {
  76. Q_D(ctkDICOMAppWidget);
  77. d->QueryRetrieveWidget->deleteLater();
  78. d->ImportDialog->deleteLater();
  79. }
  80. //----------------------------------------------------------------------------
  81. void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
  82. {
  83. Q_D(ctkDICOMAppWidget);
  84. QSettings settings;
  85. settings.setValue("DatabaseDirectory", directory);
  86. settings.sync();
  87. //close the active DICOM database
  88. d->DICOMDatabase->closeDatabase();
  89. //open DICOM database on the directory
  90. QString databaseFileName = directory + QString("/ctkDICOM.sql");
  91. try { d->DICOMDatabase->openDatabase( databaseFileName ); }
  92. catch (std::exception e)
  93. {
  94. std::cerr << "Database error: " << qPrintable(d->DICOMDatabase->lastError()) << "\n";
  95. d->DICOMDatabase->closeDatabase();
  96. return;
  97. }
  98. d->DICOMModel.setDatabase(d->DICOMDatabase->database());
  99. d->treeView->setModel(&d->DICOMModel);
  100. //pass DICOM database instance to Import widget
  101. // d->ImportDialog->setDICOMDatabase(d->DICOMDatabase);
  102. d->directoryButton->setDirectory(directory);
  103. }
  104. void ctkDICOMAppWidget::onAddToDatabase()
  105. {
  106. //Q_D(ctkDICOMAppWidget);
  107. //d->
  108. }
  109. //----------------------------------------------------------------------------
  110. void ctkDICOMAppWidget::onImport(){
  111. Q_D(ctkDICOMAppWidget);
  112. d->ImportDialog->show();
  113. d->ImportDialog->raise();
  114. }
  115. void ctkDICOMAppWidget::onExport(){
  116. }
  117. void ctkDICOMAppWidget::onQuery(){
  118. Q_D(ctkDICOMAppWidget);
  119. d->QueryRetrieveWidget->show();
  120. d->QueryRetrieveWidget->raise();
  121. }
  122. void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index){
  123. Q_D(ctkDICOMAppWidget);
  124. //TODO: update thumbnails and previewer
  125. d->thumbnailsWidget->setModelIndex(index);
  126. }
  127. void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget){
  128. //TODO: update previewer
  129. }
  130. void ctkDICOMAppWidget::onImportDirectory(QString directory)
  131. {
  132. Q_D(ctkDICOMAppWidget);
  133. if (QDir(directory).exists())
  134. {
  135. QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
  136. QString targetDirectory;
  137. if (copyOnImport->isEnabled())
  138. {
  139. targetDirectory = d->DICOMDatabase->databaseDirectory();
  140. }
  141. d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
  142. }
  143. }