From f76babf634bd45a288f3007462afa2ec69321406 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 6 Jan 2016 16:04:14 +1100 Subject: [PATCH] [FEATURE] Add duplicate button to symbol properties Allows easy duplication of a symbol layer --- .../qgssymbolv2selectordialog.sip | 4 ++ .../qgssymbolv2selectordialog.cpp | 41 +++++++++++++++++++ .../symbology-ng/qgssymbolv2selectordialog.h | 4 ++ src/ui/qgssymbolv2selectordialogbase.ui | 18 +++++++- 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/python/gui/symbology-ng/qgssymbolv2selectordialog.sip b/python/gui/symbology-ng/qgssymbolv2selectordialog.sip index fc03c116293a..ce32b1003eae 100644 --- a/python/gui/symbology-ng/qgssymbolv2selectordialog.sip +++ b/python/gui/symbology-ng/qgssymbolv2selectordialog.sip @@ -67,6 +67,10 @@ class QgsSymbolV2SelectorDialog : QDialog void saveSymbol(); void lockLayer(); + //! Duplicates the current symbol layer and places the duplicated layer above the current symbol layer + //! @note added in QGIS 2.14 + void duplicateLayer(); + void layerChanged(); void updateLayerPreview(); diff --git a/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp b/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp index ac7a9ec5ac04..8cd70eb7142f 100644 --- a/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp +++ b/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp @@ -240,6 +240,7 @@ QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsSt iconLock.addFile( QgsApplication::iconPath( "locked.svg" ), QSize(), QIcon::Normal, QIcon::On ); iconLock.addFile( QgsApplication::iconPath( "unlocked.svg" ), QSize(), QIcon::Normal, QIcon::Off ); btnLock->setIcon( iconLock ); + btnDuplicate->setIcon( QIcon( QgsApplication::iconPath( "mActionDuplicateLayer.svg" ) ) ); btnUp->setIcon( QIcon( QgsApplication::iconPath( "symbologyUp.svg" ) ) ); btnDown->setIcon( QIcon( QgsApplication::iconPath( "symbologyDown.svg" ) ) ); @@ -259,6 +260,7 @@ QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsSt connect( btnAddLayer, SIGNAL( clicked() ), this, SLOT( addLayer() ) ); connect( btnRemoveLayer, SIGNAL( clicked() ), this, SLOT( removeLayer() ) ); connect( btnLock, SIGNAL( clicked() ), this, SLOT( lockLayer() ) ); + connect( btnDuplicate, SIGNAL( clicked() ), this, SLOT( duplicateLayer() ) ); connect( btnSaveSymbol, SIGNAL( clicked() ), this, SLOT( saveSymbol() ) ); updateUi(); @@ -362,6 +364,7 @@ void QgsSymbolV2SelectorDialog::updateUi() btnDown->setEnabled( false ); btnRemoveLayer->setEnabled( false ); btnLock->setEnabled( false ); + btnDuplicate->setEnabled( false ); return; } @@ -372,6 +375,7 @@ void QgsSymbolV2SelectorDialog::updateUi() btnDown->setEnabled( currentRow < rowCount - 1 ); btnRemoveLayer->setEnabled( rowCount > 1 ); btnLock->setEnabled( true ); + btnDuplicate->setEnabled( true ); } void QgsSymbolV2SelectorDialog::updatePreview() @@ -617,6 +621,43 @@ void QgsSymbolV2SelectorDialog::lockLayer() layer->setLocked( btnLock->isChecked() ); } +void QgsSymbolV2SelectorDialog::duplicateLayer() +{ + QModelIndex idx = layersTree->currentIndex(); + if ( !idx.isValid() ) + return; + + SymbolLayerItem *item = static_cast( model->itemFromIndex( idx ) ); + if ( !item->isLayer() ) + return; + + QgsSymbolLayerV2* source = item->layer(); + + int insertIdx = item->row(); + item = static_cast( item->parent() ); + + QgsSymbolV2* parentSymbol = item->symbol(); + + QgsSymbolLayerV2* newLayer = source->clone(); + if ( insertIdx == -1 ) + parentSymbol->appendSymbolLayer( newLayer ); + else + parentSymbol->insertSymbolLayer( item->rowCount() - insertIdx, newLayer ); + + SymbolLayerItem *newLayerItem = new SymbolLayerItem( newLayer ); + item->insertRow( insertIdx == -1 ? 0 : insertIdx, newLayerItem ); + if ( newLayer->subSymbol() ) + { + loadSymbol( newLayer->subSymbol(), newLayerItem ); + layersTree->setExpanded( newLayerItem->index(), true ); + } + item->updatePreview(); + + layersTree->setCurrentIndex( model->indexFromItem( newLayerItem ) ); + updateUi(); + updatePreview(); +} + void QgsSymbolV2SelectorDialog::saveSymbol() { bool ok; diff --git a/src/gui/symbology-ng/qgssymbolv2selectordialog.h b/src/gui/symbology-ng/qgssymbolv2selectordialog.h index 1220d3b8d407..b34f01f9b39c 100644 --- a/src/gui/symbology-ng/qgssymbolv2selectordialog.h +++ b/src/gui/symbology-ng/qgssymbolv2selectordialog.h @@ -139,6 +139,10 @@ class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymb void saveSymbol(); void lockLayer(); + //! Duplicates the current symbol layer and places the duplicated layer above the current symbol layer + //! @note added in QGIS 2.14 + void duplicateLayer(); + void layerChanged(); void updateLayerPreview(); diff --git a/src/ui/qgssymbolv2selectordialogbase.ui b/src/ui/qgssymbolv2selectordialogbase.ui index 198e29fc7bdd..478d45bd3c4c 100644 --- a/src/ui/qgssymbolv2selectordialogbase.ui +++ b/src/ui/qgssymbolv2selectordialogbase.ui @@ -6,7 +6,7 @@ 0 0 - 436 + 670 359 @@ -104,6 +104,22 @@ + + + + + 50 + 16777215 + + + + Duplicates the current layer + + + + + +