29 #include <QDialogButtonBox> 
   30 #include <QGridLayout> 
   33 #include <QPushButton> 
   35 #include <QSortFilterProxyModel> 
   42   : QAbstractTableModel( parent )
 
   49   if ( !hasIndex( row, column, 
parent ) )
 
   54     return createIndex( row, column );
 
   82   if ( !
index.isValid() ||
 
   83        ( role != Qt::DisplayRole && role != Qt::EditRole && role != Qt::UserRole ) )
 
  105       if ( role == Qt::DisplayRole )
 
  109           case Qt::AlignHCenter:
 
  113                 return tr( 
"Top center" );
 
  114               case Qt::AlignBottom:
 
  115                 return tr( 
"Bottom center" );
 
  117                 return tr( 
"Middle center" );
 
  123                 return tr( 
"Top right" );
 
  124               case Qt::AlignBottom:
 
  125                 return tr( 
"Bottom right" );
 
  127                 return tr( 
"Middle right" );
 
  134                 return tr( 
"Top left" );
 
  135               case Qt::AlignBottom:
 
  136                 return tr( 
"Bottom left" );
 
  138                 return tr( 
"Middle left" );
 
  150       if ( role == Qt::DisplayRole )
 
  152         return column.
width() <= 0 ? tr( 
"Automatic" ) : tr( 
"%1 mm" ).arg( column.
width(), 0, 
'f', 2 );
 
  157         return column.
width();
 
  161       if ( role == Qt::DisplayRole )
 
  165           case Qt::DescendingOrder:
 
  166             return tr( 
"Descending" );
 
  167           case Qt::AscendingOrder:
 
  169             return tr( 
"Ascending" );
 
  189   if ( role == Qt::DisplayRole )
 
  191     if ( orientation == Qt::Vertical ) 
 
  193       return QVariant( section );
 
  201           return QVariant( tr( 
"Attribute" ) );
 
  204           return QVariant( tr( 
"Heading" ) );
 
  207           return QVariant( tr( 
"Alignment" ) );
 
  210           return QVariant( tr( 
"Width" ) );
 
  213           return QVariant( tr( 
"Sort Order" ) );
 
  223   if ( !
index.isValid() || role != Qt::EditRole || !
mTable )
 
  242         emit dataChanged( createIndex( 
index.row(), 1 ), createIndex( 
index.row(), 1 ) );
 
  254       colToUpdate.
setHAlignment( Qt::AlignmentFlag( value.toInt() & Qt::AlignHorizontal_Mask ) );
 
  255       colToUpdate.
setVAlignment( Qt::AlignmentFlag( value.toInt() & Qt::AlignVertical_Mask ) );
 
  260       colToUpdate.
setWidth( value.toDouble() );
 
  265       colToUpdate.
setSortOrder( 
static_cast< Qt::SortOrder 
>( value.toInt() ) );
 
  275   Qt::ItemFlags 
