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