Browse Source

Process model selection in ctkDICOMDatasetView based on the type of selected model index

nherlambang 14 years ago
parent
commit
dad20e0fc0

+ 2 - 24
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -102,8 +102,8 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   d->ImportDialog->setWindowModality(Qt::ApplicationModal);
 
   //connect signal and slots
-  //connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(onDICOMModelSelected(const QModelIndex &)));
   connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), d->thumbnailsWidget, SLOT(onModelSelected(const QModelIndex &)));
+  connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), d->imagePreview, SLOT(onModelSelected(const QModelIndex &)));
 
   connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
   connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
@@ -154,6 +154,7 @@ void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
   // update the button and let any connected slots know about the change
   d->directoryButton->setDirectory(directory);
   d->thumbnailsWidget->setDatabaseDirectory(directory);
+  d->imagePreview->setDatabaseDirectory(directory);
   emit databaseDirectoryChanged(directory);
 }
 
@@ -197,29 +198,6 @@ void ctkDICOMAppWidget::openQueryDialog()
 }
 
 //----------------------------------------------------------------------------
-void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index)
-{
-  Q_D(ctkDICOMAppWidget);
-
-  QModelIndex index0 = index.sibling(index.row(), 0);
-
-  // TODO: this could check the type of the model entries for image previewer
-  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());
-  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

+ 0 - 1
Libs/DICOM/Widgets/ctkDICOMAppWidget.h

@@ -46,7 +46,6 @@ public slots:
   void setDatabaseDirectory(const QString& directory);
   void onAddToDatabase();
 
-  void onDICOMModelSelected(const QModelIndex& index);
   void onThumbnailSelected(const ctkDICOMThumbnailWidget& widget);
 
   void openImportDialog();

+ 125 - 0
Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

@@ -20,8 +20,13 @@
 
 #include <iostream>
 
+// DCMTK includes
+#include <dcmimage.h>
+
 // CTK includes
 #include "ctkQImageView.h"
+#include "ctkDICOMImage.h"
+#include "ctkDICOMModel.h"
 #include "ctkDICOMDatasetView.h"
 
 // Qt includes
@@ -32,6 +37,7 @@
 #include <QMouseEvent>
 #include <QKeyEvent>
 #include <QPainter>
+#include <QFile>
 
 //--------------------------------------------------------------------------
 class ctkDICOMDatasetViewPrivate 
@@ -47,7 +53,13 @@ public:
 
   ctkDICOMDatasetViewPrivate( ctkDICOMDatasetView& object );
 
+  QString databaseDirectory;
+
   void init();
+
+  void onPatientModelSelected(const QModelIndex& index);
+  void onStudyModelSelected(const QModelIndex& index);
+  void onSeriesModelSelected(const QModelIndex& index);
 };
 
 //--------------------------------------------------------------------------
@@ -70,6 +82,94 @@ void ctkDICOMDatasetViewPrivate::init()
   */
 }
 
