void QgsSymbolSelectorWidget::symbolChanged() { SymbolLayerItem *currentItem = static_cast<SymbolLayerItem *>( model->itemFromIndex( layersTree->currentIndex() ) ); if ( !currentItem || currentItem->isLayer() ) return; // disconnect to avoid recreating widget disconnect( layersTree->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsSymbolSelectorWidget::layerChanged ); if ( currentItem->parent() ) { // it is a sub-symbol QgsSymbol *symbol = currentItem->symbol(); SymbolLayerItem *parent = static_cast<SymbolLayerItem *>( currentItem->parent() ); parent->removeRow( 0 ); loadSymbol( symbol, parent ); layersTree->setCurrentIndex( parent->child( 0 )->index() ); parent->updatePreview(); } else { //it is the symbol itself loadSymbol(); QModelIndex newIndex = layersTree->model()->index( 0, 0 ); layersTree->setCurrentIndex( newIndex ); } updatePreview(); // connect it back once things are set connect( layersTree->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsSymbolSelectorWidget::layerChanged ); }
void QgsSymbolSelectorWidget::removeLayer() { SymbolLayerItem *item = currentLayerItem(); int row = item->row(); SymbolLayerItem *parent = static_cast<SymbolLayerItem *>( item->parent() ); int layerIdx = parent->rowCount() - row - 1; // IMPORTANT QgsSymbol *parentSymbol = parent->symbol(); QgsSymbolLayer *tmpLayer = parentSymbol->takeSymbolLayer( layerIdx ); parent->removeRow( row ); parent->updatePreview(); QModelIndex newIdx = parent->child( 0 )->index(); layersTree->setCurrentIndex( newIdx ); updateUi(); updatePreview(); //finally delete the removed layer pointer delete tmpLayer; }