Bläddra i källkod

Process thumbnail generation for ctkDICOMThumbnailListWidget based on the type of model entries

nherlambang 14 år sedan
förälder
incheckning
39a7dbfec5

+ 7 - 48
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -69,6 +69,7 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
 
   //Enable sorting in tree view
   d->treeView->setSortingEnabled(true);
+  d->treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
 
   //Set toolbar button style
   d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
@@ -100,14 +101,10 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   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->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->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
   connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
 
@@ -156,6 +153,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);
   emit databaseDirectoryChanged(directory);
 }
 
@@ -205,59 +203,20 @@ void ctkDICOMAppWidget::onDICOMModelSelected(const QModelIndex& index)
 
   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
+  // 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());
-  //thumbnailPath.append(".png");
   if (QFile(thumbnailPath).exists())
   {
     DicomImage dcmImage( thumbnailPath.toStdString().c_str() );
     ctkDICOMImage ctkImage( & dcmImage );
     d->imagePreview->clearImages();
     d->imagePreview->addImage( ctkImage );
-  }
-  else
-  {
+  }else{
     d->imagePreview->clearImages();
   }
-
-
 }
 
 //----------------------------------------------------------------------------

+ 140 - 23
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.cpp

@@ -4,6 +4,7 @@
 #include <QResizeEvent>
 #include <QPushButton>
 #include <QPixmap>
+#include <QFile>
 
 // ctk includes
 #include "ctkLogger.h"
@@ -11,6 +12,10 @@
 // ctkWidgets includes
 #include "ctkFlowLayout.h"
 
+//ctkDICOMCore includes
+#include "ctkDICOMModel.h"
+#include "ctkDICOMDatabase.h"
+
 // ctkDICOMWidgets includes
 #include "ctkDICOMThumbnailListWidget.h"
 #include "ui_ctkDICOMThumbnailListWidget.h"
@@ -29,7 +34,11 @@ public:
     
   }
 
-  QList<ctkDICOMThumbnailWidget*> thumbnailList;
+  QString databaseDirectory;
+
+  void onPatientModelSelected(const QModelIndex &index);
+  void onStudyModelSelected(const QModelIndex &index);
+  void onSeriesModelSelected(const QModelIndex &index);
 
   ctkDICOMThumbnailListWidget* const q_ptr;
   Q_DECLARE_PUBLIC(ctkDICOMThumbnailListWidget);
@@ -38,6 +47,109 @@ public:
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailListWidgetPrivate methods
 
+void ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelIndex &index){
+    QModelIndex patientIndex = index;
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        model->fetchMore(patientIndex);
+        int studyCount = model->rowCount(patientIndex);
+
+        for(int i=0; i<studyCount; i++){
+            QModelIndex studyIndex = patientIndex.child(i, 0);
+            QModelIndex seriesIndex = studyIndex.child(0, 0);
+            QModelIndex imageIndex = seriesIndex.child(0, 0);
+
+            QString thumbnail = this->databaseDirectory +
+                                    "/thumbs/" + model->data(studyIndex ,ctkDICOMModel::UIDRole).toString() + "/" +
+                                    model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString() + "/" +
+                                    model->data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";
+
+            if (QFile(thumbnail).exists()){
+                ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this->scrollAreaContentWidget);
+                QString widgetLabel = QString("Image %1").arg(i);
+                widget->setText( model->data(studyIndex, Qt::DisplayRole).toString() );
+                QPixmap pix(thumbnail);
+                logger.debug("Setting pixmap to " + thumbnail);
+                widget->setPixmap(pix);
+                this->scrollAreaContentWidget->layout()->addWidget(widget);
+            }else{
+                logger.error("No thumbnail file " + thumbnail);
+            }
+        }
+    }
+}
+
+void ctkDICOMThumbnailListWidgetPrivate::onStudyModelSelected(const QModelIndex &index){
+    QModelIndex studyIndex = index;
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        model->fetchMore(studyIndex);
+        int seriesCount = model->rowCount(studyIndex);
+
+        for(int i=0; i<seriesCount; i++){
+            QModelIndex seriesIndex = studyIndex.child(i, 0);
+            QModelIndex imageIndex = seriesIndex.child(0, 0);
+
+            QString thumbnail = this->databaseDirectory +
+                                    "/thumbs/" + model->data(studyIndex ,ctkDICOMModel::UIDRole).toString() + "/" +
+                                    model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString() + "/" +
+                                    model->data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";
+
+            if (QFile(thumbnail).exists()){
+                ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this->scrollAreaContentWidget);
+                QString widgetLabel = QString("Image %1").arg(i);
+                widget->setText( model->data(seriesIndex, Qt::DisplayRole).toString() );
+                QPixmap pix(thumbnail);
+                logger.debug("Setting pixmap to " + thumbnail);
+                widget->setPixmap(pix);
+                this->scrollAreaContentWidget->layout()->addWidget(widget);
+            }else{
+                logger.error("No thumbnail file " + thumbnail);
+            }
+        }
+    }
+}
+
+void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex &index){
+    QModelIndex studyIndex = index.parent();
+    QModelIndex seriesIndex = index;
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        model->fetchMore(seriesIndex);
+
+        QString thumbnailPath = this->databaseDirectory +
+                                "/thumbs/" + model->data(studyIndex ,ctkDICOMModel::UIDRole).toString() + "/" +
+                                model->data(seriesIndex ,ctkDICOMModel::UIDRole).toString() + "/";
+
+        int imageCount = model->rowCount(seriesIndex);
+        logger.debug(QString("Thumbs: %1").arg(imageCount));
+        for (int i = 0 ; i < imageCount ; i++ )
+        {
+            QModelIndex imageIndex = seriesIndex.child(i,0);
+            QString thumbnail = thumbnailPath + model->data(imageIndex, ctkDICOMModel::UIDRole).toString() + ".png";
+            if (QFile(thumbnail).exists())
+            {
+                ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(this->scrollAreaContentWidget);
+                QString widgetLabel = QString("Image %1").arg(i);
+                widget->setText( widgetLabel );
+                QPixmap pix(thumbnail);
+                logger.debug("Setting pixmap to " + thumbnail);
+                widget->setPixmap(pix);
+                this->scrollAreaContentWidget->layout()->addWidget(widget);
+            }
+            else
+            {
+                logger.error("No thumbnail file " + thumbnail);
+            }
+        }
+    }
+}
 
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailListWidget methods
@@ -50,7 +162,7 @@ ctkDICOMThumbnailListWidget::ctkDICOMThumbnailListWidget(QWidget* _parent):Super
   
   d->setupUi(this);
 