flags = QAbstractTableModel::flags( 
index );
 
  277   if ( 
index.isValid() )
 
  279     return flags | Qt::ItemIsEditable;
 
  291   int maxRow = std::min( row + count - 1, 
columns().length() - 1 );
 
  292   beginRemoveRows( QModelIndex(), row, maxRow );
 
  294   for ( 
int i = maxRow; i >= row; --i )
 
  305   beginInsertRows( QModelIndex(), row, row + count - 1 );
 
  307   for ( 
int i = row; i < row + count; ++i )
 
  317   if ( ( direction == 
ShiftUp && row <= 0 ) ||
 
  325   int swapWithRow = direction == 
ShiftUp ? row - 1 : row + 1;
 
  328   beginRemoveRows( QModelIndex(), swapWithRow, swapWithRow );
 
  333   beginInsertRows( QModelIndex(), row, row );
 
  375   QComboBox *comboBox = 
new QComboBox( parent );
 
  377   comboBox->addItem( tr( 
"Top Left" ), 
int( Qt::AlignTop | Qt::AlignLeft ) );
 
  378   comboBox->addItem( tr( 
"Top Center" ), 
int( Qt::AlignTop | Qt::AlignHCenter ) );
 
  379   comboBox->addItem( tr( 
"Top Right" ), 
int( Qt::AlignTop | Qt::AlignRight ) );
 
  380   comboBox->addItem( tr( 
"Middle Left" ), 
int( Qt::AlignVCenter | Qt::AlignLeft ) );
 
  381   comboBox->addItem( tr( 
"Middle Center" ), 
int( Qt::AlignVCenter | Qt::AlignHCenter ) );
 
  382   comboBox->addItem( tr( 
"Middle Right" ), 
int( Qt::AlignVCenter | Qt::AlignRight ) );
 
  383   comboBox->addItem( tr( 
"Bottom Left" ), 
int( Qt::AlignBottom | Qt::AlignLeft ) );
 
  384   comboBox->addItem( tr( 
"Bottom Center" ), 
int( Qt::AlignBottom | Qt::AlignHCenter ) );
 
  385   comboBox->addItem( tr( 
"Bottom Right" ), 
int( Qt::AlignBottom | Qt::AlignRight ) );
 
  387   Qt::AlignmentFlag alignment = ( Qt::AlignmentFlag )index.model()->data( index, Qt::EditRole ).toInt();
 
  388   comboBox->setCurrentIndex( comboBox->findData( alignment ) );
 
  395   Qt::AlignmentFlag alignment = ( Qt::AlignmentFlag )index.model()->data( index, Qt::EditRole ).toInt();
 
  398   QComboBox *comboBox = 
static_cast<QComboBox *
>( editor );
 
  399   comboBox->setCurrentIndex( comboBox->findData( alignment ) );
 
  404   QComboBox *comboBox = 
static_cast<QComboBox *
>( editor );
 
  405   Qt::AlignmentFlag alignment = ( Qt::AlignmentFlag ) comboBox->currentData().toInt();
 
  406   model->setData( index, alignment, Qt::EditRole );
 
  412   editor->setGeometry( option.rect );
 
  419   : QItemDelegate( parent )
 
  420   , mVectorLayer( vlayer )
 
  421   , mLayoutObject( layoutObject )
 
  428   if ( !mLayoutObject )
 
  445   fieldExpression->
setLayer( mVectorLayer );
 
  450   return fieldExpression;
 
  455   QString 
field = index.model()->data( index, Qt::EditRole ).toString();
 
  467   model->setData( index, 
field, Qt::EditRole );
 
  473   editor->setGeometry( option.rect );
 
  476 void QgsLayoutColumnSourceDelegate::commitAndCloseEditor()
 
  479   emit commitData( fieldExpression );
 
  495   QComboBox *comboBox = 
new QComboBox( parent );
 
  496   QStringList sortOrders;
 
  497   sortOrders << tr( 
"Ascending" ) << tr( 
"Descending" );
 
  498   comboBox->addItems( sortOrders );
 
  504   Qt::SortOrder order = ( Qt::SortOrder )index.model()->data( index, Qt::EditRole ).toInt();
 
  507   QComboBox *comboBox = 
static_cast<QComboBox *
>( editor );
 
  510     case Qt::DescendingOrder:
 
  511       comboBox->setCurrentIndex( 1 );
 
  513     case Qt::AscendingOrder:
 
  515       comboBox->setCurrentIndex( 0 );
 
  522   QComboBox *comboBox = 
static_cast<QComboBox *
>( editor );
 
  523   int value = comboBox->currentIndex();
 
  528       order = Qt::DescendingOrder;
 
  532       order = Qt::AscendingOrder;
 
  536   model->setData( index, order, Qt::EditRole );
 
  542   editor->setGeometry( option.rect );
 
  551   : QItemDelegate( parent )
 
  561   editor->setMinimum( 0 );
 
  562   editor->setMaximum( 1000 );
 
  563   editor->setDecimals( 2 );
 
  564   editor->setSuffix( tr( 
" mm" ) );
 
  572   int value = index.model()->data( index, Qt::EditRole ).toInt();
 
  575   spinBox->setValue( value );
 
  581   spinBox->interpretText();
 
  582   int value = spinBox->value();
 
  584   model->setData( index, value, Qt::EditRole );
 
  590   editor->setGeometry( option.rect );
 
  597     QWidget *parent, Qt::WindowFlags f )
 
  598   : QDialog( parent, f )
 
  600   , mVectorLayer( vLayer )
 
  606   connect( mRemoveColumnPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mRemoveColumnPushButton_clicked );
 
  607   connect( mAddColumnPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mAddColumnPushButton_clicked );
 
  608   connect( mColumnUpPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mColumnUpPushButton_clicked );
 
  609   connect( mColumnDownPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mColumnDownPushButton_clicked );
 
  610   connect( mResetColumnsPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mResetColumnsPushButton_clicked );
 
  611   connect( mClearColumnsPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mClearColumnsPushButton_clicked );
 
  612   connect( mAddSortColumnPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mAddSortColumnPushButton_clicked );
 
  613   connect( mRemoveSortColumnPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mRemoveSortColumnPushButton_clicked );
 
  614   connect( mSortColumnUpPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mSortColumnUpPushButton_clicked );
 
  615   connect( mSortColumnDownPushButton, &QPushButton::clicked, 
this, &QgsLayoutAttributeSelectionDialog::mSortColumnDownPushButton_clicked );
 
  616   connect( buttonBox, &QDialogButtonBox::helpRequested, 
this, &QgsLayoutAttributeSelectionDialog::showHelp );
 
  622     mColumnsTableView->setModel( mColumnModel );
 
  623     mColumnsTableView->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
 
  625     mColumnsTableView->setItemDelegateForColumn( 0, mColumnSourceDelegate );
 
  627     mColumnsTableView->setItemDelegateForColumn( 2, mColumnAlignmentDelegate );
 
  629     mColumnsTableView->setItemDelegateForColumn( 3, mColumnWidthDelegate );
 
  632     mSortColumnTableView->setModel( mSortColumnModel );
 
  633     mSortColumnTableView->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
 
  635     mSortColumnTableView->setItemDelegateForColumn( 0, mSortColumnSourceDelegate );
 
  637     mSortColumnTableView->setItemDelegateForColumn( 1, mSortColumnOrderDelegate );
 
  641 void QgsLayoutAttributeSelectionDialog::mRemoveColumnPushButton_clicked()
 
  644   QModelIndexList indexes =  mColumnsTableView->selectionModel()->selectedRows();
 
  645   int count = indexes.count();
 
  647   for ( 
int i = count; i > 0; --i )
 
  648     mColumnModel->removeRow( indexes.at( i - 1 ).row(), QModelIndex() );
 
  651 void QgsLayoutAttributeSelectionDialog::mAddColumnPushButton_clicked()
 
  654   mColumnModel->insertRow( mColumnModel->
rowCount() );
 
  657 void QgsLayoutAttributeSelectionDialog::mColumnUpPushButton_clicked()
 
  661   QModelIndexList indexes =  mColumnsTableView->selectionModel()->selectedRows();
 
  662   int count = indexes.count();
 
  664   std::reverse( indexes.begin(), indexes.end() );
 
  665   for ( 
int i = count; i > 0; --i )
 
  669 void QgsLayoutAttributeSelectionDialog::mColumnDownPushButton_clicked()
 
  672   QModelIndexList indexes =  mColumnsTableView->selectionModel()->selectedRows();
 
  673   int count = indexes.count();
 
  675   for ( 
int i = count; i > 0; --i )
 
  679 void QgsLayoutAttributeSelectionDialog::mResetColumnsPushButton_clicked()
 
  685 void QgsLayoutAttributeSelectionDialog::mClearColumnsPushButton_clicked()
 
  691 void QgsLayoutAttributeSelectionDialog::mAddSortColumnPushButton_clicked()
 
  694   mSortColumnModel->insertRow( mSortColumnModel->
rowCount() );
 
  697 void QgsLayoutAttributeSelectionDialog::mRemoveSortColumnPushButton_clicked()
 
  700   QModelIndexList indexes =  mSortColumnTableView->selectionModel()->selectedRows();
 
  701   int count = indexes.count();
 
  703   for ( 
int i = count; i > 0; --i )
 
  704     mSortColumnModel->removeRow( indexes.at( i - 1 ).row(), QModelIndex() );
 
  707 void QgsLayoutAttributeSelectionDialog::showHelp()
 
  709   QgsHelp::openHelp( QStringLiteral( 
"print_composer/composer_items/composer_attribute_table.html" ) );
 
  712 void QgsLayoutAttributeSelectionDialog::mSortColumnUpPushButton_clicked()
 
  715   QModelIndexList indexes =  mSortColumnTableView->selectionModel()->selectedRows();
 
  716   int count = indexes.count();
 
  718   for ( 
int i = count; i > 0; --i )
 
  722 void QgsLayoutAttributeSelectionDialog::mSortColumnDownPushButton_clicked()
 
  725   QModelIndexList indexes =  mSortColumnTableView->selectionModel()->selectedRows();
 
  726   int count = indexes.count();
 
  728   for ( 
int i = count; i > 0; --i )