2 changes: 2 additions & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ symbology-ng/qgspointdisplacementrendererwidget.cpp
symbology-ng/qgsvectorfieldsymbollayerwidget.cpp
symbology-ng/qgssymbolslistwidget.cpp
symbology-ng/qgslayerpropertieswidget.cpp
symbology-ng/qgssmartgroupeditordialog.cpp

attributetable/qgsattributetablemodel.cpp
attributetable/qgsattributetablememorymodel.cpp
Expand Down Expand Up @@ -126,6 +127,7 @@ symbology-ng/qgspointdisplacementrendererwidget.h
symbology-ng/qgsvectorfieldsymbollayerwidget.h
symbology-ng/qgssymbolslistwidget.h
symbology-ng/qgslayerpropertieswidget.h
symbology-ng/qgssmartgroupeditordialog.h

attributetable/qgsattributetableview.h
attributetable/qgsattributetablemodel.h
Expand Down
191 changes: 191 additions & 0 deletions src/gui/symbology-ng/qgssmartgroupeditordialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
/***************************************************************************
qgssmartgroupeditordialog.cpp
-----------------------------
begin : July 2012
copyright : (C) 2012 by Arunmozhi
email : aruntheguy at gmail.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. *
* *
***************************************************************************/

#include "qgssmartgroupeditordialog.h"

#include "qgsstylev2.h"
#include "qgsapplication.h"

#include <QVariant>
#include <QMessageBox>

// -------------------------- //
// Condition Widget functions //
// -------------------------- //
QgsSmartGroupCondition::QgsSmartGroupCondition( int id, QWidget* parent ) : QWidget( parent )
{
setupUi( this );

mConditionId = id;

mCondCombo->addItem( "has the tag", QVariant( "tag" ) );
mCondCombo->addItem( "is a member of group", QVariant( "group" ) );
mCondCombo->addItem( "has a part of name matching", QVariant( "name" ) );
mCondCombo->addItem( "does NOT have the tag", QVariant( "!tag" ) );
mCondCombo->addItem( "is NOT a member of group", QVariant( "!group" ) );
mCondCombo->addItem( "has NO part of name matching", QVariant( "!name" ) );

mRemoveBtn->setIcon( QIcon( QgsApplication::iconPath( "symbologyRemove.png" ) ) );

connect( mRemoveBtn, SIGNAL( clicked() ), this, SLOT( destruct() ) );
}

void QgsSmartGroupCondition::destruct()
{
emit removed( mConditionId );
}

QString QgsSmartGroupCondition::constraint()
{
return mCondCombo->itemData( mCondCombo->currentIndex() ).toString();
}

QString QgsSmartGroupCondition::parameter()
{
return mCondLineEdit->text();
}

void QgsSmartGroupCondition::setConstraint( QString constraint )
{
mCondCombo->setCurrentIndex( mCondCombo->findData( QVariant( constraint ) ) );
}

void QgsSmartGroupCondition::setParameter( QString param )
{
mCondLineEdit->setText( param );
}


// ------------------------ //
// Editor Dialog Functions //
// ------------------------ //
QgsSmartGroupEditorDialog::QgsSmartGroupEditorDialog( QgsStyleV2* style, QWidget* parent )
: QDialog( parent ), mStyle( style )
{
setupUi( this );

mCondCount = 0;

mAndOrCombo->addItem( "ALL the constraints", QVariant( "AND" ) );
mAndOrCombo->addItem( "any ONE of the constraints", QVariant( "OR" ) );

mLayout = new QGridLayout( mConditionsBox );
addCondition();

connect( mAddConditionBtn, SIGNAL( clicked() ), this, SLOT( addCondition() ) );

}

QgsSmartGroupEditorDialog::~QgsSmartGroupEditorDialog()
{
}

QString QgsSmartGroupEditorDialog::smartgroupName()
{
return mNameLineEdit->text();
}

void QgsSmartGroupEditorDialog::addCondition()
{
QgsSmartGroupCondition *cond = new QgsSmartGroupCondition( mCondCount, this );
mLayout->addWidget( cond, mCondCount, 0, 1, 1 );

connect( cond, SIGNAL( removed( int ) ), this, SLOT( removeCondition( int ) ) );

mConditionMap.insert( mCondCount, cond );
++mCondCount;
}

