QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
{
  QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories );
  if ( mSourceSymbol )
    r->setSourceSymbol( mSourceSymbol->clone() );
  if ( mSourceColorRamp )
    r->setSourceColorRamp( mSourceColorRamp->clone() );
  r->setUsingSymbolLevels( usingSymbolLevels() );
  r->setRotationField( rotationField() );
  r->setSizeScaleField( sizeScaleField() );
  r->setScaleMethod( scaleMethod() );
  return r;
}
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& element )
{
  QDomElement symbolsElem = element.firstChildElement( "symbols" );
  if ( symbolsElem.isNull() )
    return NULL;

  QDomElement catsElem = element.firstChildElement( "categories" );
  if ( catsElem.isNull() )
    return NULL;

  QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem );
  QgsCategoryList cats;

  QDomElement catElem = catsElem.firstChildElement();
  while ( !catElem.isNull() )
  {
    if ( catElem.tagName() == "category" )
    {
      QVariant value = QVariant( catElem.attribute( "value" ) );
      QString symbolName = catElem.attribute( "symbol" );
      QString label = catElem.attribute( "label" );
      if ( symbolMap.contains( symbolName ) )
      {
        QgsSymbolV2* symbol = symbolMap.take( symbolName );
        cats.append( QgsRendererCategoryV2( value, symbol, label ) );
      }
    }
    catElem = catElem.nextSiblingElement();
  }

  QString attrName = element.attribute( "attr" );

  QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( attrName, cats );

  // delete symbols if there are any more
  QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap );

  // try to load source symbol (optional)
  QDomElement sourceSymbolElem = element.firstChildElement( "source-symbol" );
  if ( !sourceSymbolElem.isNull() )
  {
    QgsSymbolV2Map sourceSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( sourceSymbolElem );
    if ( sourceSymbolMap.contains( "0" ) )
    {
      r->setSourceSymbol( sourceSymbolMap.take( "0" ) );
    }
    QgsSymbolLayerV2Utils::clearSymbolMap( sourceSymbolMap );
  }

  // try to load color ramp (optional)
  QDomElement sourceColorRampElem = element.firstChildElement( "colorramp" );
  if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" )
  {
    r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) );
    QDomElement invertedColorRampElem = element.firstChildElement( "invertedcolorramp" );
    if ( !invertedColorRampElem.isNull() )
      r->setInvertedColorRamp( invertedColorRampElem.attribute( "value" ) == "1" );
  }

  QDomElement rotationElem = element.firstChildElement( "rotation" );
  if ( !rotationElem.isNull() )
    r->setRotationField( rotationElem.attribute( "field" ) );

  QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
  if ( !sizeScaleElem.isNull() )
  {
    r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
    r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
  }

  // TODO: symbol levels
  return r;
}
Example #3
0
void QgsCategorizedSymbolRendererV2Widget::addCategories()
{
    QString attrName = cboCategorizedColumn->currentText();
    int idx = mLayer->fieldNameIndex( attrName );
    QList<QVariant> unique_vals;
    mLayer->uniqueValues( idx, unique_vals );

    //DlgAddCategories dlg(mStyle, createDefaultSymbol(), unique_vals, this);
    //if (!dlg.exec())
    //  return;

    QgsVectorColorRampV2* ramp = cboCategorizedColorRamp->currentColorRamp();

    if ( ramp == NULL )
    {
        if ( cboCategorizedColorRamp->count() == 0 )
            QMessageBox::critical( this, tr( "Error" ), tr( "There are no available color ramps. You can add them in Style Manager." ) );
        else
            QMessageBox::critical( this, tr( "Error" ), tr( "The selected color ramp is not available." ) );
        return;
    }

    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;
        }

        deleteExisting = ( res == QMessageBox::Yes );
    }

    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;
                    break;
                }
            }

            if ( !contains )
                prevCats.append( cats.at( i ) );
        }
        cats = prevCats;
    }

    mOldClassificationAttribute = attrName;

    // TODO: if not all categories are desired, delete some!
    /*
    if (not dlg.readAllCats.isChecked())
    {
      cats2 = {}
      for item in dlg.listCategories.selectedItems():
        for k,c in cats.iteritems():
          if item.text() == k.toString():
            break
        cats2[k] = c
      cats = cats2
    }
    */

    // recreate renderer
    QgsCategorizedSymbolRendererV2 *r = new QgsCategorizedSymbolRendererV2( attrName, cats );
    r->setSourceSymbol( mCategorizedSymbol->clone() );
    r->setSourceColorRamp( ramp->clone() );
    r->setScaleMethod( mRenderer->scaleMethod() );
    r->setSizeScaleField( mRenderer->sizeScaleField() );
    r->setRotationField( mRenderer->rotationField() );
    delete mRenderer;
    mRenderer = r;

    populateCategories();
}