瀏覽代碼

Display image preview on thumbnail selection

nherlambang 14 年之前
父節點
當前提交
4d9073a5af

+ 5 - 1
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -27,6 +27,7 @@
 
 #include "ctkDICOMQueryRetrieveWidget.h"
 #include "ctkDICOMImportWidget.h"
+#include "ctkDICOMThumbnailWidget.h"
 
 //logger
 #include <ctkLogger.h>
@@ -200,7 +201,10 @@ void ctkDICOMAppWidget::openQueryDialog()
 //----------------------------------------------------------------------------
 void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget)
 {
-  //TODO: update previewer
+    Q_D(ctkDICOMAppWidget);
+
+    logger.debug("Thumbnail selected");
+    d->imagePreview->onModelSelected(widget.sourceIndex());
 }
 
 //----------------------------------------------------------------------------

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

@@ -24,6 +24,7 @@
 #include <dcmimage.h>
 
 // CTK includes
+#include "ctkLogger.h"
 #include "ctkQImageView.h"
 #include "ctkDICOMImage.h"
 #include "ctkDICOMModel.h"
@@ -39,6 +40,8 @@
 #include <QPainter>
 #include <QFile>
 
+static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMDatasetView");
+
 //--------------------------------------------------------------------------
 class ctkDICOMDatasetViewPrivate 
 {
@@ -60,6 +63,7 @@ public:
   void onPatientModelSelected(const QModelIndex& index);
   void onStudyModelSelected(const QModelIndex& index);
   void onSeriesModelSelected(const QModelIndex& index);
+  void onImageModelSelected(const QModelIndex& index);
 };
 
 //--------------------------------------------------------------------------
@@ -82,6 +86,7 @@ void ctkDICOMDatasetViewPrivate::init()
   */
 }
 
+// -------------------------------------------------------------------------
 void ctkDICOMDatasetViewPrivate::onPatientModelSelected(const QModelIndex &index){
     Q_Q(ctkDICOMDatasetView);
 
@@ -112,6 +117,7 @@ void ctkDICOMDatasetViewPrivate::onPatientModelSelected(const QModelIndex &index
     }
 }
 
+// -------------------------------------------------------------------------
 void ctkDICOMDatasetViewPrivate::onStudyModelSelected(const QModelIndex &index){
     Q_Q(ctkDICOMDatasetView);
 
@@ -141,6 +147,7 @@ void ctkDICOMDatasetViewPrivate::onStudyModelSelected(const QModelIndex &index){
     }
 }
 
+// -------------------------------------------------------------------------
 void ctkDICOMDatasetViewPrivate::onSeriesModelSelected(const QModelIndex &index){
     Q_Q(ctkDICOMDatasetView);
 
@@ -171,6 +178,36 @@ void ctkDICOMDatasetViewPrivate::onSeriesModelSelected(const QModelIndex &index)
 }
 
 // -------------------------------------------------------------------------
+void ctkDICOMDatasetViewPrivate::onImageModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMDatasetView);
+
+    ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+
+    if(model){
+        QModelIndex imageIndex = index;
+        QModelIndex seriesIndex = imageIndex.parent();
+        QModelIndex studyIndex = seriesIndex.parent();
+
+        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 ),
     d_ptr( new ctkDICOMDatasetViewPrivate( *this ) )
@@ -232,11 +269,17 @@ void ctkDICOMDatasetView::onModelSelected(const QModelIndex &index){
         QModelIndex index0 = index.sibling(index.row(), 0);
 
         if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::PatientType ){
+            logger.debug("PatientType");
             d->onPatientModelSelected(index0);
         }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::StudyType ){
+            logger.debug("StudyType");
             d->onStudyModelSelected(index0);
         }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::SeriesType ){
+            logger.debug("SeriesType");
             d->onSeriesModelSelected(index0);
+        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == ctkDICOMModel::ImageType ){
+            logger.debug("ImageType");
+            d->onImageModelSelected(index0);
         }
     }
 }

+ 7 - 0
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.cpp