-
+  d->scrollAreaContentWidget->setLayout(new ctkFlowLayout);
 }
 
 //----------------------------------------------------------------------------
@@ -59,27 +171,32 @@ ctkDICOMThumbnailListWidget::~ctkDICOMThumbnailListWidget()
   
 }
 
-void ctkDICOMThumbnailListWidget::setThumbnailFiles(const QStringList& thumbnailList)
-{
-  Q_D(ctkDICOMThumbnailListWidget);
+void ctkDICOMThumbnailListWidget::setDatabaseDirectory(const QString &directory){
+    Q_D(ctkDICOMThumbnailListWidget);
 
-  if (d->scrollAreaContentWidget->layout())
-  {
-    delete d->scrollAreaContentWidget->layout();
-  }
+    d->databaseDirectory = directory;
+}
 
-  ctkFlowLayout* flowLayout = new ctkFlowLayout();
-  d->scrollAreaContentWidget->setLayout(flowLayout);
-
-  int i = 0;
-  foreach (QString thumbnailFile, thumbnailList)
-  {
-    ctkDICOMThumbnailWidget* widget = new ctkDICOMThumbnailWidget(d->scrollAreaContentWidget);
-    QString widgetLabel = QString("Image %1").arg(i++);
-    widget->setText( widgetLabel );
-    QPixmap pix(thumbnailFile);
-    logger.debug("Setting pixmap to " + thumbnailFile);
-    widget->setPixmap(pix);
-    flowLayout->addWidget(widget);
-  }
+void ctkDICOMThumbnailListWidget::onModelSelected(const QModelIndex &index){
+    Q_D(ctkDICOMThumbnailListWidget);
+
+    // Remove previous displayed thumbnails
+    QLayoutItem* item;
+    while(item = d->scrollAreaContentWidget->layout()->takeAt(0)){
+        item->widget()->deleteLater();
+    }
+
+    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 - 2
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.h

@@ -38,8 +38,8 @@ public:
   explicit ctkDICOMThumbnailListWidget(QWidget* parent=0);
   virtual ~ctkDICOMThumbnailListWidget();
 
-  void setThumbnailFiles(const QStringList& thumbnailFiles);
-  
+  void setDatabaseDirectory(const QString& directory);
+
 protected:
   QScopedPointer<ctkDICOMThumbnailListWidgetPrivate> d_ptr;
 
@@ -49,6 +49,9 @@ private:
 
 signals:
   void selected(const ctkDICOMThumbnailWidget& widget);
+
+public slots:
+  void onModelSelected(const QModelIndex& index);
 };
 
 #endif