25#include <QTableWidget>
27#include "moc_qgsorderbydialog.cpp"
29using namespace Qt::StringLiterals;
37 mOrderByTableWidget->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch );
38 mOrderByTableWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::ResizeToContents );
39 mOrderByTableWidget->horizontalHeader()->setSectionResizeMode( 2, QHeaderView::ResizeToContents );
41 mOrderByTableWidget->installEventFilter(
this );
43 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsOrderByDialog::showHelp );
48 mOrderByTableWidget->setRowCount(
orderBy.length() + 1 );
51 const auto constOrderBy =
orderBy;
54 setRow( i, orderByClause );
67 for (
int i = 0; i < mOrderByTableWidget->rowCount(); ++i )
72 if ( !expressionText.isEmpty() )
75 const int ascIndex =
static_cast<QComboBox *
>( mOrderByTableWidget->cellWidget( i, 1 ) )->currentIndex();
79 bool nullsFirst =
false;
80 const int nullsFirstIndex =
static_cast<QComboBox *
>( mOrderByTableWidget->cellWidget( i, 2 ) )->currentIndex();
81 if ( nullsFirstIndex == 1 )
96void QgsOrderByDialog::onExpressionChanged(
const QString &expression )
100 for ( row = 0; row < mOrderByTableWidget->rowCount(); ++row )
102 if ( mOrderByTableWidget->cellWidget( row, 0 ) == sender() )
108 if ( expression.isEmpty() && row != mOrderByTableWidget->rowCount() - 1 )
110 mOrderByTableWidget->removeRow( row );
112 else if ( !expression.isEmpty() && row == mOrderByTableWidget->rowCount() - 1 )
114 mOrderByTableWidget->insertRow( mOrderByTableWidget->rowCount() );
115 setRow( row + 1, QgsFeatureRequest::OrderByClause( QString() ) );
121 QgsFieldExpressionWidget *fieldExpression =
new QgsFieldExpressionWidget();
122 fieldExpression->
setLayer( mLayer );
124 connect( fieldExpression,
static_cast<void ( QgsFieldExpressionWidget::* )(
const QString & )
>( &
QgsFieldExpressionWidget::fieldChanged ),
this, &QgsOrderByDialog::onExpressionChanged );
126 QComboBox *ascComboBox =
new QComboBox();
127 ascComboBox->addItem( tr(
"Ascending" ) );
128 ascComboBox->addItem( tr(
"Descending" ) );
129 ascComboBox->setCurrentIndex( orderByClause.
ascending() ? 0 : 1 );
131 QComboBox *nullsFirstComboBox =
new QComboBox();
132 nullsFirstComboBox->addItem( tr(
"NULLs Last" ) );
133 nullsFirstComboBox->addItem( tr(
"NULLs First" ) );
134 nullsFirstComboBox->setCurrentIndex( orderByClause.
nullsFirst() ? 1 : 0 );
136 mOrderByTableWidget->setCellWidget( row, 0, fieldExpression );
137 mOrderByTableWidget->setCellWidget( row, 1, ascComboBox );
138 mOrderByTableWidget->setCellWidget( row, 2, nullsFirstComboBox );
144 Q_ASSERT( obj == mOrderByTableWidget );
146 if ( e->type() == QEvent::KeyPress )
148 QKeyEvent *keyEvent =
static_cast<QKeyEvent *
>( e );
150 if ( keyEvent->key() == Qt::Key_Delete )
152 if ( mOrderByTableWidget->currentRow() != mOrderByTableWidget->rowCount() - 1 )
153 mOrderByTableWidget->removeRow( mOrderByTableWidget->currentRow() );
158 return QDialog::eventFilter( obj, e );
161void QgsOrderByDialog::showHelp()
163 QgsHelp::openHelp( u
"working_with_vector/vector_properties.html#layer-rendering"_s );
QString expression() const
Returns the original, unmodified expression string.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes).
The OrderByClause class represents an order by clause for a QgsFeatureRequest.
QgsExpression expression() const
The expression.
bool ascending() const
Order ascending.
bool nullsFirst() const
Set if NULLS should be returned first.
Represents a list of OrderByClauses, with the most important first and the least important last.
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
bool eventFilter(QObject *obj, QEvent *e) override
void setOrderBy(const QgsFeatureRequest::OrderBy &orderBy)
Set the order by to manage.
QgsOrderByDialog(QgsVectorLayer *layer, QWidget *parent=nullptr)
Create a new order by dialog.
QgsFeatureRequest::OrderBy orderBy()
Gets the order by defined in the dialog.
Represents a vector layer which manages a vector based dataset.