瀏覽代碼

Implement background color of selected thumbnail

nherlambang 14 年之前
父節點
當前提交
b4bd4f4227

+ 47 - 12
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.cpp

@@ -36,6 +36,8 @@ public:
 
   QString databaseDirectory;
 
+  void clearAllThumbnails();
+
   void onPatientModelSelected(const QModelIndex &index);
   void onStudyModelSelected(const QModelIndex &index);
   void onSeriesModelSelected(const QModelIndex &index);
@@ -48,6 +50,8 @@ public:
 // ctkDICOMThumbnailListWidgetPrivate methods
 
 void ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMThumbnailListWidget);
+
     QModelIndex patientIndex = index;
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
@@ -68,12 +72,12 @@ void ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelInde
 
             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);
+                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
             }else{
                 logger.error("No thumbnail file " + thumbnail);
             }
@@ -82,6 +86,8 @@ void ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelInde
 }
 
 void ctkDICOMThumbnailListWidgetPrivate::onStudyModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMThumbnailListWidget);
+
     QModelIndex studyIndex = index;
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
@@ -101,12 +107,12 @@ void ctkDICOMThumbnailListWidgetPrivate::onStudyModelSelected(const QModelIndex
 
             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);
+                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
             }else{
                 logger.error("No thumbnail file " + thumbnail);
             }
@@ -115,6 +121,8 @@ void ctkDICOMThumbnailListWidgetPrivate::onStudyModelSelected(const QModelIndex
 }
 
 void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMThumbnailListWidget);
+
     QModelIndex studyIndex = index.parent();
     QModelIndex seriesIndex = index;
 
@@ -142,6 +150,7 @@ void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex
                 logger.debug("Setting pixmap to " + thumbnail);
                 widget->setPixmap(pix);
                 this->scrollAreaContentWidget->layout()->addWidget(widget);
+                q->connect(widget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
             }
             else
             {
@@ -151,6 +160,20 @@ void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex
     }
 }
 
+void ctkDICOMThumbnailListWidgetPrivate::clearAllThumbnails(){
+    Q_Q(ctkDICOMThumbnailListWidget);
+
+    // Remove previous displayed thumbnails
+    QLayoutItem* item;
+    while(item = this->scrollAreaContentWidget->layout()->takeAt(0)){
+        ctkDICOMThumbnailWidget* thumbnailWidget = qobject_cast<ctkDICOMThumbnailWidget*>(item->widget());
+        if(thumbnailWidget){
+            q->disconnect(thumbnailWidget, SIGNAL(selected(ctkDICOMThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkDICOMThumbnailWidget)));
+        }
+        item->widget()->deleteLater();
+    }
+}
+
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailListWidget methods
 
@@ -158,33 +181,33 @@ void ctkDICOMThumbnailListWidgetPrivate::onSeriesModelSelected(const QModelIndex
 ctkDICOMThumbnailListWidget::ctkDICOMThumbnailListWidget(QWidget* _parent):Superclass(_parent), 
 									   d_ptr(new ctkDICOMThumbnailListWidgetPrivate(this))
 {
-  Q_D(ctkDICOMThumbnailListWidget);
-  
-  d->setupUi(this);
+    Q_D(ctkDICOMThumbnailListWidget);
+
+    d->setupUi(this);
 
-  d->scrollAreaContentWidget->setLayout(new ctkFlowLayout);
+    d->scrollAreaContentWidget->setLayout(new ctkFlowLayout);
 }
 
 //----------------------------------------------------------------------------
 ctkDICOMThumbnailListWidget::~ctkDICOMThumbnailListWidget()
 {
-  
+    Q_D(ctkDICOMThumbnailListWidget);
+
+    d->clearAllThumbnails();
 }
 
+//----------------------------------------------------------------------------
 void ctkDICOMThumbnailListWidget::setDatabaseDirectory(const QString &directory){
     Q_D(ctkDICOMThumbnailListWidget);
 
     d->databaseDirectory = directory;
 }
 
+//----------------------------------------------------------------------------
 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();
-    }
+    d->clearAllThumbnails();
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
@@ -200,3 +223,15 @@ void ctkDICOMThumbnailListWidget::onModelSelected(const QModelIndex &index){
         }
     }
 }
