[QGIS Commit] r13601 - in trunk/qgis: python/core src/core/symbology-ng src/gui/symbology-ng src/ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sun May 30 06:20:39 EDT 2010


Author: wonder
Date: 2010-05-30 06:20:38 -0400 (Sun, 30 May 2010)
New Revision: 13601

Modified:
   trunk/qgis/python/core/symbology-ng-core.sip
   trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
   trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
   trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp
   trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h
   trunk/qgis/src/ui/qgscategorizedsymbolrendererv2widget.ui
Log:
[FEATURE] manual adding of categories in symbology-ng. Patch contributed by Lynx, thanks!
+ added missing python bindings and fixed some issues.


Modified: trunk/qgis/python/core/symbology-ng-core.sip
===================================================================
--- trunk/qgis/python/core/symbology-ng-core.sip	2010-05-30 09:13:15 UTC (rev 13600)
+++ trunk/qgis/python/core/symbology-ng-core.sip	2010-05-30 10:20:38 UTC (rev 13601)
@@ -181,6 +181,7 @@
   QgsSymbolV2* symbol();
   QString label() const;
 
+  void setValue( const QVariant &value );
   void setSymbol(QgsSymbolV2* s /Transfer/);
   void setLabel(QString label);
 
@@ -220,9 +221,11 @@
   //! return index of category with specified value (-1 if not found)
   int categoryIndexForValue(QVariant val);
 
+  bool updateCategoryValue( int catIndex, const QVariant &value );
   bool updateCategorySymbol(int catIndex, QgsSymbolV2* symbol /Transfer/);
   bool updateCategoryLabel(int catIndex, QString label);
 
+  void addCategory( const QgsRendererCategoryV2 &category );
   bool deleteCategory(int catIndex);
   void deleteAllCategories();
 

Modified: trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp	2010-05-30 09:13:15 UTC (rev 13600)
+++ trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp	2010-05-30 10:20:38 UTC (rev 13601)
@@ -45,6 +45,11 @@
   return mLabel;
 }
 
+void QgsRendererCategoryV2::setValue( const QVariant &value )
+{
+  mValue = value;
+}
+
 void QgsRendererCategoryV2::setSymbol( QgsSymbolV2* s )
 {
   if ( mSymbol == s )
@@ -53,7 +58,7 @@
   mSymbol = s;
 }
 
-void QgsRendererCategoryV2::setLabel( QString label )
+void QgsRendererCategoryV2::setLabel( const QString &label )
 {
   mLabel = label;
 }
@@ -143,6 +148,14 @@
   return -1;
 }
 
+bool QgsCategorizedSymbolRendererV2::updateCategoryValue( int catIndex, const QVariant &value )
+{
+  if ( catIndex < 0 || catIndex >= mCategories.size() )
+    return false;
+  mCategories[catIndex].setValue( value );
+  return true;
+}
+
 bool QgsCategorizedSymbolRendererV2::updateCategorySymbol( int catIndex, QgsSymbolV2* symbol )
 {
   if ( catIndex < 0 || catIndex >= mCategories.size() )
@@ -159,6 +172,18 @@
   return true;
 }
 
+void QgsCategorizedSymbolRendererV2::addCategory( const QgsRendererCategoryV2 &cat )
+{
+  if ( cat.symbol() == NULL )
+  {
+    QgsDebugMsg( "invalid symbol in a category! ignoring..." );
+  }
+  else
+  {
+    mCategories.append( cat );
+  }
+}
+
 bool QgsCategorizedSymbolRendererV2::deleteCategory( int catIndex )
 {
   if ( catIndex < 0 || catIndex >= mCategories.size() )

Modified: trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
===================================================================
--- trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h	2010-05-30 09:13:15 UTC (rev 13600)
+++ trunk/qgis/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h	2010-05-30 10:20:38 UTC (rev 13601)
@@ -24,8 +24,9 @@
     QgsSymbolV2* symbol() const;
     QString label() const;
 
+    void setValue( const QVariant &value );
     void setSymbol( QgsSymbolV2* s );
-    void setLabel( QString label );
+    void setLabel( const QString &label );
 
     // debugging
     QString dump();
@@ -65,9 +66,11 @@
     //! return index of category with specified value (-1 if not found)
     int categoryIndexForValue( QVariant val );
 
+    bool updateCategoryValue( int catIndex, const QVariant &value );
     bool updateCategorySymbol( int catIndex, QgsSymbolV2* symbol );
     bool updateCategoryLabel( int catIndex, QString label );
 
+    void addCategory( const QgsRendererCategoryV2 &category );
     bool deleteCategory( int catIndex );
     void deleteAllCategories();
 

Modified: trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp	2010-05-30 09:13:15 UTC (rev 13600)
+++ trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp	2010-05-30 10:20:38 UTC (rev 13601)
@@ -40,6 +40,9 @@
     mRenderer = static_cast<QgsCategorizedSymbolRendererV2*>( renderer );
   }
 
