[QGIS Commit] r14367 - in trunk/qgis/src: app/composer core/composer ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Mon Oct 11 09:13:29 EDT 2010


Author: mhugent
Date: 2010-10-11 06:13:29 -0700 (Mon, 11 Oct 2010)
New Revision: 14367

Added:
   trunk/qgis/src/ui/qgsattributeselectiondialogbase.ui
Modified:
   trunk/qgis/src/app/composer/qgsattributeselectiondialog.cpp
   trunk/qgis/src/app/composer/qgsattributeselectiondialog.h
   trunk/qgis/src/app/composer/qgscomposertablewidget.cpp
   trunk/qgis/src/core/composer/qgscomposerattributetable.cpp
   trunk/qgis/src/core/composer/qgscomposerattributetable.h
Log:
[FEATURE]: Sorting for composer attribute table (several columns and ascending / descending)

Modified: trunk/qgis/src/app/composer/qgsattributeselectiondialog.cpp
===================================================================
--- trunk/qgis/src/app/composer/qgsattributeselectiondialog.cpp	2010-10-11 09:52:50 UTC (rev 14366)
+++ trunk/qgis/src/app/composer/qgsattributeselectiondialog.cpp	2010-10-11 13:13:29 UTC (rev 14367)
@@ -26,26 +26,20 @@
 #include <QScrollArea>
 
 QgsAttributeSelectionDialog::QgsAttributeSelectionDialog( const QgsVectorLayer* vLayer, const QSet<int>& enabledAttributes, const QMap<int, QString>& aliasMap,
-    QWidget * parent, Qt::WindowFlags f ): QDialog( parent, f ), mVectorLayer( vLayer )
+    const QList< QPair<int, bool> >& sortColumns, QWidget* parent, Qt::WindowFlags f ): QDialog( parent, f ), mVectorLayer( vLayer )
 {
+  setupUi( this );
   if ( vLayer )
   {
-    QScrollArea* attributeScrollArea = new QScrollArea( this );
-    QWidget* attributeWidget = new QWidget();
-
-    mAttributeGridLayout = new QGridLayout( attributeWidget );
-    QLabel* attributeLabel = new QLabel( QString( "<b>" ) + tr( "Attribute" ) + QString( "</b>" ), this );
-    attributeLabel->setTextFormat( Qt::RichText );
-    mAttributeGridLayout->addWidget( attributeLabel, 0, 0 );
-    QLabel* aliasLabel = new QLabel( QString( "<b>" ) + tr( "Alias" ) + QString( "</b>" ), this );
-    aliasLabel->setTextFormat( Qt::RichText );
-    mAttributeGridLayout->addWidget( aliasLabel, 0, 1 );
-
     QgsFieldMap fieldMap = vLayer->pendingFields();
     QgsFieldMap::const_iterator fieldIt = fieldMap.constBegin();
     int layoutRowCounter = 1;
     for ( ; fieldIt != fieldMap.constEnd(); ++fieldIt )
     {
+      //insert field into sorting combo first
+      mSortColumnComboBox->addItem( fieldIt.value().name(), QVariant( fieldIt.key() ) );
+
+      //and into enabled / alias list
       QCheckBox* attributeCheckBox = new QCheckBox( fieldIt.value().name(), this );
       if ( enabledAttributes.size() < 1 || enabledAttributes.contains( fieldIt.key() ) )
       {
@@ -55,7 +49,7 @@
       {
         attributeCheckBox->setCheckState( Qt::Unchecked );
       }
-      mAttributeGridLayout->addWidget( attributeCheckBox, layoutRowCounter, 0 );
+      mAttributeGridLayout->addWidget(( QWidget* )attributeCheckBox, layoutRowCounter, 0, 1, 1 );
 
       QLineEdit* attributeLineEdit = new QLineEdit( this );
       QMap<int, QString>::const_iterator aliasIt = aliasMap.find( fieldIt.key() );
@@ -63,30 +57,24 @@
       {
         attributeLineEdit->setText( aliasIt.value() );
       }
-      mAttributeGridLayout->addWidget( attributeLineEdit, layoutRowCounter, 1 );
+      mAttributeGridLayout->addWidget(( QWidget* )attributeLineEdit, layoutRowCounter, 1, 1, 1 );
       ++layoutRowCounter;
     }
 
-    attributeScrollArea->setWidget( attributeWidget );
+    //sort columns
+    QList< QPair<int, bool> >::const_iterator sortIt = sortColumns.constBegin();
+    for ( ; sortIt != sortColumns.constEnd(); ++sortIt )
+    {
+      QTreeWidgetItem* item = new QTreeWidgetItem();
+      item->setText( 0, fieldMap[sortIt->first].name() );
+      item->setData( 0, Qt::UserRole, sortIt->first );
+      item->setText( 1, sortIt->second ? tr( "Ascending" ) : tr( "Descending" ) );
+      mSortColumnTreeWidget->addTopLevelItem( item );
+    }
+  }
 
-    QVBoxLayout* verticalLayout = new QVBoxLayout( this );
-    verticalLayout->addWidget( attributeScrollArea );
-
-    QHBoxLayout* selectClearLayout = new QHBoxLayout( this );
-    QPushButton* mSelectAllButton = new QPushButton( tr( "Select all" ), this );
-    QObject::connect( mSelectAllButton, SIGNAL( clicked() ), this, SLOT( selectAllAttributes() ) );
-    QPushButton* mClearButton = new QPushButton( tr( "Clear" ), this );
-    QObject::connect( mClearButton, SIGNAL( clicked() ), this, SLOT( clearAttributes() ) );
-    selectClearLayout->addWidget( mSelectAllButton );
-    selectClearLayout->addWidget( mClearButton );
-    verticalLayout->addLayout( selectClearLayout );
-
-
-    QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this );
-    QObject::connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) );
-    QObject::connect( buttonBox, SIGNAL( rejected() ), this, SLOT( reject() ) );
-    verticalLayout->addWidget( buttonBox );
-  }
+  mOrderComboBox->insertItem( 0, tr( "Ascending" ) );
+  mOrderComboBox->insertItem( 0, tr( "Descending" ) );
 }
 
 QgsAttributeSelectionDialog::~QgsAttributeSelectionDialog()