+
+//----------------------------------------------------------------------------
+void ctkDICOMThumbnailListWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget &widget){
+    Q_D(ctkDICOMThumbnailListWidget);
+    for(int i=0; i<d->scrollAreaContentWidget->layout()->count(); i++){
+        ctkDICOMThumbnailWidget* thumbnailWidget = qobject_cast<ctkDICOMThumbnailWidget*>(d->scrollAreaContentWidget->layout()->itemAt(i)->widget());
+        if(thumbnailWidget && (&widget != thumbnailWidget)){
+            thumbnailWidget->setSelected(false);
+        }
+    }
+}
+

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

@@ -52,6 +52,7 @@ signals:
 
 public slots:
   void onModelSelected(const QModelIndex& index);
+  void onThumbnailSelected(const ctkDICOMThumbnailWidget& widget);
 };
 
 #endif

+ 51 - 3
Libs/DICOM/Widgets/ctkDICOMThumbnailWidget.cpp

@@ -25,15 +25,38 @@
 // STD includes
 #include <iostream>
 
+// Qt includes
+#include <QColor>
+
 //----------------------------------------------------------------------------
 class ctkDICOMThumbnailWidgetPrivate: public Ui_ctkDICOMThumbnailWidget
 {
 public:
+    ctkDICOMThumbnailWidget* const q_ptr;
+    Q_DECLARE_PUBLIC(ctkDICOMThumbnailWidget);
+
+    // Constructor
+    ctkDICOMThumbnailWidgetPrivate(ctkDICOMThumbnailWidget* parent);
+
+    bool selectedFlag;
+
+    QColor backgroundColor;
 };
 
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailWidgetPrivate methods
 
+ctkDICOMThumbnailWidgetPrivate::ctkDICOMThumbnailWidgetPrivate(ctkDICOMThumbnailWidget* parent): q_ptr(parent){
+    Q_Q(ctkDICOMThumbnailWidget);
+
+    this->selectedFlag = false;
+    this->backgroundColor = Qt::blue;
+
+    QPalette p(q->palette());
+    p.setColor(QPalette::Window, this->backgroundColor);
+    q->setPalette(p);
+    q->setBackgroundRole(QPalette::Window);
+}
 
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailWidget methods
@@ -41,7 +64,7 @@ public:
 //----------------------------------------------------------------------------
 ctkDICOMThumbnailWidget::ctkDICOMThumbnailWidget(QWidget* parentWidget)
   : Superclass(parentWidget)
-  , d_ptr(new ctkDICOMThumbnailWidgetPrivate)
+  , d_ptr(new ctkDICOMThumbnailWidgetPrivate(this))
 {
   Q_D(ctkDICOMThumbnailWidget);
 
@@ -84,8 +107,33 @@ const QPixmap* ctkDICOMThumbnailWidget::pixmap()const
 }
 
 //----------------------------------------------------------------------------
+void ctkDICOMThumbnailWidget::setSelected(bool selected){
+    Q_D(ctkDICOMThumbnailWidget);
+
+    if(selected == d->selectedFlag)return;
+
+    if(selected){
+        QPalette p(this->palette());
+        p.setColor(QPalette::Window, d->backgroundColor);
+        this->setPalette(p);
+        this->setAutoFillBackground(true);
+    }else{
+        this->setAutoFillBackground(false);
+    }
+
+    d->selectedFlag = selected;
+}
+
+//----------------------------------------------------------------------------
+bool ctkDICOMThumbnailWidget::isSelected(){
+    Q_D(ctkDICOMThumbnailWidget);
+    return d->selectedFlag;
+}
+
+//----------------------------------------------------------------------------
 void ctkDICOMThumbnailWidget::mousePressEvent(QMouseEvent* event)
 {
-  Q_UNUSED(event);
-  emit selected(*this);
+    Q_UNUSED(event);
+    this->setSelected(true);
+    emit selected(*this);
 }

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

@@ -44,6 +44,9 @@ public:
   void setPixmap(const QPixmap& pixmap);
   const QPixmap* pixmap()const;
 
+  void setSelected(bool selected);
+  bool isSelected();
+
 protected:
   QScopedPointer<ctkDICOMThumbnailWidgetPrivate> d_ptr;