Selaa lähdekoodia

Add progress dialog with cancel to import

Indexer already had signals for progress,
but dialog needed to be hooked up and
cancel enabled -- uses QApplication::processEvents
which I believe is safe since the progress
dialog is modal (didn't see any other method
to make the cancel button active)
Steve Pieper 13 vuotta sitten
vanhempi
commit
05ea3bd51f

+ 27 - 0
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -30,6 +30,7 @@
 #include <QMetaType>
 #include <QModelIndex>
 #include <QPersistentModelIndex>
+#include <QProgressDialog>
 #include <QSettings>
 #include <QSlider>
 #include <QTabBar>
@@ -370,6 +371,12 @@ void ctkDICOMAppWidget::resetModel()
 }
 
 //----------------------------------------------------------------------------
+void ctkDICOMAppWidget::onProgress(int progress)
+{
+  QApplication::processEvents();
+}
+
+//----------------------------------------------------------------------------
 void ctkDICOMAppWidget::onThumbnailSelected(const ctkThumbnailLabel& widget)
 {
     Q_D(ctkDICOMAppWidget);
@@ -417,8 +424,28 @@ void ctkDICOMAppWidget::onImportDirectory(QString directory)
       {
       targetDirectory = d->DICOMDatabase->databaseDirectory();
       }
+    QProgressDialog progress("DICOM Import", "Cancel", 0, 100, this,
+                           Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
+    // We don't want the progress dialog to resize itself, so we bypass the label
+    // by creating our own
+    QLabel* progressLabel = new QLabel(tr("Initialization..."));
+    progress.setLabel(progressLabel);
+    progress.setWindowModality(Qt::ApplicationModal);
+    progress.setMinimumDuration(0);
+    progress.setValue(0);
+    progress.show();
+
+    connect(&progress, SIGNAL(canceled()), d->DICOMIndexer.data(), SLOT(cancel()));
+    connect(d->DICOMIndexer.data(), SIGNAL(indexingFilePath(QString)),
+            progressLabel, SLOT(setText(QString)));
+    connect(d->DICOMIndexer.data(), SIGNAL(progress(int)),
+            &progress, SLOT(setValue(int)));
+    connect(d->DICOMIndexer.data(), SIGNAL(progress(int)),
+            this, SLOT(onProgress(int)));
+
     d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
     d->DICOMModel.reset();
+
   }
 }
 

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

@@ -63,6 +63,8 @@ public Q_SLOTS:
   void resumeModel();
   void resetModel();
 
+  void onProgress(int);
+
 Q_SIGNALS:
   /// Emited when directory is changed
   void databaseDirectoryChanged(const QString&);