@@ -149,12 +137,28 @@
   return result;
 }
 
-void QgsAttributeSelectionDialog::selectAllAttributes()
+QList< QPair<int, bool> > QgsAttributeSelectionDialog::attributeSorting() const
 {
+  QList< QPair<int, bool> > sortingList;
+
+  for ( int i = 0; i < mSortColumnTreeWidget->topLevelItemCount(); ++i )
+  {
+    QTreeWidgetItem* item = mSortColumnTreeWidget->topLevelItem( i );
+    if ( item )
+    {
+      sortingList.push_back( qMakePair( item->data( 0, Qt::UserRole ).toInt(), item->text( 1 ) == tr( "Ascending" ) ) );
+    }
+  }
+
+  return sortingList;
+}
+
+void QgsAttributeSelectionDialog::on_mSelectAllButton_clicked()
+{
   setAllEnabled( true );
 }
 
-void QgsAttributeSelectionDialog::clearAttributes()
+void QgsAttributeSelectionDialog::on_mClearButton_clicked()
 {
   setAllEnabled( false );
 }
@@ -183,3 +187,48 @@
   }
 }
 
+void QgsAttributeSelectionDialog::on_mAddPushButton_clicked()
+{
+  QTreeWidgetItem* item = new QTreeWidgetItem();
+  item->setText( 0, mSortColumnComboBox->currentText() );
+  item->setData( 0, Qt::UserRole, mSortColumnComboBox->itemData( mSortColumnComboBox->currentIndex() ) );
+  item->setText( 1, mOrderComboBox->currentText() );
+  mSortColumnTreeWidget->addTopLevelItem( item );
+}
+
+void QgsAttributeSelectionDialog::on_mRemovePushButton_clicked()
+{
+  int currentIndex = mSortColumnTreeWidget->indexOfTopLevelItem( mSortColumnTreeWidget->currentItem() );
+  if ( currentIndex != -1 )
+  {
+    delete( mSortColumnTreeWidget->takeTopLevelItem( currentIndex ) );
+  }
+}
+
+void QgsAttributeSelectionDialog::on_mUpPushButton_clicked()
+{
+  int currentIndex = mSortColumnTreeWidget->indexOfTopLevelItem( mSortColumnTreeWidget->currentItem() );
+  if ( currentIndex != -1 )
+  {
+    if ( currentIndex > 0 )
+    {
+      QTreeWidgetItem* item = mSortColumnTreeWidget->takeTopLevelItem( currentIndex );
+      mSortColumnTreeWidget->insertTopLevelItem( currentIndex - 1, item );
+      mSortColumnTreeWidget->setCurrentItem( item );
+    }
+  }
+}
+
+void QgsAttributeSelectionDialog::on_mDownPushButton_clicked()
+{
+  int currentIndex = mSortColumnTreeWidget->indexOfTopLevelItem( mSortColumnTreeWidget->currentItem() );
+  if ( currentIndex != -1 )
+  {
+    if ( currentIndex < ( mSortColumnTreeWidget->topLevelItemCount() - 1 ) )
+    {
+      QTreeWidgetItem* item = mSortColumnTreeWidget->takeTopLevelItem( currentIndex );
+      mSortColumnTreeWidget->insertTopLevelItem( currentIndex + 1, item );
+      mSortColumnTreeWidget->setCurrentItem( item );
+    }
+  }
+}

