| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 | 
							- // std includes
 
- #include <iostream>
 
- #include <dcmimage.h>
 
- // Qt includes
 
- #include <QDebug>
 
- #include <QTreeView>
 
- #include <QTabBar>
 
- #include <QSettings>
 
- #include <QAction>
 
- #include <QModelIndex>
 
- #include <QCheckBox>
 
- // ctkDICOMCore includes
 
- #include "ctkDICOMDatabase.h"
 
- #include "ctkDICOMIndexer.h"
 
- // ctkDICOMWidgets includes
 
- #include "ctkDICOMImage.h"
 
- #include "ctkDICOMModel.h"
 
- #include "ctkDICOMAppWidget.h"
 
- #include "ctkDICOMQueryResultsTabWidget.h"
 
- #include "ui_ctkDICOMAppWidget.h"
 
- #include "ctkDirectoryButton.h"
 
- #include "ctkFileDialog.h"
 
- #include "ctkDICOMQueryRetrieveWidget.h"
 
- #include "ctkDICOMImportWidget.h"
 
- //logger
 
- #include <ctkLogger.h>
 
- static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
 
- //----------------------------------------------------------------------------
 
- class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
 
- {
 
- public:
 
-   ctkDICOMAppWidgetPrivate();
 
-   ctkFileDialog* ImportDialog;
 
-   ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
 
-   QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
 
-   ctkDICOMModel DICOMModel;
 
-   QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
 
- };
 
- //----------------------------------------------------------------------------
 
- // ctkDICOMAppWidgetPrivate methods
 
- ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
 
-   
 
-   DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
 
-   DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
 
- }
 
- //----------------------------------------------------------------------------
 
- // ctkDICOMAppWidget methods
 
- //----------------------------------------------------------------------------
 
- ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent), 
 
-   d_ptr(new ctkDICOMAppWidgetPrivate)
 
- {
 
-   Q_D(ctkDICOMAppWidget);  
 
-   d->setupUi(this);
 
-   //Enable sorting in tree view
 
-   d->treeView->setSortingEnabled(true);
 
-   //Set toolbar button style
 
-   d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
 
-   //Initialize Q/R widget
 
-   d->QueryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
 
-   d->QueryRetrieveWidget->setWindowModality ( Qt::ApplicationModal );
 
-   connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(setDatabaseDirectory(const QString&)));
 
-   //Initialize import widget
 
-   d->ImportDialog = new ctkFileDialog();
 
-   QCheckBox* importCheckbox = new QCheckBox("Copy on import", d->ImportDialog);
 
-   d->ImportDialog->setBottomWidget(importCheckbox);
 
-   d->ImportDialog->setFileMode(QFileDialog::Directory);
 
-   d->ImportDialog->setLabelText(QFileDialog::Accept,"Import");
 
-   d->ImportDialog->setWindowTitle("Import DICOM files from directory ...");
 
-   d->ImportDialog->setWindowModality(Qt::ApplicationModal);
 
-   //Set thumbnails width in thumbnail widget
 
-   //d->thumbnailsWidget->setThumbnailWidth(128);
 
-   //Test add thumbnails
 
-   //d->thumbnailsWidget->addTestThumbnail();
 
-   //connect signal and slots
 
-   connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onDICOMModelSelected(const QModelIndex &)));
 
-   connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
 
-   connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
 
-   connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
 
- }
 
- //----------------------------------------------------------------------------
 
- ctkDICOMAppWidget::~ctkDICOMAppWidget()
 
