]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Plugins/IO/DicomSeriesReader.cxx
More tree visualization
[cpPlugins.git] / lib / cpPlugins / Plugins / IO / DicomSeriesReader.cxx
index 99f19b06a460efdd6db258a472898cd40e241000..e915fcf58e4c746881cd0a655e929309ad4c8e04 100644 (file)
@@ -3,8 +3,10 @@
 #ifdef cpPlugins_Interface_QT4
 #include <queue>
 #include <map>
+#include <sstream>
 #include <vector>
 
+#include <QApplication>
 #include <QDialogButtonBox>
 #include <QDir>
 #include <QFileDialog>
@@ -30,127 +32,148 @@ ExecConfigurationDialog( QWidget* parent )
   itk::GDCMSeriesFileNames::Pointer series =
     itk::GDCMSeriesFileNames::New( );
 
-  typedef std::map< std::string, TStringList > _TSeries;
-  typedef std::map< std::string, _TSeries > _TFilenames;
-  _TSeries found_series;
-  _TFilenames found_filenames;
-
   // Show dialog and check if it was accepted
   QFileDialog dialog( parent );
   dialog.setFileMode( QFileDialog::DirectoryOnly );
   dialog.setDirectory( QFileDialog::tr( "." ) );
-  if( dialog.exec( ) )
+  if( !dialog.exec( ) )
+    return( false );
+
+  // Prepare dialog
+  QApplication::setOverrideCursor( Qt::WaitCursor );
+  if( parent != NULL )
+    parent->setEnabled( false );
+
+  QDialog* tree_dialog = new QDialog( parent );
+  QTreeWidget* tree_widget = new QTreeWidget( tree_dialog );
+  QList< QTreeWidgetItem* > tree_items;
+  std::map< std::string, std::map< std::string, TStringList > > found_files;
+
+  std::string main_dir_name =
+    dialog.selectedFiles( ).begin( )->toStdString( );
+  std::queue< std::string > q;
+  q.push( main_dir_name );
+  while( !( q.empty( ) ) )
   {
-    std::string dir_name = dialog.selectedFiles( ).begin( )->toStdString( );
-    std::queue< std::string > q;
-    q.push( dir_name );
-    while( !( q.empty( ) ) )
+    std::string dir_name = q.front( );
+    q.pop( );
+
+    // Get DICOM information
+    series->SetUseSeriesDetails( true );
+    series->AddSeriesRestriction( "0008|0021" );
+    series->SetDirectory( dir_name );
+    const TStringList& seriesUID = series->GetSeriesUIDs( );
+    if( seriesUID.size( ) > 0 )
     {
-      dir_name = q.front( );
-      q.pop( );
-
-      // Get DICOM information
-      series->SetUseSeriesDetails( true );
-      series->AddSeriesRestriction( "0008|0021" );
-      series->SetDirectory( dir_name );
-      const TStringList& seriesUID = series->GetSeriesUIDs( );
-      if( seriesUID.size( ) > 0 )
+      QTreeWidgetItem* new_item = new QTreeWidgetItem(
+        ( QTreeWidgetItem* )( NULL ),
+        QStringList( dir_name.c_str( ) )
+        );
+      QTreeWidgetItem* new_leaf = NULL;
+      TStringList::const_iterator sIt = seriesUID.begin( );
+      for( ; sIt != seriesUID.end( ); ++sIt )
       {
-        TStringList::const_iterator sIt = seriesUID.begin( );
-        for( ; sIt != seriesUID.end( ); ++sIt )
+        TStringList filenames = series->GetFileNames( *sIt );
+        if( filenames.size( ) > 0 )
         {
-          TStringList filenames = series->GetFileNames( *sIt );
-          if( filenames.size( ) > 0 )
-          {
-            found_series[ dir_name ].push_back( *sIt );
-            found_filenames[ dir_name ][ *sIt ] = filenames;
+          std::stringstream ss;
+          ss << "(" << filenames.size( ) << "): " << *sIt;
+          new_leaf =
+            new QTreeWidgetItem(
+              new_item, QStringList( ss.str( ).c_str( ) )
+              );
+          new_item->addChild( new_leaf );
+          found_files[ dir_name ][ *sIt ] = filenames;
 
-          } // fi
+        } // fi
 
-        } // rof
+      } // rof
 
-      } // fi
+      if( new_leaf != NULL )
+        tree_items.append( new_item );
+      else
+        delete new_item;
+        
+    } // fi
 
       // Update queue
-      QDir dir( dir_name.c_str( ) );
-      QFileInfoList contents = dir.entryInfoList( );
-      QFileInfoList::const_iterator i = contents.begin( );
-      for( ; i != contents.end( ); ++i )
+    QDir dir( dir_name.c_str( ) );
+    QFileInfoList contents = dir.entryInfoList( );
+    QFileInfoList::const_iterator i = contents.begin( );
+    for( ; i != contents.end( ); ++i )
+    {
+      if( i->isDir( ) )
       {
-        if( i->isDir( ) )
-        {
-          std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
-          if( new_dir_name.size( ) > dir_name.size( ) )
-            q.push( new_dir_name );
+        std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
+        if( new_dir_name.size( ) > dir_name.size( ) )
+          q.push( new_dir_name );
 
-        } // fi
-
-      } // rof
+      } // fi
 