Modified: trunk/qgis/src/app/composer/qgsattributeselectiondialog.h
===================================================================
--- trunk/qgis/src/app/composer/qgsattributeselectiondialog.h	2010-10-11 09:52:50 UTC (rev 14366)
+++ trunk/qgis/src/app/composer/qgsattributeselectiondialog.h	2010-10-11 13:13:29 UTC (rev 14367)
@@ -21,31 +21,37 @@
 #include <QDialog>
 #include <QMap>
 #include <QSet>
+#include "ui_qgsattributeselectiondialogbase.h"
 
 class QGridLayout;
 class QgsVectorLayer;
 class QPushButton;
 
 /**A dialog to select what attributes to display (in the table item) and with the possibility to set different aliases*/
-class QgsAttributeSelectionDialog: public QDialog
+class QgsAttributeSelectionDialog: public QDialog, private Ui::QgsAttributeSelectionDialogBase
 {
     Q_OBJECT
   public:
-    QgsAttributeSelectionDialog( const QgsVectorLayer* vLayer, const QSet<int>& enabledAttributes, const QMap<int, QString>& aliasMap, QWidget * parent = 0, Qt::WindowFlags f = 0 );
+    QgsAttributeSelectionDialog( const QgsVectorLayer* vLayer, const QSet<int>& enabledAttributes, const QMap<int, QString>& aliasMap, const QList< QPair<int, bool> >& sortColumns, QWidget * parent = 0, Qt::WindowFlags f = 0 );
     ~QgsAttributeSelectionDialog();
 
     /**Returns indices of selected attributes*/
     QSet<int> enabledAttributes() const;
     /**Returns alias map (alias might be different than for vector layer)*/
     QMap<int, QString> aliasMap() const;
+    /**List of sorting attributes and ascending / descending (so sorting to multiple columns is possible)*/
+    QList< QPair<int, bool> > attributeSorting() const;
 
   private slots:
-    void selectAllAttributes();
-    void clearAttributes();
+    void on_mSelectAllButton_clicked();
+    void on_mClearButton_clicked();
+    void on_mAddPushButton_clicked();
+    void on_mRemovePushButton_clicked();
+    void on_mUpPushButton_clicked();
+    void on_mDownPushButton_clicked();
 
   private:
     const QgsVectorLayer* mVectorLayer;
-    QGridLayout* mAttributeGridLayout;
     QPushButton* mSelectAllButton;
     QPushButton* mClearButton;
 

Modified: trunk/qgis/src/app/composer/qgscomposertablewidget.cpp
===================================================================
--- trunk/qgis/src/app/composer/qgscomposertablewidget.cpp	2010-10-11 09:52:50 UTC (rev 14366)
+++ trunk/qgis/src/app/composer/qgscomposertablewidget.cpp	2010-10-11 13:13:29 UTC (rev 14367)
@@ -32,6 +32,8 @@
   QgsComposerItemWidget* itemPropertiesWidget = new QgsComposerItemWidget( this, mComposerTable );
   mToolBox->addItem( itemPropertiesWidget, tr( "General options" ) );
 
+  blockAllSignals( true );
+
   //insert vector layers into combo
   QMap<QString, QgsMapLayer*> layerMap =  QgsMapLayerRegistry::instance()->mapLayers();
   QMap<QString, QgsMapLayer*>::const_iterator mapIt = layerMap.constBegin();
@@ -46,6 +48,7 @@
   }
 
   //insert composer maps into combo