+void ctkDICOMDatasetViewPrivate::onPatientModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMDatasetView);
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        QModelIndex patientIndex = index;
+        QModelIndex studyIndex = patientIndex.child(0,0);
+        QModelIndex seriesIndex = studyIndex.child(0,0);
+        QModelIndex imageIndex = seriesIndex.child(0,0);
+
+        QString thumbnailPath = this->databaseDirectory;
+        thumbnailPath.append("/dicom/").append(model->data(studyIndex ,ctkDICOMModel::UIDRole).toString());
+        thumbnailPath.append("/").append(model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString());
+        thumbnailPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
+
+        if (QFile(thumbnailPath).exists())
+        {
+          DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
+          ctkDICOMImage ctkImage( & dcmImage );
+          q->clearImages();
+          q->addImage( ctkImage );
+        }else{
+          q->clearImages();
+        }
+    }else{
+        q->clearImages();
+    }
+}
+
+void ctkDICOMDatasetViewPrivate::onStudyModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMDatasetView);
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        QModelIndex studyIndex = index;
+        QModelIndex seriesIndex = studyIndex.child(0,0);
+        QModelIndex imageIndex = seriesIndex.child(0,0);
+
+        QString thumbnailPath = this->databaseDirectory;
+        thumbnailPath.append("/dicom/").append(model->data(studyIndex ,ctkDICOMModel::UIDRole).toString());
+        thumbnailPath.append("/").append(model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString());
+        thumbnailPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
+
+        if (QFile(thumbnailPath).exists())
+        {
+          DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
+          ctkDICOMImage ctkImage( & dcmImage );
+          q->clearImages();
+          q->addImage( ctkImage );
+        }else{
+          q->clearImages();
+        }
+    }else{
+        q->clearImages();
+    }
+}
+
+void ctkDICOMDatasetViewPrivate::onSeriesModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMDatasetView);
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        QModelIndex seriesIndex = index;
+        QModelIndex studyIndex = seriesIndex.parent();
+        QModelIndex imageIndex = seriesIndex.child(0,0);
+
+        QString thumbnailPath = this->databaseDirectory;
+        thumbnailPath.append("/dicom/").append(model->data(studyIndex ,ctkDICOMModel::UIDRole).toString());
+        thumbnailPath.append("/").append(model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString());
+        thumbnailPath.append("/").append(model->data(imageIndex ,ctkDICOMModel::UIDRole).toString());
+
+        if (QFile(thumbnailPath).exists())
+        {
+          DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
+          ctkDICOMImage ctkImage( & dcmImage );
+          q->clearImages();
+          q->addImage( ctkImage );
+        }else{
+          q->clearImages();
+        }
+    }else{
+        q->clearImages();
+    }
+}
+
 // -------------------------------------------------------------------------
 ctkDICOMDatasetView::ctkDICOMDatasetView( QWidget* _parent )
   : Superclass( _parent ),
@@ -95,6 +195,13 @@ ctkDICOMDatasetView::~ctkDICOMDatasetView()
 }
 
 // -------------------------------------------------------------------------
+void ctkDICOMDatasetView::setDatabaseDirectory(const QString &directory){
+    Q_D(ctkDICOMDatasetView);
+
+    d->databaseDirectory = directory;
+}
+
+// -------------------------------------------------------------------------
 void ctkDICOMDatasetView::addImage( const ctkDICOMImage & image )
 {
   for( unsigned int i=0; i<image.frameCount(); ++i )
@@ -115,3 +222,21 @@ void ctkDICOMDatasetView::update( bool zoomChanged,
 {
   Superclass::update( zoomChanged, sizeChanged );
 }
+
+void ctkDICOMDatasetView::onModelSelected(const QModelIndex &index){
+    Q_D(ctkDICOMDatasetView);
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        QModelIndex index0 = index.sibling(index.row(), 0);
+
+        if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::PatientType ){
+            d->onPatientModelSelected(index0);
+        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::StudyType ){
+            d->onStudyModelSelected(index0);
+        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::SeriesType ){
+            d->onSeriesModelSelected(index0);
+        }
+    }
+}

+ 5 - 0
Libs/DICOM/Widgets/ctkDICOMDatasetView.h

@@ -24,6 +24,7 @@
 /// Qt includes
 #include <QWidget>
 #include <QImage>
+#include <QModelIndex>
 
 /// CTK includes
 #include "ctkQImageView.h"
@@ -52,11 +53,15 @@ public:
   /// Destructor
   virtual ~ctkDICOMDatasetView( void );
 
+  void setDatabaseDirectory(const QString& directory);
+
 public slots:
 
   void addImage( const ctkDICOMImage & image );
   void addImage( const QImage & image );
 
+  void onModelSelected(const QModelIndex& index);
+
   virtual void update( bool zoomChanged=false, bool sizeChanged=false );
 
 protected: