[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