From d5b99d0f063fe0e16ae8c6c40a41dfb0ff71050b Mon Sep 17 00:00:00 2001
From: Cyrille Valladeau <cyrille.valladeau@c-s.fr>
Date: Tue, 27 Sep 2011 14:08:10 +0200
Subject: [PATCH] Qt Input image list in progress, up down in progress

---
 .../otbWrapperInputImageListParameter.h       |  35 ++-
 .../QtWidget/otbQtFileSelectionWidget.cxx     |   8 +-
 .../QtWidget/otbQtFileSelectionWidget.h       |  17 ++
 ...WrapperQtWidgetInputImageListParameter.cxx | 228 ++++++++++++++----
 4 files changed, 230 insertions(+), 58 deletions(-)

diff --git a/Code/ApplicationEngine/otbWrapperInputImageListParameter.h b/Code/ApplicationEngine/otbWrapperInputImageListParameter.h
index 65e55d3780..456a4b694a 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageListParameter.h
+++ b/Code/ApplicationEngine/otbWrapperInputImageListParameter.h
@@ -176,12 +176,43 @@ public:
     return m_ImageList->GetNthElement(0).IsNotNull();
   }
 
+  void Erase( unsigned int id )
+  {
+    if(m_ImageList->Size()<id)
+      {
+      itkExceptionMacro(<< "No image "<<id<<". Only "<<m_ImageList->Size()<<" images available.");
+      }
+    
+    m_ImageList->Erase( id );
+    m_ReaderList->Erase( id );
+  }
+
   void ClearValue()
   {
     m_ImageList = FloatVectorImageListType::Pointer();
     m_ReaderList = ImageFileReaderListType::Pointer();
   }
 
+  void SwitchOrder( std::map<unisgned int, unsigned int> idMap )
+  {
+    if(idMap.size() != m_ImageList->Size())
+      {
+      itkExceptionMacro(<< "Map size and the number of image mismatches ("<<idMap.size()<<" vs. "<<m_ImageList->Size()<<").");
+      }
+
+    FloatVectorImageListType::Pointer tmpImageList = FloatVectorImageListType::New();
+    ImageFileReaderListType::Pointer  tmpReaderList = ImageFileReaderListType::New();
+
+    for( unsigned int i=0; i<idMap.size(); i++)
+      {
+      tmpImageList->PushBack( m_ImageList->GetNthElement(idMap[i]) );
+      tmpReaderList->PushBack( m_ReaderList->GetNthElement(idMap[i]) );
+
+      m_ReaderList = tmpReaderList;
+      m_ImageList = tmpImageList;
+      }
+  }
+
 protected:
   /** Constructor */
   InputImageListParameter()
@@ -197,8 +228,8 @@ protected:
   {}
 
  
-  FloatVectorImageListType::Pointer     m_ImageList;
-  ImageFileReaderListType::Pointer m_ReaderList;
+  FloatVectorImageListType::Pointer m_ImageList;
+  ImageFileReaderListType::Pointer  m_ReaderList;
 
 private:
   InputImageListParameter(const Parameter &); //purposely not implemented
diff --git a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx
index 7da73be75d..4b54c6489a 100644
--- a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx
+++ b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.cxx
@@ -58,16 +58,15 @@ void QtFileSelectionWidget::DoCreateWidget()
 
   m_Input = new QLineEdit;
 
-  //connect( m_Input, SIGNAL(textChanged(const QString&)), this, SLOT(SetFileName(const QString&)) );
-  //connect( m_Input, SIGNAL(textChanged(const QString&)), GetModel(), SLOT(NotifyUpdate()) );
-
   m_HLayout->addWidget(m_Input);
 
   // Set up input text edit
   m_Button = new QPushButton;
   m_Button->setText("...");
   m_Button->setToolTip("Select file...");
-  m_Button->setMaximumWidth(m_Button->width());
+  m_Button->setFixedWidth(30);
+ 
+  //m_Button->setMaximumWidth(m_Button->width());
   connect( m_Button, SIGNAL(clicked()), this, SLOT(SelectFile()) );
   m_HLayout->addWidget(m_Button);
 
@@ -76,7 +75,6 @@ void QtFileSelectionWidget::DoCreateWidget()
 
 void QtFileSelectionWidget::SelectFile()
 {
-  std::cout<<this<<std::endl;
   QFileDialog fileDialog;
   fileDialog.setConfirmOverwrite(true);
   fileDialog.setFileMode(QFileDialog::ExistingFile);
diff --git a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h
index 06a519b05a..df74ce83b0 100644
--- a/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h
+++ b/Code/Wrappers/QtWidget/otbQtFileSelectionWidget.h
@@ -54,6 +54,23 @@ public:
     return m_Index;
   }
 
