18#include <QInputDialog> 
   25QgsProcessingMatrixModelerWidget::QgsProcessingMatrixModelerWidget( QWidget *parent )
 
   30  mModel = 
new QStandardItemModel( 
this );
 
   31  mModel->appendColumn( QList< QStandardItem * >() << 
new QStandardItem( 
'0' ) );
 
   32  mTableView->setModel( mModel );
 
   34  connect( mButtonAddColumn, &QToolButton::clicked, 
this, &QgsProcessingMatrixModelerWidget::addColumn );
 
   35  connect( mButtonRemoveColumn, &QToolButton::clicked, 
this, &QgsProcessingMatrixModelerWidget::removeColumns );
 
   36  connect( mButtonAddRow, &QToolButton::clicked, 
this, &QgsProcessingMatrixModelerWidget::addRow );
 
   37  connect( mButtonRemoveRow, &QToolButton::clicked, 
this, &QgsProcessingMatrixModelerWidget::removeRows );
 
   38  connect( mButtonClear, &QToolButton::clicked, 
this, &QgsProcessingMatrixModelerWidget::clearTable );
 
   39  connect( mTableView->horizontalHeader(), &QHeaderView::sectionDoubleClicked, 
this, &QgsProcessingMatrixModelerWidget::changeHeader );
 
   42void QgsProcessingMatrixModelerWidget::addColumn()
 
   44  QList< QStandardItem * > items;
 
   45  for ( 
int i = 0; i < mModel->rowCount(); ++i )
 
   46    items << 
new QStandardItem( 
'0' );
 
   48  mModel->appendColumn( items );
 
   51void QgsProcessingMatrixModelerWidget::removeColumns()
 
   53  QModelIndexList selected = mTableView->selectionModel()->selectedColumns();
 
   54  std::sort( selected.begin(), selected.end(), []( 
const QModelIndex & a, 
const QModelIndex & b ) { return b < a; } );
 
   56  mTableView->setUpdatesEnabled( 
false );
 
   57  for ( QModelIndex i : std::as_const( selected ) )
 
   58    mModel->removeColumns( i.column(), 1 );
 
   60  mTableView->setUpdatesEnabled( 
true );
 
   63void QgsProcessingMatrixModelerWidget::addRow()
 
   65  QList< QStandardItem * > items;
 
   66  for ( 
int i = 0; i < mModel->columnCount(); ++i )
 
   67    items << 
new QStandardItem( 
'0' );
 
   69  mModel->appendRow( items );
 
   72void QgsProcessingMatrixModelerWidget::removeRows()
 
   74  QModelIndexList selected = mTableView->selectionModel()->selectedRows();
 
   75  std::sort( selected.begin(), selected.end(), []( 
const QModelIndex & a, 
const QModelIndex & b ) { return b < a; } );
 
   77  mTableView->setUpdatesEnabled( 
false );
 
   78  for ( QModelIndex i : std::as_const( selected ) )
 
   79    mModel->removeRows( i.row(), 1 );
 
   81  mTableView->setUpdatesEnabled( 
true );
 
   84void QgsProcessingMatrixModelerWidget::clearTable()
 
   86  if ( QMessageBox::question( 
nullptr, tr( 
"Clear table" ),
 
   87                              tr( 
"Are you sure you want to clear table?" ),
 
   88                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) == QMessageBox::Yes )
 
   92void QgsProcessingMatrixModelerWidget::changeHeader( 
int index )
 
   95  QString text = QInputDialog::getText( 
nullptr, tr( 
"Enter column name" ),
 
   96                                        tr( 
"Column name" ), QLineEdit::Normal,
 
   98  if ( ok && !text.isEmpty() )
 
   99    mModel->setHeaderData( index, Qt::Horizontal, text );
 
  102QStringList QgsProcessingMatrixModelerWidget::headers()
 const 
  105  for ( 
int i = 0; i < mModel->columnCount(); ++i )
 
  107    headers << mModel->headerData( i, Qt::Horizontal ).toString();
 
  112QVariant QgsProcessingMatrixModelerWidget::value()
 const 
  114  QVariantList defaults;
 
  115  const int cols = mModel->columnCount();
 
  116  const int rows = mModel->rowCount();
 
  118  for ( 
int row = 0; row < rows; ++row )
 
  120    for ( 
int col = 0; col < cols; ++col )
 
  122      defaults << mModel->item( row, col )->text();
 
  126  QVariant val( defaults );
 
  130void QgsProcessingMatrixModelerWidget::setValue( 
const QStringList &headers, 
const QVariant &defaultValue )
 
  132  QVariantList contents = defaultValue.toList();
 
  134  const int cols = headers.count();
 
  135  const int rows = contents.count() / cols;
 
  137  mModel->setRowCount( rows );
 
  138  mModel->setColumnCount( cols );
 
  139  mModel->setHorizontalHeaderLabels( headers );
 
  141  for ( 
int row = 0; row < rows; ++row )
 
  143    for ( 
int col = 0; col < cols; ++col )
 
  145      QStandardItem *item = 
new QStandardItem( contents.at( row * cols + col ).toString() );
 
  146      mModel->setItem( row, col, item );
 
  149  mTableView->setModel( mModel );
 
  152bool QgsProcessingMatrixModelerWidget::fixedRows()
 const 
  154  return mFixedRows->isChecked();
 
  157void QgsProcessingMatrixModelerWidget::setFixedRows( 
bool fixedRows )
 
  159  mFixedRows->setChecked( fixedRows );