void QgsSymbolSelectorWidget::addLayer() { QModelIndex idx = layersTree->currentIndex(); if ( !idx.isValid() ) return; int insertIdx = -1; SymbolLayerItem *item = static_cast<SymbolLayerItem *>( model->itemFromIndex( idx ) ); if ( item->isLayer() ) { insertIdx = item->row(); item = static_cast<SymbolLayerItem *>( item->parent() ); } QgsSymbol *parentSymbol = item->symbol(); // save data-defined values at marker level QgsProperty ddSize( parentSymbol->type() == QgsSymbol::Marker ? static_cast<QgsMarkerSymbol *>( parentSymbol )->dataDefinedSize() : QgsProperty() ); QgsProperty ddAngle( parentSymbol->type() == QgsSymbol::Marker ? static_cast<QgsMarkerSymbol *>( parentSymbol )->dataDefinedAngle() : QgsProperty() ); QgsProperty ddWidth( parentSymbol->type() == QgsSymbol::Line ? static_cast<QgsLineSymbol *>( parentSymbol )->dataDefinedWidth() : QgsProperty() ); QgsSymbolLayer *newLayer = QgsApplication::symbolLayerRegistry()->defaultSymbolLayer( parentSymbol->type() ); if ( insertIdx == -1 ) parentSymbol->appendSymbolLayer( newLayer ); else parentSymbol->insertSymbolLayer( item->rowCount() - insertIdx, newLayer ); // restore data-defined values at marker level if ( ddSize ) static_cast<QgsMarkerSymbol *>( parentSymbol )->setDataDefinedSize( ddSize ); if ( ddAngle ) static_cast<QgsMarkerSymbol *>( parentSymbol )->setDataDefinedAngle( ddAngle ); if ( ddWidth ) static_cast<QgsLineSymbol *>( parentSymbol )->setDataDefinedWidth( ddWidth ); SymbolLayerItem *newLayerItem = new SymbolLayerItem( newLayer ); item->insertRow( insertIdx == -1 ? 0 : insertIdx, newLayerItem ); item->updatePreview(); layersTree->setCurrentIndex( model->indexFromItem( newLayerItem ) ); updateUi(); updatePreview(); }
void QgsSymbolsListWidget::updateSymbolInfo() { updateSymbolColor(); const auto overrideButtons {findChildren< QgsPropertyOverrideButton * >()}; for ( QgsPropertyOverrideButton *button : overrideButtons ) { button->registerExpressionContextGenerator( this ); } if ( mSymbol->type() == QgsSymbol::Marker ) { QgsMarkerSymbol *markerSymbol = static_cast<QgsMarkerSymbol *>( mSymbol ); spinSize->setValue( markerSymbol->size() ); spinAngle->setValue( markerSymbol->angle() ); if ( mLayer ) { QgsProperty ddSize( markerSymbol->dataDefinedSize() ); mSizeDDBtn->init( QgsSymbolLayer::PropertySize, ddSize, QgsSymbolLayer::propertyDefinitions(), mLayer, true ); spinSize->setEnabled( !mSizeDDBtn->isActive() ); QgsProperty ddAngle( markerSymbol->dataDefinedAngle() ); mRotationDDBtn->init( QgsSymbolLayer::PropertyAngle, ddAngle, QgsSymbolLayer::propertyDefinitions(), mLayer, true ); spinAngle->setEnabled( !mRotationDDBtn->isActive() ); } else { mSizeDDBtn->setEnabled( false ); mRotationDDBtn->setEnabled( false ); } } else if ( mSymbol->type() == QgsSymbol::Line ) { QgsLineSymbol *lineSymbol = static_cast<QgsLineSymbol *>( mSymbol ); spinWidth->setValue( lineSymbol->width() ); if ( mLayer ) { QgsProperty dd( lineSymbol->dataDefinedWidth() ); mWidthDDBtn->init( QgsSymbolLayer::PropertyStrokeWidth, dd, QgsSymbolLayer::propertyDefinitions(), mLayer, true ); spinWidth->setEnabled( !mWidthDDBtn->isActive() ); } else { mWidthDDBtn->setEnabled( false ); } } mSymbolUnitWidget->blockSignals( true ); mSymbolUnitWidget->setUnit( mSymbol->outputUnit() ); mSymbolUnitWidget->setMapUnitScale( mSymbol->mapUnitScale() ); mSymbolUnitWidget->blockSignals( false ); mOpacityWidget->setOpacity( mSymbol->opacity() ); // Clean up previous advanced symbol actions const QList<QAction *> actionList( btnAdvanced->menu()->actions() ); for ( const auto &action : actionList ) { if ( mClipFeaturesAction->text() == action->text() ) { btnAdvanced->menu()->removeAction( action ); } else if ( mStandardizeRingsAction->text() == action->text() ) { btnAdvanced->menu()->removeAction( action ); } } if ( mSymbol->type() == QgsSymbol::Line || mSymbol->type() == QgsSymbol::Fill ) { //add clip features option for line or fill symbols btnAdvanced->menu()->addAction( mClipFeaturesAction ); } if ( mSymbol->type() == QgsSymbol::Fill ) { btnAdvanced->menu()->addAction( mStandardizeRingsAction ); } btnAdvanced->setVisible( mAdvancedMenu || !btnAdvanced->menu()->isEmpty() ); whileBlocking( mClipFeaturesAction )->setChecked( mSymbol->clipFeaturesToExtent() ); whileBlocking( mStandardizeRingsAction )->setChecked( mSymbol->forceRHR() ); }