+  unsigned int SetIndex( unsigned int id )
+  {
+    m_Index = id;
+  }
+
+
+  bool IsChecked()
+  {
+    return m_Checkbox->isChecked();
+  }
+
+  void SetChecked( bool val )
+  {
+    return m_Checkbox->setChecked( val );
+  }
+
+
 protected slots:
   //void SetFileName( const QString& value );
   void SelectFile();
diff --git a/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx b/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx
index 9261ea2036..561a1cbbf2 100644
--- a/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx
+++ b/Code/Wrappers/QtWidget/otbWrapperQtWidgetInputImageListParameter.cxx
@@ -40,9 +40,10 @@ void QtWidgetInputImageListParameter::DoUpdateGUI()
 
 void QtWidgetInputImageListParameter::DoCreateWidget()
 {
+hg   m_FileSelectionList.clear();
+  const unsigned int sp(2);
+  const unsigned int buttonSize(30);
 
-  //m_FileSelectionList.clear();
-  const unsigned int sp = 2;
   // Global layout
   QHBoxLayout * hLayout = new QHBoxLayout;
   hLayout->setSpacing(sp);
@@ -64,6 +65,7 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
   // Add file button
   QPushButton * addButton = new QPushButton;
   addButton->setText("+");
+  addButton->setFixedWidth(buttonSize);
   addButton->setToolTip("Add a file selector...");
   addButton->setMaximumWidth(addButton->width());
   connect( addButton, SIGNAL(clicked()), this, SLOT(AddFile()) );
@@ -72,6 +74,7 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
   // Supress file button
   QPushButton * supButton = new QPushButton;
   supButton->setText("-");
+  supButton->setFixedWidth(buttonSize);
   supButton->setToolTip("Supress the selected file...");
   supButton->setMaximumWidth(supButton->width());
   connect( supButton, SIGNAL(clicked()), this, SLOT(SupressFile()) );
@@ -81,6 +84,7 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
   // Up file edit
   QPushButton * upButton = new QPushButton;
   upButton->setText("Up");
+  upButton->setFixedWidth(buttonSize);
   upButton->setToolTip("Up the selected file in the list...");
   upButton->setMaximumWidth(upButton->width());
   connect( upButton, SIGNAL(clicked()), this, SLOT(UpFile()) );
@@ -89,6 +93,7 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
   // Down file edit
   QPushButton * downButton = new QPushButton;
   downButton->setText("Down");
+  downButton->setFixedWidth(buttonSize);
   downButton->setToolTip("Down the selected file in the list...");
   downButton->setMaximumWidth(downButton->width());
   connect( downButton, SIGNAL(clicked()), this, SLOT(DownFile()) );
@@ -98,44 +103,27 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
   // Erase file edit
   QPushButton * eraseButton = new QPushButton;
   eraseButton->setText("Erase");
+  eraseButton->setFixedWidth(2*buttonSize);
   eraseButton->setToolTip("Erase the selected file of the list...");
   eraseButton->setMaximumWidth(eraseButton->width());
   connect( eraseButton, SIGNAL(clicked()), this, SLOT(EraseFile()) );
   buttonLayout->addWidget(eraseButton);
 
   QVBoxLayout * fileLayout = new QVBoxLayout();
+  fileLayout->setSpacing(0);
 
-  QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget(m_InputImageListParam);
   fileSelection->setFixedHeight(40);
   fileLayout->addWidget( fileSelection );
-/*
-  QtFileSelectionWidget * fileSelection1 = new QtFileSelectionWidget();
-  fileSelection1->setFixedHeight(40);
-  fileLayout->addWidget( fileSelection1 );
-  QtFileSelectionWidget * fileSelection2 = new QtFileSelectionWidget();
-  fileSelection2->setFixedHeight(40);
-  fileLayout->addWidget( fileSelection2 );
-  QtFileSelectionWidget * fileSelection3 = new QtFileSelectionWidget();
-  fileSelection3->setFixedHeight(40);
-  fileLayout->addWidget( fileSelection3 );
-  QtFileSelectionWidget * fileSelection4 = new QtFileSelectionWidget();
-  fileSelection4->setFixedHeight(40);
-  fileLayout->addWidget( fileSelection4 );
-  QtFileSelectionWidget * fileSelection5 = new QtFileSelectionWidget();
-  fileSelection5->setFixedHeight(40);
-  fileLayout->addWidget( fileSelection5 );
-  QtFileSelectionWidget * fileSelection6 = new QtFileSelectionWidget();
-  fileSelection6->setFixedHeight(40);
-  fileLayout->addWidget( fileSelection6 );
-*/
   m_FileSelectionList.push_back(fileSelection);
 
   QGroupBox *mainGroup = new QGroupBox();
   mainGroup->setLayout(fileLayout);
   QScrollArea * scroll = new QScrollArea();
   scroll->setWidget(mainGroup);
-  scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); //ScrollBarAlwaysOn);
-  scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); //ScrollBarAlwaysOn);
+  //scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+  scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+  scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
 
   hLayout->addWidget(scroll);
   hLayout->addLayout(buttonLayout);
@@ -144,9 +132,9 @@ void QtWidgetInputImageListParameter::DoCreateWidget()
  
   this->setLayout(hLayout);
 
- m_FileLayout = fileLayout;
- m_HLayout = hLayout;
- m_Scroll = scroll;
+  m_FileLayout = fileLayout;
+  m_HLayout = hLayout;
+  m_Scroll = scroll;
 
 }
 
@@ -168,24 +156,148 @@ void QtWidgetInputImageListParameter::SelectFile()
 void
 QtWidgetInputImageListParameter::UpFile()
 {
-  std::cout<<"upupup"<<std::endl;
+ if(m_FileSelectionList.size() < 2 )
+    return;
+
+  m_FileLayout = new QVBoxLayout();
+  m_FileLayout->setSpacing(2);
+  std::vector<QtFileSelectionWidget *> tmpList;
+  // Map link between old and new index in the list
+  std::map<unsigned int, unsigned int> idMap;
+  
+  // Init map
+  for(unsigned int i=0; i<m_FileSelectionList.size(); i++ )
+    {
+    idMap[i] = i;
+    }
+  
+  // If the first item is checked, uncheck it...
+  // It won't be moved
+  if( m_FileSelectionList[0]->IsChecked() )
+    {
+    m_FileSelectionList[0]->SetChecked(false);
+    }
+
+ 
+  // If other item are checked, up the index
+  // Starts at 1 because the first item mustn't move
+  for(unsigned int i=1; i<m_FileSelectionList.size(); i++ )
+    {
+    if( m_FileSelectionList[i]->IsChecked() )
+      {
+      unsigned int tmp = idMap[i];
+      idMap[i] = i-1;
+      idMap[idMap[i-1]] = tmp;
+      }
+    }
+
+   // Keys become values and inverse
+   std::map<unsigned int, unsigned int> idMapBis;
+   for(unsigned int i=0; i<idMap.size(); i++ )
+     {
+     idMapBis[ idMap[i] ] = i;
+     }
+
+  // Create the new item list
+  for(unsigned int i=0; i<m_FileSelectionList.size(); i++ )
+    {
+    m_FileLayout->addWidget( m_FileSelectionList[ idMapBis[i] ] );
+    tmpList.push_back(m_FileSelectionList[ idMapBis[i] ]);
+    }
+      
+  m_FileSelectionList =  tmpList;
+  
+
+  QGroupBox *mainGroup = new QGroupBox();
+  mainGroup->setLayout(m_FileLayout);
+  m_Scroll->setWidget(mainGroup);
+
+  this->update();
 }
+
 void
 QtWidgetInputImageListParameter::DownFile()
 {
- std::cout<<"downdowndown"<<std::endl;
+  if(m_FileSelectionList.size() < 2 )
+    return;
+
+  m_FileLayout = new QVBoxLayout();
+  m_FileLayout->setSpacing(0);
+  std::vector<QtFileSelectionWidget *> tmpList;
+  // Map link between old and new index in the list
+  std::map<unsigned int, unsigned int> idMap;
+  
+  // Init map
+  for(unsigned int i=0; i<m_FileSelectionList.size(); i++ )
+    {
+    idMap[i] = i;
+    }
+  
+  // If the last item is checked, uncheck it...
+  // It won't be moved
+  if( m_FileSelectionList[m_FileSelectionList.size()-1]->IsChecked() )
+    {
+    m_FileSelectionList[m_FileSelectionList.size()-1]->SetChecked(false);
+    }
+
+ 
+  // If other item are checked, up the index
+  // Stops at size-1 because the last item mustn't move
+  for(int i=m_FileSelectionList.size()-2; i>=0; i-- )
+    {
+    if( m_FileSelectionList[i]->IsChecked() )
+      {
+      unsigned int tmp = idMap[i];
+      idMap[i] = i+1;
+       idMap[idMap[i+1]] = tmp;
+      }
+    }
+    
+ // Keys become values and inverse
+   std::map<unsigned int, unsigned int> idMapBis;
+   for(unsigned int i=0; i<idMap.size(); i++ )
+     {
+     idMapBis[ idMap[i] ] = i;
+     }
+
+  // Create the new item list
+  for(unsigned int i=0; i<m_FileSelectionList.size(); i++ )
+    {
+  // Update QtFileSelectionWidget index
+    m_FileSelectionList[ idMapBis[i] ]->SetIndex(idMapBis[i]);
+    m_FileLayout->addWidget( m_FileSelectionList[ idMapBis[i] ] );
+    tmpList.push_back(m_FileSelectionList[ idMapBis[i] ]);
+    }
+      
+  // Update input image list parameter order
+  m_InputImageListParam->SwitchOrder( idMapBis );
+
+  // Update QtFileSelectionWidget index
+
+
+  m_FileSelectionList =  tmpList;
+
+  QGroupBox *mainGroup = new QGroupBox();
+  mainGroup->setLayout(m_FileLayout);
+  m_Scroll->setWidget(mainGroup);
+
+  this->update();
 }