+  mLayerComboBox->blockSignals( true );
   if ( mComposerTable )
   {
     const QgsComposition* tableComposition = mComposerTable->composition();
@@ -60,8 +63,10 @@
       }
     }
   }
+  mLayerComboBox->blockSignals( false );
 
   updateGuiElements();
+  blockAllSignals( false );
 
   if ( mComposerTable )
   {
@@ -108,12 +113,13 @@
     return;
   }
 
-  QgsAttributeSelectionDialog d( mComposerTable->vectorLayer(), mComposerTable->displayAttributes(), mComposerTable->fieldAliasMap(), 0 );
+  QgsAttributeSelectionDialog d( mComposerTable->vectorLayer(), mComposerTable->displayAttributes(), mComposerTable->fieldAliasMap(), mComposerTable->sortAttributes(), 0 );
   if ( d.exec() == QDialog::Accepted )
   {
     //change displayAttributes and aliases
     mComposerTable->setDisplayAttributes( d.enabledAttributes() );
     mComposerTable->setFieldAliasMap( d.aliasMap() );
+    mComposerTable->setSortAttributes( d.attributeSorting() );
     mComposerTable->update();
   }
 }

Modified: trunk/qgis/src/core/composer/qgscomposerattributetable.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerattributetable.cpp	2010-10-11 09:52:50 UTC (rev 14366)
+++ trunk/qgis/src/core/composer/qgscomposerattributetable.cpp	2010-10-11 13:13:29 UTC (rev 14367)
@@ -20,6 +20,29 @@
 #include "qgsmaplayerregistry.h"
 #include "qgsvectorlayer.h"
 
+QgsComposerAttributeTableCompare::QgsComposerAttributeTableCompare(): mCurrentSortColumn( 0 ), mAscending( true )
+{
+}
+
+
+bool QgsComposerAttributeTableCompare::operator()( const QgsAttributeMap& m1, const QgsAttributeMap& m2 )
+{
+  QVariant v1 = m1[mCurrentSortColumn];
+  QVariant v2 = m2[mCurrentSortColumn];
+
+  bool less = false;
+  if ( v1.type() == QVariant::String && v2.type() == QVariant::String )
+  {
+    less = v1.toString() < v2.toString();
+  }
+  else
+  {
+    less = v1.toDouble() < v2.toDouble();
+  }
+  return ( mAscending ? less : !less );
+}
+
+
 QgsComposerAttributeTable::QgsComposerAttributeTable( QgsComposition* composition ): QgsComposerTable( composition ), mVectorLayer( 0 ), mComposerMap( 0 ), \
     mMaximumNumberOfFeatures( 5 ), mShowOnlyVisibleFeatures( true )
 {
@@ -110,6 +133,15 @@
     attributes.push_back( f.attributeMap() );
     ++counter;
   }
