QGIS API Documentation  master-6227475
src/gui/symbology-ng/qgssymbollayerv2widget.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     qgssymbollayerv2widget.cpp - symbol layer widgets
00003 
00004     ---------------------
00005     begin                : November 2009
00006     copyright            : (C) 2009 by Martin Dobias
00007     email                : wonder dot sk at gmail dot com
00008  ***************************************************************************
00009  *                                                                         *
00010  *   This program is free software; you can redistribute it and/or modify  *
00011  *   it under the terms of the GNU General Public License as published by  *
00012  *   the Free Software Foundation; either version 2 of the License, or     *
00013  *   (at your option) any later version.                                   *
00014  *                                                                         *
00015  ***************************************************************************/
00016 
00017 #include "qgssymbollayerv2widget.h"
00018 
00019 #include "qgslinesymbollayerv2.h"
00020 #include "qgsmarkersymbollayerv2.h"
00021 #include "qgsfillsymbollayerv2.h"
00022 
00023 #include "characterwidget.h"
00024 #include "qgsdashspacedialog.h"
00025 #include "qgsdatadefinedsymboldialog.h"
00026 #include "qgssymbolv2selectordialog.h"
00027 #include "qgssvgcache.h"
00028 #include "qgssymbollayerv2utils.h"
00029 
00030 #include "qgsstylev2.h" //for symbol selector dialog
00031 
00032 #include "qgsapplication.h"
00033 
00034 #include "qgslogger.h"
00035 
00036 #include <QAbstractButton>
00037 #include <QColorDialog>
00038 #include <QCursor>
00039 #include <QDir>
00040 #include <QFileDialog>
00041 #include <QPainter>
00042 #include <QSettings>
00043 #include <QStandardItemModel>
00044 #include <QSvgRenderer>
00045 
00046 
00047 
00048 QgsSimpleLineSymbolLayerV2Widget::QgsSimpleLineSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
00049     : QgsSymbolLayerV2Widget( parent, vl )
00050 {
00051   mLayer = NULL;
00052 
00053   setupUi( this );
00054 
00055   connect( spinWidth, SIGNAL( valueChanged( double ) ), this, SLOT( penWidthChanged() ) );
00056   connect( btnChangeColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( colorChanged( const QColor& ) ) );
00057   connect( cboPenStyle, SIGNAL( currentIndexChanged( int ) ), this, SLOT( penStyleChanged() ) );
00058   connect( spinOffset, SIGNAL( valueChanged( double ) ), this, SLOT( offsetChanged() ) );
00059   connect( cboCapStyle, SIGNAL( currentIndexChanged( int ) ), this, SLOT( penStyleChanged() ) );
00060   connect( cboJoinStyle, SIGNAL( currentIndexChanged( int ) ), this, SLOT( penStyleChanged() ) );
00061   updatePatternIcon();
00062 
00063 }
00064 
00065 void QgsSimpleLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
00066 {
00067   if ( !layer || layer->layerType() != "SimpleLine" )
00068     return;
00069 
00070   // layer type is correct, we can do the cast
00071   mLayer = static_cast<QgsSimpleLineSymbolLayerV2*>( layer );
00072 
00073   // set units
00074   mPenWidthUnitComboBox->blockSignals( true );
00075   mPenWidthUnitComboBox->setCurrentIndex( mLayer->widthUnit() );
00076   mPenWidthUnitComboBox->blockSignals( false );
00077   mOffsetUnitComboBox->blockSignals( true );
00078   mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
00079   mOffsetUnitComboBox->blockSignals( false );
00080   mDashPatternUnitComboBox->blockSignals( true );
00081   mDashPatternUnitComboBox->setCurrentIndex( mLayer->customDashPatternUnit() );
00082   mDashPatternUnitComboBox->blockSignals( false );
00083 
00084   // set values
00085   spinWidth->setValue( mLayer->width() );
00086   btnChangeColor->setColor( mLayer->color() );
00087   btnChangeColor->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
00088   spinOffset->setValue( mLayer->offset() );
00089   cboPenStyle->blockSignals( true );
00090   cboJoinStyle->blockSignals( true );
00091   cboCapStyle->blockSignals( true );
00092   cboPenStyle->setPenStyle( mLayer->penStyle() );
00093   cboJoinStyle->setPenJoinStyle( mLayer->penJoinStyle() );
00094   cboCapStyle->setPenCapStyle( mLayer->penCapStyle() );
00095   cboPenStyle->blockSignals( false );
00096   cboJoinStyle->blockSignals( false );
00097   cboCapStyle->blockSignals( false );
00098 
00099   //use a custom dash pattern?
00100   bool useCustomDashPattern = mLayer->useCustomDashPattern();
00101   mChangePatternButton->setEnabled( useCustomDashPattern );
00102   label_3->setEnabled( !useCustomDashPattern );
00103   cboPenStyle->setEnabled( !useCustomDashPattern );
00104   mCustomCheckBox->blockSignals( true );
00105   mCustomCheckBox->setCheckState( useCustomDashPattern ? Qt::Checked : Qt::Unchecked );
00106   mCustomCheckBox->blockSignals( false );
00107   updatePatternIcon();
00108 }
00109 
00110 QgsSymbolLayerV2* QgsSimpleLineSymbolLayerV2Widget::symbolLayer()
00111 {
00112   return mLayer;
00113 }
00114 
00115 void QgsSimpleLineSymbolLayerV2Widget::penWidthChanged()
00116 {
00117   mLayer->setWidth( spinWidth->value() );
00118   updatePatternIcon();
00119   emit changed();
00120 }
00121 
00122 void QgsSimpleLineSymbolLayerV2Widget::colorChanged( const QColor& color )
00123 {
00124   mLayer->setColor( color );
00125   updatePatternIcon();
00126   emit changed();
00127 }
00128 
00129 void QgsSimpleLineSymbolLayerV2Widget::penStyleChanged()
00130 {
00131   mLayer->setPenStyle( cboPenStyle->penStyle() );
00132   mLayer->setPenJoinStyle( cboJoinStyle->penJoinStyle() );
00133   mLayer->setPenCapStyle( cboCapStyle->penCapStyle() );
00134   emit changed();
00135 }
00136 
00137 void QgsSimpleLineSymbolLayerV2Widget::offsetChanged()
00138 {
00139   mLayer->setOffset( spinOffset->value() );
00140   updatePatternIcon();
00141   emit changed();
00142 }
00143 
00144 void QgsSimpleLineSymbolLayerV2Widget::on_mCustomCheckBox_stateChanged( int state )
00145 {
00146   bool checked = ( state == Qt::Checked );
00147   mChangePatternButton->setEnabled( checked );
00148   label_3->setEnabled( !checked );
00149   cboPenStyle->setEnabled( !checked );
00150 
00151   mLayer->setUseCustomDashPattern( checked );
00152   emit changed();
00153 }
00154 
00155 void QgsSimpleLineSymbolLayerV2Widget::on_mChangePatternButton_clicked()
00156 {
00157   QgsDashSpaceDialog d( mLayer->customDashVector() );
00158   if ( d.exec() == QDialog::Accepted )
00159   {
00160     mLayer->setCustomDashVector( d.dashDotVector() );
00161     updatePatternIcon();
00162     emit changed();
00163   }
00164 }
00165 
00166 void QgsSimpleLineSymbolLayerV2Widget::on_mPenWidthUnitComboBox_currentIndexChanged( int index )
00167 {
00168   if ( mLayer )
00169   {
00170     mLayer->setWidthUnit(( QgsSymbolV2::OutputUnit )index );
00171   }
00172 }
00173 
00174 void QgsSimpleLineSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
00175 {
00176   if ( mLayer )
00177   {
00178     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit )index );
00179   }
00180   emit changed();
00181 }
00182 
00183 void QgsSimpleLineSymbolLayerV2Widget::on_mDashPatternUnitComboBox_currentIndexChanged( int index )
00184 {
00185   if ( mLayer )
00186   {
00187     mLayer->setCustomDashPatternUnit(( QgsSymbolV2::OutputUnit )index );
00188   }
00189   emit changed();
00190 }
00191 
00192 void QgsSimpleLineSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
00193 {
00194   if ( !mLayer )
00195   {
00196     return;
00197   }
00198 
00199   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
00200   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color", tr( "Color" ), mLayer->dataDefinedPropertyString( "color" ),
00201       QgsDataDefinedSymbolDialog::colorHelpText() );
00202   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "width", tr( "Pen width" ), mLayer->dataDefinedPropertyString( "width" ),
00203       QgsDataDefinedSymbolDialog::doubleHelpText() );
00204   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "offset", tr( "Offset" ), mLayer->dataDefinedPropertyString( "offset" ),
00205       QgsDataDefinedSymbolDialog::doubleHelpText() );
00206   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "customdash", tr( "Dash pattern" ), mLayer->dataDefinedPropertyString( "customdash" ), "<dash>;<space>" );
00207   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "joinstyle", tr( "Join style" ), mLayer->dataDefinedPropertyString( "joinstyle" ), "'bevel'|'miter'|'round'" );
00208   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "capstyle", tr( "Cap style" ),  mLayer->dataDefinedPropertyString( "capstyle" ), "'square'|'flat'|'round'" );
00209   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
00210 
00211   if ( d.exec() == QDialog::Accepted )
00212   {
00213     //empty all existing properties first
00214     mLayer->removeDataDefinedProperties();
00215 
00216     QMap<QString, QString> properties = d.dataDefinedProperties();
00217     QMap<QString, QString>::const_iterator it = properties.constBegin();
00218     for ( ; it != properties.constEnd(); ++it )
00219     {
00220       if ( !it.value().isEmpty() )
00221       {
00222         mLayer->setDataDefinedProperty( it.key(), it.value() );
00223       }
00224     }
00225     emit changed();
00226   }
00227 }
00228 
00229 void QgsSimpleLineSymbolLayerV2Widget::updatePatternIcon()
00230 {
00231   if ( !mLayer )
00232   {
00233     return;
00234   }
00235   QgsSimpleLineSymbolLayerV2* layerCopy = dynamic_cast<QgsSimpleLineSymbolLayerV2*>( mLayer->clone() );
00236   if ( !layerCopy )
00237   {
00238     return;
00239   }
00240   layerCopy->setUseCustomDashPattern( true );
00241   QIcon buttonIcon = QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( layerCopy, QgsSymbolV2::MM, mChangePatternButton->iconSize() );
00242   mChangePatternButton->setIcon( buttonIcon );
00243   delete layerCopy;
00244 }
00245 
00246 
00248 
00249 
00250 QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
00251     : QgsSymbolLayerV2Widget( parent, vl )
00252 {
00253   mLayer = NULL;
00254 
00255   setupUi( this );
00256 
00257   QSize size = lstNames->iconSize();
00258   QStringList names;
00259   names << "circle" << "rectangle" << "diamond" << "pentagon" << "cross" << "cross2" << "triangle"
00260   << "equilateral_triangle" << "star" << "regular_star" << "arrow" << "line" << "arrowhead" << "filled_arrowhead";
00261   double markerSize = DEFAULT_POINT_SIZE * 2;
00262   for ( int i = 0; i < names.count(); ++i )
00263   {
00264     QgsSimpleMarkerSymbolLayerV2* lyr = new QgsSimpleMarkerSymbolLayerV2( names[i], QColor( 200, 200, 200 ), QColor( 0, 0, 0 ), markerSize );
00265     QIcon icon = QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( lyr, QgsSymbolV2::MM, size );
00266     QListWidgetItem* item = new QListWidgetItem( icon, QString(), lstNames );
00267     item->setData( Qt::UserRole, names[i] );
00268     delete lyr;
00269   }
00270 
00271   connect( lstNames, SIGNAL( currentRowChanged( int ) ), this, SLOT( setName() ) );
00272   connect( btnChangeColorBorder, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColorBorder( const QColor& ) ) );
00273   connect( btnChangeColorFill, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColorFill( const QColor& ) ) );
00274   connect( spinSize, SIGNAL( valueChanged( double ) ), this, SLOT( setSize() ) );
00275   connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle() ) );
00276   connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
00277   connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
00278 }
00279 
00280 void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
00281 {
00282   if ( layer->layerType() != "SimpleMarker" )
00283     return;
00284 
00285   // layer type is correct, we can do the cast
00286   mLayer = static_cast<QgsSimpleMarkerSymbolLayerV2*>( layer );
00287 
00288   // set values
00289   QString name = mLayer->name();
00290   for ( int i = 0; i < lstNames->count(); ++i )
00291   {
00292     if ( lstNames->item( i )->data( Qt::UserRole ).toString() == name )
00293     {
00294       lstNames->setCurrentRow( i );
00295       break;
00296     }
00297   }
00298   btnChangeColorBorder->setColor( mLayer->borderColor() );
00299   btnChangeColorBorder->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
00300   btnChangeColorFill->setColor( mLayer->color() );
00301   btnChangeColorFill->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
00302   spinSize->setValue( mLayer->size() );
00303   spinAngle->setValue( mLayer->angle() );
00304   mOutlineWidthSpinBox->setValue( mLayer->outlineWidth() );
00305 
00306   // without blocking signals the value gets changed because of slot setOffset()
00307   spinOffsetX->blockSignals( true );
00308   spinOffsetX->setValue( mLayer->offset().x() );
00309   spinOffsetX->blockSignals( false );
00310   spinOffsetY->blockSignals( true );
00311   spinOffsetY->setValue( mLayer->offset().y() );
00312   spinOffsetY->blockSignals( false );
00313 
00314   mSizeUnitComboBox->blockSignals( true );
00315   mSizeUnitComboBox->setCurrentIndex( mLayer->sizeUnit() );
00316   mSizeUnitComboBox->blockSignals( false );
00317   mOffsetUnitComboBox->blockSignals( true );
00318   mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
00319   mOffsetUnitComboBox->blockSignals( false );
00320   mOutlineWidthUnitComboBox->blockSignals( true );
00321   mOutlineWidthUnitComboBox->setCurrentIndex( mLayer->outlineWidthUnit() );
00322   mOutlineWidthUnitComboBox->blockSignals( false );
00323 }
00324 
00325 QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2Widget::symbolLayer()
00326 {
00327   return mLayer;
00328 }
00329 
00330 void QgsSimpleMarkerSymbolLayerV2Widget::setName()
00331 {
00332   mLayer->setName( lstNames->currentItem()->data( Qt::UserRole ).toString() );
00333   emit changed();
00334 }
00335 
00336 void QgsSimpleMarkerSymbolLayerV2Widget::setColorBorder( const QColor& color )
00337 {
00338   mLayer->setBorderColor( color );
00339   emit changed();
00340 }
00341 
00342 void QgsSimpleMarkerSymbolLayerV2Widget::setColorFill( const QColor& color )
00343 {
00344   mLayer->setColor( color );
00345   emit changed();
00346 }
00347 
00348 void QgsSimpleMarkerSymbolLayerV2Widget::setSize()
00349 {
00350   mLayer->setSize( spinSize->value() );
00351   emit changed();
00352 }
00353 
00354 void QgsSimpleMarkerSymbolLayerV2Widget::setAngle()
00355 {
00356   mLayer->setAngle( spinAngle->value() );
00357   emit changed();
00358 }
00359 
00360 void QgsSimpleMarkerSymbolLayerV2Widget::setOffset()
00361 {
00362   mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
00363   emit changed();
00364 }
00365 
00366 void QgsSimpleMarkerSymbolLayerV2Widget::on_mOutlineWidthSpinBox_valueChanged( double d )
00367 {
00368   if ( mLayer )
00369   {
00370     mLayer->setOutlineWidth( d );
00371     emit changed();
00372   }
00373 }
00374 
00375 void QgsSimpleMarkerSymbolLayerV2Widget::on_mSizeUnitComboBox_currentIndexChanged( int index )
00376 {
00377   if ( mLayer )
00378   {
00379     mLayer->setSizeUnit(( QgsSymbolV2::OutputUnit ) index );
00380     emit changed();
00381   }
00382 }
00383 
00384 void QgsSimpleMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
00385 {
00386   if ( mLayer )
00387   {
00388     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
00389     emit changed();
00390   }
00391 }
00392 
00393 void QgsSimpleMarkerSymbolLayerV2Widget::on_mOutlineWidthUnitComboBox_currentIndexChanged( int index )
00394 {
00395   if ( mLayer )
00396   {
00397     mLayer->setOutlineWidthUnit(( QgsSymbolV2::OutputUnit ) index );
00398     emit changed();
00399   }
00400 }
00401 
00402 void QgsSimpleMarkerSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
00403 {
00404   if ( !mLayer )
00405   {
00406     return;
00407   }
00408 
00409   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
00410   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "name", tr( "Name" ), mLayer->dataDefinedPropertyString( "name" ),
00411       "'square'|'rectangle'|'diamond'|'pentagon'\n|'triangle'|'equilateral_triangle'|'star'\n|'regular_star'|'arrow'|'filled_arrowhead'|'circle'\n|'cross'|'x'|'cross2'|'line'|'arrowhead'" );
00412   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color", tr( "Fill color" ), mLayer->dataDefinedPropertyString( "color" ),
00413       QgsDataDefinedSymbolDialog::colorHelpText() );
00414   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color_border", tr( "Border color" ), mLayer->dataDefinedPropertyString( "color_border" ),
00415       QgsDataDefinedSymbolDialog::colorHelpText() );
00416   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "outline_width", tr( "Outline width" ), mLayer->dataDefinedPropertyString( "outline_width" ),
00417       QgsDataDefinedSymbolDialog::doubleHelpText() );
00418   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "size", tr( "Size" ), mLayer->dataDefinedPropertyString( "size" ),
00419       QgsDataDefinedSymbolDialog::doubleHelpText() );
00420   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "angle", tr( "Angle" ), mLayer->dataDefinedPropertyString( "angle" ),
00421       QgsDataDefinedSymbolDialog::doubleHelpText() );
00422   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "offset", tr( "Offset" ), mLayer->dataDefinedPropertyString( "offset" ),
00423       QgsDataDefinedSymbolDialog::offsetHelpText() );
00424   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
00425   if ( d.exec() == QDialog::Accepted )
00426   {
00427     //empty all existing properties first
00428     mLayer->removeDataDefinedProperties();
00429 
00430     QMap<QString, QString> properties = d.dataDefinedProperties();
00431     QMap<QString, QString>::const_iterator it = properties.constBegin();
00432     for ( ; it != properties.constEnd(); ++it )
00433     {
00434       if ( !it.value().isEmpty() )
00435       {
00436         mLayer->setDataDefinedProperty( it.key(), it.value() );
00437       }
00438     }
00439     emit changed();
00440   }
00441 }
00442 
00443 
00445 
00446 QgsSimpleFillSymbolLayerV2Widget::QgsSimpleFillSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
00447     : QgsSymbolLayerV2Widget( parent, vl )
00448 {
00449   mLayer = NULL;
00450 
00451   setupUi( this );
00452 
00453   connect( btnChangeColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColor( const QColor& ) ) );
00454   connect( cboFillStyle, SIGNAL( currentIndexChanged( int ) ), this, SLOT( setBrushStyle() ) );
00455   connect( btnChangeBorderColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setBorderColor( const QColor& ) ) );
00456   connect( spinBorderWidth, SIGNAL( valueChanged( double ) ), this, SLOT( borderWidthChanged() ) );
00457   connect( cboBorderStyle, SIGNAL( currentIndexChanged( int ) ), this, SLOT( borderStyleChanged() ) );
00458   connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( offsetChanged() ) );
00459   connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( offsetChanged() ) );
00460 }
00461 
00462 void QgsSimpleFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
00463 {
00464   if ( layer->layerType() != "SimpleFill" )
00465     return;
00466 
00467   // layer type is correct, we can do the cast
00468   mLayer = static_cast<QgsSimpleFillSymbolLayerV2*>( layer );
00469 
00470   // set values
00471   btnChangeColor->setColor( mLayer->color() );
00472   btnChangeColor->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
00473   cboFillStyle->setBrushStyle( mLayer->brushStyle() );
00474   btnChangeBorderColor->setColor( mLayer->borderColor() );
00475   btnChangeBorderColor->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
00476   cboBorderStyle->setPenStyle( mLayer->borderStyle() );
00477   spinBorderWidth->setValue( mLayer->borderWidth() );
00478   spinOffsetX->blockSignals( true );
00479   spinOffsetX->setValue( mLayer->offset().x() );
00480   spinOffsetX->blockSignals( false );
00481   spinOffsetY->blockSignals( true );
00482   spinOffsetY->setValue( mLayer->offset().y() );
00483   spinOffsetY->blockSignals( false );
00484 
00485   mBorderWidthUnitComboBox->blockSignals( true );
00486   mBorderWidthUnitComboBox->setCurrentIndex( mLayer->borderWidthUnit() );
00487   mBorderWidthUnitComboBox->blockSignals( false );
00488   mOffsetUnitComboBox->blockSignals( true );
00489   mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
00490   mOffsetUnitComboBox->blockSignals( false );
00491 }
00492 
00493 QgsSymbolLayerV2* QgsSimpleFillSymbolLayerV2Widget::symbolLayer()
00494 {
00495   return mLayer;
00496 }
00497 
00498 void QgsSimpleFillSymbolLayerV2Widget::setColor( const QColor& color )
00499 {
00500   mLayer->setColor( color );
00501   emit changed();
00502 }
00503 
00504 void QgsSimpleFillSymbolLayerV2Widget::setBorderColor( const QColor& color )
00505 {
00506   mLayer->setBorderColor( color );
00507   emit changed();
00508 }
00509 
00510 void QgsSimpleFillSymbolLayerV2Widget::setBrushStyle()
00511 {
00512   mLayer->setBrushStyle( cboFillStyle->brushStyle() );
00513   emit changed();
00514 }
00515 
00516 void QgsSimpleFillSymbolLayerV2Widget::borderWidthChanged()
00517 {
00518   mLayer->setBorderWidth( spinBorderWidth->value() );
00519   emit changed();
00520 }
00521 
00522 void QgsSimpleFillSymbolLayerV2Widget::borderStyleChanged()
00523 {
00524   mLayer->setBorderStyle( cboBorderStyle->penStyle() );
00525   emit changed();
00526 }
00527 
00528 void QgsSimpleFillSymbolLayerV2Widget::offsetChanged()
00529 {
00530   mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
00531   emit changed();
00532 }
00533 
00534 void QgsSimpleFillSymbolLayerV2Widget::on_mBorderWidthUnitComboBox_currentIndexChanged( int index )
00535 {
00536   if ( mLayer )
00537   {
00538     mLayer->setBorderWidthUnit(( QgsSymbolV2::OutputUnit ) index );
00539     emit changed();
00540   }
00541 }
00542 
00543 void QgsSimpleFillSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
00544 {
00545   if ( mLayer )
00546   {
00547     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
00548     emit changed();
00549   }
00550 }
00551 
00552 void QgsSimpleFillSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
00553 {
00554   if ( !mLayer )
00555   {
00556     return;
00557   }
00558 
00559   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
00560   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color", tr( "Color" ), mLayer->dataDefinedPropertyString( "color" ), QgsDataDefinedSymbolDialog::colorHelpText() );
00561   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color_border", tr( "Border color" ), mLayer->dataDefinedPropertyString( "color_border" ),
00562       QgsDataDefinedSymbolDialog::colorHelpText() );
00563   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "width_border", tr( "Border width" ), mLayer->dataDefinedPropertyString( "width_border" ),
00564       QgsDataDefinedSymbolDialog::doubleHelpText() );
00565   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
00566   if ( d.exec() == QDialog::Accepted )
00567   {
00568     //empty all existing properties first
00569     mLayer->removeDataDefinedProperties();
00570 
00571     QMap<QString, QString> properties = d.dataDefinedProperties();
00572     QMap<QString, QString>::const_iterator it = properties.constBegin();
00573     for ( ; it != properties.constEnd(); ++it )
00574     {
00575       if ( !it.value().isEmpty() )
00576       {
00577         mLayer->setDataDefinedProperty( it.key(), it.value() );
00578       }
00579     }
00580     emit changed();
00581   }
00582 }
00583 
00585 
00586 QgsMarkerLineSymbolLayerV2Widget::QgsMarkerLineSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
00587     : QgsSymbolLayerV2Widget( parent, vl )
00588 {
00589   mLayer = NULL;
00590 
00591   setupUi( this );
00592 
00593   connect( spinInterval, SIGNAL( valueChanged( double ) ), this, SLOT( setInterval( double ) ) );
00594   connect( chkRotateMarker, SIGNAL( clicked() ), this, SLOT( setRotate() ) );
00595   connect( spinOffset, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
00596   connect( radInterval, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
00597   connect( radVertex, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
00598   connect( radVertexLast, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
00599   connect( radVertexFirst, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
00600   connect( radCentralPoint, SIGNAL( clicked() ), this, SLOT( setPlacement() ) );
00601 }
00602 
00603 void QgsMarkerLineSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
00604 {
00605   if ( layer->layerType() != "MarkerLine" )
00606     return;
00607 
00608   // layer type is correct, we can do the cast
00609   mLayer = static_cast<QgsMarkerLineSymbolLayerV2*>( layer );
00610 
00611   // set values
00612   spinInterval->setValue( mLayer->interval() );
00613   chkRotateMarker->setChecked( mLayer->rotateMarker() );
00614   spinOffset->setValue( mLayer->offset() );
00615   if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Interval )
00616     radInterval->setChecked( true );
00617   else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::Vertex )
00618     radVertex->setChecked( true );
00619   else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::LastVertex )
00620     radVertexLast->setChecked( true );
00621   else if ( mLayer->placement() == QgsMarkerLineSymbolLayerV2::CentralPoint )
00622     radCentralPoint->setChecked( true );
00623   else
00624     radVertexFirst->setChecked( true );
00625 
00626   // set units
00627   mIntervalUnitComboBox->blockSignals( true );
00628   mIntervalUnitComboBox->setCurrentIndex( mLayer->intervalUnit() );
00629   mIntervalUnitComboBox->blockSignals( false );
00630   mOffsetUnitComboBox->blockSignals( true );
00631   mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
00632   mOffsetUnitComboBox->blockSignals( false );
00633 
00634   setPlacement(); // update gui
00635 }
00636 
00637 QgsSymbolLayerV2* QgsMarkerLineSymbolLayerV2Widget::symbolLayer()
00638 {
00639   return mLayer;
00640 }
00641 
00642 void QgsMarkerLineSymbolLayerV2Widget::setInterval( double val )
00643 {
00644   mLayer->setInterval( val );
00645   emit changed();
00646 }
00647 
00648 void QgsMarkerLineSymbolLayerV2Widget::setRotate()
00649 {
00650   mLayer->setRotateMarker( chkRotateMarker->isChecked() );
00651   emit changed();
00652 }
00653 
00654 void QgsMarkerLineSymbolLayerV2Widget::setOffset()
00655 {
00656   mLayer->setOffset( spinOffset->value() );
00657   emit changed();
00658 }
00659 
00660 void QgsMarkerLineSymbolLayerV2Widget::setPlacement()
00661 {
00662   bool interval = radInterval->isChecked();
00663   spinInterval->setEnabled( interval );
00664   //mLayer->setPlacement( interval ? QgsMarkerLineSymbolLayerV2::Interval : QgsMarkerLineSymbolLayerV2::Vertex );
00665   if ( radInterval->isChecked() )
00666     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Interval );
00667   else if ( radVertex->isChecked() )
00668     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::Vertex );
00669   else if ( radVertexLast->isChecked() )
00670     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::LastVertex );
00671   else if ( radVertexFirst->isChecked() )
00672     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::FirstVertex );
00673   else
00674     mLayer->setPlacement( QgsMarkerLineSymbolLayerV2::CentralPoint );
00675 
00676   emit changed();
00677 }
00678 
00679 void QgsMarkerLineSymbolLayerV2Widget::on_mIntervalUnitComboBox_currentIndexChanged( int index )
00680 {
00681   if ( mLayer )
00682   {
00683     mLayer->setIntervalUnit(( QgsSymbolV2::OutputUnit ) index );
00684   }
00685   emit changed();
00686 }
00687 
00688 void QgsMarkerLineSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
00689 {
00690   if ( mLayer )
00691   {
00692     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
00693   }
00694   emit changed();
00695 }
00696 
00697 void QgsMarkerLineSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
00698 {
00699   if ( !mLayer )
00700   {
00701     return;
00702   }
00703 
00704   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
00705   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "interval", tr( "Interval" ), mLayer->dataDefinedPropertyString( "interval" ),
00706       QgsDataDefinedSymbolDialog::doubleHelpText() );
00707   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "offset", tr( "Line offset" ), mLayer->dataDefinedPropertyString( "offset" ),
00708       QgsDataDefinedSymbolDialog::doubleHelpText() );
00709   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "placement", tr( "Placement" ), mLayer->dataDefinedPropertyString( "placement" ),
00710       tr( "'vertex'|'lastvertex'|'firstvertex'|'centerpoint'" ) );
00711   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
00712   if ( d.exec() == QDialog::Accepted )
00713   {
00714     //empty all existing properties first
00715     mLayer->removeDataDefinedProperties();
00716 
00717     QMap<QString, QString> properties = d.dataDefinedProperties();
00718     QMap<QString, QString>::const_iterator it = properties.constBegin();
00719     for ( ; it != properties.constEnd(); ++it )
00720     {
00721       if ( !it.value().isEmpty() )
00722       {
00723         mLayer->setDataDefinedProperty( it.key(), it.value() );
00724       }
00725     }
00726     emit changed();
00727   }
00728 }
00729 
00731 
00732 
00733 QgsSvgMarkerSymbolLayerV2Widget::QgsSvgMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
00734     : QgsSymbolLayerV2Widget( parent, vl )
00735 {
00736   mLayer = NULL;
00737 
00738   setupUi( this );
00739   viewGroups->setHeaderHidden( true );
00740 
00741   populateList();
00742 
00743   connect( viewImages->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( setName( const QModelIndex& ) ) );
00744   connect( viewGroups->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( populateIcons( const QModelIndex& ) ) );
00745   connect( spinSize, SIGNAL( valueChanged( double ) ), this, SLOT( setSize() ) );
00746   connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle() ) );
00747   connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
00748   connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
00749 }
00750 
00751 #include <QTime>
00752 #include <QAbstractListModel>
00753 #include <QPixmapCache>
00754 #include <QStyle>
00755 
00756 class QgsSvgListModel : public QAbstractListModel
00757 {
00758   public:
00759     QgsSvgListModel( QObject* parent ) : QAbstractListModel( parent )
00760     {
00761       mSvgFiles = QgsSymbolLayerV2Utils::listSvgFiles();
00762     }
00763 
00764     // Constructor to create model for icons in a specific path
00765     QgsSvgListModel( QObject* parent, QString path ) : QAbstractListModel( parent )
00766     {
00767       mSvgFiles = QgsSymbolLayerV2Utils::listSvgFilesAt( path );
00768     }
00769 
00770     int rowCount( const QModelIndex & parent = QModelIndex() ) const
00771     {
00772       Q_UNUSED( parent );
00773       return mSvgFiles.count();
00774     }
00775 
00776     QVariant data( const QModelIndex & index, int role = Qt::DisplayRole ) const
00777     {
00778       QString entry = mSvgFiles.at( index.row() );
00779 
00780       if ( role == Qt::DecorationRole ) // icon
00781       {
00782         QPixmap pixmap;
00783         if ( !QPixmapCache::find( entry, pixmap ) )
00784         {
00785           // render SVG file
00786           QColor fill, outline;
00787           double outlineWidth;
00788           bool fillParam, outlineParam, outlineWidthParam;
00789           QgsSvgCache::instance()->containsParams( entry, fillParam, fill, outlineParam, outline, outlineWidthParam, outlineWidth );
00790 
00791           bool fitsInCache; // should always fit in cache at these sizes (i.e. under 559 px ^ 2, or half cache size)
00792           const QImage& img = QgsSvgCache::instance()->svgAsImage( entry, 30.0, fill, outline, outlineWidth, 3.5 /*appr. 88 dpi*/, 1.0, fitsInCache );
00793           pixmap = QPixmap::fromImage( img );
00794           QPixmapCache::insert( entry, pixmap );
00795         }
00796 
00797         return pixmap;
00798       }
00799       else if ( role == Qt::UserRole || role == Qt::ToolTipRole )
00800       {
00801         return entry;
00802       }
00803 
00804       return QVariant();
00805     }
00806 
00807   protected:
00808     QStringList mSvgFiles;
00809 };
00810 
00811 class QgsSvgGroupsModel : public QStandardItemModel
00812 {
00813   public:
00814     QgsSvgGroupsModel( QObject* parent ) : QStandardItemModel( parent )
00815     {
00816       QStringList svgPaths = QgsApplication::svgPaths();
00817       QStandardItem *parentItem = invisibleRootItem();
00818 
00819       for ( int i = 0; i < svgPaths.size(); i++ )
00820       {
00821         QDir dir( svgPaths[i] );
00822         QStandardItem *baseGroup;
00823 
00824         if ( dir.path().contains( QgsApplication::pkgDataPath() ) )
00825         {
00826           baseGroup = new QStandardItem( QString( "App Symbols" ) );
00827         }
00828         else if ( dir.path().contains( QgsApplication::qgisSettingsDirPath() ) )
00829         {
00830           baseGroup = new QStandardItem( QString( "User Symbols" ) );
00831         }
00832         else
00833         {
00834           baseGroup = new QStandardItem( dir.dirName() );
00835         }
00836         baseGroup->setData( QVariant( svgPaths[i] ) );
00837         baseGroup->setEditable( false );
00838         baseGroup->setCheckable( false );
00839         baseGroup->setIcon( QgsApplication::style()->standardIcon( QStyle::SP_DirIcon ) );
00840         baseGroup->setToolTip( dir.path() );
00841         parentItem->appendRow( baseGroup );
00842         createTree( baseGroup );
00843         QgsDebugMsg( QString( "SVG base path %1: %2" ).arg( i ).arg( baseGroup->data().toString() ) );
00844       }
00845     }
00846   private:
00847     void createTree( QStandardItem* &parentGroup )
00848     {
00849       QDir parentDir( parentGroup->data().toString() );
00850       foreach ( QString item, parentDir.entryList( QDir::Dirs | QDir::NoDotAndDotDot ) )
00851       {
00852         QStandardItem* group = new QStandardItem( item );
00853         group->setData( QVariant( parentDir.path() + "/" + item ) );
00854         group->setEditable( false );
00855         group->setCheckable( false );
00856         group->setToolTip( parentDir.path() + "/" + item );
00857         group->setIcon( QgsApplication::style()->standardIcon( QStyle::SP_DirIcon ) );
00858         parentGroup->appendRow( group );
00859         createTree( group );
00860       }
00861     }
00862 };
00863 
00864 void QgsSvgMarkerSymbolLayerV2Widget::populateList()
00865 {
00866   QgsSvgGroupsModel* g = new QgsSvgGroupsModel( viewGroups );
00867   viewGroups->setModel( g );
00868   // Set the tree expanded at the first level
00869   int rows = g->rowCount( g->indexFromItem( g->invisibleRootItem() ) );
00870   for ( int i = 0; i < rows; i++ )
00871   {
00872     viewGroups->setExpanded( g->indexFromItem( g->item( i ) ), true );
00873   }
00874 
00875   // Initally load the icons in the List view without any grouping
00876   QgsSvgListModel* m = new QgsSvgListModel( viewImages );
00877   viewImages->setModel( m );
00878 }
00879 
00880 void QgsSvgMarkerSymbolLayerV2Widget::populateIcons( const QModelIndex& idx )
00881 {
00882   QString path = idx.data( Qt::UserRole + 1 ).toString();
00883 
00884   QgsSvgListModel* m = new QgsSvgListModel( viewImages, path );
00885   viewImages->setModel( m );
00886 
00887   connect( viewImages->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( setName( const QModelIndex& ) ) );
00888   emit changed();
00889 }
00890 
00891 void QgsSvgMarkerSymbolLayerV2Widget::setGuiForSvg( const QgsSvgMarkerSymbolLayerV2* layer )
00892 {
00893   if ( !layer )
00894   {
00895     return;
00896   }
00897 
00898   //activate gui for svg parameters only if supported by the svg file
00899   bool hasFillParam, hasOutlineParam, hasOutlineWidthParam;
00900   QColor defaultFill, defaultOutline;
00901   double defaultOutlineWidth;
00902   QgsSvgCache::instance()->containsParams( layer->path(), hasFillParam, defaultFill, hasOutlineParam, defaultOutline, hasOutlineWidthParam, defaultOutlineWidth );
00903   mChangeColorButton->setEnabled( hasFillParam );
00904   mChangeBorderColorButton->setEnabled( hasOutlineParam );
00905   mBorderWidthSpinBox->setEnabled( hasOutlineWidthParam );
00906 
00907   if ( hasFillParam )
00908     mChangeColorButton->setColor( defaultFill );
00909   if ( hasOutlineParam )
00910     mChangeBorderColorButton->setColor( defaultOutline );
00911 
00912   mFileLineEdit->blockSignals( true );
00913   mFileLineEdit->setText( layer->path() );
00914   mFileLineEdit->blockSignals( false );
00915 
00916   mBorderWidthSpinBox->blockSignals( true );
00917   mBorderWidthSpinBox->setValue( layer->outlineWidth() );
00918   mBorderWidthSpinBox->blockSignals( false );
00919 }
00920 
00921 
00922 void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
00923 {
00924   if ( !layer )
00925   {
00926     return;
00927   }
00928 
00929   if ( layer->layerType() != "SvgMarker" )
00930     return;
00931 
00932   // layer type is correct, we can do the cast
00933   mLayer = static_cast<QgsSvgMarkerSymbolLayerV2*>( layer );
00934 
00935   // set values
00936 
00937   QAbstractItemModel* m = viewImages->model();
00938   QItemSelectionModel* selModel = viewImages->selectionModel();
00939   for ( int i = 0; i < m->rowCount(); i++ )
00940   {
00941     QModelIndex idx( m->index( i, 0 ) );
00942     if ( m->data( idx ).toString() == mLayer->path() )
00943     {
00944       selModel->select( idx, QItemSelectionModel::SelectCurrent );
00945       selModel->setCurrentIndex( idx, QItemSelectionModel::SelectCurrent );
00946       setName( idx );
00947       break;
00948     }
00949   }
00950 
00951   spinSize->setValue( mLayer->size() );
00952   spinAngle->setValue( mLayer->angle() );
00953 
00954   // without blocking signals the value gets changed because of slot setOffset()
00955   spinOffsetX->blockSignals( true );
00956   spinOffsetX->setValue( mLayer->offset().x() );
00957   spinOffsetX->blockSignals( false );
00958   spinOffsetY->blockSignals( true );
00959   spinOffsetY->setValue( mLayer->offset().y() );
00960   spinOffsetY->blockSignals( false );
00961 
00962   mSizeUnitComboBox->blockSignals( true );
00963   mSizeUnitComboBox->setCurrentIndex( mLayer->sizeUnit() );
00964   mSizeUnitComboBox->blockSignals( false );
00965   mBorderWidthUnitComboBox->blockSignals( true );
00966   mBorderWidthUnitComboBox->setCurrentIndex( mLayer->outlineWidthUnit() );
00967   mBorderWidthUnitComboBox->blockSignals( false );
00968   mOffsetUnitComboBox->blockSignals( true );
00969   mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
00970   mOffsetUnitComboBox->blockSignals( false );
00971   setGuiForSvg( mLayer );
00972 }
00973 
00974 QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2Widget::symbolLayer()
00975 {
00976   return mLayer;
00977 }
00978 
00979 void QgsSvgMarkerSymbolLayerV2Widget::setName( const QModelIndex& idx )
00980 {
00981   QString name = idx.data( Qt::UserRole ).toString();
00982   mLayer->setPath( name );
00983   mFileLineEdit->setText( name );
00984 
00985   setGuiForSvg( mLayer );
00986   emit changed();
00987 }
00988 
00989 void QgsSvgMarkerSymbolLayerV2Widget::setSize()
00990 {
00991   mLayer->setSize( spinSize->value() );
00992   emit changed();
00993 }
00994 
00995 void QgsSvgMarkerSymbolLayerV2Widget::setAngle()
00996 {
00997   mLayer->setAngle( spinAngle->value() );
00998   emit changed();
00999 }
01000 
01001 void QgsSvgMarkerSymbolLayerV2Widget::setOffset()
01002 {
01003   mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
01004   emit changed();
01005 }
01006 
01007 void QgsSvgMarkerSymbolLayerV2Widget::on_mFileToolButton_clicked()
01008 {
01009   QSettings s;
01010   QString file = QFileDialog::getOpenFileName( 0,
01011                  tr( "Select SVG file" ),
01012                  s.value( "/UI/lastSVGMarkerDir" ).toString(),
01013                  tr( "SVG files" ) + " (*.svg)" );
01014   QFileInfo fi( file );
01015   if ( file.isEmpty() || !fi.exists() )
01016   {
01017     return;
01018   }
01019   mFileLineEdit->setText( file );
01020   mLayer->setPath( file );
01021   s.setValue( "/UI/lastSVGMarkerDir", fi.absolutePath() );
01022   emit changed();
01023 }
01024 
01025 void QgsSvgMarkerSymbolLayerV2Widget::on_mFileLineEdit_textEdited( const QString& text )
01026 {
01027   if ( !QFileInfo( text ).exists() )
01028   {
01029     return;
01030   }
01031   mLayer->setPath( text );
01032   setGuiForSvg( mLayer );
01033   emit changed();
01034 }
01035 
01036 void QgsSvgMarkerSymbolLayerV2Widget::on_mFileLineEdit_editingFinished()
01037 {
01038   if ( !QFileInfo( mFileLineEdit->text() ).exists() )
01039   {
01040     QUrl url( mFileLineEdit->text() );
01041     if ( !url.isValid() )
01042     {
01043       return;
01044     }
01045   }
01046 
01047   QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
01048   mLayer->setPath( mFileLineEdit->text() );
01049   QApplication::restoreOverrideCursor();
01050 
01051   setGuiForSvg( mLayer );
01052   emit changed();
01053 }
01054 
01055 void QgsSvgMarkerSymbolLayerV2Widget::on_mChangeColorButton_colorChanged( const QColor& color )
01056 {
01057   if ( !mLayer )
01058   {
01059     return;
01060   }
01061 
01062   mLayer->setFillColor( color );
01063   emit changed();
01064 }
01065 
01066 void QgsSvgMarkerSymbolLayerV2Widget::on_mChangeBorderColorButton_colorChanged( const QColor& color )
01067 {
01068   if ( !mLayer )
01069   {
01070     return;
01071   }
01072 
01073   mLayer->setOutlineColor( color );
01074   emit changed();
01075 }
01076 
01077 void QgsSvgMarkerSymbolLayerV2Widget::on_mBorderWidthSpinBox_valueChanged( double d )
01078 {
01079   if ( mLayer )
01080   {
01081     mLayer->setOutlineWidth( d );
01082     emit changed();
01083   }
01084 }
01085 
01086 void QgsSvgMarkerSymbolLayerV2Widget::on_mSizeUnitComboBox_currentIndexChanged( int index )
01087 {
01088   if ( mLayer )
01089   {
01090     mLayer->setSizeUnit(( QgsSymbolV2::OutputUnit ) index );
01091   }
01092   emit changed();
01093 }
01094 
01095 void QgsSvgMarkerSymbolLayerV2Widget::on_mBorderWidthUnitComboBox_currentIndexChanged( int index )
01096 {
01097   if ( mLayer )
01098   {
01099     mLayer->setOutlineWidthUnit(( QgsSymbolV2::OutputUnit ) index );
01100   }
01101   emit changed();
01102 }
01103 
01104 void QgsSvgMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
01105 {
01106   if ( mLayer )
01107   {
01108     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
01109   }
01110   emit changed();
01111 }
01112 
01113 void QgsSvgMarkerSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
01114 {
01115   if ( !mLayer )
01116   {
01117     return;
01118   }
01119 
01120   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
01121   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "size", tr( "Size" ), mLayer->dataDefinedPropertyString( "size" ),
01122       QgsDataDefinedSymbolDialog::doubleHelpText() );
01123   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "outline-width", tr( "Border width" ), mLayer->dataDefinedPropertyString( "outline-width" ),
01124       QgsDataDefinedSymbolDialog::doubleHelpText() );
01125   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "angle", tr( "Angle" ), mLayer->dataDefinedPropertyString( "angle" ),
01126       QgsDataDefinedSymbolDialog::doubleHelpText() );
01127   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "offset", tr( "Offset" ), mLayer->dataDefinedPropertyString( "offset" ),
01128       QgsDataDefinedSymbolDialog::offsetHelpText() );
01129   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "name", tr( "SVG file" ), mLayer->dataDefinedPropertyString( "name" ),
01130       QgsDataDefinedSymbolDialog::fileNameHelpText() );
01131   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "fill", tr( "Color" ), mLayer->dataDefinedPropertyString( "fill" ),
01132       QgsDataDefinedSymbolDialog::colorHelpText() );
01133   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "outline", tr( "Border color" ), mLayer->dataDefinedPropertyString( "outline" ),
01134       QgsDataDefinedSymbolDialog::colorHelpText() );
01135   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
01136   if ( d.exec() == QDialog::Accepted )
01137   {
01138     //empty all existing properties first
01139     mLayer->removeDataDefinedProperties();
01140 
01141     QMap<QString, QString> properties = d.dataDefinedProperties();
01142     QMap<QString, QString>::const_iterator it = properties.constBegin();
01143     for ( ; it != properties.constEnd(); ++it )
01144     {
01145       if ( !it.value().isEmpty() )
01146       {
01147         mLayer->setDataDefinedProperty( it.key(), it.value() );
01148       }
01149     }
01150     emit changed();
01151   }
01152 }
01153 
01155 
01156 QgsLineDecorationSymbolLayerV2Widget::QgsLineDecorationSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
01157     : QgsSymbolLayerV2Widget( parent, vl )
01158 {
01159   mLayer = NULL;
01160 
01161   setupUi( this );
01162 
01163   connect( btnChangeColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( colorChanged( const QColor& ) ) );
01164   connect( spinWidth, SIGNAL( valueChanged( double ) ), this, SLOT( penWidthChanged() ) );
01165 }
01166 
01167 void QgsLineDecorationSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
01168 {
01169   if ( layer->layerType() != "LineDecoration" )
01170     return;
01171 
01172   // layer type is correct, we can do the cast
01173   mLayer = static_cast<QgsLineDecorationSymbolLayerV2*>( layer );
01174 
01175   // set values
01176   btnChangeColor->setColor( mLayer->color() );
01177   btnChangeColor->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
01178   spinWidth->setValue( mLayer->width() );
01179 
01180   mWidthUnitComboBox->blockSignals( true );
01181   mWidthUnitComboBox->setCurrentIndex( mLayer->widthUnit() );
01182   mWidthUnitComboBox->blockSignals( false );
01183 }
01184 
01185 QgsSymbolLayerV2* QgsLineDecorationSymbolLayerV2Widget::symbolLayer()
01186 {
01187   return mLayer;
01188 }
01189 
01190 void QgsLineDecorationSymbolLayerV2Widget::colorChanged( const QColor& color )
01191 {
01192   mLayer->setColor( color );
01193   emit changed();
01194 }
01195 
01196 void QgsLineDecorationSymbolLayerV2Widget::penWidthChanged()
01197 {
01198   mLayer->setWidth( spinWidth->value() );
01199   emit changed();
01200 }
01201 
01202 void QgsLineDecorationSymbolLayerV2Widget::on_mWidthUnitComboBox_currentIndexChanged( int index )
01203 {
01204   if ( mLayer )
01205   {
01206     mLayer->setWidthUnit(( QgsSymbolV2::OutputUnit ) index );
01207   }
01208   emit changed();
01209 }
01210 
01212 
01213 #include <QFileDialog>
01214 
01215 QgsSVGFillSymbolLayerWidget::QgsSVGFillSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent ): QgsSymbolLayerV2Widget( parent, vl )
01216 {
01217   mLayer = 0;
01218   setupUi( this );
01219   mSvgTreeView->setHeaderHidden( true );
01220   insertIcons();
01221 
01222   connect( mSvgListView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( setFile( const QModelIndex& ) ) );
01223   connect( mSvgTreeView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( populateIcons( const QModelIndex& ) ) );
01224 }
01225 
01226 void QgsSVGFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer )
01227 {
01228   if ( !layer )
01229   {
01230     return;
01231   }
01232 
01233   if ( layer->layerType() != "SVGFill" )
01234   {
01235     return;
01236   }
01237 
01238   mLayer = dynamic_cast<QgsSVGFillSymbolLayer*>( layer );
01239   if ( mLayer )
01240   {
01241     double width = mLayer->patternWidth();
01242     mTextureWidthSpinBox->setValue( width );
01243     mSVGLineEdit->setText( mLayer->svgFilePath() );
01244     mRotationSpinBox->setValue( mLayer->angle() );
01245     mTextureWidthUnitComboBox->blockSignals( true );
01246     mTextureWidthUnitComboBox->setCurrentIndex( mLayer->patternWidthUnit() );
01247     mTextureWidthUnitComboBox->blockSignals( false );
01248     mSvgOutlineWidthUnitComboBox->blockSignals( true );
01249     mSvgOutlineWidthUnitComboBox->setCurrentIndex( mLayer->svgOutlineWidthUnit() );
01250     mSvgOutlineWidthUnitComboBox->blockSignals( false );
01251   }
01252   updateParamGui();
01253 }
01254 
01255 QgsSymbolLayerV2* QgsSVGFillSymbolLayerWidget::symbolLayer()
01256 {
01257   return mLayer;
01258 }
01259 
01260 void QgsSVGFillSymbolLayerWidget::on_mBrowseToolButton_clicked()
01261 {
01262   QString filePath = QFileDialog::getOpenFileName( 0, tr( "Select svg texture file" ) );
01263   if ( !filePath.isNull() )
01264   {
01265     mSVGLineEdit->setText( filePath );
01266     emit changed();
01267   }
01268 }
01269 
01270 void QgsSVGFillSymbolLayerWidget::on_mTextureWidthSpinBox_valueChanged( double d )
01271 {
01272   if ( mLayer )
01273   {
01274     mLayer->setPatternWidth( d );
01275     emit changed();
01276   }
01277 }
01278 
01279 void QgsSVGFillSymbolLayerWidget::on_mSVGLineEdit_textEdited( const QString & text )
01280 {
01281   if ( !mLayer )
01282   {
01283     return;
01284   }
01285 
01286   QFileInfo fi( text );
01287   if ( !fi.exists() )
01288   {
01289     return;
01290   }
01291   mLayer->setSvgFilePath( text );
01292   updateParamGui();
01293   emit changed();
01294 }
01295 
01296 void QgsSVGFillSymbolLayerWidget::on_mSVGLineEdit_editingFinished()
01297 {
01298   if ( !mLayer )
01299   {
01300     return;
01301   }
01302 
01303   QFileInfo fi( mSVGLineEdit->text() );
01304   if ( !fi.exists() )
01305   {
01306     QUrl url( mSVGLineEdit->text() );
01307     if ( !url.isValid() )
01308     {
01309       return;
01310     }
01311   }
01312 
01313   QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
01314   mLayer->setSvgFilePath( mSVGLineEdit->text() );
01315   QApplication::restoreOverrideCursor();
01316 
01317   updateParamGui();
01318   emit changed();
01319 }
01320 
01321 void QgsSVGFillSymbolLayerWidget::setFile( const QModelIndex& item )
01322 {
01323   QString file = item.data( Qt::UserRole ).toString();
01324   mLayer->setSvgFilePath( file );
01325   mSVGLineEdit->setText( file );
01326 
01327   updateParamGui();
01328   emit changed();
01329 }
01330 
01331 void QgsSVGFillSymbolLayerWidget::insertIcons()
01332 {
01333   QgsSvgGroupsModel* g = new QgsSvgGroupsModel( mSvgTreeView );
01334   mSvgTreeView->setModel( g );
01335   // Set the tree expanded at the first level
01336   int rows = g->rowCount( g->indexFromItem( g->invisibleRootItem() ) );
01337   for ( int i = 0; i < rows; i++ )
01338   {
01339     mSvgTreeView->setExpanded( g->indexFromItem( g->item( i ) ), true );
01340   }
01341 
01342   QgsSvgListModel* m = new QgsSvgListModel( mSvgListView );
01343   mSvgListView->setModel( m );
01344 }
01345 
01346 void QgsSVGFillSymbolLayerWidget::populateIcons( const QModelIndex& idx )
01347 {
01348   QString path = idx.data( Qt::UserRole + 1 ).toString();
01349 
01350   QgsSvgListModel* m = new QgsSvgListModel( mSvgListView, path );
01351   mSvgListView->setModel( m );
01352 
01353   connect( mSvgListView->selectionModel(), SIGNAL( currentChanged( const QModelIndex&, const QModelIndex& ) ), this, SLOT( setFile( const QModelIndex& ) ) );
01354   emit changed();
01355 }
01356 
01357 
01358 void QgsSVGFillSymbolLayerWidget::on_mRotationSpinBox_valueChanged( double d )
01359 {
01360   if ( mLayer )
01361   {
01362     mLayer->setAngle( d );
01363     emit changed();
01364   }
01365 }
01366 
01367 void QgsSVGFillSymbolLayerWidget::updateParamGui()
01368 {
01369   //activate gui for svg parameters only if supported by the svg file
01370   bool hasFillParam, hasOutlineParam, hasOutlineWidthParam;
01371   QColor defaultFill, defaultOutline;
01372   double defaultOutlineWidth;
01373   QgsSvgCache::instance()->containsParams( mSVGLineEdit->text(), hasFillParam, defaultFill, hasOutlineParam, defaultOutline, hasOutlineWidthParam, defaultOutlineWidth );
01374   if ( hasFillParam )
01375     mChangeColorButton->setColor( defaultFill );
01376   mChangeColorButton->setEnabled( hasFillParam );
01377   if ( hasOutlineParam )
01378     mChangeBorderColorButton->setColor( defaultOutline );
01379   mChangeBorderColorButton->setEnabled( hasOutlineParam );
01380   mBorderWidthSpinBox->setEnabled( hasOutlineWidthParam );
01381 }
01382 
01383 void QgsSVGFillSymbolLayerWidget::on_mChangeColorButton_colorChanged( const QColor& color )
01384 {
01385   if ( !mLayer )
01386   {
01387     return;
01388   }
01389 
01390   mLayer->setSvgFillColor( color );
01391   emit changed();
01392 }
01393 
01394 void QgsSVGFillSymbolLayerWidget::on_mChangeBorderColorButton_colorChanged( const QColor& color )
01395 {
01396   if ( !mLayer )
01397   {
01398     return;
01399   }
01400 
01401   mLayer->setSvgOutlineColor( color );
01402   emit changed();
01403 }
01404 
01405 void QgsSVGFillSymbolLayerWidget::on_mBorderWidthSpinBox_valueChanged( double d )
01406 {
01407   if ( mLayer )
01408   {
01409     mLayer->setSvgOutlineWidth( d );
01410     emit changed();
01411   }
01412 }
01413 
01414 void QgsSVGFillSymbolLayerWidget::on_mTextureWidthUnitComboBox_currentIndexChanged( int index )
01415 {
01416   if ( mLayer )
01417   {
01418     mLayer->setPatternWidthUnit(( QgsSymbolV2::OutputUnit ) index );
01419     emit changed();
01420   }
01421 }
01422 
01423 void QgsSVGFillSymbolLayerWidget::on_mSvgOutlineWidthUnitComboBox_currentIndexChanged( int index )
01424 {
01425   if ( mLayer )
01426   {
01427     mLayer->setSvgOutlineWidthUnit(( QgsSymbolV2::OutputUnit ) index );
01428     emit changed();
01429   }
01430 }
01431 
01432 void QgsSVGFillSymbolLayerWidget::on_mDataDefinedPropertiesButton_clicked()
01433 {
01434   if ( !mLayer )
01435   {
01436     return;
01437   }
01438 
01439   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
01440   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "width", tr( "Texture width" ), mLayer->dataDefinedPropertyString( "width" ),
01441       QgsDataDefinedSymbolDialog::doubleHelpText() );
01442   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "svgFile", tr( "SVG file" ), mLayer->dataDefinedPropertyString( "svgFile" ),
01443       QgsDataDefinedSymbolDialog::fileNameHelpText() );
01444   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "angle", tr( "Rotation" ), mLayer->dataDefinedPropertyString( "angle" ),
01445       QgsDataDefinedSymbolDialog::doubleHelpText() );
01446   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "svgFillColor", tr( "Color" ), mLayer->dataDefinedPropertyString( "svgFillColor" ),
01447       QgsDataDefinedSymbolDialog::colorHelpText() );
01448   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "svgOutlineColor", tr( "Border color" ), mLayer->dataDefinedPropertyString( "svgOutlineColor" ),
01449       QgsDataDefinedSymbolDialog::colorHelpText() );
01450   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "svgOutlineWidth", tr( "Border width" ), mLayer->dataDefinedPropertyString( "svgOutlineWidth" ),
01451       QgsDataDefinedSymbolDialog::doubleHelpText() );
01452   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
01453   if ( d.exec() == QDialog::Accepted )
01454   {
01455     //empty all existing properties first
01456     mLayer->removeDataDefinedProperties();
01457 
01458     QMap<QString, QString> properties = d.dataDefinedProperties();
01459     QMap<QString, QString>::const_iterator it = properties.constBegin();
01460     for ( ; it != properties.constEnd(); ++it )
01461     {
01462       if ( !it.value().isEmpty() )
01463       {
01464         mLayer->setDataDefinedProperty( it.key(), it.value() );
01465       }
01466     }
01467     emit changed();
01468   }
01469 }
01470 
01472 
01473 QgsLinePatternFillSymbolLayerWidget::QgsLinePatternFillSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent ):
01474     QgsSymbolLayerV2Widget( parent, vl ), mLayer( 0 )
01475 {
01476   setupUi( this );
01477 }
01478 
01479 void QgsLinePatternFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer )
01480 {
01481   if ( layer->layerType() != "LinePatternFill" )
01482   {
01483     return;
01484   }
01485 
01486   QgsLinePatternFillSymbolLayer* patternLayer = static_cast<QgsLinePatternFillSymbolLayer*>( layer );
01487   if ( patternLayer )
01488   {
01489     mLayer = patternLayer;
01490     mAngleSpinBox->setValue( mLayer->lineAngle() );
01491     mDistanceSpinBox->setValue( mLayer->distance() );
01492     mLineWidthSpinBox->setValue( mLayer->lineWidth() );
01493     mOffsetSpinBox->setValue( mLayer->offset() );
01494     mColorPushButton->setColor( mLayer->color() );
01495     mColorPushButton->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
01496 
01497     //units
01498     mDistanceUnitComboBox->blockSignals( true );
01499     mDistanceUnitComboBox->setCurrentIndex( mLayer->distanceUnit() );
01500     mDistanceUnitComboBox->blockSignals( false );
01501     mLineWidthUnitComboBox->blockSignals( true );
01502     mLineWidthUnitComboBox->setCurrentIndex( mLayer->lineWidthUnit() );
01503     mLineWidthUnitComboBox->blockSignals( false );
01504     mOffsetUnitComboBox->blockSignals( true );
01505     mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
01506     mOffsetUnitComboBox->blockSignals( false );
01507   }
01508 }
01509 
01510 QgsSymbolLayerV2* QgsLinePatternFillSymbolLayerWidget::symbolLayer()
01511 {
01512   return mLayer;
01513 }
01514 
01515 void QgsLinePatternFillSymbolLayerWidget::on_mAngleSpinBox_valueChanged( double d )
01516 {
01517   if ( mLayer )
01518   {
01519     mLayer->setLineAngle( d );
01520     emit changed();
01521   }
01522 }
01523 
01524 void QgsLinePatternFillSymbolLayerWidget::on_mDistanceSpinBox_valueChanged( double d )
01525 {
01526   if ( mLayer )
01527   {
01528     mLayer->setDistance( d );
01529     emit changed();
01530   }
01531 }
01532 
01533 void QgsLinePatternFillSymbolLayerWidget::on_mLineWidthSpinBox_valueChanged( double d )
01534 {
01535   if ( mLayer )
01536   {
01537     mLayer->setLineWidth( d );
01538     emit changed();
01539   }
01540 }
01541 
01542 void QgsLinePatternFillSymbolLayerWidget::on_mOffsetSpinBox_valueChanged( double d )
01543 {
01544   if ( mLayer )
01545   {
01546     mLayer->setOffset( d );
01547     emit changed();
01548   }
01549 }
01550 
01551 void QgsLinePatternFillSymbolLayerWidget::on_mColorPushButton_colorChanged( const QColor& color )
01552 {
01553   if ( !mLayer )
01554   {
01555     return;
01556   }
01557 
01558   mLayer->setColor( color );
01559   emit changed();
01560 }
01561 
01562 void QgsLinePatternFillSymbolLayerWidget::on_mDistanceUnitComboBox_currentIndexChanged( int index )
01563 {
01564   if ( mLayer )
01565   {
01566     mLayer->setDistanceUnit(( QgsSymbolV2::OutputUnit ) index );
01567     emit changed();
01568   }
01569 }
01570 
01571 void QgsLinePatternFillSymbolLayerWidget::on_mLineWidthUnitComboBox_currentIndexChanged( int index )
01572 {
01573   if ( mLayer )
01574   {
01575     mLayer->setLineWidthUnit(( QgsSymbolV2::OutputUnit ) index );
01576     emit changed();
01577   }
01578 }
01579 
01580 void QgsLinePatternFillSymbolLayerWidget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
01581 {
01582   if ( mLayer )
01583   {
01584     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
01585     emit changed();
01586   }
01587 }
01588 
01589 void QgsLinePatternFillSymbolLayerWidget::on_mDataDefinedPropertiesButton_clicked()
01590 {
01591   if ( !mLayer )
01592   {
01593     return;
01594   }
01595 
01596   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
01597   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "lineangle",  tr( "Angle" ), mLayer->dataDefinedPropertyString( "lineangle" ),
01598       QgsDataDefinedSymbolDialog::doubleHelpText() );
01599   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "distance", tr( "Distance" ), mLayer->dataDefinedPropertyString( "distance" ),
01600       QgsDataDefinedSymbolDialog::doubleHelpText() );
01601   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "linewidth", tr( "Line width" ), mLayer->dataDefinedPropertyString( "linewidth" ),
01602       QgsDataDefinedSymbolDialog::doubleHelpText() );
01603   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color", tr( "Color" ), mLayer->dataDefinedPropertyString( "color" ),
01604       QgsDataDefinedSymbolDialog::colorHelpText() );
01605   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
01606   if ( d.exec() == QDialog::Accepted )
01607   {
01608     //empty all existing properties first
01609     mLayer->removeDataDefinedProperties();
01610 
01611     QMap<QString, QString> properties = d.dataDefinedProperties();
01612     QMap<QString, QString>::const_iterator it = properties.constBegin();
01613     for ( ; it != properties.constEnd(); ++it )
01614     {
01615       if ( !it.value().isEmpty() )
01616       {
01617         mLayer->setDataDefinedProperty( it.key(), it.value() );
01618       }
01619     }
01620     emit changed();
01621   }
01622 }
01623 
01624 
01626 
01627 QgsPointPatternFillSymbolLayerWidget::QgsPointPatternFillSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent ):
01628     QgsSymbolLayerV2Widget( parent, vl ), mLayer( 0 )
01629 {
01630   setupUi( this );
01631 }
01632 
01633 
01634 void QgsPointPatternFillSymbolLayerWidget::setSymbolLayer( QgsSymbolLayerV2* layer )
01635 {
01636   if ( !layer || layer->layerType() != "PointPatternFill" )
01637   {
01638     return;
01639   }
01640 
01641   mLayer = static_cast<QgsPointPatternFillSymbolLayer*>( layer );
01642   mHorizontalDistanceSpinBox->setValue( mLayer->distanceX() );
01643   mVerticalDistanceSpinBox->setValue( mLayer->distanceY() );
01644   mHorizontalDisplacementSpinBox->setValue( mLayer->displacementX() );
01645   mVerticalDisplacementSpinBox->setValue( mLayer->displacementY() );
01646 
01647   mHorizontalDistanceUnitComboBox->blockSignals( true );
01648   mHorizontalDistanceUnitComboBox->setCurrentIndex( mLayer->distanceXUnit() );
01649   mHorizontalDistanceUnitComboBox->blockSignals( false );
01650   mVerticalDistanceUnitComboBox->blockSignals( true );
01651   mVerticalDistanceUnitComboBox->setCurrentIndex( mLayer->distanceYUnit() );
01652   mVerticalDistanceUnitComboBox->blockSignals( false );
01653   mHorizontalDisplacementUnitComboBox->blockSignals( true );
01654   mHorizontalDisplacementUnitComboBox->setCurrentIndex( mLayer->displacementXUnit() );
01655   mHorizontalDisplacementUnitComboBox->blockSignals( false );
01656   mVerticalDisplacementUnitComboBox->blockSignals( true );
01657   mVerticalDisplacementUnitComboBox->setCurrentIndex( mLayer->displacementYUnit() );
01658   mVerticalDisplacementUnitComboBox->blockSignals( false );
01659 }
01660 
01661 QgsSymbolLayerV2* QgsPointPatternFillSymbolLayerWidget::symbolLayer()
01662 {
01663   return mLayer;
01664 }
01665 
01666 void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDistanceSpinBox_valueChanged( double d )
01667 {
01668   if ( mLayer )
01669   {
01670     mLayer->setDistanceX( d );
01671     emit changed();
01672   }
01673 }
01674 
01675 void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDistanceSpinBox_valueChanged( double d )
01676 {
01677   if ( mLayer )
01678   {
01679     mLayer->setDistanceY( d );
01680     emit changed();
01681   }
01682 }
01683 
01684 void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDisplacementSpinBox_valueChanged( double d )
01685 {
01686   if ( mLayer )
01687   {
01688     mLayer->setDisplacementX( d );
01689     emit changed();
01690   }
01691 }
01692 
01693 void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDisplacementSpinBox_valueChanged( double d )
01694 {
01695   if ( mLayer )
01696   {
01697     mLayer->setDisplacementY( d );
01698     emit changed();
01699   }
01700 }
01701 
01702 void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDistanceUnitComboBox_currentIndexChanged( int index )
01703 {
01704   if ( mLayer )
01705   {
01706     mLayer->setDistanceXUnit(( QgsSymbolV2::OutputUnit ) index );
01707     emit changed();
01708   }
01709 }
01710 
01711 void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDistanceUnitComboBox_currentIndexChanged( int index )
01712 {
01713   if ( mLayer )
01714   {
01715     mLayer->setDistanceYUnit(( QgsSymbolV2::OutputUnit ) index );
01716     emit changed();
01717   }
01718 }
01719 
01720 void QgsPointPatternFillSymbolLayerWidget::on_mHorizontalDisplacementUnitComboBox_currentIndexChanged( int index )
01721 {
01722   if ( mLayer )
01723   {
01724     mLayer->setDisplacementXUnit(( QgsSymbolV2::OutputUnit ) index );
01725     emit changed();
01726   }
01727 }
01728 
01729 void QgsPointPatternFillSymbolLayerWidget::on_mVerticalDisplacementUnitComboBox_currentIndexChanged( int index )
01730 {
01731   if ( mLayer )
01732   {
01733     mLayer->setDisplacementYUnit(( QgsSymbolV2::OutputUnit ) index );
01734     emit changed();
01735   }
01736 }
01737 
01738 void QgsPointPatternFillSymbolLayerWidget::on_mDataDefinedPropertiesButton_clicked()
01739 {
01740   if ( !mLayer )
01741   {
01742     return;
01743   }
01744 
01745   QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
01746   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "distance_x", tr( "Horizontal distance" ), mLayer->dataDefinedPropertyString( "distance_x" ),
01747       QgsDataDefinedSymbolDialog::doubleHelpText() );
01748   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "distance_y", tr( "Vertical distance" ), mLayer->dataDefinedPropertyString( "distance_y" ),
01749       QgsDataDefinedSymbolDialog::doubleHelpText() );
01750   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "displacement_x", tr( "Horizontal displacement" ), mLayer->dataDefinedPropertyString( "displacement_x" ),
01751       QgsDataDefinedSymbolDialog::doubleHelpText() );
01752   dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "displacement_y", tr( "Vertical displacement" ), mLayer->dataDefinedPropertyString( "displacement_y" ),
01753       QgsDataDefinedSymbolDialog::doubleHelpText() );
01754   QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
01755   if ( d.exec() == QDialog::Accepted )
01756   {
01757     //empty all existing properties first
01758     mLayer->removeDataDefinedProperties();
01759 
01760     QMap<QString, QString> properties = d.dataDefinedProperties();
01761     QMap<QString, QString>::const_iterator it = properties.constBegin();
01762     for ( ; it != properties.constEnd(); ++it )
01763     {
01764       if ( !it.value().isEmpty() )
01765       {
01766         mLayer->setDataDefinedProperty( it.key(), it.value() );
01767       }
01768     }
01769     emit changed();
01770   }
01771 }
01772 
01774 
01775 QgsFontMarkerSymbolLayerV2Widget::QgsFontMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
01776     : QgsSymbolLayerV2Widget( parent, vl )
01777 {
01778   mLayer = NULL;
01779 
01780   setupUi( this );
01781   widgetChar = new CharacterWidget;
01782   scrollArea->setWidget( widgetChar );
01783 
01784   connect( cboFont, SIGNAL( currentFontChanged( const QFont & ) ), this, SLOT( setFontFamily( const QFont& ) ) );
01785   connect( spinSize, SIGNAL( valueChanged( double ) ), this, SLOT( setSize( double ) ) );
01786   connect( btnColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColor( const QColor& ) ) );
01787   connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle( double ) ) );
01788   connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
01789   connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) );
01790   connect( widgetChar, SIGNAL( characterSelected( const QChar & ) ), this, SLOT( setCharacter( const QChar & ) ) );
01791 }
01792 
01793 
01794 void QgsFontMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
01795 {
01796   if ( layer->layerType() != "FontMarker" )
01797     return;
01798 
01799   // layer type is correct, we can do the cast
01800   mLayer = static_cast<QgsFontMarkerSymbolLayerV2*>( layer );
01801 
01802   // set values
01803   cboFont->setCurrentFont( QFont( mLayer->fontFamily() ) );
01804   spinSize->setValue( mLayer->size() );
01805   btnColor->setColor( mLayer->color() );
01806   btnColor->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
01807   spinAngle->setValue( mLayer->angle() );
01808 
01809   //block
01810   spinOffsetX->blockSignals( true );
01811   spinOffsetX->setValue( mLayer->offset().x() );
01812   spinOffsetX->blockSignals( false );
01813   spinOffsetY->blockSignals( true );
01814   spinOffsetY->setValue( mLayer->offset().y() );
01815   spinOffsetY->blockSignals( false );
01816 
01817   mSizeUnitComboBox->blockSignals( true );
01818   mSizeUnitComboBox->setCurrentIndex( mLayer->sizeUnit() );
01819   mSizeUnitComboBox->blockSignals( false );
01820 
01821   mOffsetUnitComboBox->blockSignals( true );
01822   mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
01823   mOffsetUnitComboBox->blockSignals( false );
01824 }
01825 
01826 QgsSymbolLayerV2* QgsFontMarkerSymbolLayerV2Widget::symbolLayer()
01827 {
01828   return mLayer;
01829 }
01830 
01831 void QgsFontMarkerSymbolLayerV2Widget::setFontFamily( const QFont& font )
01832 {
01833   mLayer->setFontFamily( font.family() );
01834   widgetChar->updateFont( font );
01835   emit changed();
01836 }
01837 
01838 void QgsFontMarkerSymbolLayerV2Widget::setColor( const QColor& color )
01839 {
01840   mLayer->setColor( color );
01841   emit changed();
01842 }
01843 
01844 void QgsFontMarkerSymbolLayerV2Widget::setSize( double size )
01845 {
01846   mLayer->setSize( size );
01847   //widgetChar->updateSize(size);
01848   emit changed();
01849 }
01850 
01851 void QgsFontMarkerSymbolLayerV2Widget::setAngle( double angle )
01852 {
01853   mLayer->setAngle( angle );
01854   emit changed();
01855 }
01856 
01857 void QgsFontMarkerSymbolLayerV2Widget::setCharacter( const QChar& chr )
01858 {
01859   mLayer->setCharacter( chr );
01860   emit changed();
01861 }
01862 
01863 void QgsFontMarkerSymbolLayerV2Widget::setOffset()
01864 {
01865   mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
01866   emit changed();
01867 }
01868 
01869 void QgsFontMarkerSymbolLayerV2Widget::on_mSizeUnitComboBox_currentIndexChanged( int index )
01870 {
01871   if ( mLayer )
01872   {
01873     mLayer->setSizeUnit(( QgsSymbolV2::OutputUnit ) index );
01874   }
01875   emit changed();
01876 }
01877 
01878 void QgsFontMarkerSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
01879 {
01880   if ( mLayer )
01881   {
01882     mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
01883   }
01884   emit changed();
01885 }
01886 
01887 
01889 
01890 
01891 QgsCentroidFillSymbolLayerV2Widget::QgsCentroidFillSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
01892     : QgsSymbolLayerV2Widget( parent, vl )
01893 {
01894   mLayer = NULL;
01895 
01896   setupUi( this );
01897 }
01898 
01899 void QgsCentroidFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
01900 {
01901   if ( layer->layerType() != "CentroidFill" )
01902     return;
01903 
01904   // layer type is correct, we can do the cast
01905   mLayer = static_cast<QgsCentroidFillSymbolLayerV2*>( layer );
01906 }
01907 
01908 QgsSymbolLayerV2* QgsCentroidFillSymbolLayerV2Widget::symbolLayer()
01909 {
01910   return mLayer;
01911 }
01912 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines