Skip to content

Commit

Permalink
Use field expression widget in order by dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
m-kuhn committed Dec 22, 2015
1 parent 9c9ff79 commit 09cc9e4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 75 deletions.
4 changes: 4 additions & 0 deletions src/gui/qgsfieldexpressionwidget.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -79,7 +79,11 @@ class GUI_EXPORT QgsFieldExpressionWidget : public QWidget
*/ */
bool isValidExpression( QString *expressionError = nullptr ) const; bool isValidExpression( QString *expressionError = nullptr ) const;


/**
* If the content is not just a simple field this method will return true.
*/
bool isExpression() const; bool isExpression() const;

/** /**
* Return the current text that is set in the expression area * Return the current text that is set in the expression area
*/ */
Expand Down
103 changes: 30 additions & 73 deletions src/gui/qgsorderbydialog.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "qgsorderbydialog.h" #include "qgsorderbydialog.h"


#include "qgsexpressionbuilderdialog.h" #include "qgsexpressionbuilderdialog.h"
#include "qgsfieldexpressionwidget.h"


#include <QTableWidget> #include <QTableWidget>
#include <QCheckBox> #include <QCheckBox>
Expand All @@ -27,8 +28,6 @@ QgsOrderByDialog::QgsOrderByDialog( QgsVectorLayer* layer, QWidget* parent )
, mLayer( layer ) , mLayer( layer )
{ {
setupUi( this ); setupUi( this );
connect( mOrderByTableWidget, SIGNAL( cellDoubleClicked( int, int ) ), this, SLOT( onCellDoubleClicked( int, int ) ) );
connect( mOrderByTableWidget, SIGNAL( cellChanged( int, int ) ), this, SLOT( onCellChanged( int, int ) ) );


mOrderByTableWidget->horizontalHeader()->setResizeMode( QHeaderView::Stretch ); mOrderByTableWidget->horizontalHeader()->setResizeMode( QHeaderView::Stretch );
mOrderByTableWidget->horizontalHeader()->setResizeMode( 1, QHeaderView::Interactive ); mOrderByTableWidget->horizontalHeader()->setResizeMode( 1, QHeaderView::Interactive );
Expand All @@ -45,28 +44,13 @@ void QgsOrderByDialog::setOrderBy( const QgsFeatureRequest::OrderBy& orderBy )
int i = 0; int i = 0;
Q_FOREACH ( const QgsFeatureRequest::OrderByClause& orderByClause, orderBy ) Q_FOREACH ( const QgsFeatureRequest::OrderByClause& orderByClause, orderBy )
{ {
QTableWidgetItem* expressionItem = new QTableWidgetItem( orderByClause.expression().expression() ); setRow( i, orderByClause );
QCheckBox* ascCheckBox = new QCheckBox();
ascCheckBox->setChecked( orderByClause.ascending() );
QCheckBox* nullsFirstCheckBox = new QCheckBox();
nullsFirstCheckBox->setChecked( orderByClause.nullsFirst() );

mOrderByTableWidget->setItem( i, 0, expressionItem );
mOrderByTableWidget->setCellWidget( i, 1, ascCheckBox );
mOrderByTableWidget->setCellWidget( i, 2, nullsFirstCheckBox );


++i; ++i;
} }


// Add an empty widget at the end // Add an empty widget at the end
QTableWidgetItem* expressionItem = new QTableWidgetItem( "" ); setRow( i, QgsFeatureRequest::OrderByClause( "" ) );
QCheckBox* ascCheckBox = new QCheckBox();
ascCheckBox->setChecked( true );
QCheckBox* nullsFirstCheckBox = new QCheckBox();

mOrderByTableWidget->setItem( i, 0, expressionItem );
mOrderByTableWidget->setCellWidget( i, 1, ascCheckBox );
mOrderByTableWidget->setCellWidget( i, 2, nullsFirstCheckBox );
} }


QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy() QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy()
Expand All @@ -75,7 +59,7 @@ QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy()