+
+  //sort the list, starting with the last attribute
+  QgsComposerAttributeTableCompare c;
+  for ( int i = mSortInformation.size() - 1; i >= 0; --i )
+  {
+    c.setSortColumn( mSortInformation.at( i ).first );
+    c.setAscending( mSortInformation.at( i ).second );
+    qStableSort( attributes.begin(), attributes.end(), c );
+  }
   return true;
 }
 
@@ -212,8 +244,20 @@
     aliasMapElem.appendChild( mapEntryElem );
   }
   composerTableElem.appendChild( aliasMapElem );
+
+  //sort info
+  QDomElement sortColumnsElem = doc.createElement( "sortColumns" );
+  QList< QPair<int, bool> >::const_iterator sortIt = mSortInformation.constBegin();
+  for ( ; sortIt != mSortInformation.constEnd(); ++sortIt )
+  {
+    QDomElement columnElem = doc.createElement( "column" );
+    columnElem.setAttribute( "index", QString::number( sortIt->first ) );
+    columnElem.setAttribute( "ascending", sortIt->second == true ? "true" : "false" );
+    sortColumnsElem.appendChild( columnElem );
+  }
+  composerTableElem.appendChild( sortColumnsElem );
+  elem.appendChild( composerTableElem );
   bool ok = tableWriteXML( composerTableElem, doc );
-  elem.appendChild( composerTableElem );
   return ok;
 }
 
@@ -291,5 +335,20 @@
       mFieldAliasMap.insert( key, value );
     }
   }
+
+  //restore sort columns
+  mSortInformation.clear();
+  QDomElement sortColumnsElem = itemElem.firstChildElement( "sortColumns" );
+  if ( !sortColumnsElem.isNull() )
+  {
+    QDomNodeList columns = sortColumnsElem.elementsByTagName( "column" );
+    for ( int i = 0; i < columns.size(); ++i )
+    {
+      QDomElement columnElem = columns.at( i ).toElement();
+      int attribute = columnElem.attribute( "index" ).toInt();
+      bool ascending = columnElem.attribute( "ascending" ) == "true" ? true : false;
+      mSortInformation.push_back( qMakePair( attribute, ascending ) );
+    }
+  }
   return tableReadXML( itemElem, doc );
 }

Modified: trunk/qgis/src/core/composer/qgscomposerattributetable.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerattributetable.h	2010-10-11 09:52:50 UTC (rev 14366)
+++ trunk/qgis/src/core/composer/qgscomposerattributetable.h	2010-10-11 13:13:29 UTC (rev 14367)
@@ -23,6 +23,19 @@
 class QgsComposerMap;
 class QgsVectorLayer;
 
