36 QgsMaskingWidget::QgsMaskingWidget( QWidget *parent ) :
 
   42 void QgsMaskingWidget::onSelectionChanged()
 
   45   bool printMessage = mMaskTargetsWidget->selection().empty() != mMaskSourcesWidget->selection().empty();
 
   47   if ( mMessageBarItem && !printMessage )
 
   49     mMessageBar->popWidget( mMessageBarItem );
 
   50     delete mMessageBarItem;
 
   52   else if ( !mMessageBarItem && printMessage )
 
   54     mMessageBarItem = 
new QgsMessageBarItem( tr( 
"Select both sources and symbol layers or your configuration will be lost" ), 
Qgis::Warning, 0, 
this );
 
   55     mMessageBar->pushItem( mMessageBarItem );
 
   61 void QgsMaskingWidget::showEvent( QShowEvent *event )
 
   71     mMustPopulate = 
false;
 
   93 QList<QPair<QgsSymbolLayerId, QList<QgsSymbolLayerReference>>> symbolLayerMasks( 
const QgsVectorLayer *layer )
 
   98   QList<QPair<QgsSymbolLayerId, QList<QgsSymbolLayerReference>>> mMasks;
 
  101     if ( ! sl->
masks().isEmpty() )
 
  102       mMasks.push_back( qMakePair( lid, sl->
masks() ) );
 
  110   if ( mLayer != layer )
 
  113     mMustPopulate = 
true;
 
  117 void QgsMaskingWidget::populate()
 
  119   mMaskSourcesWidget->update();
 
  120   mMaskTargetsWidget->setLayer( mLayer );
 
  123   QSet<QgsSymbolLayerId> maskedSymbolLayers;
 
  124   QList<QgsMaskSourceSelectionWidget::MaskSource> maskSources;
 
  128   for ( 
auto layerIt = layers.begin(); layerIt != layers.end(); layerIt++ )
 
  130     QString layerId = layerIt.key();
 
  131     QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layerIt.value() );
 
  136     QList<QPair<QgsSymbolLayerId, QList<QgsSymbolLayerReference>>> slMasks = symbolLayerMasks( vl );
 
  137     for ( 
auto p : slMasks )
 
  142         if ( ref.
layerId() == mLayer->id() )
 
  150           maskSources.append( source );
 
  157     for ( 
auto it = labelMasks.begin(); it != labelMasks.end(); it++ )
 
  159       const QString &ruleKey = it.key();
 
  160       for ( 
auto it2 = it.value().begin(); it2 != it.value().end(); it2++ )
 
  162         if ( it2.key() == mLayer->id() )
 
  165           maskedSymbolLayers.unite( it2.value() );
 
  170           maskSources.append( source );
 
  176   mMaskSourcesWidget->setSelection( maskSources );
 
  177   mMaskTargetsWidget->setSelection( maskedSymbolLayers );
 
  180 void QgsMaskingWidget::apply()
 
  182   QList<QgsMaskSourceSelectionWidget::MaskSource> maskSources = mMaskSourcesWidget->selection();
 
  183   QSet<QgsSymbolLayerId> maskedSymbolLayers = mMaskTargetsWidget->selection();
 
  185   QSet<QString> layersToRefresh;
 
  188   for ( 
auto layerIt = layers.begin(); layerIt != layers.end(); layerIt++ )
 
  190     QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layerIt.value() );
 
  200         QgsMaskMarkerSymbolLayer *maskSl = const_cast<QgsMaskMarkerSymbolLayer *>( static_cast<const QgsMaskMarkerSymbolLayer *>( sl ) );
 
  202         QgsSymbolLayerReferenceList masks = maskSl->masks();
 
  203         QgsSymbolLayerReferenceList newMasks;
 
  204         for ( const QgsSymbolLayerReference &ref : masks )
 
  207           if ( ref.layerId() != mLayer->id() )
 
  208             newMasks.append( ref );
 
  215             for ( const QgsSymbolLayerId &maskedId : maskedSymbolLayers )
 
  217               newMasks.append( QgsSymbolLayerReference( mLayer->id(), maskedId ) );
 
  220             layersToRefresh.insert( source.
layerId );
 
  223         maskSl->setMasks( newMasks );
 
  245         if ( ref.
layerId() != mLayer->id() )
 
  246           newMasks.append( ref );
 
  259           layersToRefresh.insert( source.
layerId );
 
  270   mLayer->triggerRepaint();
 
  272   for ( QString layerId : layersToRefresh )
 
  279 bool QgsMaskingWidget::hasBeenPopulated()
 
  281   return !mMustPopulate;
 
  284 SymbolLayerVisitor::SymbolLayerVisitor( SymbolLayerVisitor::SymbolLayerCallback callback ) :
 
  285   mCallback( callback )
 
  297 void SymbolLayerVisitor::visitSymbol( 
const QgsSymbol *symbol, 
const QString &leafIdentifier, QVector<int> rootPath )
 
  301     QVector<int> indexPath = rootPath;
 
  302     indexPath.push_back( idx );
 
  306     mCallback( sl, 
QgsSymbolLayerId( mSymbolKey + leafIdentifier, indexPath ) );
 
  311       visitSymbol( subSymbol, leafIdentifier, indexPath );
 
  320     if ( symbolEntity->symbol() )
 
  321       visitSymbol( symbolEntity->symbol(), leaf.
identifier, {} );
 
virtual QStringList subProviders() const
Gets list of sub-providers within the layer's labeling.
virtual void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString())=0
Set pal settings for a specific provider (takes ownership).
virtual QgsPalLayerSettings settings(const QString &providerId=QString()) const =0
Gets associated label settings.
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
Base class for all map layer types.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
Represents an item shown within a QgsMessageBar widget.
Contains settings for how a map layer will be labeled.
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
void setDirty(bool b=true)
Flag the project as dirty (modified).
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
virtual QgsStyle::StyleEntity type() const =0
Returns the type of style entity.
@ SymbolRule
Rule based symbology or label child rule.
A symbol entity for QgsStyle databases.
We may need stable references to symbol layers, when pointers to symbol layers is not usable (when a ...
QString symbolKey() const
Returns the key associated to the symbol.
Type used to refer to a specific symbol layer in a symbol of a layer.
QgsSymbolLayerId symbolLayerId() const
The symbol layer's id.
QString layerId() const
The referenced vector layer / feature renderer.
virtual QgsSymbolLayerReferenceList masks() const
Returns masks defined by this symbol layer.
virtual QString layerType() const =0
Returns a string that represents this layer type.
Abstract base class for all rendered symbols.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
Container for all settings relating to text rendering.
QgsTextMaskSettings & mask()
Returns a reference to the masking settings.
QgsSymbolLayerReferenceList maskedSymbolLayers() const
Returns a list of references to symbol layers that are masked by this buffer.
void setMaskedSymbolLayers(QgsSymbolLayerReferenceList maskedLayers)
Sets the symbol layers that will be masked by this buffer.
bool enabled() const
Returns whether the mask is enabled.
static QHash< QString, QHash< QString, QSet< QgsSymbolLayerId > > > labelMasks(const QgsVectorLayer *)
Returns masks defined in labeling options of a layer.
Represents a vector layer which manages a vector based data sets.
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
QList< QgsSymbolLayerReference > QgsSymbolLayerReferenceList
Contains information relating to a node (i.e.
QString identifier
A string identifying the node.
QgsStyleEntityVisitorInterface::NodeType type
Node type.
Contains information relating to the style entity currently being visited.
const QgsStyleEntityInterface * entity
Reference to style entity being visited.
QString identifier
A string identifying the style entity.