Forráskód Böngészése

Add functionality to adjust the size of thumbnails with slider bar

nherlambang 14 éve
szülő
commit
f4735d18d5

+ 1 - 1
Libs/DICOM/Core/ctkDICOMModel.cpp

@@ -476,7 +476,7 @@ Qt::ItemFlags ctkDICOMModel::flags ( const QModelIndex & modelIndex ) const
     {
     return indexFlags;
     }
-  bool checkable = false;
+  bool checkable = true;
   node->Data[Qt::CheckStateRole].toInt(&checkable);
   indexFlags = indexFlags | (checkable ? Qt::ItemIsUserCheckable : Qt::NoItemFlags);
   return indexFlags;

+ 90 - 14
Libs/DICOM/Widgets/Resources/UI/ctkDICOMAppWidget.ui

@@ -111,6 +111,9 @@
       </layout>
      </item>
      <item>
+      <layout class="QHBoxLayout" name="horizontalLayout"/>
+     </item>
+     <item>
       <widget class="QFrame" name="UserFrame">
        <property name="frameShape">
         <enum>QFrame::StyledPanel</enum>
@@ -123,20 +126,76 @@
      <item>
       <layout class="QHBoxLayout" name="ViewerLayout">
        <item>
-        <widget class="ctkDICOMThumbnailListWidget" name="ThumbnailsWidget" native="true">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="minimumSize">
-          <size>
-           <width>0</width>
-           <height>200</height>
-          </size>
-         </property>
-        </widget>
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <item>
+          <widget class="ctkDICOMThumbnailListWidget" name="ThumbnailsWidget" native="true">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>0</width>
+             <height>200</height>
+            </size>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_3">
+           <item>
+            <spacer name="horizontalSpacer">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QSlider" name="ThumbnailWidthSlider">
+             <property name="maximumSize">
+              <size>
+               <width>200</width>
+               <height>16777215</height>
+              </size>
+             </property>
+             <property name="minimum">
+              <number>64</number>
+             </property>
+             <property name="maximum">
+              <number>256</number>
+             </property>
+             <property name="value">
+              <number>128</number>
+             </property>
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_2">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
+         </item>
+        </layout>
        </item>
        <item>
         <widget class="QFrame" name="PreviewFrame">
@@ -555,6 +614,22 @@
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>ThumbnailWidthSlider</sender>
+   <signal>valueChanged(int)</signal>
+   <receiver>ctkDICOMAppWidget</receiver>
+   <slot>onThumbnailWidthSliderValueChanged(int)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>236</x>
+     <y>610</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>369</x>
+     <y>318</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <signal>signal1()</signal>
@@ -569,5 +644,6 @@
   <slot>onNextStudy()</slot>
   <slot>onPreviousStudy()</slot>
   <slot>onAutoPlayCheckboxStateChanged(int)</slot>
+  <slot>onThumbnailWidthSliderValueChanged(int)</slot>
  </slots>
 </ui>

+ 6 - 0
Libs/DICOM/Widgets/Resources/UI/ctkDICOMThumbnailWidget.ui

@@ -17,6 +17,12 @@
    <string notr="true">background-color:white</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_2">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>4</number>
+   </property>
    <item>
     <widget class="QLabel" name="TextLabel">
      <property name="minimumSize">

+ 164 - 126
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -29,6 +29,7 @@
 #include <QDebug>
 #include <QModelIndex>
 #include <QSettings>
+#include <QSlider>
 #include <QTabBar>
 #include <QTimer>
 #include <QTreeView>
@@ -115,6 +116,8 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   d->DICOMProxyModel.setSourceModel(&d->DICOMModel);
   d->TreeView->setModel(&d->DICOMModel);
 
+  d->ThumbnailsWidget->setThumbnailWidth(d->ThumbnailWidthSlider->value());
+
   connect(d->TreeView, SIGNAL(collapsed(QModelIndex)), this, SLOT(onTreeCollapsed(QModelIndex)));
   connect(d->TreeView, SIGNAL(expanded(QModelIndex)), this, SLOT(onTreeExpanded(QModelIndex)));
 