+/**Helper class for sorting, takes into account sorting column and ascending / descending*/
+class QgsComposerAttributeTableCompare
+{
+  public:
+    QgsComposerAttributeTableCompare();
+    bool operator()( const QgsAttributeMap& m1, const QgsAttributeMap& m2 );
+    void setSortColumn( int col ) { mCurrentSortColumn = col; }
+    void setAscending( bool asc ) { mAscending = asc; }
+  private:
+    int mCurrentSortColumn;
+    bool mAscending;
+};
+
 /**A table class that displays a vector attribute table*/
 class CORE_EXPORT QgsComposerAttributeTable: public QgsComposerTable
 {
@@ -58,6 +71,9 @@
     /**Adapts mMaximumNumberOfFeatures depending on the rectangle height*/
     void setSceneRect( const QRectF& rectangle );
 
+    void setSortAttributes( const QList<QPair<int, bool> > att ) { mSortInformation = att; }
+    QList<QPair<int, bool> > sortAttributes() const { return mSortInformation; }
+
   protected:
     /**Retrieves feature attributes*/
     bool getFeatureAttributes( QList<QgsAttributeMap>& attributes );
@@ -79,6 +95,9 @@
     /**Map of attribute name aliases. The aliases might be different to those of QgsVectorLayer (but those from the vector layer are the default)*/
     QMap<int, QString> mFieldAliasMap;
 
+    /**Contains information about sort attribute index / ascending (true/false). First entry has the highest priority*/
+    QList< QPair<int, bool> > mSortInformation;
+
     /**Inserts aliases from vector layer as starting configuration to the alias map*/
     void initializeAliasMap();
     /**Returns the attribute name to display in the item (attribute name or an alias if present)*/

Added: trunk/qgis/src/ui/qgsattributeselectiondialogbase.ui
===================================================================
--- trunk/qgis/src/ui/qgsattributeselectiondialogbase.ui	                        (rev 0)
+++ trunk/qgis/src/ui/qgsattributeselectiondialogbase.ui	2010-10-11 13:13:29 UTC (rev 14367)
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QgsAttributeSelectionDialogBase</class>
+ <widget class="QDialog" name="QgsAttributeSelectionDialogBase">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>322</width>
+    <height>283</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Select attributes</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0" colspan="3">
+    <layout class="QGridLayout" name="mAttributeGridLayout">
+     <property name="sizeConstraint">
+      <enum>QLayout::SetDefaultConstraint</enum>
+     </property>
+     <item row="0" column="0">
+      <widget class="QLabel" name="mAttributeLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&lt;b&gt;Attribute&lt;/b&gt;</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLabel" name="mAliasLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&lt;b&gt;Alias&lt;/b&gt;</string>
+       </property>
+       <property name="textFormat">
+        <enum>Qt::AutoText</enum>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QPushButton" name="mSelectAllButton">
+     <property name="text">
+      <string>Select all</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QPushButton" name="mClearButton">
+     <property name="text">
+      <string>Clear</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="2">
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>131</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="2" column="0" colspan="3">
+    <widget class="QGroupBox" name="mSortingGroupBox">
+     <property name="title">
+      <string>Sorting</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0" colspan="2">
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <widget class="QPushButton" name="mUpPushButton">
+          <property name="text">
+           <string/>
+          </property>
+          <property name="icon">
+           <iconset resource="../../images/images.qrc">
+            <normaloff>:/images/themes/default/symbologyUp.png</normaloff>:/images/themes/default/symbologyUp.png</iconset>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="mDownPushButton">
+          <property name="text">
+           <string/>
+          </property>
+          <property name="icon">
+           <iconset resource="../../images/images.qrc">
+            <normaloff>:/images/themes/default/symbologyDown.png</normaloff>:/images/themes/default/symbologyDown.png</iconset>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="mAddPushButton">
+          <property name="text">
+           <string/>
+          </property>
+          <property name="icon">
+           <iconset resource="../../images/images.qrc">
+            <normaloff>:/images/themes/default/symbologyAdd.png</normaloff>:/images/themes/default/symbologyAdd.png</iconset>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="mRemovePushButton">
+          <property name="text">
+           <string/>
+          </property>
+          <property name="icon">
+           <iconset resource="../../images/images.qrc">
+            <normaloff>:/images/themes/default/symbologyRemove.png</normaloff>:/images/themes/default/symbologyRemove.png</iconset>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item row="1" column="0">
+       <widget class="QComboBox" name="mSortColumnComboBox"/>
+      </item>
+      <item row="1" column="1">
+       <widget class="QComboBox" name="mOrderComboBox"/>
+      </item>
+      <item row="2" column="0" colspan="2">
+       <widget class="QTreeWidget" name="mSortColumnTreeWidget">
+        <column>
+         <property name="text">
+          <string>Column</string>
+         </property>
+        </column>
+        <column>
+         <property name="text">
+          <string>Ascending</string>
+         </property>
+        </column>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="3">
+    <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>
+  <include location="../../images/images.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>QgsAttributeSelectionDialogBase</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>QgsAttributeSelectionDialogBase</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>



More information about the QGIS-commit mailing list