]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/QT/DicomSeriesSelectorWidget.cxx
bb81a84c69aa66e85d9715f2e17670262fa0edd3
[cpPlugins.git] / lib / cpExtensions / QT / DicomSeriesSelectorWidget.cxx
1 #include <cpExtensions/QT/DicomSeriesSelectorWidget.h>
2
3 #ifdef cpExtensions_QT4
4
5 #include <cpExtensions/QT/ui_DicomSeriesSelectorWidget.h>
6 #include <queue>
7 #include <string>
8 #include <QFileDialog>
9 #include <itkGDCMSeriesFileNames.h>
10
11 // -------------------------------------------------------------------------
12 cpExtensions::QT::DicomSeriesSelectorWidget::
13 DicomSeriesSelectorWidget( QWidget* parent )
14   : QWidget( parent ),
15     m_UI( new Ui::DicomSeriesSelectorWidget )
16 {
17   this->m_UI->setupUi( this );
18   this->setStartDir( ".", false );
19   this->connect(
20     this->m_UI->ChooseButton, SIGNAL( clicked( ) ),
21     this, SLOT( _Choose( ) )
22     );
23 }
24
25 // -------------------------------------------------------------------------
26 cpExtensions::QT::DicomSeriesSelectorWidget::
27 ~DicomSeriesSelectorWidget( )
28 {
29   delete this->m_UI;
30 }
31
32 // -------------------------------------------------------------------------
33 QString cpExtensions::QT::DicomSeriesSelectorWidget::
34 startDir( ) const
35 {
36   return( this->m_UI->Directory->text( ) );
37 }
38
39 // -------------------------------------------------------------------------
40 void cpExtensions::QT::DicomSeriesSelectorWidget::
41 setStartDir( const QString& dir, bool build )
42 {
43   this->m_UI->Directory->setText( dir );
44   if( !build )
45     return;
46   
47   // Process subdirs
48   QApplication::setOverrideCursor( Qt::WaitCursor );
49
50   this->m_UI->Series->clear( );
51   this->m_UI->Series->setColumnCount( 3 );
52   QStringList labels;
53   labels << "Images count" << "Series UID" << "Series path";
54   this->m_UI->Series->setHorizontalHeaderLabels( labels );
55
56   itk::GDCMSeriesFileNames::GlobalWarningDisplayOff( );
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     // Get series
66     itk::GDCMSeriesFileNames::Pointer series =
67       itk::GDCMSeriesFileNames::New( );
68     series->SetUseSeriesDetails( true );
69     series->AddSeriesRestriction( "0008|0021" );
70     series->SetDirectory( dir_name );
71     const std::vector< std::string >& seriesUID = series->GetSeriesUIDs( );
72     for( auto sIt = seriesUID.begin( ); sIt != seriesUID.end( ); ++sIt )
73     {
74       unsigned long rows = this->m_UI->Series->rowCount( );
75       this->m_UI->Series->insertRow( rows );
76       std::stringstream str_count;
77       str_count << series->GetFileNames( *sIt ).size( );
78       QTableWidgetItem* count_item =
79         new QTableWidgetItem( str_count.str( ).c_str( ) );
80       QTableWidgetItem* uid_item =
81         new QTableWidgetItem( sIt->c_str( ) );
82       QTableWidgetItem* dir_item =
83         new QTableWidgetItem( dir_name.substr( dir.size( ) + 1 ).c_str( ) );
84       count_item->setFlags( count_item->flags( ) &  ~Qt::ItemIsEditable );
85       uid_item->setFlags( uid_item->flags( ) &  ~Qt::ItemIsEditable );
86       dir_item->setFlags( dir_item->flags( ) &  ~Qt::ItemIsEditable );
87       this->m_UI->Series->setItem( rows, 0, count_item );
88       this->m_UI->Series->setItem( rows, 1, uid_item );
89       this->m_UI->Series->setItem( rows, 2, dir_item );
90
91     } // rof
92
93     // Update queue
94     QDir dir( dir_name.c_str( ) );
95     QFileInfoList contents = dir.entryInfoList( );
96     QFileInfoList::const_iterator i = contents.begin( );
97     for( ; i != contents.end( ); ++i )
98     {
99       if( i->isDir( ) )
100       {
101         std::string new_dir_name = i->absoluteFilePath( ).toStdString( );
102         if( new_dir_name.size( ) > dir_name.size( ) )
103           q.push( new_dir_name );
104
105       } // fi
106
107     } // rof
108
109   } // elihw
110
111   // Restore cursor
112   QApplication::restoreOverrideCursor( );
113   itk::GDCMSeriesFileNames::GlobalWarningDisplayOn( );
114 }
115
116 // -------------------------------------------------------------------------
117 std::vector< std::string > cpExtensions::QT::DicomSeriesSelectorWidget::
118 selectedFilenames( )
119 {
120   std::vector< std::string > filenames;
121   auto items = this->m_UI->Series->selectedItems( );
122   if( items.size( ) > 0 )
123   {
124     std::string dir =
125       this->m_UI->Series->
126       item( items[ 0 ]->row( ), 2 )->text( ).toStdString( );
127     dir = this->startDir( ).toStdString( ) + "/" + dir;
128     itk::GDCMSeriesFileNames::GlobalWarningDisplayOff( );
129
130     itk::GDCMSeriesFileNames::Pointer series =
131       itk::GDCMSeriesFileNames::New( );
132     series->SetUseSeriesDetails( true );
133     series->AddSeriesRestriction( "0008|0021" );
134     series->SetDirectory( dir );
135     filenames = series->GetFileNames(
136       this->m_UI->Series->item(
137         items[ 0 ]->row( ), 1
138         )->text( ).toStdString( )
139       );
140     itk::GDCMSeriesFileNames::GlobalWarningDisplayOn( );
141
142   } // fi
143   return( filenames );
144 }
145
146 // -------------------------------------------------------------------------
147 void cpExtensions::QT::DicomSeriesSelectorWidget::
148 _Choose( )
149 {
150   QString qdir =
151     QFileDialog::getExistingDirectory(
152       this, tr( "Open Directory" ),
153       this->startDir( ),
154       QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks
155       );
156   if( qdir.toStdString( ) != "" )
157     this->setStartDir( qdir );
158 }
159
160 #endif // cpExtensions_QT4
161
162 // eof - $RCSfile$