void QgsSmartGroupEditorDialog::removeCondition( int id )
{
if ( mConditionMap.count() == 1 )
{
QMessageBox::critical( this, tr( "Invalid Operation" ),
tr( "A Smart Group should have at least ONE condition. Cannot remove the only condition." ) );
return;
}

QgsSmartGroupCondition *cond = mConditionMap.take( id );
delete cond;
}

QgsSmartConditionMap QgsSmartGroupEditorDialog::conditionMap()
{
QgsSmartConditionMap conditions;

foreach( QgsSmartGroupCondition* condition, mConditionMap.values() )
{
conditions.insert( condition->constraint(), condition->parameter() );
}

return conditions;
}

QString QgsSmartGroupEditorDialog::conditionOperator()
{
return mAndOrCombo->itemData( mAndOrCombo->currentIndex() ).toString();
}

void QgsSmartGroupEditorDialog::setConditionMap( QgsSmartConditionMap map )
{
QStringList constraints;
constraints << "tag" << "group" << "name" << "!tag" << "!group" << "!name" ;

// clear any defaults
foreach( int id, mConditionMap.keys() )
{
QgsSmartGroupCondition *cond = mConditionMap.take( id );
delete cond;
}

//set the constraints
foreach ( const QString &constr, constraints )
{
QStringList params = map.values( constr );
foreach ( const QString &param, params )
{
QgsSmartGroupCondition *cond = new QgsSmartGroupCondition( mCondCount, this );
mLayout->addWidget( cond, mCondCount, 0, 1, 1 );

cond->setConstraint( constr );
cond->setParameter( param );

connect( cond, SIGNAL( removed( int ) ), this, SLOT( removeCondition( int ) ) );

mConditionMap.insert( mCondCount, cond );
++mCondCount;
}
}
}

void QgsSmartGroupEditorDialog::setOperator( QString op )
{
mAndOrCombo->setCurrentIndex( mAndOrCombo->findData( QVariant( op ) ) );
}

void QgsSmartGroupEditorDialog::setSmartgroupName( QString name )
{
mNameLineEdit->setText( name );
}

