]> Creatis software - cpPlugins.git/blob - plugins/ITKIO/DicomSeriesSelectorWidget.cxx
98954d4ac7c0a61977a1469e2e52c0539975ccb1
[cpPlugins.git] / plugins / ITKIO / DicomSeriesSelectorWidget.cxx
1 #include <ITKIO/DicomSeriesSelectorWidget.h>
2
3 #ifdef cpPlugins_QT4
4
5 #include <ITKIO/ui_DicomSeriesSelectorWidget.h>
6 #include <queue>
7 #include <string>
8 #include <QFileDialog>
9
10 // -------------------------------------------------------------------------
11 cpPluginsITKIO::DicomSeriesSelectorWidget::
12 DicomSeriesSelectorWidget( QWidget* parent )
13   : QWidget( parent ),
14     m_UI( new Ui::DicomSeriesSelectorWidget )
15 {
16   this->m_UI->setupUi( this );
17   this->setStartDir( ".", false );
18   this->connect(
19     this->m_UI->ChooseButton, SIGNAL( clicked( ) ),
20     this, SLOT( _Choose( ) )
21     );
22 }
23
24 // -------------------------------------------------------------------------
25 cpPluginsITKIO::DicomSeriesSelectorWidget::
26 ~DicomSeriesSelectorWidget( )
27 {
28   delete this->m_UI;
29 }
30
31 // -------------------------------------------------------------------------
32 QString cpPluginsITKIO::DicomSeriesSelectorWidget::
33 startDir( ) const
34 {
35   return( this->m_UI->Directory->text( ) );
36 }
37
38 // -------------------------------------------------------------------------
39 void cpPluginsITKIO::DicomSeriesSelectorWidget::
40 setStartDir( const QString& dir, bool build )
41 {
42   this->m_Series.clear( );
43
44   this->m_UI->Directory->setText( dir );
45   if( !build )
46     return;
47   
48   // Process subdirs
49   QApplication::setOverrideCursor( Qt::WaitCursor );
50
51   this->m_UI->Series->clear( );
52   this->m_UI->Series->setColumnCount( 3 );
53   QStringList labels;
54   labels << "Images count" << "Series UID" << "Series path";
55   this->m_UI->Series->setHorizontalHeaderLabels( labels );
56
57   std::string main_dir_name = dir.toStdString( );
58   std::queue< std::string > q;
59   q.push( main_dir_name );
60   while( !( q.empty( ) ) )
61   {
62     std::string dir_name = q.front( );
63     q.pop( );
64
65     // Update queue
66     QDir dir( dir_name.c_str( ) );
67     QFileInfoList contents = dir.entryInfoList( );
68     QFileInfoList::const_iterator i = contents.begin( );
69     std::set< std::string > files;
70     for( ; i != contents.end( ); ++i )
71     {
72       if( i->isDir( ) )
73       {
74         std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
75         if( new_dir_name.size( ) > dir_name.size( ) )
76           q.push( new_dir_name );
77       }
78       else
79         files.insert( i->absoluteFilePath( ).toStdString( ) );
80
81     } // rof
82
83     if( files.size( ) > 0 )
84     {
85       this->m_GDCMHelper.Clear( );
86       this->m_GDCMHelper.SetUseSeriesDetails( true );
87       this->m_GDCMHelper.SetLoadMode( 0 );
88       this->m_GDCMHelper.AddRestriction( "0008|0021" );
89       this->m_GDCMHelper.SetFileNames( files.begin( ), files.end( ) );
90
91       gdcm::FileList* flist =
92         this->m_GDCMHelper.GetFirstSingleSerieUIDFileSet( );
93       while( flist != NULL )
94       {
95         if( flist->size( ) > 0 )
96         {
97           this->m_GDCMHelper.OrderFileList( flist );
98           gdcm::File* file = ( *flist )[ 0 ];
99           std::string id =
100             this->m_GDCMHelper.CreateUniqueSeriesIdentifier( file ).c_str( );
101
102           gdcm::FileList::iterator it;
103           for( it = flist->begin( ); it != flist->end( ); ++it )
104             if( *it != NULL )
105               this->m_Series[ id ].push_back( ( *it )->filename );
106
107         } // fi
108         flist = this->m_GDCMHelper.GetNextSingleSerieUIDFileSet( );
109
110       } // elihw
111
112     } // fi
113
114   } // elihw
115
116   // Show series
117   for( auto sIt = this->m_Series.begin( ); sIt != this->m_Series.end( ); ++sIt )
118   {
119     if( sIt->second.size( ) > 0 )
120     {
121       QFileInfo fdir( sIt->second[ 0 ].c_str( ) );
122
123       unsigned long rows = this->m_UI->Series->rowCount( );
124       this->m_UI->Series->insertRow( rows );
125       std::stringstream str_count;
126       str_count << sIt->second.size( );
127       QTableWidgetItem* count_item =
128         new QTableWidgetItem( str_count.str( ).c_str( ) );
129       QTableWidgetItem* uid_item =
130         new QTableWidgetItem( sIt->first.c_str( ) );
131       QTableWidgetItem* dir_item =
132         new QTableWidgetItem( fdir.dir( ).canonicalPath( ) );
133       count_item->setFlags( count_item->flags( ) & ~Qt::ItemIsEditable );
134       uid_item->setFlags( uid_item->flags( ) & ~Qt::ItemIsEditable );
135       dir_item->setFlags( dir_item->flags( ) & ~Qt::ItemIsEditable );
136       this->m_UI->Series->setItem( rows, 0, count_item );
137       this->m_UI->Series->setItem( rows, 1, uid_item );
138       this->m_UI->Series->setItem( rows, 2, dir_item );
139
140     } // fi
141
142   } // rof
143
144   // Restore cursor
145   QApplication::restoreOverrideCursor( );
146 }
147
148 // -------------------------------------------------------------------------
149 std::vector< std::string >* cpPluginsITKIO::DicomSeriesSelectorWidget::
150 selectedFilenames( )
151 {
152   auto items = this->m_UI->Series->selectedItems( );
153   if( items.size( ) > 0 )
154   {
155     std::string uid =
156       this->m_UI->Series->
157       item( items[ 0 ]->row( ), 1 )->text( ).toStdString( );
158     auto sIt = this->m_Series.find( uid );
159     if( sIt != this->m_Series.end( ) )
160       return( &( sIt->second ) );
161
162   } // fi
163   return( NULL );
164 }
165
166 // -------------------------------------------------------------------------
167 void cpPluginsITKIO::DicomSeriesSelectorWidget::
168 _Choose( )
169 {
170   QString qdir =
171     QFileDialog::getExistingDirectory(
172       this, tr( "Open Directory" ),
173       this->startDir( ),
174       QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks
175       );
176   if( qdir.toStdString( ) != "" )
177     this->setStartDir( qdir );
178 }
179
180 #endif // cpPlugins_QT4
181
182 // eof - $RCSfile$