|
Quantum GIS API Documentation
master-693a1fe
|
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