diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/core/qgsvectorlayer.cpp /hometb/mk/sig/dev/r14936_patched/qgis//src/core/qgsvectorlayer.cpp --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/core/qgsvectorlayer.cpp 2010-12-23 16:58:54.579294984 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/core/qgsvectorlayer.cpp 2010-12-28 22:54:22.099566119 +0100 @@ -837,11 +837,17 @@ for ( int i = 0; i < symbols.count(); i++ ) { QgsSymbolV2* sym = symbols[i]; + + QgsDebugMsg( "num layers symbols:" + + QString::number( sym->symbolLayerCount() ) ); for ( int j = 0; j < sym->symbolLayerCount(); j++ ) { int level = sym->symbolLayer( j )->renderingPass(); - if ( level < 0 || level >= 1000 ) // ignore invalid levels - continue; + + QgsDebugMsg( "Level: " + QString::number(level )); + + if ( level < 0 || level >= 1000 ){ // ignore invalid levels + QgsDebugMsg( "invalid levels!" );continue;} QgsSymbolV2LevelItem item( sym, j ); while ( level >= levels.count() ) // append new empty levels levels.append( QgsSymbolV2Level() ); @@ -858,9 +864,11 @@ QgsSymbolV2LevelItem& item = level[i]; if ( !features.contains( item.symbol() ) ) { - QgsDebugMsg( "level item's symbol not found!" ); +// QgsDebugMsg( "level item's symbol not found!" ); continue; } + QgsDebugMsg( "level item's symbol found. Level " + QString::number( i ) + "/" + QString::number(level.count() ) ); + int layer = item.layer(); QList& lst = features[item.symbol()]; QList::iterator fit; diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/core/symbology-ng/qgsrulebasedrendererv2.cpp /hometb/mk/sig/dev/r14936_patched/qgis//src/core/symbology-ng/qgsrulebasedrendererv2.cpp --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/core/symbology-ng/qgsrulebasedrendererv2.cpp 2010-12-23 16:58:50.639408727 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/core/symbology-ng/qgsrulebasedrendererv2.cpp 2010-12-28 23:39:43.800961483 +0100 @@ -14,7 +14,7 @@ ***************************************************************************/ #include "qgsrulebasedrendererv2.h" - +#include "qgssymbollayerv2.h" #include "qgssearchtreenode.h" #include "qgssymbollayerv2utils.h" #include "qgsrendercontext.h" @@ -28,10 +28,10 @@ -QgsRuleBasedRendererV2::Rule::Rule( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp ) +QgsRuleBasedRendererV2::Rule::Rule( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description ) : mSymbol( symbol ), mScaleMinDenom( scaleMinDenom ), mScaleMaxDenom( scaleMaxDenom ), - mFilterExp( filterExp ) + mFilterExp( filterExp ), mLabel( label ), mDescription( description ) { initFilter(); } @@ -62,8 +62,8 @@ QString QgsRuleBasedRendererV2::Rule::dump() const { - return QString( "RULE - scale [%1,%2] - filter %3 - symbol %4" ) - .arg( mScaleMinDenom ).arg( mScaleMaxDenom ) + return QString( "RULE %1 - scale [%2,%3] - filter %4 - symbol %5" ) + .arg( mLabel ).arg( mScaleMinDenom ).arg( mScaleMaxDenom ) .arg( mFilterExp ).arg( mSymbol->dump() ); } @@ -107,6 +107,8 @@ mScaleMinDenom = other.mScaleMinDenom; mScaleMaxDenom = other.mScaleMaxDenom; mFilterExp = other.mFilterExp; + mLabel = other.mLabel; + mDescription = other.mDescription; initFilter(); } return *this; @@ -126,7 +128,21 @@ QgsSymbolV2* QgsRuleBasedRendererV2::symbolForFeature( QgsFeature& feature ) { - return mCurrentSymbol; + QgsDebugMsg( "usingSymbolLevels:" ); + QgsDebugMsg( QString(usingSymbolLevels()?"T":"F") ); + QgsDebugMsg( QString(mUsingSymbolLevels?"T":"F") ); +// return mCurrentSymbol; // uncomment this out to disable UsingSymbolLevels + if( !usingSymbolLevels() ) return mCurrentSymbol;// comment this out to disable UsingSymbolLevels + + for ( QList::iterator it = mCurrentRules.begin(); it != mCurrentRules.end(); ++it ) + { + Rule* rule = *it; + + if ( rule->isFilterOK( mCurrentFields, feature ) ) + { + return rule->symbol(); //works with levels but takes only first rule + } + } } void QgsRuleBasedRendererV2::renderFeature( QgsFeature& feature, @@ -198,6 +214,7 @@ QgsSymbolV2* s = mDefaultSymbol->clone(); QgsRuleBasedRendererV2* r = new QgsRuleBasedRendererV2( s ); r->mRules = mRules; + r->setUsingSymbolLevels( usingSymbolLevels() ); // comment this out to disable UsingSymbolLevels return r; } @@ -217,6 +234,7 @@ { QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME ); rendererElem.setAttribute( "type", "RuleRenderer" ); + rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) ); QDomElement rulesElem = doc.createElement( "rules" ); @@ -233,6 +251,8 @@ ruleElem.setAttribute( "filter", rule.filterExpression() ); ruleElem.setAttribute( "scalemindenom", rule.scaleMinDenom() ); ruleElem.setAttribute( "scalemaxdenom", rule.scaleMaxDenom() ); + ruleElem.setAttribute( "label", rule.label() ); + ruleElem.setAttribute( "description", rule.description() ); rulesElem.appendChild( ruleElem ); } rendererElem.appendChild( rulesElem ); @@ -250,7 +270,7 @@ for ( QList::iterator it = mRules.begin(); it != mRules.end(); ++it ) { QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( it->symbol(), iconSize ); - lst << qMakePair( it->filterExpression(), pix ); + lst << qMakePair( it->label(), pix ); } return lst; } @@ -260,7 +280,7 @@ QgsLegendSymbolList lst; for ( QList::iterator it = mRules.begin(); it != mRules.end(); ++it ) { - lst << qMakePair( it->filterExpression(), it->symbol() ); + lst << qMakePair( it->label(), it->symbol() ); } return lst; } @@ -292,9 +312,11 @@ if ( symbolMap.contains( symbolIdx ) ) { QString filterExp = ruleElem.attribute( "filter" ); + QString label = ruleElem.attribute( "label" ); + QString description = ruleElem.attribute( "description" ); int scaleMinDenom = ruleElem.attribute( "scalemindenom", "0" ).toInt(); int scaleMaxDenom = ruleElem.attribute( "scalemaxdenom", "0" ).toInt(); - r->mRules.append( Rule( symbolMap.take( symbolIdx ), scaleMinDenom, scaleMaxDenom, filterExp ) ); + r->mRules.append( Rule( symbolMap.take( symbolIdx ), scaleMinDenom, scaleMaxDenom, filterExp, label, description ) ); } else { @@ -350,11 +372,13 @@ { QString newfilter = QString( "%1 = '%2'" ).arg( r->classAttribute() ).arg( cat.value().toString() ); QString filter = initialRule.filterExpression(); + QString label = initialRule.label(); + QString description = initialRule.description(); if ( filter.isEmpty() ) filter = newfilter; else filter = QString( "(%1) AND (%2)" ).arg( filter ).arg( newfilter ); - rules.append( Rule( cat.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter ) ); + rules.append( Rule( cat.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter, initialRule.label(), initialRule.description() ) ); } return rules; } @@ -366,11 +390,13 @@ { QString newfilter = QString( "%1 >= '%2' AND %1 <= '%3'" ).arg( r->classAttribute() ).arg( rng.lowerValue() ).arg( rng.upperValue() ); QString filter = initialRule.filterExpression(); + QString label = initialRule.label(); + QString description = initialRule.description(); if ( filter.isEmpty() ) filter = newfilter; else filter = QString( "(%1) AND (%2)" ).arg( filter ).arg( newfilter ); - rules.append( Rule( rng.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter ) ); + rules.append( Rule( rng.symbol()->clone(), initialRule.scaleMinDenom(), initialRule.scaleMaxDenom(), filter, initialRule.label(), initialRule.description() ) ); } return rules; } @@ -387,10 +413,10 @@ continue; // jump over the first scales out of the interval if ( maxDenom != 0 && maxDenom <= scale ) break; // ignore the latter scales out of the interval - rules.append( Rule( initialRule.symbol()->clone(), oldScale, scale, initialRule.filterExpression() ) ); + rules.append( Rule( initialRule.symbol()->clone(), oldScale, scale, initialRule.filterExpression(), initialRule.label(), initialRule.description() ) ); oldScale = scale; } // last rule - rules.append( Rule( initialRule.symbol()->clone(), oldScale, maxDenom, initialRule.filterExpression() ) ); + rules.append( Rule( initialRule.symbol()->clone(), oldScale, maxDenom, initialRule.filterExpression(), initialRule.label(), initialRule.description() ) ); return rules; } diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/core/symbology-ng/qgsrulebasedrendererv2.h /hometb/mk/sig/dev/r14936_patched/qgis//src/core/symbology-ng/qgsrulebasedrendererv2.h --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/core/symbology-ng/qgsrulebasedrendererv2.h 2010-12-23 16:58:50.629409016 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/core/symbology-ng/qgsrulebasedrendererv2.h 2010-12-22 21:14:52.204050948 +0100 @@ -44,7 +44,7 @@ { public: //! Constructor takes ownership of the symbol - Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString() ); + Rule( QgsSymbolV2* symbol, int scaleMinDenom = 0, int scaleMaxDenom = 0, QString filterExp = QString(), QString label = QString(), QString description = QString() ); Rule( const Rule& other ); ~Rule(); QString dump() const; @@ -57,11 +57,15 @@ int scaleMinDenom() const { return mScaleMinDenom; } int scaleMaxDenom() const { return mScaleMaxDenom; } QString filterExpression() const { return mFilterExp; } + QString label() const { return mLabel; } + QString description() const { return mDescription; } void setScaleMinDenom( int scaleMinDenom ) { mScaleMinDenom = scaleMinDenom; } void setScaleMaxDenom( int scaleMaxDenom ) { mScaleMaxDenom = scaleMaxDenom; } void setFilterExpression( QString filterExp ) { mFilterExp = filterExp; initFilter(); } - + void setLabel( QString label ) { mLabel = label; } + void setDescription( QString description ) { mDescription = description; } + Rule& operator=( const Rule& other ); protected: @@ -70,7 +74,7 @@ QgsSymbolV2* mSymbol; int mScaleMinDenom, mScaleMaxDenom; - QString mFilterExp; + QString mFilterExp, mLabel, mDescription; // temporary QgsSearchString mFilterParsed; @@ -81,7 +85,7 @@ static QgsFeatureRendererV2* create( QDomElement& element ); - //! Constructor. Takes ownership of the defult symbol. + //! Constructor. Takes ownership of the default symbol. QgsRuleBasedRendererV2( QgsSymbolV2* defaultSymbol ); //! return symbol for current feature. Should not be used individually: there could be more symbols for a feature diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp /hometb/mk/sig/dev/r14936_patched/qgis//src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp 2010-12-23 16:58:49.449443081 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp 2010-12-20 21:10:57.036149117 +0100 @@ -27,6 +27,7 @@ #include #include #include +#include QgsRendererV2Widget* QgsRuleBasedRendererV2Widget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) { @@ -57,7 +58,7 @@ setupUi( this ); treeRules->setRenderer( mRenderer ); - + treeRules->setColumnCount(5); // FIXME: is this necessary for all 3 types of grouping? mRefineMenu = new QMenu( btnRefineRule ); mRefineMenu->addAction( tr( "Add scales" ), this, SLOT( refineRuleScales() ) ); mRefineMenu->addAction( tr( "Add categories" ), this, SLOT( refineRuleCategories() ) ); @@ -303,7 +304,9 @@ setupUi( this ); editFilter->setText( mRule.filterExpression() ); - + editLabel->setText( mRule.label() ); + editDescription->setText( mRule.description() ); + if ( mRule.dependsOnScale() ) { groupScale->setChecked( true ); @@ -368,6 +371,8 @@ void QgsRendererRulePropsDialog::updateRuleFromGui() { mRule.setFilterExpression( editFilter->text() ); + mRule.setLabel( editLabel->text() ); + mRule.setDescription( editDescription->text() ); mRule.setScaleMinDenom( groupScale->isChecked() ? spinMinScale->value() : 0 ); mRule.setScaleMaxDenom( groupScale->isChecked() ? spinMaxScale->value() : 0 ); } @@ -400,18 +405,68 @@ QString QgsRendererRulesTreeWidget::formatScaleRange( int minDenom, int maxDenom ) { - if ( maxDenom != 0 ) - return QString( "<1:%1, 1:%2>" ).arg( minDenom ).arg( maxDenom ); +// if ( maxDenom != 0 ) +// return QString( "<1:%1, 1:%2>" ).arg( minDenom ).arg( maxDenom ); +// else +// return QString( "<1:%1, 1:inf>" ).arg( minDenom ); + if ( maxDenom != 0 ){ + if ( minDenom != 0 ){ + return QString( "<%1, %2>" ).arg( formatScale( minDenom ) ).arg( formatScale( maxDenom ) ); + } + else + return QString( "<1:0, %1>" ).arg( formatScale( maxDenom ) ); + } else - return QString( "<1:%1, 1:inf>" ).arg( minDenom ); + return QString( "<%1, 1:inf>" ).arg( formatScale( minDenom ) ); + } +QString QgsRendererRulesTreeWidget::formatScale( int denom ) +{ + if ( denom != 0 ) { + QString denomString = QString( "%1" ).arg( denom ); + + // Add spaces for thousands separators + // FIXME: it's not sure to work for right-to-left languages e.g. launching qgis with ./qgis --lang ar + // Hence it is currently disabled for those languages. Otherwise "1:15 000" is displayed "000 15:1" + // (at least running ./qgis --lang ar on French Kubuntu) + + if ( layoutDirection() == Qt::LeftToRight ){ + int nSeps=0; + for ( int i=3; i < denomString.size() + nSeps; i+=3){ + denomString.insert(denomString.size() - i - nSeps, " " ); nSeps++; // ISO-31-0 recommands spaces rather than locale, see http://en.wikipedia.org/wiki/ISO_31-0#Numbers + } // TODO: fix minor bug (in some cases, space after ":" + } + return QString( "1:%1" ).arg( denomString ); + } + else + return QString( "" ); +} + + +int widthMinDenom = 0; // is it the best place to declare those? +int widthMaxDenom = 0; void QgsRendererRulesTreeWidget::populateRules() { if ( !mR ) return; clear(); + + + for ( int i = 0; i < mR->ruleCount(); ++i ) // find longest scale string for future padding. FIXME: code already use above; avoid duplicate + { + QgsRuleBasedRendererV2::Rule& rule = mR->ruleAt( i ); + + if( formatScale( rule.scaleMinDenom() ).size() > widthMinDenom ) + widthMinDenom = formatScale( rule.scaleMinDenom() ).size() ; + + if( formatScale( rule.scaleMaxDenom() ).size() > widthMaxDenom ) + widthMaxDenom = formatScale( rule.scaleMaxDenom() ).size() ; + } + + + if ( mGrouping == NoGrouping ) populateRulesNoGrouping(); else if ( mGrouping == GroupingByScale ) @@ -423,25 +478,50 @@ void QgsRendererRulesTreeWidget::populateRulesNoGrouping() { QList lst; + for ( int i = 0; i < mR->ruleCount(); ++i ) { QgsRuleBasedRendererV2::Rule& rule = mR->ruleAt( i ); QTreeWidgetItem* item = new QTreeWidgetItem; - QString txt = rule.filterExpression(); - if ( txt.isEmpty() ) txt = tr( "(no filter)" ); - if ( rule.dependsOnScale() ) - { - txt += tr( ", scale " ) + formatScaleRange( rule.scaleMinDenom(), rule.scaleMaxDenom() ); - } - item->setText( 0, txt ); + QString txtLabel = rule.label(); + item->setText( 0, txtLabel ); item->setData( 0, Qt::UserRole + 1, i ); item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) ); + QString txtRule = rule.filterExpression(); + if ( txtRule.isEmpty() ) txtRule = tr( "(no filter)" ); + item->setText( 1, txtRule ); + + if ( rule.dependsOnScale() ) + { + QString txtMinDenomScale = formatScale( rule.scaleMinDenom() ); + QString txtMaxDenomScale = formatScale( rule.scaleMaxDenom() ); + while( txtMinDenomScale.size() < widthMinDenom ){ txtMinDenomScale.insert( 0, " " );} // pad to left with spaces (to fix string-based sorting) + while( txtMaxDenomScale.size() < widthMaxDenom ){ txtMaxDenomScale.insert( 0, " " );} + item->setText( 2, txtMinDenomScale ); + item->setText( 3, txtMaxDenomScale ); + item->setTextAlignment (2, Qt::AlignRight); + item->setTextAlignment (3, Qt::AlignRight); + } + + QBrush brush( QColor( 200, 200, 200, 255 ) ); + item->setBackground( 1, brush ); + item->setBackground( 3, brush ); + + // Id: add 1 to rule number and convert to string + std::ostringstream ioss; + ioss << i+1; + std::string ruleIdx = ioss.str(); + while( ruleIdx.size() < 4 ){ ruleIdx.insert( 0, " " );} // pad to left with spaces (to fix string-based sorting) + item->setText( 4, QString(ruleIdx.c_str()) );// Insert Id in table TODO: base it on SymbolIdx ? How to access it? + item->setTextAlignment (4, Qt::AlignRight); lst << item; } + + addTopLevelItems( lst ); } @@ -466,15 +546,53 @@ scale_item->setText( 0, txt ); scale_item->setData( 0, Qt::UserRole + 1, -2 ); scale_item->setFlags( scale_item->flags() & ~Qt::ItemIsDragEnabled ); // groups cannot be dragged + QFont italicFont("" , -1 , -1, true ); + scale_item->setFont( 0, italicFont ); scale_items[scale] = scale_item; + // need to add the item before setFirstColumnSpanned, + // see http://qt.nokia.com/developer/task-tracker/index_html?method=entry&id=214686 + addTopLevelItem( scale_item ); + scale_item->setFirstColumnSpanned( true ); } QString filter = rule.filterExpression(); QTreeWidgetItem* item = new QTreeWidgetItem( scale_items[scale] ); - item->setText( 0, filter.isEmpty() ? tr( "(no filter)" ) : filter ); + + QString txtLabel = rule.label(); + item->setText( 0, txtLabel ); item->setData( 0, Qt::UserRole + 1, i ); item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) ); + + QString txtRule = rule.filterExpression(); + if ( txtRule.isEmpty() ) txtRule = tr( "(no filter)" ); + item->setText( 1, txtRule ); + + if ( rule.dependsOnScale() ) + { + QString txtMinDenomScale = formatScale( rule.scaleMinDenom() ); + QString txtMaxDenomScale = formatScale( rule.scaleMaxDenom() ); + while( txtMinDenomScale.size() < widthMinDenom ){ txtMinDenomScale.insert( 0, " " );} // pad to left with spaces (to fix string-based sorting) + while( txtMaxDenomScale.size() < widthMaxDenom ){ txtMaxDenomScale.insert( 0, " " );} + // Displaying scales is redundant here, but keeping them allows to keep constant the layout and width of all columns when switching to one of the two other views + item->setText( 2, txtMinDenomScale ); + item->setText( 3, txtMaxDenomScale ); + item->setTextAlignment (2, Qt::AlignRight); + item->setTextAlignment (3, Qt::AlignRight); + } + + QBrush brush( QColor( 200, 200, 200, 255 ) ); + item->setBackground( 1, brush ); + item->setBackground( 3, brush ); + + // Id: add 1 to rule number and convert to string + std::ostringstream ioss; + ioss << i+1; + std::string ruleIdx = ioss.str(); + while( ruleIdx.size() < 4 ){ ruleIdx.insert( 0, " " );} // pad to left with spaces (to fix string-based sorting) + item->setText( 4, QString(ruleIdx.c_str()) );// Insert Id in table TODO: base it on SymbolIdx ? How to access it? + item->setTextAlignment (4, Qt::AlignRight); + } addTopLevelItems( scale_items.values() ); } @@ -494,20 +612,58 @@ filter_item->setText( 0, filter.isEmpty() ? tr( "(no filter)" ) : filter ); filter_item->setData( 0, Qt::UserRole + 1, -1 ); filter_item->setFlags( filter_item->flags() & ~Qt::ItemIsDragEnabled ); // groups cannot be dragged + QFont italicFont("" , -1 , -1, true ); + filter_item->setFont( 0, italicFont ); filter_items[filter] = filter_item; + // need to add the item before setFirstColumnSpanned, + // see http://qt.nokia.com/developer/task-tracker/index_html?method=entry&id=214686 + addTopLevelItem( filter_item ); + filter_item->setFirstColumnSpanned( true ); } - QString txt; - if ( rule.dependsOnScale() ) - txt = QString( "scale <1:%1, 1:%2>" ).arg( rule.scaleMinDenom() ).arg( rule.scaleMaxDenom() ); - else - txt = "any scale"; +// Displaying scaleMinDenom and scaleMaxDenom separately allows to sort by them in the widget +// QString txt; +// if ( rule.dependsOnScale() ) +// txt = QString( "scale <1:%1, 1:%2>" ).arg( rule.scaleMinDenom() ).arg( rule.scaleMaxDenom() ); +// else +// txt = "any scale"; QTreeWidgetItem* item = new QTreeWidgetItem( filter_items[filter] ); - item->setText( 0, txt ); + + QString txtLabel = rule.label(); + item->setText( 0, txtLabel ); item->setData( 0, Qt::UserRole + 1, i ); item->setIcon( 0, QgsSymbolLayerV2Utils::symbolPreviewIcon( rule.symbol(), QSize( 16, 16 ) ) ); + // Displaying filter is redundant here, but keeping it allows to keep constant the layout and width of all columns when switching to one of the two other views + item->setText( 1, filter ); + + QBrush brush( QColor( 200, 200, 200, 255 ) ); + item->setBackground( 1, brush ); // Makes table layout slightly more readable when filters are long strings + item->setBackground( 3, brush ); + + if ( rule.dependsOnScale() ) + { + QString txtMinDenomScale = formatScale( rule.scaleMinDenom() ); + QString txtMaxDenomScale = formatScale( rule.scaleMaxDenom() ); + while( txtMinDenomScale.size() < widthMinDenom ){ txtMinDenomScale.insert( 0, " " );} // pad to left with spaces (to fix string-based sorting) + while( txtMaxDenomScale.size() < widthMaxDenom ){ txtMaxDenomScale.insert( 0, " " );} + item->setText( 2, txtMinDenomScale ); + item->setText( 3, txtMaxDenomScale ); + item->setTextAlignment (2, Qt::AlignRight); + item->setTextAlignment (3, Qt::AlignRight); + } + + // Id: add 1 to rule number and convert to string + std::ostringstream ioss; + ioss << i+1; + std::string ruleIdx = ioss.str(); + while( ruleIdx.size() < 4 ){ ruleIdx.insert( 0, " " );} // pad to left with spaces (to fix string-based sorting) + item->setText( 4, QString(ruleIdx.c_str()) );// Insert Id in table TODO: base it on SymbolIdx ? How to access it? + item->setTextAlignment (4, Qt::AlignRight); } - addTopLevelItems( filter_items.values() ); + + addTopLevelItems( filter_items.values() ); + + } diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/gui/symbology-ng/qgsrulebasedrendererv2widget.h /hometb/mk/sig/dev/r14936_patched/qgis//src/gui/symbology-ng/qgsrulebasedrendererv2widget.h --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/gui/symbology-ng/qgsrulebasedrendererv2widget.h 2010-12-23 16:58:49.439443369 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/gui/symbology-ng/qgsrulebasedrendererv2widget.h 2010-12-19 15:17:17.099983660 +0100 @@ -47,6 +47,8 @@ QString formatScaleRange( int minDenom, int maxDenom ); + QString formatScale( int denom ); + QgsRuleBasedRendererV2* mR; Grouping mGrouping; }; diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/ui/qgsrendererrulepropsdialogbase.ui /hometb/mk/sig/dev/r14936_patched/qgis//src/ui/qgsrendererrulepropsdialogbase.ui --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/ui/qgsrendererrulepropsdialogbase.ui 2010-12-23 16:58:55.489268713 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/ui/qgsrendererrulepropsdialogbase.ui 2010-12-18 02:08:46.182228227 +0100 @@ -6,7 +6,7 @@ 0 0 - 545 + 558 298 @@ -22,6 +22,23 @@ + Legend label + + + + + + + + + + + + 0 + + + + Filter @@ -51,6 +68,20 @@ + + + + + + Description + + + + + + + + diff -r -u --new-file '--exclude=.svn' '--exclude=build' '--exclude=cmake*' '--exclude=CMake*' '--exclude=*~' '--exclude=*.orig' '--exclude=*.back' '--exclude=qtcreator-build' '--exclude=astyle' '--exclude=qgsrendererrulepropsdialogbase_v2.ui' /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/ui/qgsrulebasedrendererv2widget.ui /hometb/mk/sig/dev/r14936_patched/qgis//src/ui/qgsrulebasedrendererv2widget.ui --- /hometb/mk/sig/dev/r14936/qgis_trunk_14936//src/ui/qgsrulebasedrendererv2widget.ui 2010-12-23 16:58:55.459269578 +0100 +++ /hometb/mk/sig/dev/r14936_patched/qgis//src/ui/qgsrulebasedrendererv2widget.ui 2010-12-19 23:32:10.703514200 +0100 @@ -6,8 +6,8 @@ 0 0 - 460 - 221 + 554 + 256 @@ -26,13 +26,59 @@ false - + true + + false + + + + Label + + Rule + + + 200 + 200 + 200 + + + + + + Min. scale + + + AlignHCenter|AlignVCenter|AlignCenter + + + + + Max. scale + + + AlignHCenter|AlignVCenter|AlignCenter + + + + 200 + 200 + 200 + + + + + + Id + + + AlignHCenter|AlignVCenter|AlignCenter +