+
+
+
 void
 QtWidgetInputImageListParameter::AddFile()
 {
   m_FileLayout = new QVBoxLayout();
+  m_FileLayout->setSpacing(0);
   for(unsigned int i=0; i<m_FileSelectionList.size(); i++ )
     {
     m_FileLayout->addWidget( m_FileSelectionList[i] );
     }
 
-  QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
-  fileSelection->setFixedHeight( 40 );
+  QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget(m_InputImageListParam);
+  fileSelection->setFixedHeight( 30 ); 
   m_FileLayout->addWidget( fileSelection );
   m_FileSelectionList.push_back(fileSelection);
 
@@ -199,43 +311,57 @@ QtWidgetInputImageListParameter::AddFile()
 void
 QtWidgetInputImageListParameter::SupressFile()
 {
+  m_FileLayout = new QVBoxLayout();
+  m_FileLayout->setSpacing(0);
+  std::vector<QtFileSelectionWidget *> tmpList;
+  for(unsigned int i=0; i<m_FileSelectionList.size(); i++ )
+    {
+    if( !m_FileSelectionList[i]->IsChecked() )
+      {
+      m_FileLayout->addWidget( m_FileSelectionList[i] );
+      }
+    else
+      {
+      const unsigned int curId( m_FileSelectionList[i]->GetIndex() );
+      for(unsigned int j=0; j<m_FileSelectionList.size(); j++ )
+        {
+        if( m_FileSelectionList[j]->GetIndex() > curId )
+          {
+          m_FileSelectionList[j]->SetIndex( m_FileSelectionList[j]->GetIndex()-1 );
+          }
+        }
+      }
+    tmpList.push_back(m_FileSelectionList[i]);
+    }
+      
+  m_FileSelectionList =  tmpList;
+
+  QGroupBox *mainGroup = new QGroupBox();
+  mainGroup->setLayout(m_FileLayout);
+  m_Scroll->setWidget(mainGroup);
+
+  this->update();
  std::cout<<"supsupsup"<<std::endl;
 }
+
+
 void
 QtWidgetInputImageListParameter::EraseFile()
 {
   m_FileSelectionList.clear();
 
-  //m_HLayout->removeItem( m_FileLayout );
-  //m_HLayout->removeWidget( m_Scroll );
-  //m_HLayout->update();
-
   m_FileLayout = new QVBoxLayout();
-  //QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
-  //QLineEdit * fileSelection = new QLineEdit();
-  //fileSelection->setFixedHeight( 40 );
-  //fileLayout->addWidget( fileSelection );
 
-  QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget();
+  QtFileSelectionWidget * fileSelection = new QtFileSelectionWidget(m_InputImageListParam);
   fileSelection->setFixedHeight( 40 );
   m_FileLayout->addWidget( fileSelection );
   m_FileSelectionList.push_back(fileSelection);
 
   QGroupBox *mainGroup = new QGroupBox();
   mainGroup->setLayout(m_FileLayout);
-  //m_Scroll = new QScrollArea();
-  //m_Scroll->setLayout(m_FileLayout);
   m_Scroll->setWidget(mainGroup);
-  //scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); //ScrollBarAlwaysOn);
-  //scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); //ScrollBarAlwaysOn)
 
-  //m_HLayout->insertWidget(0, m_Scroll);
-  //m_HLayout->update();
   this->update();
-  //m_FileLayout = fileLayout;
-  //m_Scroll = scroll;
-  
- std::cout<<"cleancleanclean"<<std::endl;
 }
 /*
 void QtWidgetInputImageListParameter::SetFileName(const QString& value)
-- 
GitLab