17
17
#include " qgsorderbydialog.h"
18
18
19
19
#include " qgsexpressionbuilderdialog.h"
20
+ #include " qgsfieldexpressionwidget.h"
20
21
21
22
#include < QTableWidget>
22
23
#include < QCheckBox>
@@ -27,8 +28,6 @@ QgsOrderByDialog::QgsOrderByDialog( QgsVectorLayer* layer, QWidget* parent )
27
28
, mLayer( layer )
28
29
{
29
30
setupUi ( this );
30
- connect ( mOrderByTableWidget , SIGNAL ( cellDoubleClicked ( int , int ) ), this , SLOT ( onCellDoubleClicked ( int , int ) ) );
31
- connect ( mOrderByTableWidget , SIGNAL ( cellChanged ( int , int ) ), this , SLOT ( onCellChanged ( int , int ) ) );
32
31
33
32
mOrderByTableWidget ->horizontalHeader ()->setResizeMode ( QHeaderView::Stretch );
34
33
mOrderByTableWidget ->horizontalHeader ()->setResizeMode ( 1 , QHeaderView::Interactive );
@@ -45,28 +44,13 @@ void QgsOrderByDialog::setOrderBy( const QgsFeatureRequest::OrderBy& orderBy )
45
44
int i = 0 ;
46
45
Q_FOREACH ( const QgsFeatureRequest::OrderByClause& orderByClause, orderBy )
47
46
{
48
- QTableWidgetItem* expressionItem = new QTableWidgetItem ( orderByClause.expression ().expression () );
49
- QCheckBox* ascCheckBox = new QCheckBox ();
50
- ascCheckBox->setChecked ( orderByClause.ascending () );
51
- QCheckBox* nullsFirstCheckBox = new QCheckBox ();
52
- nullsFirstCheckBox->setChecked ( orderByClause.nullsFirst () );
53
-
54
- mOrderByTableWidget ->setItem ( i, 0 , expressionItem );
55
- mOrderByTableWidget ->setCellWidget ( i, 1 , ascCheckBox );
56
- mOrderByTableWidget ->setCellWidget ( i, 2 , nullsFirstCheckBox );
47
+ setRow ( i, orderByClause );
57
48
58
49
++i;
59
50
}
60
51
61
52
// Add an empty widget at the end
62
- QTableWidgetItem* expressionItem = new QTableWidgetItem ( " " );
63
- QCheckBox* ascCheckBox = new QCheckBox ();
64
- ascCheckBox->setChecked ( true );
65
- QCheckBox* nullsFirstCheckBox = new QCheckBox ();
66
-
67
- mOrderByTableWidget ->setItem ( i, 0 , expressionItem );
68
- mOrderByTableWidget ->setCellWidget ( i, 1 , ascCheckBox );
69
- mOrderByTableWidget ->setCellWidget ( i, 2 , nullsFirstCheckBox );
53
+ setRow ( i, QgsFeatureRequest::OrderByClause ( " " ) );
70
54
}
71
55
72
56
QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy ()
@@ -75,7 +59,7 @@ QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy()
75
59
76
60
for ( int i = 0 ; i < mOrderByTableWidget ->rowCount (); ++i )
77
61
{
78
- QString expressionText = mOrderByTableWidget ->item ( i, 0 )-> text ();
62
+ QString expressionText = static_cast <QgsFieldExpressionWidget*>( mOrderByTableWidget ->cellWidget ( i, 0 ) )-> currentText ();
79
63
80
64
if ( ! expressionText.isEmpty () )
81
65
{
@@ -90,70 +74,43 @@ QgsFeatureRequest::OrderBy QgsOrderByDialog::orderBy()
90
74
return orderBy;
91
75
}
92
76
93
- void QgsOrderByDialog::onCellDoubleClicked ( int row, int column )
77
+ void QgsOrderByDialog::onExpressionChanged ( const QString& expression )
94
78
{
95
- // Only act on first cell where the expression text is
96
- if ( 0 == column )
79
+ // The sender() is the field widget which is the cell widget of the first column
80
+ int row;
81
+ for ( row = 0 ; row < mOrderByTableWidget ->rowCount (); ++row )
97
82
{
98
- QgsExpressionBuilderDialog dlg ( mLayer );
99
-
100
- dlg.setExpressionText ( mOrderByTableWidget ->item ( row, column )->text () );
101
-
102
- if ( dlg.exec () )
83
+ if ( mOrderByTableWidget ->cellWidget ( row, 0 ) == sender () )
103
84
{
104
- QString expressionText = dlg.expressionText ();
105
-
106
- mOrderByTableWidget ->item ( row, column )->setText ( expressionText );
107
-
108
- if ( row == mOrderByTableWidget ->rowCount () - 1 )
109
- {
110
- // Add an empty widget at the end if the last row was edited
111
- mOrderByTableWidget ->insertRow ( mOrderByTableWidget ->rowCount () );
112
-
113
- QTableWidgetItem* expressionItem = new QTableWidgetItem ( " " );
114
- QCheckBox* ascCheckBox = new QCheckBox ();
115
- ascCheckBox->setChecked ( true );
116
- QCheckBox* nullsFirstCheckBox = new QCheckBox ();
117
-
118
- mOrderByTableWidget ->setItem ( row + 1 , 0 , expressionItem );
119
- mOrderByTableWidget ->setCellWidget ( row + 1 , 1 , ascCheckBox );
120
- mOrderByTableWidget ->setCellWidget ( row + 1 , 2 , nullsFirstCheckBox );
121
- }
85
+ break ;
122
86
}
123
87
}
124
- }
125
88
126
- void QgsOrderByDialog::onCellChanged ( int row, int column )
127
- {
128
- // If the text was cleared
129
- if ( mOrderByTableWidget ->item ( row, column )->text ().isEmpty () )
89
+ if ( expression.isEmpty () && row != mOrderByTableWidget ->rowCount () - 1 )
130
90
{
131
- // If the first column (expression text) and not the last row was edited
132
- if ( 0 == column && row != mOrderByTableWidget ->rowCount () - 1 )
133
- {
134
- {
135
- mOrderByTableWidget ->removeRow ( row );
136
- }
137
- }
91
+ mOrderByTableWidget ->removeRow ( row );
138
92
}
139
- else
93
+ else if ( !expression. isEmpty () && row == mOrderByTableWidget -> rowCount () - 1 )
140
94
{
141
- // If it's the last row and an expression was added: add a new empty one
142
- if ( row == mOrderByTableWidget ->rowCount () - 1 && !mOrderByTableWidget ->item ( row, column )->text ().isEmpty () )
143
- {
144
- // Add an empty widget at the end if the last row was edited
145
- mOrderByTableWidget ->insertRow ( mOrderByTableWidget ->rowCount () );
95
+ mOrderByTableWidget ->insertRow ( mOrderByTableWidget ->rowCount () );
96
+ setRow ( row + 1 , QgsFeatureRequest::OrderByClause ( " " ) );
97
+ }
98
+ }
146
99
147
- QTableWidgetItem* expressionItem = new QTableWidgetItem ( " " );
148
- QCheckBox* ascCheckBox = new QCheckBox ();
149
- ascCheckBox->setChecked ( true );
150
- QCheckBox* nullsFirstCheckBox = new QCheckBox ();
100
+ void QgsOrderByDialog::setRow ( int row, const QgsFeatureRequest::OrderByClause& orderByClause )
101
+ {
102
+ QgsFieldExpressionWidget* fieldExpression = new QgsFieldExpressionWidget ();
103
+ fieldExpression->setLayer ( mLayer );
104
+ fieldExpression->setField ( orderByClause.expression ().expression () );
105
+ connect ( fieldExpression, SIGNAL ( fieldChanged ( QString ) ), this , SLOT ( onExpressionChanged ( QString ) ) );
106
+ QCheckBox* ascCheckBox = new QCheckBox ();
107
+ ascCheckBox->setChecked ( orderByClause.ascending () );
108
+ QCheckBox* nullsFirstCheckBox = new QCheckBox ();
109
+ nullsFirstCheckBox->setChecked ( orderByClause.nullsFirst () );
151
110
152
- mOrderByTableWidget ->setItem ( row + 1 , 0 , expressionItem );
153
- mOrderByTableWidget ->setCellWidget ( row + 1 , 1 , ascCheckBox );
154
- mOrderByTableWidget ->setCellWidget ( row + 1 , 2 , nullsFirstCheckBox );
155
- }
156
- }
111
+ mOrderByTableWidget ->setCellWidget ( row, 0 , fieldExpression );
112
+ mOrderByTableWidget ->setCellWidget ( row, 1 , ascCheckBox );
113
+ mOrderByTableWidget ->setCellWidget ( row, 2 , nullsFirstCheckBox );
157
114
}
158
115
159
116
bool QgsOrderByDialog::eventFilter ( QObject* obj, QEvent* e )
0 commit comments