@@ -157,7 +160,7 @@ ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
   connect(d->ThumbnailsWidget, SIGNAL(doubleClicked(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailDoubleClicked(const ctkDICOMThumbnailWidget&)));
   connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
 
-  connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
+  //connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
   connect(d->QueryRetrieveWidget, SIGNAL( canceled() ), d->QueryRetrieveWidget, SLOT( hide() ) );
 
   connect(d->imagePreview, SIGNAL(requestNextImage()), this, SLOT(onNextImage()));
@@ -193,13 +196,16 @@ void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
   
   //open DICOM database on the directory
   QString databaseFileName = directory + QString("/ctkDICOM.sql");
-  try { d->DICOMDatabase->openDatabase( databaseFileName ); }
+  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->DICOMModel.setDisplayLevel(ctkDICOMModel::SeriesType);
@@ -268,18 +274,18 @@ void ctkDICOMAppWidget::onThumbnailDoubleClicked(const ctkDICOMThumbnailWidget&
 {
     Q_D(ctkDICOMAppWidget);
 
-    logger.debug("double clicked");
     QModelIndex index = widget.sourceIndex();
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
     QModelIndex index0 = index.sibling(index.row(), 0);
 
-    if(model && (model->data(index0,ctkDICOMModel::TypeRole) != static_cast<int>(ctkDICOMModel::ImageType))){
+    if(model && (model->data(index0,ctkDICOMModel::TypeRole) != static_cast<int>(ctkDICOMModel::ImageType)))
+      {
         this->onModelSelected(index0);
         d->TreeView->setCurrentIndex(index0);
         d->ThumbnailsWidget->onModelSelected(index0);
         d->imagePreview->onModelSelected(index0);
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -287,13 +293,13 @@ 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();
-    }
+      {
+      targetDirectory = d->DICOMDatabase->databaseDirectory();
+      }
     d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
     d->DICOMModel.reset();
   }
@@ -301,50 +307,60 @@ void ctkDICOMAppWidget::onImportDirectory(QString directory)
 
 //----------------------------------------------------------------------------
 void ctkDICOMAppWidget::onModelSelected(const QModelIndex &index){
-    Q_D(ctkDICOMAppWidget);
+Q_D(ctkDICOMAppWidget);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
-    if(model){
+    if(model)
+      {
         QModelIndex index0 = index.sibling(index.row(), 0);
 
-        if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType) ){
-            d->NextImageButton->show();
-            d->PrevImageButton->show();
-            d->NextSeriesButton->show();
-            d->PrevSeriesButton->show();
-            d->NextStudyButton->show();
-            d->PrevStudyButton->show();
-        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType) ){
-            d->NextImageButton->show();
-            d->PrevImageButton->show();
-            d->NextSeriesButton->show();
-            d->PrevSeriesButton->show();
-            d->NextStudyButton->hide();
-            d->PrevStudyButton->hide();
-        }else if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType) ){
-            d->NextImageButton->show();
-            d->PrevImageButton->show();
-            d->NextSeriesButton->hide();
-            d->PrevSeriesButton->hide();
-            d->NextStudyButton->hide();
-            d->PrevStudyButton->hide();
-        }else{
-            d->NextImageButton->hide();
-            d->PrevImageButton->hide();
-            d->NextSeriesButton->hide();
-            d->PrevSeriesButton->hide();
-            d->NextStudyButton->hide();
-            d->PrevStudyButton->hide();
+        if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::PatientType) )
+          {
+          d->NextImageButton->show();
+          d->PrevImageButton->show();
+          d->NextSeriesButton->show();
+          d->PrevSeriesButton->show();
+          d->NextStudyButton->show();
+          d->PrevStudyButton->show();
+          }
+        else if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::StudyType) )
+          {
+          d->NextImageButton->show();
+          d->PrevImageButton->show();
+          d->NextSeriesButton->show();
+          d->PrevSeriesButton->show();
+          d->NextStudyButton->hide();
+          d->PrevStudyButton->hide();
+          }
+        else if ( model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType) )
+          {
+          d->NextImageButton->show();
+          d->PrevImageButton->show();
+          d->NextSeriesButton->hide();
+          d->PrevSeriesButton->hide();
+          d->NextStudyButton->hide();
+          d->PrevStudyButton->hide();
+          }
+        else
+          {
+          d->NextImageButton->hide();
+          d->PrevImageButton->hide();
+          d->NextSeriesButton->hide();
+          d->PrevSeriesButton->hide();
+          d->NextStudyButton->hide();
+          d->PrevStudyButton->hide();
+          }
         }
