diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx index 4ed51d04740fba594e099cf2d3c751f7bfe7b171..7f1111939e40c1df5b14e8789c7f091d00967514 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx @@ -40,13 +40,31 @@ QtWidgetListViewParameter::~QtWidgetListViewParameter() void QtWidgetListViewParameter::DoUpdateGUI() { - size_t numSelected = m_ListViewParam->GetSelectedItems().size(); + bool resetNeeded = false; + if (m_ListViewParam->GetNbChoices() != (unsigned int) m_ListView->count()) + { + resetNeeded = true; + } + else + { + for (unsigned int i = 0; i < m_ListViewParam->GetNbChoices(); ++i) + { + QString key = m_ListViewParam->GetChoiceKey(i).c_str(); + if (key != m_ListView->item(i)->text() ) + { + resetNeeded = true; + break; + } + } + } - //Clear m_ListView add re-add choices only if no items selected. - //Otherwise results in mantis #1025 + // save selected choices + std::vector<int> selected = m_ListViewParam->GetSelectedItems(); - if(numSelected < 1) + //Beware of mantis #1025 and #1403 + if(resetNeeded) { + m_SelectedItems.clear(); while(m_ListView->takeItem(0)) { m_ListView->removeItemWidget( m_ListView->takeItem(0) ); @@ -60,13 +78,25 @@ void QtWidgetListViewParameter::DoUpdateGUI() } } - //I can't find any reason for calling m_ListView->setCurrentRow(value) in this - //case because QListWidget is a MultiSelection widget. - if (m_ListView->selectionMode() == QAbstractItemView::SingleSelection) + // test if selection has to be updated + if (selected != m_SelectedItems) { - unsigned int value = m_ListViewParam->GetValue( ); - m_ListView->setCurrentRow(value); + for (int idx = 0; idx < m_ListView->count(); ++idx) + { + // check if this item is selected + bool isSelected = false; + for (unsigned int k = 0 ; k < selected.size() ; ++k) + { + if (selected[k] == idx) + { + isSelected = true; + break; + } + } + m_ListView->item(idx)->setSelected(isSelected); + } } + } void QtWidgetListViewParameter::DoCreateWidget() @@ -100,7 +130,7 @@ void QtWidgetListViewParameter::SelectedItems() m_SelectedItems.clear(); // Item changed (check if selected or not) - for (int idx = 0; idx < m_ListView->count(); ++idx) + for (int idx = 0; idx < m_ListView->count() && idx < (int) m_ListViewParam->GetNbChoices(); ++idx) { if (m_ListView->item(idx)->isSelected()) {