- {
 
-   Q_D(ctkDICOMAppWidget);  
 
-   d->QueryRetrieveWidget->deleteLater();
 
-   d->ImportDialog->deleteLater();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
 
- {
 
-   Q_D(ctkDICOMAppWidget);  
 
-   QSettings settings;
 
-   settings.setValue("DatabaseDirectory", directory);
 
-   settings.sync();
 
-   //close the active DICOM database
 
-   d->DICOMDatabase->closeDatabase();
 
-   
 
-   //open DICOM database on the directory
 
-   QString databaseFileName = directory + QString("/ctkDICOM.sql");
 
-   try { d->DICOMDatabase->openDatabase( databaseFileName ); }
 
-   catch (std::exception e)
 
-   {
 
-     std::cerr << "Database error: " << qPrintable(d->DICOMDatabase->lastError()) << "\n";
 
-     d->DICOMDatabase->closeDatabase();
 
-     return;
 
-   }
 
-   
 
-   d->DICOMModel.setDatabase(d->DICOMDatabase->database());
 
-   d->treeView->setModel(&d->DICOMModel);
 
-   //pass DICOM database instance to Import widget
 
-   // d->ImportDialog->setDICOMDatabase(d->DICOMDatabase);
 
-   d->QueryRetrieveWidget->setRetrieveDatabase(d->DICOMDatabase);
 
- }
 
- void ctkDICOMAppWidget::onAddToDatabase()
 
- {
 
-   //Q_D(ctkDICOMAppWidget);
 
-   //d->
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::openImportDialog()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   
 
-   d->ImportDialog->show();
 
-   d->ImportDialog->raise();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::openExportDialog()
 
- {
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::openQueryDialog()
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   d->QueryRetrieveWidget->show();
 
-   d->QueryRetrieveWidget->raise();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index)
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   QModelIndex index0 = index.sibling(index.row(), 0);
 
-   if ( d->DICOMModel.data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::SeriesType )
 
-   {
 
-     qDebug() << "Clicked on series";
 
-     QStringList thumbnails;
 
-     QString thumbnailPath = d->DICOMDatabase->databaseDirectory() +
 
-                             "/thumbs/" + d->DICOMModel.data(index0.parent() ,ctkDICOMModel::UIDRole).toString() + "/" +
 
-                             d->DICOMModel.data(index0 ,ctkDICOMModel::UIDRole).toString() + "/";
 
-     QModelIndex studyIndex = index0.parent();
 
-     QModelIndex seriesIndex = index0;
 
-     d->DICOMModel.fetchMore(index0);
 
-     int imageCount = d->DICOMModel.rowCount(index0);
 
-     logger.debug(QString("Thumbs: %1").arg(imageCount));
 
-     for (int i = 0 ; i < imageCount ; i++ )
 
-     {
 
-       QModelIndex imageIndex = index0.child(i,0);
 
-       QString thumbnail = thumbnailPath + d->DICOMModel.data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";
 
-       qDebug() << "Thumb: " << thumbnail;
 
-       if (QFile(thumbnail).exists())
 
-       {
 
-         thumbnails << thumbnail;
 
-       }
 
-       else
 
-       {
 
-       logger.error("No thumbnail file " + thumbnail);
 
-       }
 
-     }
 
-     d->thumbnailsWidget->setThumbnailFiles(thumbnails);
 
-     //  thumbnailPath.append("/thumbs/").append(d->DICOMModel.data( studyIndex,ctkDICOMModel::UIDRole).toString() );
 
-     //  thumbnailPath.append(d->DICOMModel.data( seriesIndex,ctkDICOMModel::UIDRole).toString() );
 
-   }
 
-   // TODO: this could check the type of the model entries
 
-   QString thumbnailPath = d->DICOMDatabase->databaseDirectory();
 
-   thumbnailPath.append("/dicom/").append(d->DICOMModel.data(index0.parent().parent() ,ctkDICOMModel::UIDRole).toString());
 
-   thumbnailPath.append("/").append(d->DICOMModel.data(index0.parent() ,ctkDICOMModel::UIDRole).toString());
 
-   thumbnailPath.append("/").append(d->DICOMModel.data(index0 ,ctkDICOMModel::UIDRole).toString());
 
-   //thumbnailPath.append(".png");
 
-   if (QFile(thumbnailPath).exists())
 
-   {
 
-     DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
 
-     ctkDICOMImage ctkImage( & dcmImage );
 
-     d->imagePreview->clearImages();
 
-     d->imagePreview->addImage( ctkImage );
 
-   }
 
-   else
 
-   {
 
-     d->imagePreview->clearImages();
 
-   }
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget)
 
- {
 
-   //TODO: update previewer
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMAppWidget::onImportDirectory(QString directory)
 
- {
 
-   Q_D(ctkDICOMAppWidget);
 
-   if (QDir(directory).exists())
 
-   {
 
-     QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
 
-     QString targetDirectory;
 
-     if (copyOnImport->isEnabled())
 
-     {
 
-        targetDirectory = d->DICOMDatabase->databaseDirectory();
 
-     }
 
-     d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
 
-     d->DICOMModel.reset();
 
-   }
 
- }
 
 
  |