-    }else{
+      else
+        {
         d->NextImageButton->hide();
         d->PrevImageButton->hide();
         d->NextSeriesButton->hide();
         d->PrevSeriesButton->hide();
         d->NextStudyButton->hide();
         d->PrevStudyButton->hide();
-    }
+        }
 }
 
 //----------------------------------------------------------------------------
@@ -353,23 +369,25 @@ void ctkDICOMAppWidget::onNextImage(){
 
     QModelIndex currentIndex = d->imagePreview->currentImageIndex();
 
-    if(currentIndex.isValid()){
-        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
+    if(currentIndex.isValid())
+      {
+      ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-        if(model){
-            QModelIndex seriesIndex = currentIndex.parent();
+      if(model)
+        {
+        QModelIndex seriesIndex = currentIndex.parent();
 
-            int imageCount = model->rowCount(seriesIndex);
-            int imageID = currentIndex.row();
+        int imageCount = model->rowCount(seriesIndex);
+        int imageID = currentIndex.row();
 
-            imageID = (imageID+1)%imageCount;
+        imageID = (imageID+1)%imageCount;
 
-            QModelIndex nextIndex = currentIndex.sibling(imageID, 0);
+        QModelIndex nextIndex = currentIndex.sibling(imageID, 0);
 
-            d->imagePreview->onModelSelected(nextIndex);
-            d->ThumbnailsWidget->selectThumbnail(nextIndex);
+        d->imagePreview->onModelSelected(nextIndex);
+        d->ThumbnailsWidget->selectThumbnail(nextIndex);
         }
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -378,24 +396,26 @@ void ctkDICOMAppWidget::onPreviousImage(){
 
     QModelIndex currentIndex = d->imagePreview->currentImageIndex();
 
-    if(currentIndex.isValid()){
-        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
+    if(currentIndex.isValid())
+      {
+      ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-        if(model){
-            QModelIndex seriesIndex = currentIndex.parent();
+      if(model)
+        {
+        QModelIndex seriesIndex = currentIndex.parent();
 
-            int imageCount = model->rowCount(seriesIndex);
-            int imageID = currentIndex.row();
+        int imageCount = model->rowCount(seriesIndex);
+        int imageID = currentIndex.row();
 
-            imageID--;
-            if(imageID < 0) imageID += imageCount;
+        imageID--;
+        if(imageID < 0) imageID += imageCount;
 
-            QModelIndex prevIndex = currentIndex.sibling(imageID, 0);
+        QModelIndex prevIndex = currentIndex.sibling(imageID, 0);
 
-            d->imagePreview->onModelSelected(prevIndex);
-            d->ThumbnailsWidget->selectThumbnail(prevIndex);
+        d->imagePreview->onModelSelected(prevIndex);
+        d->ThumbnailsWidget->selectThumbnail(prevIndex);
         }
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -404,24 +424,26 @@ void ctkDICOMAppWidget::onNextSeries(){
 
     QModelIndex currentIndex = d->imagePreview->currentImageIndex();
 
-    if(currentIndex.isValid()){
-        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
+    if(currentIndex.isValid())
+      {
+      ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-        if(model){
-            QModelIndex seriesIndex = currentIndex.parent();
-            QModelIndex studyIndex = seriesIndex.parent();
+      if(model)
+        {
+        QModelIndex seriesIndex = currentIndex.parent();
+        QModelIndex studyIndex = seriesIndex.parent();
 
-            int seriesCount = model->rowCount(studyIndex);
-            int seriesID = seriesIndex.row();
+        int seriesCount = model->rowCount(studyIndex);
+        int seriesID = seriesIndex.row();
 
-            seriesID = (seriesID + 1)%seriesCount;
+        seriesID = (seriesID + 1)%seriesCount;
 
-            QModelIndex nextIndex = seriesIndex.sibling(seriesID, 0);
+        QModelIndex nextIndex = seriesIndex.sibling(seriesID, 0);
 
-            d->imagePreview->onModelSelected(nextIndex);
-            d->ThumbnailsWidget->selectThumbnail(nextIndex);
+        d->imagePreview->onModelSelected(nextIndex);
+        d->ThumbnailsWidget->selectThumbnail(nextIndex);
         }
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -430,25 +452,27 @@ void ctkDICOMAppWidget::onPreviousSeries(){
 
     QModelIndex currentIndex = d->imagePreview->currentImageIndex();
 
-    if(currentIndex.isValid()){
-        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
+    if(currentIndex.isValid())
+      {
+      ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-        if(model){
-            QModelIndex seriesIndex = currentIndex.parent();
-            QModelIndex studyIndex = seriesIndex.parent();
+      if(model)
+        {
+        QModelIndex seriesIndex = currentIndex.parent();
+        QModelIndex studyIndex = seriesIndex.parent();
 
-            int seriesCount = model->rowCount(studyIndex);
-            int seriesID = seriesIndex.row();
+        int seriesCount = model->rowCount(studyIndex);
+        int seriesID = seriesIndex.row();
 
-            seriesID--;
-            if(seriesID < 0) seriesID += seriesCount;
+        seriesID--;
+        if(seriesID < 0) seriesID += seriesCount;
 
-            QModelIndex prevIndex = seriesIndex.sibling(seriesID, 0);
+        QModelIndex prevIndex = seriesIndex.sibling(seriesID, 0);
 
-            d->imagePreview->onModelSelected(prevIndex);
-            d->ThumbnailsWidget->selectThumbnail(prevIndex);
+        d->imagePreview->onModelSelected(prevIndex);
+        d->ThumbnailsWidget->selectThumbnail(prevIndex);
         }
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -457,25 +481,27 @@ void ctkDICOMAppWidget::onNextStudy(){
 
     QModelIndex currentIndex = d->imagePreview->currentImageIndex();
 
-    if(currentIndex.isValid()){
-        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
+    if(currentIndex.isValid())
+      {
+      ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-        if(model){
-            QModelIndex seriesIndex = currentIndex.parent();
-            QModelIndex studyIndex = seriesIndex.parent();
-            QModelIndex patientIndex = studyIndex.parent();
+      if(model)
+        {
+        QModelIndex seriesIndex = currentIndex.parent();
+        QModelIndex studyIndex = seriesIndex.parent();
+        QModelIndex patientIndex = studyIndex.parent();
 
-            int studyCount = model->rowCount(patientIndex);
-            int studyID = studyIndex.row();
+        int studyCount = model->rowCount(patientIndex);
+        int studyID = studyIndex.row();
 
-            studyID = (studyID + 1)%studyCount;
+        studyID = (studyID + 1)%studyCount;
 
-            QModelIndex nextIndex = studyIndex.sibling(studyID, 0);
+        QModelIndex nextIndex = studyIndex.sibling(studyID, 0);
 
-            d->imagePreview->onModelSelected(nextIndex);
-            d->ThumbnailsWidget->selectThumbnail(nextIndex);
+        d->imagePreview->onModelSelected(nextIndex);
+        d->ThumbnailsWidget->selectThumbnail(nextIndex);
         }
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -484,26 +510,28 @@ void ctkDICOMAppWidget::onPreviousStudy(){
 
     QModelIndex currentIndex = d->imagePreview->currentImageIndex();
 
-    if(currentIndex.isValid()){
-        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
+    if(currentIndex.isValid())
+      {
+      ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(currentIndex.model()));
 
-        if(model){
-            QModelIndex seriesIndex = currentIndex.parent();
-            QModelIndex studyIndex = seriesIndex.parent();
-            QModelIndex patientIndex = studyIndex.parent();
+      if(model)
+        {
+        QModelIndex seriesIndex = currentIndex.parent();
+        QModelIndex studyIndex = seriesIndex.parent();
+        QModelIndex patientIndex = studyIndex.parent();
 
-            int studyCount = model->rowCount(patientIndex);
-            int studyID = studyIndex.row();
+        int studyCount = model->rowCount(patientIndex);
+        int studyID = studyIndex.row();
 
-            studyID--;
-            if(studyID < 0) studyID += studyCount;
+        studyID--;
+        if(studyID < 0) studyID += studyCount;
 
-            QModelIndex prevIndex = studyIndex.sibling(studyID, 0);
+        QModelIndex prevIndex = studyIndex.sibling(studyID, 0);
 
-            d->imagePreview->onModelSelected(prevIndex);
-            d->ThumbnailsWidget->selectThumbnail(prevIndex);
+        d->imagePreview->onModelSelected(prevIndex);
+        d->ThumbnailsWidget->selectThumbnail(prevIndex);
         }
-    }
+      }
 }
 
 //----------------------------------------------------------------------------
@@ -524,16 +552,26 @@ void ctkDICOMAppWidget::onTreeExpanded(const QModelIndex &index){
 void ctkDICOMAppWidget::onAutoPlayCheckboxStateChanged(int state){
     Q_D(ctkDICOMAppWidget);
 
-    if(state == 0){ //OFF
-        disconnect(d->AutoPlayTimer, SIGNAL(timeout()), this, SLOT(onAutoPlayTimer()));
-        d->AutoPlayTimer->deleteLater();
-    }else if(state == 2){ //ON
-        d->AutoPlayTimer = new QTimer(this);
-        connect(d->AutoPlayTimer, SIGNAL(timeout()), this, SLOT(onAutoPlayTimer()));
-        d->AutoPlayTimer->start(50);
-    }
+    if(state == 0) //OFF
+      {
+      disconnect(d->AutoPlayTimer, SIGNAL(timeout()), this, SLOT(onAutoPlayTimer()));
+      d->AutoPlayTimer->deleteLater();
+      }
+    else if(state == 2) //ON
+      {
+      d->AutoPlayTimer = new QTimer(this);
+      connect(d->AutoPlayTimer, SIGNAL(timeout()), this, SLOT(onAutoPlayTimer()));
+      d->AutoPlayTimer->start(50);
+      }
 }
 
+//----------------------------------------------------------------------------
 void ctkDICOMAppWidget::onAutoPlayTimer(){
     this->onNextImage();
 }
+
+//----------------------------------------------------------------------------
+void ctkDICOMAppWidget::onThumbnailWidthSliderValueChanged(int val){
+  Q_D(ctkDICOMAppWidget);
+  d->ThumbnailsWidget->setThumbnailWidth(val);
+}

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

@@ -83,9 +83,12 @@ protected slots:
     /// To be called when auto-play checkbox state changed
     void onAutoPlayCheckboxStateChanged(int state);
 
-
+    /// Called by timer for auto-play functionality
     void onAutoPlayTimer();
 
+    /// To be called when the value of thumbnail size slider bar is changed
+    void onThumbnailWidthSliderValueChanged(int val);
+
 private:
   Q_DECLARE_PRIVATE(ctkDICOMAppWidget);
   Q_DISABLE_COPY(ctkDICOMAppWidget);

+ 1 - 1
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -21,11 +21,11 @@
 //Qt includes
 #include <QDebug>
 #include <QLabel>
+#include <QMessageBox>
 #include <QProgressDialog>
 #include <QSettings>
 #include <QTreeView>
 #include <QTabBar>
-#include <QMessageBox>
 
 /// CTK includes
 #include <ctkCheckableHeaderView.h>

+ 1 - 1
Libs/DICOM/Widgets/ctkDICOMThumbnailGenerator.cpp

@@ -61,7 +61,7 @@ ctkDICOMThumbnailGeneratorPrivate::~ctkDICOMThumbnailGeneratorPrivate()
 ctkDICOMThumbnailGenerator::ctkDICOMThumbnailGenerator(QObject* parentValue)
   : d_ptr(new ctkDICOMThumbnailGeneratorPrivate(*this))
 {
-
+  Q_UNUSED(parentValue);
 }
 
 //------------------------------------------------------------------------------

+ 33 - 3
Libs/DICOM/Widgets/ctkDICOMThumbnailListWidget.cpp

@@ -56,13 +56,13 @@ static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMThumbnailListWidget"
 class ctkDICOMThumbnailListWidgetPrivate: public Ui_ctkDICOMThumbnailListWidget
 {
 public:
-  ctkDICOMThumbnailListWidgetPrivate(ctkDICOMThumbnailListWidget* parent): q_ptr(parent){
-    
-  }
+  ctkDICOMThumbnailListWidgetPrivate(ctkDICOMThumbnailListWidget* parent);
 
   QString DatabaseDirectory;
   QModelIndex CurrentSelectedModel;
 
+  int ThumbnailWidth;
+
   void clearAllThumbnails();
   void addThumbnailWidget(const QModelIndex &imageIndex, const QModelIndex& sourceIndex, const QString& text);
 
@@ -77,6 +77,12 @@ public:
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailListWidgetPrivate methods
 
+//----------------------------------------------------------------------------
+ctkDICOMThumbnailListWidgetPrivate::ctkDICOMThumbnailListWidgetPrivate(ctkDICOMThumbnailListWidget* parent): q_ptr(parent){
+  this->ThumbnailWidth = -1;
+}
+
+//----------------------------------------------------------------------------
 void ctkDICOMThumbnailListWidgetPrivate::onPatientModelSelected(const QModelIndex &index){
     QModelIndex patientIndex = index;
 
@@ -205,9 +211,14 @@ void ctkDICOMThumbnailListWidgetPrivate::addThumbnailWidget(const QModelIndex& i
         widget->setText( widgetLabel );
         QPixmap pix(thumbnailPath);
         logger.debug("Setting pixmap to " + thumbnailPath);
+        if(this->ThumbnailWidth > 0){
+          widget->setMaximumWidth(this->ThumbnailWidth);
+          widget->setMinimumWidth(this->ThumbnailWidth);
+        }
         widget->setPixmap(pix);
         widget->setSourceIndex(sourceIndex);
         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)));
         q->connect(widget, SIGNAL(doubleClicked(ctkDICOMThumbnailWidget)), q, SIGNAL(doubleClicked(ctkDICOMThumbnailWidget)));
@@ -226,6 +237,7 @@ ctkDICOMThumbnailListWidget::ctkDICOMThumbnailListWidget(QWidget* _parent):Super
     d->setupUi(this);
 
     d->ScrollAreaContentWidget->setLayout(new ctkFlowLayout);
+    qobject_cast<ctkFlowLayout*>(d->ScrollAreaContentWidget->layout())->setHorizontalSpacing(4);
 }
 
 //----------------------------------------------------------------------------
@@ -339,3 +351,21 @@ void ctkDICOMThumbnailListWidget::onThumbnailSelected(const ctkDICOMThumbnailWid
         }
     }
 }
+
+//----------------------------------------------------------------------------
+void ctkDICOMThumbnailListWidget::setThumbnailWidth(int width){
+  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)
+      {
+        if(width > 0){
+          thumbnailWidget->setMaximumWidth(width);
+          thumbnailWidget->setMinimumWidth(width);
+        }
+      }
+    }
+
+  d->ThumbnailWidth = width;
+}

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

@@ -57,6 +57,8 @@ signals:
 public slots:
   void onModelSelected(const QModelIndex& index);
   void onThumbnailSelected(const ctkDICOMThumbnailWidget& widget);
+
+  void setThumbnailWidth(int width);
 };
 
 #endif

+ 21 - 4
Libs/DICOM/Widgets/ctkDICOMThumbnailWidget.cpp

@@ -43,15 +43,18 @@ public:
     ctkDICOMThumbnailWidgetPrivate(ctkDICOMThumbnailWidget* parent);
 
     bool SelectedFlag;
-
     QColor BackgroundColor;
-
     QModelIndex SourceIndex;
+    QPixmap OriginalThumbnail;
+
+    // Redraw thumbnail
+    void updateThumbnail();
 };
 
 //----------------------------------------------------------------------------
 // ctkDICOMThumbnailWidgetPrivate methods
 
+//----------------------------------------------------------------------------
 ctkDICOMThumbnailWidgetPrivate::ctkDICOMThumbnailWidgetPrivate(ctkDICOMThumbnailWidget* parent): q_ptr(parent){
     Q_Q(ctkDICOMThumbnailWidget);
 
@@ -60,6 +63,11 @@ ctkDICOMThumbnailWidgetPrivate::ctkDICOMThumbnailWidgetPrivate(ctkDICOMThumbnail
 }
 
 //----------------------------------------------------------------------------
+void ctkDICOMThumbnailWidgetPrivate::updateThumbnail(){
+    this->PixmapLabel->setPixmap(this->OriginalThumbnail.scaledToWidth(this->PixmapLabel->width()));
+}
+
+//----------------------------------------------------------------------------
 // ctkDICOMThumbnailWidget methods
 
 //----------------------------------------------------------------------------
@@ -97,7 +105,8 @@ void ctkDICOMThumbnailWidget::setPixmap(const QPixmap &pixmap)
 {
   Q_D(ctkDICOMThumbnailWidget);
 
-  d->PixmapLabel->setPixmap(pixmap);
+  d->OriginalThumbnail = pixmap;
+  d->updateThumbnail();
 }
 
 //----------------------------------------------------------------------------
@@ -105,7 +114,7 @@ const QPixmap* ctkDICOMThumbnailWidget::pixmap()const
 {
   Q_D(const ctkDICOMThumbnailWidget);
 
-  return d->PixmapLabel->pixmap();
+  return &(d->OriginalThumbnail);
 }
 
 //----------------------------------------------------------------------------
@@ -160,3 +169,11 @@ void ctkDICOMThumbnailWidget::mouseDoubleClickEvent(QMouseEvent *event){
     Q_UNUSED(event);
     emit doubleClicked(*this);
 }
+
+//----------------------------------------------------------------------------
+void ctkDICOMThumbnailWidget::resizeEvent(QResizeEvent *event){
+  Q_D(ctkDICOMThumbnailWidget);
+  Q_UNUSED(event);
+
+  d->updateThumbnail();
+}

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

@@ -57,6 +57,8 @@ protected:
   virtual void mousePressEvent(QMouseEvent* event);
   virtual void mouseDoubleClickEvent(QMouseEvent* event);
 
+  virtual void resizeEvent(QResizeEvent* event);
+
 private:
   Q_DECLARE_PRIVATE(ctkDICOMThumbnailWidget);
   Q_DISABLE_COPY(ctkDICOMThumbnailWidget);