1 /***************************************************************************
2 qgssmartgroupeditordialog.cpp
3 -----------------------------
4 begin : July 2012
5 copyright : (C) 2012 by Arunmozhi
6 email : aruntheguy at gmail.com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16 #include "qgssmartgroupeditordialog.h"
17
18 #include "qgsstyle.h"
19 #include "qgsapplication.h"
20 #include "qgsgui.h"
21
22 #include <QVariant>
23 #include <QMessageBox>
24
25 // -------------------------- //
26 // Condition Widget functions //
27 // -------------------------- //
QgsSmartGroupCondition(int id,QWidget * parent)28 QgsSmartGroupCondition::QgsSmartGroupCondition( int id, QWidget *parent ) : QWidget( parent )
29 {
30 setupUi( this );
31
32 mConditionId = id;
33
34 mCondCombo->addItem( tr( "has the tag" ), QVariant( "tag" ) );
35 mCondCombo->addItem( tr( "has a part of name matching" ), QVariant( "name" ) );
36 mCondCombo->addItem( tr( "does NOT have the tag" ), QVariant( "!tag" ) );
37 mCondCombo->addItem( tr( "has NO part of name matching" ), QVariant( "!name" ) );
38
39 mRemoveBtn->setIcon( QIcon( QgsApplication::iconPath( "symbologyRemove.svg" ) ) );
40
41 connect( mRemoveBtn, &QAbstractButton::clicked, this, &QgsSmartGroupCondition::destruct );
42 }
43
destruct()44 void QgsSmartGroupCondition::destruct()
45 {
46 emit removed( mConditionId );
47 }
48
constraint()49 QString QgsSmartGroupCondition::constraint()
50 {
51 return mCondCombo->currentData().toString();
52 }
53
parameter()54 QString QgsSmartGroupCondition::parameter()
55 {
56 return mCondLineEdit->text();
57 }
58
setConstraint(const QString & constraint)59 void QgsSmartGroupCondition::setConstraint( const QString &constraint )
60 {
61 mCondCombo->setCurrentIndex( mCondCombo->findData( QVariant( constraint ) ) );
62 }
63
setParameter(const QString & param)64 void QgsSmartGroupCondition::setParameter( const QString ¶m )
65 {
66 mCondLineEdit->setText( param );
67 }
68
hideRemoveButton(bool hide)69 void QgsSmartGroupCondition::hideRemoveButton( bool hide )
70 {
71 mRemoveBtn->setVisible( !hide );
72 }
73
74
75 // ------------------------ //
76 // Editor Dialog Functions //
77 // ------------------------ //
QgsSmartGroupEditorDialog(QgsStyle * style,QWidget * parent)78 QgsSmartGroupEditorDialog::QgsSmartGroupEditorDialog( QgsStyle *style, QWidget *parent )
79 : QDialog( parent )
80 , mStyle( style )
81 {
82 setupUi( this );
83 QgsGui::enableAutoGeometryRestore( this );
84
85 connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsSmartGroupEditorDialog::buttonBox_accepted );
86
87 mCondCount = 0;
88
89 mAndOrCombo->addItem( tr( "ALL the constraints" ), QVariant( "AND" ) );
90 mAndOrCombo->addItem( tr( "any ONE of the constraints" ), QVariant( "OR" ) );
91
92 mLayout = new QGridLayout( mConditionsBox );
93 addCondition();
94
95 connect( mAddConditionBtn, &QAbstractButton::clicked, this, &QgsSmartGroupEditorDialog::addCondition );
96 }
97
smartgroupName()98 QString QgsSmartGroupEditorDialog::smartgroupName()
99 {
100 return mNameLineEdit->text();
101 }
102
addCondition()103 void QgsSmartGroupEditorDialog::addCondition()
104 {
105 // enable the remove buttons when 2nd condition is added
106 if ( mConditionMap.count() == 1 )
107 {
108 const auto constMConditionMap = mConditionMap;
109 for ( QgsSmartGroupCondition *condition : constMConditionMap )
110 {
111 condition->hideRemoveButton( false );
112 }
113 }
114 QgsSmartGroupCondition *cond = new QgsSmartGroupCondition( mCondCount, this );
115 mLayout->addWidget( cond, mCondCount, 0, 1, 1 );
116
117 connect( cond, &QgsSmartGroupCondition::removed, this, &QgsSmartGroupEditorDialog::removeCondition );
118 if ( mConditionMap.isEmpty() )
119 {
120 cond->hideRemoveButton( true );
121 }
122 mConditionMap.insert( mCondCount, cond );
123 ++mCondCount;
124 }
125
removeCondition(int id)126 void QgsSmartGroupEditorDialog::removeCondition( int id )
127 {
128 // hide the remove button of the last condition when 2nd last is removed
129 if ( mConditionMap.count() == 2 )
130 {
131 const auto constMConditionMap = mConditionMap;
132 for ( QgsSmartGroupCondition *condition : constMConditionMap )
133 {
134 condition->hideRemoveButton( true );
135 }
136 }
137
138 QgsSmartGroupCondition *cond = mConditionMap.take( id );
139 delete cond;
140 }
141
conditionMap()142 QgsSmartConditionMap QgsSmartGroupEditorDialog::conditionMap()
143 {
144 QgsSmartConditionMap conditions;
145
146 const auto constMConditionMap = mConditionMap;
147 for ( QgsSmartGroupCondition *condition : constMConditionMap )
148 {
149 conditions.insert( condition->constraint(), condition->parameter() );
150 }
151
152 return conditions;
153 }
154
conditionOperator()155 QString QgsSmartGroupEditorDialog::conditionOperator()
156 {
157 return mAndOrCombo->currentData().toString();
158 }
159
setConditionMap(const QgsSmartConditionMap & map)160 void QgsSmartGroupEditorDialog::setConditionMap( const QgsSmartConditionMap &map )
161 {
162 QStringList constraints;
163 constraints << QStringLiteral( "tag" ) << QStringLiteral( "name" ) << QStringLiteral( "!tag" ) << QStringLiteral( "!name" );
164
165 // clear any defaults
166 qDeleteAll( mConditionMap );
167 mConditionMap.clear();
168
169 //set the constraints
170 const auto constConstraints = constraints;
171 for ( const QString &constr : constConstraints )
172 {
173 QStringList params = map.values( constr );
174 const auto constParams = params;
175 for ( const QString ¶m : constParams )
176 {
177 QgsSmartGroupCondition *cond = new QgsSmartGroupCondition( mCondCount, this );
178 mLayout->addWidget( cond, mCondCount, 0, 1, 1 );
179
180 cond->setConstraint( constr );
181 cond->setParameter( param );
182
183 connect( cond, &QgsSmartGroupCondition::removed, this, &QgsSmartGroupEditorDialog::removeCondition );
184
185 mConditionMap.insert( mCondCount, cond );
186 ++mCondCount;
187 }
188 }
189 }
190
setOperator(const QString & op)191 void QgsSmartGroupEditorDialog::setOperator( const QString &op )
192 {
193 mAndOrCombo->setCurrentIndex( mAndOrCombo->findData( QVariant( op ) ) );
194 }
195
setSmartgroupName(const QString & name)196 void QgsSmartGroupEditorDialog::setSmartgroupName( const QString &name )
197 {
198 mNameLineEdit->setText( name );
199 }
200
buttonBox_accepted()201 void QgsSmartGroupEditorDialog::buttonBox_accepted()
202 {
203 if ( mNameLineEdit->text().isEmpty() )
204 {
205 QMessageBox::critical( this, tr( "Edit Smart Group" ), tr( "The smart group name field is empty. Kindly provide a name." ) );
206 return;
207 }
208 accept();
209 }
210