void QgsSmartGroupEditorDialog::on_buttonBox_accepted()
{
if ( mNameLineEdit->text().isEmpty() )
{
QMessageBox::critical( this, tr( "Invalid name" ), tr( "The smart group name field is empty. Kindly provide a name" ) );
return;
}
accept();
}
111 changes: 111 additions & 0 deletions src/gui/symbology-ng/qgssmartgroupeditordialog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/***************************************************************************
qgssmartgroupeditordialog.h
---------------------------
begin : July 2012
copyright : (C) 2012 by Arunmozhi
email : aruntheguy at gmail.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 QGSSMARTGROUPCONDITION_H
#define QGSSMARTGROUPCONDITION_H

#include "ui_qgssmartgroupconditionwidget.h"

class GUI_EXPORT QgsSmartGroupCondition : public QWidget, private Ui::QgsSmartGroupConditionWidget
{
Q_OBJECT

public:
QgsSmartGroupCondition( int id, QWidget *parent = NULL );

//! returns the constraint key
QString constraint();

//! returns the parameter
QString parameter();

//! sets the given constraint
void setConstraint( QString constraint );

//! sets the given param
void setParameter( QString param );

public slots:
void destruct();

signals:
void removed( int );

protected:
int mConditionId;

};

#endif //QGSSMARTGROUPCONDITION


#ifndef QGSSMARTGROUPEDITORDIALOG_H
#define QGSSMARTGROUPEDITORDIALOG_H

#include <QDialog>

#include "ui_qgssmartgroupeditordialogbase.h"
//#include "qgscontexthelp.h"

#include "qgsstylev2.h" //for QgsSmartConditionMap

class GUI_EXPORT QgsSmartGroupEditorDialog : public QDialog, private Ui::QgsSmartGroupEditorDialogBase
{
Q_OBJECT

public:
QgsSmartGroupEditorDialog( QgsStyleV2* style, QWidget* parent = NULL );
~QgsSmartGroupEditorDialog();

//! returns the value from mNameLineEdit
QString smartgroupName();

//! returns the condition map
QgsSmartConditionMap conditionMap();

//! returns the AND/OR condition
QString conditionOperator();

//! sets up the GUI for the given conditionmap
void setConditionMap( QgsSmartConditionMap );

//! sets the operator AND/OR
void setOperator( QString );

//! sets the smart group Name
void setSmartgroupName( QString );

public slots:

//! function to create a new ConditionBox and update UI
void addCondition();

//! slot to remove the condition with id int
void removeCondition( int );

void on_buttonBox_accepted();

protected:
QgsStyleV2* mStyle;
// layout of the mConditionsBox
QGridLayout *mLayout;
// counter for the number of conditions
int mCondCount;
// map tracking the condition widget and the ids
QMap<int,QgsSmartGroupCondition*> mConditionMap;
};

#endif // QGSSMARTGROUPEDITORDIALOG_H

142 changes: 100 additions & 42 deletions src/gui/symbology-ng/qgsstylev2managerdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "qgsvectorrandomcolorrampv2dialog.h"
#include "qgsvectorcolorbrewercolorrampv2dialog.h"
#include "qgsstylev2exportimportdialog.h"
#include "qgssmartgroupeditordialog.h"

#include <QFile>
#include <QFileDialog>
Expand Down Expand Up @@ -97,10 +98,10 @@ QgsStyleV2ManagerDialog::QgsStyleV2ManagerDialog( QgsStyleV2* style, QWidget* pa

QMenu *groupMenu = new QMenu( "Group Actions" );
QAction *groupSymbols = groupMenu->addAction( "Group Symbols" );
QAction *tagSymbols = groupMenu->addAction( "Tag Symbols" );
QAction *editSmartgroup = groupMenu->addAction( "Edit Smart Group" );
btnManageGroups->setMenu( groupMenu );
connect( groupSymbols, SIGNAL( triggered() ), this, SLOT( groupSymbolsAction() ) );
connect( tagSymbols, SIGNAL( triggered() ), this, SLOT( tagSymbolsAction() ) );
connect( editSmartgroup, SIGNAL( triggered() ), this, SLOT( editSmartgroupAction() ) );

connect( btnAddGroup, SIGNAL( clicked() ), this, SLOT( addGroup() ) );
connect( btnRemoveGroup, SIGNAL( clicked() ), this, SLOT( removeGroup() ) );
Expand Down Expand Up @@ -639,7 +640,15 @@ void QgsStyleV2ManagerDialog::populateGroups()
QStandardItem *tag = new QStandardItem( "Smart Groups" );
tag->setData( "smartgroups" );
tag->setEditable( false );
// TODO populate/build smart groups
QgsSymbolGroupMap sgMap = mStyle->smartgroupsListMap();
QgsSymbolGroupMap::const_iterator i = sgMap.constBegin();
while ( i != sgMap.constEnd() )
{
QStandardItem *item = new QStandardItem( i.value() );
item->setData( i.key() );
tag->appendRow( item );
++i;
}
model->appendRow( tag );

}
Expand Down Expand Up @@ -690,13 +699,14 @@ void QgsStyleV2ManagerDialog::groupChanged( const QModelIndex& index )
//determine groups and tags
if ( index.parent().data( Qt::UserRole + 1 ) == "smartgroups" )
{
// TODO
// create a new Menu with smart group specific functions
// and set it to the btnManageGroups
btnAddGroup->setEnabled( false );
btnRemoveGroup->setEnabled( true );
btnManageGroups->setEnabled( true );
symbolNames = mStyle->symbolsOfSmartgroup( index.data( Qt::UserRole + 1 ).toInt() );
}
else // then it must be a group
{
if ( !index.data( Qt::UserRole + 1 ).toInt() && ( index.data() == "Ungrouped" ) )
if ( ( !index.data( Qt::UserRole + 1 ).toInt() && ( index.data() == "Ungrouped" ) ) || mGrouppingMode )
enableGroupInputs( false );
else
enableGroupInputs( true );
Expand Down Expand Up @@ -742,14 +752,40 @@ void QgsStyleV2ManagerDialog::addGroup()
return;
}

// No violation
QString itemName;
QVariant itemData;
bool isGroup = true;

// create a smart group if that is selected
if ( parentIndex.data( Qt::UserRole + 1 ).toString() == "smartgroups" )
{
QgsSmartGroupEditorDialog dlg( mStyle, this );
if ( dlg.exec() == QDialog::Rejected )
return;
int id = mStyle->addSmartgroup( dlg.smartgroupName(), dlg.conditionOperator(), dlg.conditionMap() );
if ( !id )
return;
itemData = QVariant( id );
itemName = dlg.smartgroupName();
isGroup = false;
}
else
{
itemName = QString( "New Group" );
itemData = QVariant( "newgroup" );
}

// Else create a simple child-group to the selected
QStandardItem *parentItem = model->itemFromIndex( parentIndex );
QStandardItem *childItem = new QStandardItem( "New Group" );
childItem->setData( QVariant( "newgroup" ) );
QStandardItem *childItem = new QStandardItem( itemName );
childItem->setData( itemData );
parentItem->appendRow( childItem );

groupTree->setCurrentIndex( childItem->index() );
groupTree->edit( childItem->index() );
if ( isGroup )
{
groupTree->edit( childItem->index() );
}
}

void QgsStyleV2ManagerDialog::removeGroup()
Expand All @@ -771,7 +807,7 @@ void QgsStyleV2ManagerDialog::removeGroup()
QStandardItem *parentItem = model->itemFromIndex( index.parent() );
if ( parentItem->data( Qt::UserRole + 1 ).toString() == "smartgroups" )
{
mStyle->remove( TagEntity, index.data( Qt::UserRole + 1 ).toInt() );
mStyle->remove( SmartgroupEntity, index.data( Qt::UserRole + 1 ).toInt() );
}
else
{
Expand All @@ -796,11 +832,7 @@ void QgsStyleV2ManagerDialog::groupRenamed( QStandardItem * item )
if ( data == "newgroup" )
{
int id;
if ( item->parent()->data( Qt::UserRole + 1 ).toString() == "smartgroups" )
{
id = mStyle->addTag( item->text() );
}
else if ( item->parent()->data( Qt::UserRole + 1 ).toString() == "groups" )
if ( item->parent()->data( Qt::UserRole + 1 ).toString() == "groups" )
{
id = mStyle->addGroup( item->text() );
}
Expand Down Expand Up @@ -828,7 +860,7 @@ void QgsStyleV2ManagerDialog::groupRenamed( QStandardItem * item )
QString name = item->text();
if ( item->parent()->data( Qt::UserRole + 1 ) == "smartgroups" )
{
mStyle->rename( TagEntity, id, name );
mStyle->rename( SmartgroupEntity, id, name );
}
else
{
Expand All @@ -851,18 +883,12 @@ void QgsStyleV2ManagerDialog::groupSymbolsAction()
// disconnect slot which handles regrouping
disconnect( model, SIGNAL( itemChanged( QStandardItem* )),
this, SLOT( regrouped( QStandardItem* ) ) );
// Re-enable the buttons
// NOTE: if you ever change the layout name in the .ui file edit here too
for ( int i = 0; i < symbolBtnsLayout->count(); i++ )
{
symbolBtnsLayout->itemAt( i )->widget()->setEnabled( true );
}
btnAddGroup->setEnabled( true );
btnRemoveGroup->setEnabled( true );

// disabel all items except groups in groupTree
enableItemsForGroupingMode( true );
groupChanged( groupTree->currentIndex() );
// Finally: Reconnect all Symbol editing functionalities

// Finally: Reconnect all Symbol editing functionalities
connect( treeModel, SIGNAL( itemChanged( QStandardItem* ) ),
this, SLOT( groupRenamed( QStandardItem* ) ) );
connect( model, SIGNAL( itemChanged( QStandardItem* ) ),
Expand Down Expand Up @@ -891,24 +917,17 @@ void QgsStyleV2ManagerDialog::groupSymbolsAction()
mGrouppingMode = true;
// Change the text menu
senderAction->setText( "Finish Grouping" );

// Remove all Symbol editing functionalities
disconnect( treeModel, SIGNAL( itemChanged( QStandardItem* ) ),
this, SLOT( groupRenamed( QStandardItem* ) ) );
disconnect( model, SIGNAL( itemChanged( QStandardItem* ) ),
this, SLOT( itemChanged( QStandardItem* ) ) );
// Disable the buttons
// NOTE: if you ever change the layout name in the .ui file edit here too
for ( int i = 0; i < symbolBtnsLayout->count(); i++ )
{
symbolBtnsLayout->itemAt( i )->widget()->setEnabled( false );
}
// Disable tree editing
btnAddGroup->setEnabled( false );
btnRemoveGroup->setEnabled( false );

// disabel all items except groups in groupTree
enableItemsForGroupingMode( false );
groupChanged( groupTree->currentIndex() );
btnManageGroups->setEnabled( true );


// Connect to slot which handles regrouping
connect( model, SIGNAL( itemChanged( QStandardItem* )),
Expand Down Expand Up @@ -949,11 +968,6 @@ void QgsStyleV2ManagerDialog::setSymbolsChecked( QStringList symbols )
}
}

void QgsStyleV2ManagerDialog::tagSymbolsAction()
{
QgsDebugMsg( "tagging symbols now" );
}

void QgsStyleV2ManagerDialog::filterSymbols( QString qword )
{
QStringList symbols = mStyle->findSymbols( qword );
Expand Down Expand Up @@ -1041,6 +1055,13 @@ void QgsStyleV2ManagerDialog::enableItemsForGroupingMode( bool enable )
}
}

// The buttons
// NOTE: if you ever change the layout name in the .ui file edit here too
for ( int i = 0; i < symbolBtnsLayout->count(); i++ )
{
symbolBtnsLayout->itemAt( i )->widget()->setEnabled( enable );
}

}

void QgsStyleV2ManagerDialog::grouptreeContextMenu( const QPoint& point )
Expand Down Expand Up @@ -1098,3 +1119,40 @@ void QgsStyleV2ManagerDialog::listitemsContextMenu( const QPoint& point )
QgsDebugMsg( "Selected Action: " + selectedItem->text() );
}
}

void QgsStyleV2ManagerDialog::editSmartgroupAction()
{
QStandardItemModel *treeModel = qobject_cast<QStandardItemModel*>( groupTree->model() );

// determine whether it is a valid group
QModelIndex present = groupTree->currentIndex();
if ( present.parent().data( Qt::UserRole + 1 ) != "smartgroups" )
{
QMessageBox::critical( this, tr( "Invalid Selection" ),
tr( "You have not selected a Smart Group. Kindly select a Smart Group to edit." ) );
return;
}
QStandardItem* item = treeModel->itemFromIndex( present );

QgsSmartGroupEditorDialog dlg( mStyle, this );
QgsSmartConditionMap map = mStyle->smartgroup( present.data( Qt::UserRole + 1 ).toInt() );
dlg.setSmartgroupName( item->text() );
dlg.setOperator( mStyle->smartgroupOperator( item->data().toInt() ) );
dlg.setConditionMap( map );

if ( dlg.exec() == QDialog::Rejected )
return;

mStyle->remove( SmartgroupEntity, item->data().toInt() );
int id = mStyle->addSmartgroup( dlg.smartgroupName(), dlg.conditionOperator(), dlg.conditionMap() );
if ( !id )
{
QMessageBox::critical( this, tr( "Database Error!"),
tr( "There was some error in editing the smart group." ) );
return;
}
item->setText( dlg.smartgroupName() );
item->setData( id );

groupChanged( present );
}
8 changes: 7 additions & 1 deletion src/gui/symbology-ng/qgsstylev2managerdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,14 @@ class GUI_EXPORT QgsStyleV2ManagerDialog : public QDialog, private Ui::QgsStyleV
void groupRenamed( QStandardItem * );
void addGroup();
void removeGroup();

//! carryout symbol grouping using check boxes
void groupSymbolsAction();
void tagSymbolsAction();

//! edit the selected smart group
void editSmartgroupAction();

//! symbol changed from one group
void regrouped( QStandardItem* );

//! filter the symbols based on input search term
Expand Down
74 changes: 74 additions & 0 deletions src/ui/qgssmartgroupconditionwidget.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QgsSmartGroupConditionWidget</class>
<widget class="QWidget" name="QgsSmartGroupConditionWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>494</width>
<height>29</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>The Symbol</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="mCondCombo">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="mCondLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="mRemoveBtn">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
82 changes: 82 additions & 0 deletions src/ui/qgssmartgroupeditordialogbase.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QgsSmartGroupEditorDialogBase</class>
<widget class="QDialog" name="QgsSmartGroupEditorDialogBase">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>141</height>
</rect>
</property>
<property name="windowTitle">
<string>Smart Group Editor</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Smart Group Name</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="mNameLineEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Condition matches</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mAndOrCombo"/>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="mAddConditionBtn">
<property name="text">
<string>Add Condition</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QGroupBox" name="mConditionsBox">
<property name="title">
<string>Conditions</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>QgsSmartGroupEditorDialogBase</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>