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