-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgsexpressionbuilderwidget.h
170 lines (146 loc) · 6.08 KB
/
qgsexpressionbuilderwidget.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/***************************************************************************
qgisexpressionbuilderwidget.h - A genric expression string builder widget.
--------------------------------------
Date : 29-May-2011
Copyright : (C) 2011 by Nathan Woodrow
Email : woodrow.nathan at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSEXPRESSIONBUILDER_H
#define QGSEXPRESSIONBUILDER_H
#include <QWidget>
#include "ui_qgsexpressionbuilder.h"
#include "qgsvectorlayer.h"
#include "QStandardItemModel"
#include "QStandardItem"
#include "QSortFilterProxyModel"
/** Search proxy used to filter the QgsExpressionBuilderWidget tree.
* The default search for a tree model only searches top level this will handle one
* level down
*/
class QgsExpressionItemSearchProxy : public QSortFilterProxyModel
{
public:
QgsExpressionItemSearchProxy() { }
bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
{
if ( source_parent == qobject_cast<QStandardItemModel*>( sourceModel() )->invisibleRootItem()->index() )
return true;
return QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent );
}
};
/** An expression item that can be used in the QgsExpressionBuilderWidget tree.
*/
class QgsExpressionItem : public QStandardItem
{
public:
enum ItemType
{
Header,
Field,
ExpressionNode
};
QgsExpressionItem( QString label,
QString expressionText,
QString helpText,
QgsExpressionItem::ItemType itemType = ExpressionNode )
: QStandardItem( label )
{
mExpressionText = expressionText;
mHelpText = helpText;
mType = itemType;
}
QgsExpressionItem( QString label,
QString expressionText,
QgsExpressionItem::ItemType itemType = ExpressionNode )
: QStandardItem( label )
{
mExpressionText = expressionText;
mType = itemType;
}
QString getExpressionText() { return mExpressionText; }
/** Get the help text that is associated with this expression item.
*
* @return The help text.
*/
QString getHelpText() { return mHelpText; }
/** Set the help text for the current item
*
* @note The help text can be set as a html string.
*/
void setHelpText( QString helpText ) { mHelpText = helpText; }
/** Get the type of expression item eg header, field, ExpressionNode.
*
* @return The QgsExpressionItem::ItemType
*/
QgsExpressionItem::ItemType getItemType() { return mType ; }
private:
QString mExpressionText;
QString mHelpText;
QgsExpressionItem::ItemType mType;
};
/** A reusable widget that can be used to build a expression string.
* See QgsExpressionBuilderDialog for exmaple of usage.
*/
class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExpressionBuilderWidgetBase
{
Q_OBJECT
public:
QgsExpressionBuilderWidget( QWidget *parent );
~QgsExpressionBuilderWidget();
/** Sets layer in order to get the fields and values
* @note this needs to be called before calling loadFieldNames().
*/
void setLayer( QgsVectorLayer* layer );
/** Loads all the field names from the layer.
* @remarks Should this really be public couldn't we just do this for the user?
*/
void loadFieldNames();
/** Gets the expression string that has been set in the expression area.
* @returns The expression as a string. */
QString getExpressionString();
/** Sets the expression string for the widget */
void setExpressionString( const QString expressionString );
/** Registers a node item for the expression builder.
* @param group The group the item will be show in the tree view. If the group doesn't exsit it will be created.
* @param label The label that is show to the user for the item in the tree.
* @param expressionText The text that is inserted into the expression area when the user double clicks on the item.
* @param helpText The help text that the user will see when item is selected.
* @param type The type of the expression item.
*/
void registerItem( QString group, QString label, QString expressionText,
QString helpText = "",
QgsExpressionItem::ItemType type = QgsExpressionItem::ExpressionNode );
public slots:
void on_expressionTree_clicked( const QModelIndex &index );
void on_expressionTree_doubleClicked( const QModelIndex &index );
void on_txtExpressionString_textChanged();
void on_txtSearchEdit_textChanged();
void on_lblPreview_linkActivated( QString link );
void on_mValueListWidget_itemDoubleClicked( QListWidgetItem* item );
void operatorButtonClicked();
void showContextMenu( const QPoint & );
void loadSampleValues();
void loadAllValues();
signals:
/** Emited when the user changes the expression in the widget.
* Users of this widget should connect to this signal to decide if to let the user
* continue.
* @param isVaild Is true if the expression the user has typed is vaild.
*/
void expressionParsed( bool isVaild );
private:
void fillFieldValues( int fieldIndex, int countLimit );
QgsVectorLayer *mLayer;
QStandardItemModel *mModel;
QgsExpressionItemSearchProxy *mProxyModel;
QMap<QString, QgsExpressionItem*> mExpressionGroups;
QgsFeature* mFeature;
};
#endif // QGSEXPRESSIONBUILDER_H