30#include <QDialogButtonBox>
35#include <QSortFilterProxyModel>
39#include "moc_qgslayoutattributeselectiondialog.cpp"
41using namespace Qt::StringLiterals;
46 : QAbstractTableModel(
parent )
53 if ( !hasIndex( row, column,
parent ) )
58 return createIndex( row, column );
86 if ( !
index.isValid() || ( role != Qt::DisplayRole && role != Qt::EditRole && role != Qt::UserRole ) )
108 if ( role == Qt::DisplayRole )
112 case Qt::AlignHCenter:
116 return tr(
"Top center" );
117 case Qt::AlignBottom:
118 return tr(
"Bottom center" );
120 return tr(
"Middle center" );
126 return tr(
"Top right" );
127 case Qt::AlignBottom:
128 return tr(
"Bottom right" );
130 return tr(
"Middle right" );
137 return tr(
"Top left" );
138 case Qt::AlignBottom:
139 return tr(
"Bottom left" );
141 return tr(
"Middle left" );
153 if ( role == Qt::DisplayRole )
155 return column.
width() <= 0 ? tr(
"Automatic" ) : tr(
"%L1 mm" ).arg( column.
width(), 0,
'f', 2 );
160 return column.
width();
164 if ( role == Qt::DisplayRole )
168 case Qt::DescendingOrder:
169 return tr(
"Descending" );
170 case Qt::AscendingOrder:
172 return tr(
"Ascending" );
192 if ( role == Qt::DisplayRole )
194 if ( orientation == Qt::Vertical )
196 return QVariant( section );
204 return QVariant( tr(
"Attribute" ) );
207 return QVariant( tr(
"Heading" ) );
210 return QVariant( tr(
"Alignment" ) );
213 return QVariant( tr(
"Width" ) );
216 return QVariant( tr(
"Sort Order" ) );
226 if ( !
index.isValid() || role != Qt::EditRole || !
mTable )
245 emit dataChanged( createIndex(
index.row(), 1 ), createIndex(
index.row(), 1 ) );
257 colToUpdate.
setHAlignment( Qt::AlignmentFlag( value.toInt() & Qt::AlignHorizontal_Mask ) );
258 colToUpdate.
setVAlignment( Qt::AlignmentFlag( value.toInt() & Qt::AlignVertical_Mask ) );
263 colToUpdate.
setWidth( value.toDouble() );
268 colToUpdate.
setSortOrder(
static_cast<Qt::SortOrder
>( value.toInt() ) );
278 Qt::ItemFlags
flags = QAbstractTableModel::flags(
index );
280 if (
index.isValid() )
282 return flags | Qt::ItemIsEditable;
294 const int maxRow = std::min<int>( row + count - 1,
columns().length() - 1 );
295 beginRemoveRows( QModelIndex(), row, maxRow );
297 for (
int i = maxRow; i >= row; --i )
308 beginInsertRows( QModelIndex(), row, row + count - 1 );
310 for (
int i = row; i < row + count; ++i )
327 const int swapWithRow = direction ==
ShiftUp ? row - 1 : row + 1;
330 beginRemoveRows( QModelIndex(), swapWithRow, swapWithRow );
335 beginInsertRows( QModelIndex(), row, row );
361 return mTable->sortColumns();
367 : QItemDelegate( parent )
377 QComboBox *comboBox =
new QComboBox( parent );
379 comboBox->addItem( tr(
"Top Left" ),
int( Qt::AlignTop | Qt::AlignLeft ) );
380 comboBox->addItem( tr(
"Top Center" ),
int( Qt::AlignTop | Qt::AlignHCenter ) );
381 comboBox->addItem( tr(
"Top Right" ),
int( Qt::AlignTop | Qt::AlignRight ) );
382 comboBox->addItem( tr(
"Middle Left" ),
int( Qt::AlignVCenter | Qt::AlignLeft ) );
383 comboBox->addItem( tr(
"Middle Center" ),
int( Qt::AlignVCenter | Qt::AlignHCenter ) );
384 comboBox->addItem( tr(
"Middle Right" ),
int( Qt::AlignVCenter | Qt::AlignRight ) );
385 comboBox->addItem( tr(
"Bottom Left" ),
int( Qt::AlignBottom | Qt::AlignLeft ) );
386 comboBox->addItem( tr(
"Bottom Center" ),
int( Qt::AlignBottom | Qt::AlignHCenter ) );
387 comboBox->addItem( tr(
"Bottom Right" ),
int( Qt::AlignBottom | Qt::AlignRight ) );
389 const Qt::AlignmentFlag alignment = ( Qt::AlignmentFlag ) index.model()->data( index, Qt::EditRole ).toInt();
390 comboBox->setCurrentIndex( comboBox->findData( alignment ) );
397 const Qt::AlignmentFlag alignment = ( Qt::AlignmentFlag ) index.model()->data( index, Qt::EditRole ).toInt();
400 QComboBox *comboBox =
static_cast<QComboBox *
>( editor );
401 comboBox->setCurrentIndex( comboBox->findData( alignment ) );
406 QComboBox *comboBox =
static_cast<QComboBox *
>( editor );
407 const Qt::AlignmentFlag alignment = ( Qt::AlignmentFlag ) comboBox->currentData().toInt();
408 model->setData( index, alignment, Qt::EditRole );
414 editor->setGeometry( option.rect );
421 : QItemDelegate( parent )
422 , mVectorLayer( vlayer )
423 , mLayoutObject( layoutObject )
424 , mForceExpressions( forceExpressions )
430 if ( !mLayoutObject )
435 QgsExpressionContext expContext = mLayoutObject->createExpressionContext();
436 expContext.
lastScope()->
addVariable( QgsExpressionContextScope::StaticVariable( u
"row_number"_s, 1,
true ) );
447 fieldExpression->
setLayer( mVectorLayer );
452 return fieldExpression;
457 const QString field = index.model()->data( index, Qt::EditRole ).toString();
469 model->setData( index, field, Qt::EditRole );
475 editor->setGeometry( option.rect );
478void QgsLayoutColumnSourceDelegate::commitAndCloseEditor()
481 emit commitData( fieldExpression );
488 : QItemDelegate( parent )
497 QComboBox *comboBox =
new QComboBox( parent );
498 QStringList sortOrders;
499 sortOrders << tr(
"Ascending" ) << tr(
"Descending" );
500 comboBox->addItems( sortOrders );
506 const Qt::SortOrder order = ( Qt::SortOrder ) index.model()->data( index, Qt::EditRole ).toInt();
509 QComboBox *comboBox =
static_cast<QComboBox *
>( editor );
512 case Qt::DescendingOrder:
513 comboBox->setCurrentIndex( 1 );
515 case Qt::AscendingOrder:
517 comboBox->setCurrentIndex( 0 );
524 QComboBox *comboBox =
static_cast<QComboBox *
>( editor );
525 const int value = comboBox->currentIndex();
530 order = Qt::DescendingOrder;
534 order = Qt::AscendingOrder;
538 model->setData( index, order, Qt::EditRole );
544 editor->setGeometry( option.rect );
553 : QItemDelegate( parent )
562 editor->setMinimum( 0 );
563 editor->setMaximum( 1000 );
564 editor->setDecimals( 2 );
565 editor->setSuffix( tr(
" mm" ) );
573 const int value = index.model()->data( index, Qt::EditRole ).toInt();
576 spinBox->setValue( value );
582 spinBox->interpretText();
583 const int value = spinBox->value();
585 model->setData( index, value, Qt::EditRole );
591 editor->setGeometry( option.rect );
598 : QDialog( parent, f )
605 connect( mRemoveColumnPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mRemoveColumnPushButton_clicked );
606 connect( mAddColumnPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mAddColumnPushButton_clicked );
607 connect( mColumnUpPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mColumnUpPushButton_clicked );
608 connect( mColumnDownPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mColumnDownPushButton_clicked );
609 connect( mResetColumnsPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mResetColumnsPushButton_clicked );
610 connect( mClearColumnsPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mClearColumnsPushButton_clicked );
611 connect( mAddSortColumnPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mAddSortColumnPushButton_clicked );
612 connect( mRemoveSortColumnPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mRemoveSortColumnPushButton_clicked );
613 connect( mSortColumnUpPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mSortColumnUpPushButton_clicked );
614 connect( mSortColumnDownPushButton, &QPushButton::clicked,
this, &QgsLayoutAttributeSelectionDialog::mSortColumnDownPushButton_clicked );
615 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsLayoutAttributeSelectionDialog::showHelp );
621 mColumnsTableView->setModel( mColumnModel );
622 mColumnsTableView->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
624 mColumnsTableView->setItemDelegateForColumn( 0, mColumnSourceDelegate );
626 mColumnsTableView->setItemDelegateForColumn( 2, mColumnAlignmentDelegate );
628 mColumnsTableView->setItemDelegateForColumn( 3, mColumnWidthDelegate );
631 mSortColumnTableView->setModel( mSortColumnModel );
632 mSortColumnTableView->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
634 mSortColumnTableView->setItemDelegateForColumn( 0, mSortColumnSourceDelegate );
636 mSortColumnTableView->setItemDelegateForColumn( 1, mSortColumnOrderDelegate );
640void QgsLayoutAttributeSelectionDialog::mRemoveColumnPushButton_clicked()
643 const QModelIndexList indexes = mColumnsTableView->selectionModel()->selectedRows();
644 const int count = indexes.count();
646 for (
int i = count; i > 0; --i )
647 mColumnModel->removeRow( indexes.at( i - 1 ).row(), QModelIndex() );
650void QgsLayoutAttributeSelectionDialog::mAddColumnPushButton_clicked()
653 mColumnModel->insertRow( mColumnModel->rowCount() );
656void QgsLayoutAttributeSelectionDialog::mColumnUpPushButton_clicked()
660 QModelIndexList indexes = mColumnsTableView->selectionModel()->selectedRows();
661 const int count = indexes.count();
663 std::reverse( indexes.begin(), indexes.end() );
664 for (
int i = count; i > 0; --i )
668void QgsLayoutAttributeSelectionDialog::mColumnDownPushButton_clicked()
671 const QModelIndexList indexes = mColumnsTableView->selectionModel()->selectedRows();
672 const int count = indexes.count();
674 for (
int i = count; i > 0; --i )
678void QgsLayoutAttributeSelectionDialog::mResetColumnsPushButton_clicked()
681 mColumnModel->resetToLayer();
684void QgsLayoutAttributeSelectionDialog::mClearColumnsPushButton_clicked()
687 mColumnModel->removeRows( 0, mColumnModel->rowCount() );
690void QgsLayoutAttributeSelectionDialog::mAddSortColumnPushButton_clicked()
693 mSortColumnModel->insertRow( mSortColumnModel->rowCount() );
696void QgsLayoutAttributeSelectionDialog::mRemoveSortColumnPushButton_clicked()
699 const QModelIndexList indexes = mSortColumnTableView->selectionModel()->selectedRows();
700 const int count = indexes.count();
702 for (
int i = count; i > 0; --i )
703 mSortColumnModel->removeRow( indexes.at( i - 1 ).row(), QModelIndex() );
706void QgsLayoutAttributeSelectionDialog::showHelp()
708 QgsHelp::openHelp( u
"print_composer/composer_items/composer_attribute_table.html"_s );
711void QgsLayoutAttributeSelectionDialog::mSortColumnDownPushButton_clicked()
714 const QModelIndexList indexes = mSortColumnTableView->selectionModel()->selectedRows();
715 const int count = indexes.count();
717 for (
int i = count; i > 0; --i )
721void QgsLayoutAttributeSelectionDialog::mSortColumnUpPushButton_clicked()
724 const QModelIndexList indexes = mSortColumnTableView->selectionModel()->selectedRows();
725 const int count = indexes.count();
727 for (
int i = count; i > 0; --i )
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
void setSpecialValueText(const QString &txt)
Set the special-value text to be txt If set, the spin box will display this text instead of a numeric...
void setShowClearButton(bool showClearButton)
Sets whether the widget will show a clear button.
virtual QgsExpressionContext createExpressionContext() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
QgsLayoutAttributeSelectionDialog(QgsLayoutItemAttributeTable *table, QgsVectorLayer *vLayer, QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags())
constructor
QModelIndex index(int row, int column, const QModelIndex &parent) const override
Column
Available columns for the configuration table to be used by the model.
@ SortOrder
Defines the sort order.
@ Width
Defines the width of the column.
@ Heading
Defines the title of the column.
@ Attribute
Attribute for a field or an expression.
@ Alignment
Defines the alignment of the column.
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
bool moveRow(int row, ShiftDirection direction)
Moves the specified row up or down in the model.
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
virtual QVector< QgsLayoutTableColumn > & columns() const =0
To be reimplemented to provide the display or the sort columns.
QVariant data(const QModelIndex &index, int role) const override
QgsLayoutAttributeTableColumnModelBase(QgsLayoutItemAttributeTable *table, QObject *parent=nullptr)
Constructor for QgsLayoutAttributeTableColumnModel.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
virtual QList< Column > displayedColumns() const =0
To be reimplemented to choose which column should be used by the model.
QgsLayoutItemAttributeTable * mTable
int rowCount(const QModelIndex &parent=QModelIndex()) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
QModelIndex parent(const QModelIndex &child) const override
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
ShiftDirection
Controls whether a row/column is shifted up or down.
@ ShiftUp
Shift the row/column up.
@ ShiftDown
Shift the row/column down.
bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
A model for displaying columns shown in a QgsLayoutAttributeTable.
QVector< QgsLayoutTableColumn > & columns() const override
To be reimplemented to provide the display or the sort columns.
void resetToLayer()
Resets the attribute table's columns to match the source layer's fields.
A delegate for showing column alignment as a combo box.
void setEditorData(QWidget *editor, const QModelIndex &index) const override
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
QgsLayoutColumnAlignmentDelegate(QObject *parent=nullptr)
constructor
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
A delegate for showing column sort order as a combo box.
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
void setEditorData(QWidget *editor, const QModelIndex &index) const override
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
QgsLayoutColumnSortOrderDelegate(QObject *parent=nullptr)
constructor
A delegate for showing column attribute source as a QgsFieldExpressionWidget.
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
QgsLayoutColumnSourceDelegate(QgsVectorLayer *vlayer, QObject *parent=nullptr, const QgsLayoutObject *layoutObject=nullptr, bool forceExpressions=false)
Constructor for QgsLayoutColumnSourceDelegate.
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setEditorData(QWidget *editor, const QModelIndex &index) const override
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
A delegate for showing column width as a spin box.
void setEditorData(QWidget *editor, const QModelIndex &index) const override
QgsLayoutColumnWidthDelegate(QObject *parent=nullptr)
constructor
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
A layout table subclass that displays attributes from a vector layer.
A base class for objects which belong to a layout.
Stores properties of a column for a QgsLayoutTable.
QString attribute() const
Returns the attribute name or expression used for the column's values.
void setVAlignment(Qt::AlignmentFlag alignment)
Sets the vertical alignment for a column, which controls the alignment used for drawing column values...
double width() const
Returns the width for the column in mm, or 0 if column width is automatically calculated.
Qt::AlignmentFlag vAlignment() const
Returns the vertical alignment for a column, which controls the alignment used for drawing column val...
QString heading() const
Returns the heading for a column, which is the value displayed in the column's header cell.
void setSortOrder(Qt::SortOrder order)
Sets the sort order for the column.
void setAttribute(const QString &attribute)
Sets the attribute name or expression used for the column's values.
Qt::SortOrder sortOrder() const
Returns the sort order for the column.
void setHAlignment(Qt::AlignmentFlag alignment)
Sets the horizontal alignment for a column, which controls the alignment used for drawing column valu...
void setHeading(const QString &heading)
Sets the heading for a column, which is the value displayed in the column's header cell.
Qt::AlignmentFlag hAlignment() const
Returns the horizontal alignment for a column, which controls the alignment used for drawing column v...
void setWidth(const double width)
Sets the width for a column in mm.
Allows for filtering QgsComposerAttributeTable columns by columns which are sorted or unsorted.
QVector< QgsLayoutTableColumn > & columns() const override
To be reimplemented to provide the display or the sort columns.
Represents a vector layer which manages a vector based dataset.