#ifdef cpPlugins_Interface_QT4
#include <queue>
#include <map>
+#include <sstream>
#include <vector>
+#include <QApplication>
#include <QDialogButtonBox>
#include <QDir>
#include <QFileDialog>
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