소스 검색

Cleanup + add more tests to ctkDICOMQueryRetrieveWidget

Julien Finet 14 년 전
부모
커밋
d5d7a0fd90

+ 10 - 0
Libs/DICOM/Widgets/Testing/Cpp/ctkDICOMQueryRetrieveWidgetTest1.cpp

@@ -33,7 +33,17 @@ int ctkDICOMQueryRetrieveWidgetTest1( int argc, char * argv [] )
 {
   QApplication app(argc, argv);
  
+  QSharedPointer<ctkDICOMDatabase> dicomDatabase;
   ctkDICOMQueryRetrieveWidget widget;
+  widget.setRetrieveDatabase(dicomDatabase);
+  if (widget.retrieveDatabase() != dicomDatabase)
+    {
+    std::cerr << "ctkDICOMQueryRetrieveDatabase::setRetrieveDatabase failed."
+              << std::endl;
+    }
+
+  widget.query();
+  widget.retrieve();
   widget.show();
 
   if (argc <= 1 || QString(argv[1]) != "-I")

+ 93 - 38
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.cpp

@@ -47,55 +47,89 @@ static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMQueryRetrieveWidget"
 //----------------------------------------------------------------------------
 class ctkDICOMQueryRetrieveWidgetPrivate: public Ui_ctkDICOMQueryRetrieveWidget
 {
+  Q_DECLARE_PUBLIC( ctkDICOMQueryRetrieveWidget );
+
+protected:
+  ctkDICOMQueryRetrieveWidget* const q_ptr;
+  
 public:
-  ctkDICOMQueryRetrieveWidgetPrivate(){}
-
-  QMap<QString, ctkDICOMQuery*> QueriesByServer;
-  QMap<QString, ctkDICOMQuery*> QueriesByStudyUID;
-  QMap<QString, ctkDICOMRetrieve*> RetrievalsByStudyUID;
-  ctkDICOMDatabase QueryResultDatabase;
-  QSharedPointer<ctkDICOMDatabase> RetrieveDatabase;
-  ctkDICOMModel    model;
+  ctkDICOMQueryRetrieveWidgetPrivate(ctkDICOMQueryRetrieveWidget& obj);
+  ~ctkDICOMQueryRetrieveWidgetPrivate();
+  void init();
+
+  QMap<QString, ctkDICOMQuery*>     QueriesByServer;
+  QMap<QString, ctkDICOMQuery*>     QueriesByStudyUID;
+  QMap<QString, ctkDICOMRetrieve*>  RetrievalsByStudyUID;
+  ctkDICOMDatabase                  QueryResultDatabase;
+  QSharedPointer<ctkDICOMDatabase>  RetrieveDatabase;
+  ctkDICOMModel                     Model;
   
-  QProgressDialog* ProgressDialog;
-  QString          CurrentServer;
+  QProgressDialog*                  ProgressDialog;
+  QString                           CurrentServer;
 };
 
 //----------------------------------------------------------------------------
 // ctkDICOMQueryRetrieveWidgetPrivate methods
 
 //----------------------------------------------------------------------------
-// ctkDICOMQueryRetrieveWidget methods
+ctkDICOMQueryRetrieveWidgetPrivate::ctkDICOMQueryRetrieveWidgetPrivate(
+  ctkDICOMQueryRetrieveWidget& obj)
+  : q_ptr(&obj)
+{
+  this->ProgressDialog = 0;
+}
 
 //----------------------------------------------------------------------------
-ctkDICOMQueryRetrieveWidget::ctkDICOMQueryRetrieveWidget(QWidget* parentWidget)
-  : Superclass(parentWidget) 
-  , d_ptr(new ctkDICOMQueryRetrieveWidgetPrivate)
+ctkDICOMQueryRetrieveWidgetPrivate::~ctkDICOMQueryRetrieveWidgetPrivate()
 {
-  Q_D(ctkDICOMQueryRetrieveWidget);
-  
-  d->setupUi(this);
+  foreach(ctkDICOMQuery* query, this->QueriesByServer.values())
+    {
+    delete query;
+    }
+  foreach(ctkDICOMRetrieve* retrieval, this->RetrievalsByStudyUID.values())
+    {
+    delete retrieval;
+    }
+}
 
-  d->ProgressDialog = 0;
-  connect(d->QueryButton, SIGNAL(clicked()), this, SLOT(processQuery()));
-  connect(d->RetrieveButton, SIGNAL(clicked()), this, SLOT(processRetrieve()));
-  connect(d->CancelButton, SIGNAL(clicked()),this,SLOT(hide()));
+//----------------------------------------------------------------------------
+void ctkDICOMQueryRetrieveWidgetPrivate::init()
+{
+  Q_Q(ctkDICOMQueryRetrieveWidget);
+  this->setupUi(q);
+
+  QObject::connect(this->QueryButton, SIGNAL(clicked()), q, SLOT(query()));
+  QObject::connect(this->RetrieveButton, SIGNAL(clicked()), q, SLOT(retrieve()));
+  QObject::connect(this->CancelButton, SIGNAL(clicked()), q, SLOT(cancel()));
 
-  d->results->setModel(&d->model);
-  d->model.setHeaderData(0, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
+  this->results->setModel(&this->Model);
+  this->Model.setHeaderData(0, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
 
-  QHeaderView* previousHeaderView = d->results->header();
-  ctkCheckableHeaderView* headerView = new ctkCheckableHeaderView(Qt::Horizontal, d->results);
+  QHeaderView* previousHeaderView = this->results->header();
+  ctkCheckableHeaderView* headerView =
+    new ctkCheckableHeaderView(Qt::Horizontal, this->results);
   headerView->setClickable(previousHeaderView->isClickable());
   headerView->setMovable(previousHeaderView->isMovable());
   headerView->setHighlightSections(previousHeaderView->highlightSections());
   headerView->setPropagateToItems(true);
-  d->results->setHeader(headerView);
+  this->results->setHeader(headerView);
   // headerView is hidden because it was created with a visisble parent widget 
   headerView->setHidden(false);
 }
 
 //----------------------------------------------------------------------------
+// ctkDICOMQueryRetrieveWidget methods
+
+//----------------------------------------------------------------------------
+ctkDICOMQueryRetrieveWidget::ctkDICOMQueryRetrieveWidget(QWidget* parentWidget)
+  : Superclass(parentWidget) 
+  , d_ptr(new ctkDICOMQueryRetrieveWidgetPrivate(*this))
+{
+  Q_D(ctkDICOMQueryRetrieveWidget);
+  d->init();
+}
+
+//----------------------------------------------------------------------------
 ctkDICOMQueryRetrieveWidget::~ctkDICOMQueryRetrieveWidget()
 {
 }
@@ -109,7 +143,14 @@ void ctkDICOMQueryRetrieveWidget::setRetrieveDatabase(QSharedPointer<ctkDICOMDat
 }
 
 //----------------------------------------------------------------------------
-void ctkDICOMQueryRetrieveWidget::processQuery()
+QSharedPointer<ctkDICOMDatabase> ctkDICOMQueryRetrieveWidget::retrieveDatabase()const
+{
+  Q_D(const ctkDICOMQueryRetrieveWidget);
+  return d->RetrieveDatabase;
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMQueryRetrieveWidget::query()
 {
   Q_D(ctkDICOMQueryRetrieveWidget);
 
@@ -146,7 +187,6 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
     Q_ASSERT(parameters["CheckState"] == Qt::Checked );
     // create a query for the current server
     ctkDICOMQuery* query = new ctkDICOMQuery;
-    d->QueriesByServer[d->CurrentServer] = query;
     query->setCallingAETitle(d->ServerNodeWidget->callingAETitle());
     query->setCalledAETitle(parameters["AETitle"].toString());
     query->setHost(parameters["Address"].toString());
@@ -175,8 +215,10 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
       {
       logger.error ( "Query error: " + parameters["Name"].toString() );
       progress.setLabelText("Query error: " + parameters["Name"].toString());
+      delete query;
       }
-
+    d->QueriesByServer[d->CurrentServer] = query;
+    
     foreach( QString studyUID, query->studyInstanceUIDQueried() )
       {
       d->QueriesByStudyUID[studyUID] = query;
@@ -184,27 +226,31 @@ void ctkDICOMQueryRetrieveWidget::processQuery()
     }
   
   // checkable headers - allow user to select the patient/studies to retrieve
-  d->model.setDatabase(d->QueryResultDatabase.database());
+  d->Model.setDatabase(d->QueryResultDatabase.database());
 
-  d->RetrieveButton->setEnabled(d->model.rowCount());
+  d->RetrieveButton->setEnabled(d->Model.rowCount());
   progress.setValue(progress.maximum());
   d->ProgressDialog = 0;
 }
 
 //----------------------------------------------------------------------------
-void ctkDICOMQueryRetrieveWidget::processRetrieve()
+void ctkDICOMQueryRetrieveWidget::retrieve()
 {
   Q_D(ctkDICOMQueryRetrieveWidget);
 
+  if (!d->RetrieveButton->isEnabledTo(this))
+    {
+    return;
+    }
+
   QMap<QString,QVariant> serverParameters = d->ServerNodeWidget->parameters();
 
   foreach( QString studyUID, d->QueriesByStudyUID.keys() )
-  {
-    logger.debug("need to retrieve " + studyUID + " from " + d->QueriesByStudyUID[studyUID]->host());
+    {
+    logger.debug("About to retrieve " + studyUID + " from " + d->QueriesByStudyUID[studyUID]->host());
     ctkDICOMQuery *query = d->QueriesByStudyUID[studyUID];
     ctkDICOMRetrieve *retrieve = new ctkDICOMRetrieve;
     retrieve->setRetrieveDatabase( d->RetrieveDatabase );
-    d->RetrievalsByStudyUID[studyUID] = retrieve;
     retrieve->setCallingAETitle( query->callingAETitle() );
     retrieve->setCalledAETitle( query->calledAETitle() );
     retrieve->setCalledPort( query->port() );
@@ -222,13 +268,22 @@ void ctkDICOMQueryRetrieveWidget::processRetrieve()
     catch (std::exception e)
       {
       logger.error ( "Retrieve failed" );
+      delete retrieve;
+      // TODO: ask the user if he wants to keep trying to retrieve other studies
       QMessageBox::information ( this, tr("Query Retrieve"), tr("Retrieve failed.") );
-      return;
+      continue;
       }
+    d->RetrievalsByStudyUID[studyUID] = retrieve;
     logger.info ( "Retrieve success" );
-  }
+    }
   QMessageBox::information ( this, tr("Query Retrieve"), tr("Selected studies have been downloaded.") );
-  this->hide();
+  emit studiesRetrieved(d->RetrievalsByStudyUID.keys());
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMQueryRetrieveWidget::cancel()
+{
+  emit studiesRetrieved(QStringList());
 }
 
 //----------------------------------------------------------------------------

+ 11 - 2
Libs/DICOM/Widgets/ctkDICOMQueryRetrieveWidget.h

@@ -40,10 +40,19 @@ public:
   explicit ctkDICOMQueryRetrieveWidget(QWidget* parent=0);
   virtual ~ctkDICOMQueryRetrieveWidget();
 
+  QSharedPointer<ctkDICOMDatabase> retrieveDatabase()const;
+
 public slots:
   void setRetrieveDatabase(QSharedPointer<ctkDICOMDatabase> retrieveDatabase);
-  void processQuery();
-  void processRetrieve();
+  void query();
+  void retrieve();
+  void cancel();
+
+signals:
+  /// Signal emit when studies have been retrieved (user clicked on the
+  /// "Retrieve" button) or when the widget is cancelled (user clicked on the
+  /// "Cancel" button).
+  void studiesRetrieved(QStringList);
 
 protected slots:
   void onQueryProgressChanged(int value);