@@ -76,8 +76,10 @@ void ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelInde
                 QPixmap pix(thumbnail);
                 logger.debug("Setting pixmap to " + thumbnail);
                 widget->setPixmap(pix);
+                widget->setSourceIndex(studyIndex);
                 this->scrollAreaContentWidget->layout()->addWidget(widget);
                 q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
+                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));
             }else{
                 logger.error("No thumbnail file " + thumbnail);
             }
@@ -111,8 +113,10 @@ void ctkDICOMThumbnailListWidgetPrivate::onStudyModelSelected(const QModelIndex
                 QPixmap pix(thumbnail);
                 logger.debug("Setting pixmap to " + thumbnail);
                 widget->setPixmap(pix);
+                widget->setSourceIndex(seriesIndex);
                 this->scrollAreaContentWidget->layout()->addWidget(widget);
                 q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
+                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));
             }else{
                 logger.error("No thumbnail file " + thumbnail);
             }
@@ -149,8 +153,10 @@ void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex
                 QPixmap pix(thumbnail);
                 logger.debug("Setting pixmap to " + thumbnail);
                 widget->setPixmap(pix);
+                widget->setSourceIndex(imageIndex);
                 this->scrollAreaContentWidget->layout()->addWidget(widget);
                 q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
+                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));
             }
             else
             {
@@ -169,6 +175,7 @@ void ctkDICOMThumbnailListWidgetPrivate::clearAllThumbnails(){
         ctkDICOMThumbnailWidget* thumbnailWidget = qobject_cast<ctkDICOMThumbnailWidget*>(item->widget());
         if(thumbnailWidget){
             q->disconnect(thumbnailWidget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
+            q->disconnect(thumbnailWidget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SIGNAL(selected(ctkDICOMThumbnailWidget)));
         }
         item->widget()->deleteLater();
     }

+ 16 - 5
Libs/DICOM/Widgets/ctkDICOMThumbnailWidget.cpp

@@ -41,6 +41,8 @@ public:
     bool selectedFlag;
 
     QColor backgroundColor;
+
+    QModelIndex sourceIndex;
 };
 
 //----------------------------------------------------------------------------
@@ -51,11 +53,6 @@ ctkDICOMThumbnailWidgetPrivate::ctkDICOMThumbnailWidgetPrivate(ctkDICOMThumbnail
 
     this->selectedFlag = false;
     this->backgroundColor = Qt::blue;
-
-    QPalette p(q->palette());
-    p.setColor(QPalette::Window, this->backgroundColor);
-    q->setPalette(p);
-    q->setBackgroundRole(QPalette::Window);
 }
 
 //----------------------------------------------------------------------------
@@ -107,6 +104,20 @@ const QPixmap* ctkDICOMThumbnailWidget::pixmap()const
 }
 
 //----------------------------------------------------------------------------
+void ctkDICOMThumbnailWidget::setSourceIndex(QModelIndex index){
+    Q_D(ctkDICOMThumbnailWidget);
+
+    d->sourceIndex = index;
+}
+
+//----------------------------------------------------------------------------
+QModelIndex ctkDICOMThumbnailWidget::sourceIndex() const{
+    Q_D(const ctkDICOMThumbnailWidget);
+
+    return d->sourceIndex;
+}
+
+//----------------------------------------------------------------------------
 void ctkDICOMThumbnailWidget::setSelected(bool selected){
     Q_D(ctkDICOMThumbnailWidget);
 

+ 4 - 0
Libs/DICOM/Widgets/ctkDICOMThumbnailWidget.h

@@ -23,6 +23,7 @@
 
 // Qt includes 
 #include <QWidget>
+#include <QModelIndex>
 
 #include "ctkDICOMWidgetsExport.h"
 
@@ -47,6 +48,9 @@ public:
   void setSelected(bool selected);
   bool isSelected();
 
+  void setSourceIndex(QModelIndex index);
+  QModelIndex sourceIndex() const;
+
 protected:
   QScopedPointer<ctkDICOMThumbnailWidgetPrivate> d_ptr;