-    } // elihw
+    } // rof
 
-  } // fi
+  } // elihw
 
   // Show second dialog
-  if( found_series.size( ) > 0 )
+  if( tree_items.size( ) == 0 )
   {
-    QDialog* tree_dialog = new QDialog( parent );
-
-    QLabel* title = new QLabel( tree_dialog );
-    title->setText( "Choose a DICOM series" );
-    QGridLayout* mainLayout = new QGridLayout( tree_dialog );
-    QVBoxLayout* toolsLayout = new QVBoxLayout( );
-    toolsLayout->addWidget( title );
-    mainLayout->addLayout( toolsLayout, 0, 0, 1, 1 );
+    delete tree_widget;
+    delete tree_dialog;
+    return( false );
 
-    QTreeWidget* tree = new QTreeWidget( tree_dialog );
-    QList< QTreeWidgetItem* > tree_items;
-
-    _TSeries::const_iterator fsIt = found_series.begin( );
-    for( ; fsIt != found_series.end( ); ++fsIt )
-    {
-      QTreeWidgetItem* new_item =
-        new QTreeWidgetItem(
-          ( QTreeWidgetItem* )( NULL ), QStringList( fsIt->first.c_str( ) )
-          );
-      TStringList::const_iterator sId = fsIt->second.begin( );
-      for( ; sId != fsIt->second.end( ); ++sId )
-      {
-        QTreeWidgetItem* new_leaf =
-          new QTreeWidgetItem( new_item, QStringList( sId->c_str( ) ) );
-        new_item->addChild( new_leaf );
-
-      } // rof
-      tree_items.append( new_item );
-
-    } // rof
-    tree->insertTopLevelItems( 0, tree_items );
-    toolsLayout->addWidget( tree );
-
-    QDialogButtonBox* bb = new QDialogButtonBox(
-      QDialogButtonBox::Ok | QDialogButtonBox::Cancel
-      );
-    tree_dialog->connect( bb, SIGNAL( accepted( ) ), tree_dialog, SLOT( accept( ) ) );
-    tree_dialog->connect( bb, SIGNAL( rejected( ) ), tree_dialog, SLOT( reject( ) ) );
-    toolsLayout->addWidget( bb );
+  } // fi
 
-    if( tree_dialog->exec( ) == 1 )
+  QLabel* title = new QLabel( tree_dialog );
+  title->setText( "Choose a DICOM series" );
+  QGridLayout* mainLayout = new QGridLayout( tree_dialog );
+  QVBoxLayout* toolsLayout = new QVBoxLayout( );
+  toolsLayout->addWidget( title );
+  mainLayout->addLayout( toolsLayout, 0, 0, 1, 1 );
+
+  tree_widget->insertTopLevelItems( 0, tree_items );
+  toolsLayout->addWidget( tree_widget );
+
+  QDialogButtonBox* bb = new QDialogButtonBox(
+    QDialogButtonBox::Ok | QDialogButtonBox::Cancel
+    );
+  tree_dialog->connect(
+    bb, SIGNAL( accepted( ) ), tree_dialog, SLOT( accept( ) )
+    );
+  tree_dialog->connect(
+    bb, SIGNAL( rejected( ) ), tree_dialog, SLOT( reject( ) )
+    );
+  toolsLayout->addWidget( bb );
+
+  QApplication::restoreOverrideCursor( );
+  if( parent != NULL )
+    parent->setEnabled( true );
+
+  if( tree_dialog->exec( ) == 0 )
+    return( false );
+
+  QTreeWidgetItem* item = tree_widget->currentItem( );
+  if( item != NULL )
+  {
+    QTreeWidgetItem* item_parent = item->parent( );
+    if( item_parent != NULL )
     {
-      QTreeWidgetItem* item = tree->currentItem( );
-      QTreeWidgetItem* parent = item->parent( );
+      QApplication::setOverrideCursor( Qt::WaitCursor );
       if( parent != NULL )
-      {
-        std::string serie_dir = parent->text( 0 ).toStdString( );
-        std::string serie_id = item->text( 0 ).toStdString( );
+        parent->setEnabled( false );
 
-        this->m_Parameters->ClearStringList( "FileNames" );
-        const TStringList& filenames = found_filenames[ serie_dir ][ serie_id ];
-        for( unsigned int f = 0; f < filenames.size( ); ++f )
-          this->m_Parameters->AddToStringList( "FileNames", filenames[ f ] );
+      std::string serie_dir = item_parent->text( 0 ).toStdString( );
+      std::string serie_id = item->text( 0 ).toStdString( );
+      serie_id = serie_id.substr( serie_id.find_first_of( " " ) + 1 );
+      this->m_Parameters->ClearStringList( "FileNames" );
+      const TStringList& names = found_files[ serie_dir ][ serie_id ];
+      for( unsigned int f = 0; f < names.size( ); ++f )
+        this->m_Parameters->AddToStringList( "FileNames", names[ f ] );
 
-        r = true;
+      r = true;
 
-      } // fi
+      QApplication::restoreOverrideCursor( );
+      if( parent != NULL )
+        parent->setEnabled( true );
 
     } // fi