+  QString attrName = mRenderer->classAttribute();
+  mOldClassificationAttribute = attrName;
+
   // setup user interface
   setupUi( this );
 
@@ -47,7 +50,7 @@
   populateColorRamps();
   QStandardItemModel* m = new QStandardItemModel( this );
   QStringList labels;
-  labels << "Value" << "Label";
+  labels << tr( "Symbol" ) << tr( "Value" ) << tr( "Label" );
   m->setHorizontalHeaderLabels( labels );
   viewCategories->setModel( m );
 
@@ -61,6 +64,7 @@
   connect( btnAddCategories, SIGNAL( clicked() ), this, SLOT( addCategories() ) );
   connect( btnDeleteCategory, SIGNAL( clicked() ), this, SLOT( deleteCategory() ) );
   connect( btnDeleteAllCategories, SIGNAL( clicked() ), this, SLOT( deleteAllCategories() ) );
+  connect( btnAddCategory, SIGNAL( clicked() ), this, SLOT( addCategory() ) );
   connect( m, SIGNAL( itemChanged( QStandardItem * ) ), this, SLOT( changeCurrentValue( QStandardItem * ) ) );
 
   // update GUI from renderer
@@ -81,6 +85,7 @@
   // set column
   disconnect( cboCategorizedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( categoryColumnChanged() ) );
   QString attrName = mRenderer->classAttribute();
+  mOldClassificationAttribute = attrName;
   int idx = cboCategorizedColumn->findText( attrName, Qt::MatchExactly );
   cboCategorizedColumn->setCurrentIndex( idx >= 0 ? idx : 0 );
   connect( cboCategorizedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( categoryColumnChanged() ) );
@@ -127,36 +132,28 @@
   btnChangeCategorizedSymbol->setIcon( icon );
 }
 
-
 void QgsCategorizedSymbolRendererV2Widget::populateCategories()
 {
   QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model() );
   m->clear();
 
   QStringList labels;
-  labels << "Value" << "Label";
+  labels << tr( "Symbol" ) << tr( "Value" ) << tr( "Label" );
   m->setHorizontalHeaderLabels( labels );
 
-  QSize iconSize( 16, 16 );
-
   int i, count = mRenderer->categories().count();
 
   // TODO: sort?? utils.sortVariantList(keys);
 
   for ( i = 0; i < count; i++ )
   {
-    const QgsRendererCategoryV2& cat = mRenderer->categories()[i];
-    QVariant k = cat.value();
+    const QgsRendererCategoryV2 &cat = mRenderer->categories()[i];
+    addCategory( cat );
+  }
 
-    QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( cat.symbol(), iconSize );
-    QStandardItem* item = new QStandardItem( icon, k.toString() );
-    item->setData( k ); // set attribute value as user role
-    item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
-
-    QList<QStandardItem *> list;
-    list << item << new QStandardItem( cat.label() );
-    m->appendRow( list );
-  }
+  viewCategories->resizeColumnToContents( 0 );
+  viewCategories->resizeColumnToContents( 1 );
+  viewCategories->resizeColumnToContents( 2 );
 }
 
 void QgsCategorizedSymbolRendererV2Widget::populateColumns()
@@ -185,7 +182,22 @@
   }
 }
 
+void QgsCategorizedSymbolRendererV2Widget::addCategory( const QgsRendererCategoryV2 &cat )
+{
+  QSize iconSize( 16, 16 );
 
+  QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( cat.symbol(), iconSize );
+  QStandardItem *symbolItem = new QStandardItem( icon, "" );
+  symbolItem->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
+
+  QStandardItem *valueItem = new QStandardItem( cat.value().toString() );
+  valueItem->setData( cat.value() ); // set attribute value as user role
+
+  QList<QStandardItem *> list;
+  list << symbolItem << valueItem << new QStandardItem( cat.label() );
+  qobject_cast<QStandardItemModel *>( viewCategories->model() )->appendRow( list );
+}
+
 void QgsCategorizedSymbolRendererV2Widget::categoryColumnChanged()
 {
   mRenderer->setClassAttribute( cboCategorizedColumn->currentText() );
@@ -218,9 +230,6 @@
   populateCategories();
 }
 
