18 #include <QMessageBox> 
   19 #include <QToolButton> 
   23 QgsProcessingEnumModelerWidget::QgsProcessingEnumModelerWidget( QWidget *parent )
 
   28   mModel = 
new QStandardItemModel( 
this );
 
   29   mItemList->setModel( mModel );
 
   30   connect( mModel, &QStandardItemModel::itemChanged, 
this, &QgsProcessingEnumModelerWidget::onItemChanged );
 
   32   connect( mButtonAdd, &QToolButton::clicked, 
this, &QgsProcessingEnumModelerWidget::addItem );
 
   33   connect( mButtonRemove, &QToolButton::clicked, 
this, [ = ] { removeItems( 
false ); } );
 
   34   connect( mButtonClear, &QToolButton::clicked, 
this, [ = ] { removeItems( 
true ); } );
 
   37 void QgsProcessingEnumModelerWidget::addItem()
 
   39   QStandardItem *item = 
new QStandardItem( tr( 
"new item" ) );
 
   40   item->setCheckable( 
true );
 
   41   item->setDropEnabled( 
false );
 
   42   item->setData( Qt::Unchecked );
 
   43   mModel->appendRow( item );
 
   46 void QgsProcessingEnumModelerWidget::removeItems( 
const bool removeAll )
 
   50     if ( QMessageBox::question( 
nullptr, tr( 
"Delete items" ),
 
   51                                 tr( 
"Are you sure you want to delete all items" ),
 
   52                                 QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) == QMessageBox::Yes )
 
   57     QModelIndexList selected = mItemList->selectionModel()->selectedIndexes();
 
   59     rows.reserve( selected.count() );
 
   60     for ( 
const QModelIndex &i : selected )
 
   63     QList< int > rowsToDelete = qgis::setToList( rows );
 
   64     std::sort( rowsToDelete.begin(), rowsToDelete.end(), std::greater<int>() );
 
   66     mItemList->setUpdatesEnabled( 
false );
 
   67     for ( 
int i : std::as_const( rowsToDelete ) )
 
   68       mModel->removeRows( i, 1 );
 
   69     mItemList->setUpdatesEnabled( 
true );
 
   73 void QgsProcessingEnumModelerWidget::onItemChanged( QStandardItem *item )
 
   75   int checkedItemIndex = -1;
 
   76   for ( 
int i = 0; i < mModel->rowCount(); i++ )
 
   78     QStandardItem *itm = mModel->item( i );
 
   79     if ( itm->checkState() == Qt::Checked && itm->data() == Qt::Checked )
 
   86   mModel->blockSignals( 
true );
 
   87   if ( checkedItemIndex < 0 )
 
   89     item->setData( item->checkState() );
 
   93     if ( mAllowMultiple->isChecked() )
 
   95       item->setData( item->checkState() );
 
   99       mModel->item( checkedItemIndex )->setCheckState( Qt::Unchecked );
 
  100       mModel->item( checkedItemIndex )->setData( Qt::Unchecked );
 
  101       item->setData( item->checkState() );
 
  104   mModel->blockSignals( 
false );
 
  107 QStringList QgsProcessingEnumModelerWidget::options()
 const 
  110   options.reserve( mModel->rowCount() );
 
  111   for ( 
int i = 0; i < mModel->rowCount(); ++i )
 
  113     options << mModel->item( i )->text();
 
  118 void QgsProcessingEnumModelerWidget::setOptions( 
const QStringList &options )
 
  120   for ( 
const QString &option : options )
 
  122     QStandardItem *item = 
new QStandardItem( option );
 
  123     item->setCheckable( 
true );
 
  124     item->setDropEnabled( 
false );
 
  125     item->setData( Qt::Unchecked );
 
  126     mModel->appendRow( item );
 
  130 QVariant QgsProcessingEnumModelerWidget::defaultOptions()
 const 
  132   QVariantList defaults;
 
  133   for ( 
int i = 0; i < mModel->rowCount(); ++i )
 
  135     if ( mModel->item( i )->checkState() == Qt::Checked )
 
  138   QVariant val( defaults );
 
  142 void QgsProcessingEnumModelerWidget::setDefaultOptions( 
const QVariant &defaultValue )
 
  144   if ( !defaultValue.isValid() )
 
  147   QVariant val = defaultValue;
 
  149   if ( val.type() == QVariant::List || val.type() == QVariant::StringList )
 
  151     for ( 
const QVariant &var : val.toList() )
 
  152       values << var.toInt();
 
  154   else if ( val.type() == QVariant::String )
 
  156     QStringList split = val.toString().split( 
',' );
 
  157     for ( 
const QString &var : split )
 
  158       values << var.toInt();
 
  160   else if ( val.type() == QVariant::Int )
 
  162     values << val.toInt();
 
  166   for ( 
const int &i : values )
 
  168     item = mModel->item( i );
 
  171       item->setCheckState( Qt::Checked );
 
  172       item->setData( Qt::Checked );
 
  177 bool QgsProcessingEnumModelerWidget::allowMultiple()
 const 
  179   return mAllowMultiple->isChecked();
 
  182 void QgsProcessingEnumModelerWidget::setAllowMultiple( 
bool allowMultiple )
 
  184   mAllowMultiple->setChecked( allowMultiple );