for ( int i = 0; i < mOrderByTableWidget->rowCount(); ++i ) for ( int i = 0; i < mOrderByTableWidget->rowCount(); ++i )
{ {
QString expressionText = mOrderByTableWidget->item( i, 0 )->text(); QString expressionText = static_cast<QgsFieldExpressionWidget*>( mOrderByTableWidget->cellWidget( i, 0 ) )->currentText();


if ( ! expressionText.isEmpty() ) if ( ! expressionText.isEmpty() )
{ {
Expand All @@ -90,70 +74,43 @@ QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy()
return orderBy; return orderBy;
} }


void QgsOrderByDialog::onCellDoubleClicked( int row, int column ) void QgsOrderByDialog::onExpressionChanged( const QString& expression )
{ {
// Only act on first cell where the expression text is // The sender() is the field widget which is the cell widget of the first column
if ( 0 == column ) int row;
for ( row = 0; row < mOrderByTableWidget->rowCount(); ++row )
{ {
QgsExpressionBuilderDialog dlg( mLayer ); if ( mOrderByTableWidget->cellWidget( row, 0 ) == sender() )

dlg.setExpressionText( mOrderByTableWidget->item( row, column )->text() );

if ( dlg.exec() )
{ {
QString expressionText = dlg.expressionText(); break;

mOrderByTableWidget->item( row, column )->setText( expressionText );

if ( row == mOrderByTableWidget->rowCount() - 1 )
{
// Add an empty widget at the end if the last row was edited
mOrderByTableWidget->insertRow( mOrderByTableWidget->rowCount() );

QTableWidgetItem* expressionItem = new QTableWidgetItem( "" );
QCheckBox* ascCheckBox = new QCheckBox();
ascCheckBox->setChecked( true );
QCheckBox* nullsFirstCheckBox = new QCheckBox();

mOrderByTableWidget->setItem( row + 1, 0, expressionItem );
mOrderByTableWidget->setCellWidget( row + 1, 1, ascCheckBox );
mOrderByTableWidget->setCellWidget( row + 1, 2, nullsFirstCheckBox );
}
} }
} }
}


void QgsOrderByDialog::onCellChanged( int row, int column ) if ( expression.isEmpty() && row != mOrderByTableWidget->rowCount() - 1 )
{
// If the text was cleared
if ( mOrderByTableWidget->item( row, column )->text().isEmpty() )
{ {
// If the first column (expression text) and not the last row was edited mOrderByTableWidget->removeRow( row );
if ( 0 == column && row != mOrderByTableWidget->rowCount() - 1 )
{
{
mOrderByTableWidget->removeRow( row );
}
}
} }
else else if ( !expression.isEmpty() && row == mOrderByTableWidget->rowCount() - 1 )
{ {
// If it's the last row and an expression was added: add a new empty one mOrderByTableWidget->insertRow( mOrderByTableWidget->rowCount() );
if ( row == mOrderByTableWidget->rowCount() - 1 && !mOrderByTableWidget->item( row, column )->text().isEmpty() ) setRow( row + 1, QgsFeatureRequest::OrderByClause( "" ) );
{ }
// Add an empty widget at the end if the last row was edited }
mOrderByTableWidget->insertRow( mOrderByTableWidget->rowCount() );


QTableWidgetItem* expressionItem = new QTableWidgetItem( "" ); void QgsOrderByDialog::setRow( int row, const QgsFeatureRequest::OrderByClause& orderByClause )
QCheckBox* ascCheckBox = new QCheckBox(); {
ascCheckBox->setChecked( true ); QgsFieldExpressionWidget* fieldExpression = new QgsFieldExpressionWidget();
QCheckBox* nullsFirstCheckBox = new QCheckBox(); fieldExpression->setLayer( mLayer );
fieldExpression->setField( orderByClause.expression().expression() );
connect( fieldExpression, SIGNAL( fieldChanged( QString ) ), this, SLOT( onExpressionChanged( QString ) ) );
QCheckBox* ascCheckBox = new QCheckBox();
ascCheckBox->setChecked( orderByClause.ascending() );
QCheckBox* nullsFirstCheckBox = new QCheckBox();
nullsFirstCheckBox->setChecked( orderByClause.nullsFirst() );


mOrderByTableWidget->setItem( row + 1, 0, expressionItem ); mOrderByTableWidget->setCellWidget( row, 0, fieldExpression );
mOrderByTableWidget->setCellWidget( row + 1, 1, ascCheckBox ); mOrderByTableWidget->setCellWidget( row, 1, ascCheckBox );
mOrderByTableWidget->setCellWidget( row + 1, 2, nullsFirstCheckBox ); mOrderByTableWidget->setCellWidget( row, 2, nullsFirstCheckBox );
}
}
} }


bool QgsOrderByDialog::eventFilter( QObject* obj, QEvent* e ) bool QgsOrderByDialog::eventFilter( QObject* obj, QEvent* e )
Expand Down
8 changes: 6 additions & 2 deletions src/gui/qgsorderbydialog.h
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -53,10 +53,14 @@ class GUI_EXPORT QgsOrderByDialog : public QDialog, private Ui::OrderByDialogBas
QgsFeatureRequest::OrderBy orderBy(); QgsFeatureRequest::OrderBy orderBy();


private slots: private slots:
void onCellDoubleClicked( int row, int column ); void onExpressionChanged( const QString& expression );
void onCellChanged( int row, int column );


private: private:
/**
* Initialize a row with the given information
*/
void setRow( int row, const QgsFeatureRequest::OrderByClause& orderByClause );

QgsVectorLayer* mLayer; QgsVectorLayer* mLayer;


bool eventFilter( QObject *obj, QEvent *e ); bool eventFilter( QObject *obj, QEvent *e );
Expand Down

0 comments on commit 09cc9e4

Please sign in to comment.