-
-
-
 static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp )
 {
   // sort the categories first
@@ -270,9 +279,47 @@
   QgsCategoryList cats;
   _createCategories( cats, unique_vals, mCategorizedSymbol, ramp );
 
+  bool deleteExisting = false;
+  if ( !mOldClassificationAttribute.isEmpty() &&
+       attrName != mOldClassificationAttribute &&
+       mRenderer->categories().count() > 0 )
+  {
+    int res = QMessageBox::question( this,
+                                     tr( "Confirm Delete" ),
+                                     tr( "The classification field was changed from '%1' to '%2'.\n"
+                                         "Should the existing classes be deleted before classification?" )
+                                     .arg( mOldClassificationAttribute ).arg( attrName ),
+                                     QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel );
+    if ( res == QMessageBox::Cancel )
+      return;
+    if ( res == QMessageBox::Yes )
+      deleteExisting = true;
+  }
+
+  mOldClassificationAttribute = attrName;
+
+  if ( !deleteExisting )
+  {
+    QgsCategoryList prevCats = mRenderer->categories();
+    for ( int i = 0; i < cats.size(); ++i )
+    {
+      bool contains = false;
+      QVariant value = cats.at( i ).value();
+      for ( int j = 0; j < prevCats.size() && !contains; ++j )
+      {
+        if ( prevCats.at( j ).value() == value )
+          contains = true;
+      }
+
+      if ( !contains )
+        prevCats.append( cats.at( i ) );
+    }
+    cats = prevCats;
+  }
+
   // TODO: if not all categories are desired, delete some!
   /*
-  if (not dlg.radAllCats.isChecked())
+  if (not dlg.readAllCats.isChecked())
   {
     cats2 = {}
     for item in dlg.listCategories.selectedItems():
@@ -307,7 +354,7 @@
   if ( row == -1 )
     return QVariant();
   QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model() );
-  return m->item( row )->data();
+  return m->item( row, 1 )->data();
 }
 
 void QgsCategorizedSymbolRendererV2Widget::deleteCategory()
@@ -333,10 +380,29 @@
 
 void QgsCategorizedSymbolRendererV2Widget::changeCurrentValue( QStandardItem * item )
 {
+  int idx = item->row();
+  QString newtext = item->text();
   if ( item->column() == 1 )
   {
-    QString label = item->text();
-    int idx = item->row();
-    mRenderer->updateCategoryLabel( idx, label );
+    QVariant value = newtext;
+    // try to preserve variant type for this value
+    QVariant::Type t = item->data().type();
+    if ( t == QVariant::Int )
+      value = newtext.toInt();
+    else if ( t == QVariant::Double )
+      value = newtext.toDouble();
+    mRenderer->updateCategoryValue( idx, value );
   }
+  else if ( item->column() == 2 )
+  {
+    mRenderer->updateCategoryLabel( idx, newtext );
+  }
 }
+
+void QgsCategorizedSymbolRendererV2Widget::addCategory()
+{
+  QgsSymbolV2 *symbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() );
+  QgsRendererCategoryV2 cat( QString(), symbol, QString() );
+  addCategory( cat );
+  mRenderer->addCategory( cat );
+}

Modified: trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h
===================================================================
--- trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h	2010-05-30 09:13:15 UTC (rev 13600)
+++ trunk/qgis/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h	2010-05-30 10:20:38 UTC (rev 13601)
@@ -5,6 +5,7 @@
 #include <QStandardItem>
 
 class QgsCategorizedSymbolRendererV2;
+class QgsRendererCategoryV2;
 
 #include "ui_qgscategorizedsymbolrendererv2widget.h"
 
@@ -30,6 +31,9 @@
     void deleteAllCategories();
     void changeCurrentValue( QStandardItem * item );
 
+  protected slots:
+    void addCategory();
+
   protected:
 
     void updateUiFromRenderer();
@@ -44,6 +48,8 @@
 
     void populateColorRamps();
 
+    void addCategory( const QgsRendererCategoryV2& cat );
+
     //! return row index for the currently selected category (-1 if on no selection)
     int currentCategoryRow();
 
@@ -56,6 +62,9 @@
     QgsCategorizedSymbolRendererV2* mRenderer;
 
     QgsSymbolV2* mCategorizedSymbol;
+
+  private:
+    QString mOldClassificationAttribute;
 };
 
 

Modified: trunk/qgis/src/ui/qgscategorizedsymbolrendererv2widget.ui
===================================================================
--- trunk/qgis/src/ui/qgscategorizedsymbolrendererv2widget.ui	2010-05-30 09:13:15 UTC (rev 13600)
+++ trunk/qgis/src/ui/qgscategorizedsymbolrendererv2widget.ui	2010-05-30 10:20:38 UTC (rev 13601)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>464</width>
-    <height>316</height>
+    <width>599</width>
+    <height>298</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -115,6 +115,13 @@
       </widget>
      </item>
      <item>
+      <widget class="QPushButton" name="btnAddCategory">
+       <property name="text">
+        <string>Add</string>
+       </property>
+      </widget>
+     </item>
+     <item>
       <widget class="QPushButton" name="btnDeleteCategory">
        <property name="text">
         <string>Delete</string>



More information about the QGIS-commit mailing list