30#include <QStandardItemModel>
34#include "moc_qgsvectorlayerlegendwidget.cpp"
39 mIncludeByDefaultInLayoutLegendsCheck =
new QCheckBox( tr(
"Include automatically in print layout legend items" ) );
41 mLegendTreeView =
new QTreeView;
42 mLegendTreeView->setRootIsDecorated(
false );
44 mTextOnSymbolFormatButton =
new QgsFontButton(
nullptr, tr(
"Legend Text Format" ) );
45 mTextOnSymbolFormatButton->setText( tr(
"Text Format" ) );
48 mTextOnSymbolFromExpressionButton =
new QPushButton( tr(
"Set Labels from Expression…" ) );
49 connect( mTextOnSymbolFromExpressionButton, &QPushButton::clicked,
this, &QgsVectorLayerLegendWidget::labelsFromExpression );
53 QHBoxLayout *buttonsLayout =
new QHBoxLayout;
54 buttonsLayout->addWidget( mTextOnSymbolFormatButton );
55 buttonsLayout->addWidget( mTextOnSymbolFromExpressionButton );
56 buttonsLayout->addStretch();
58 QVBoxLayout *groupLayout =
new QVBoxLayout;
59 groupLayout->addWidget( mLegendTreeView );
60 groupLayout->addLayout( buttonsLayout );
62 mTextOnSymbolGroupBox->setTitle( tr(
"Text on Symbols" ) );
63 mTextOnSymbolGroupBox->setCheckable(
true );
64 mTextOnSymbolGroupBox->setLayout( groupLayout );
68 mLabelLegendGroupBox->setCheckable(
true );
69 mLabelLegendGroupBox->setTitle( tr(
"Show Label Legend" ) );
71 mLabelLegendTreeWidget =
new QTreeWidget;
72 connect( mLabelLegendTreeWidget, &QTreeWidget::itemDoubleClicked,
this, &QgsVectorLayerLegendWidget::labelLegendTreeWidgetItemDoubleClicked );
73 QVBoxLayout *labelLegendLayout =
new QVBoxLayout;
74 labelLegendLayout->addWidget( mLabelLegendTreeWidget );
75 mLabelLegendGroupBox->setLayout( labelLegendLayout );
77 mPlaceholderImageLabel =
new QLabel( tr(
"Legend placeholder image" ) );
79 mImageSourceLineEdit->setLastPathSettingsKey( QStringLiteral(
"lastLegendPlaceholderDir" ) );
82 mImageSourceLineEdit->setSource( mLayer->legendPlaceholderImage() );
85 QGroupBox *generalGroupBox =
new QGroupBox( tr(
"General Settings" ) );
87 QGridLayout *generalLayout =
new QGridLayout;
88 generalLayout->addWidget( mIncludeByDefaultInLayoutLegendsCheck, 0, 0, 1, 2 );
89 generalLayout->addWidget( mPlaceholderImageLabel, 1, 0 );
90 generalLayout->addWidget( mImageSourceLineEdit, 1, 1 );
91 generalLayout->setColumnStretch( 0, 1 );
92 generalLayout->setColumnStretch( 1, 2 );
93 generalGroupBox->setLayout( generalLayout );
95 QVBoxLayout *layout =
new QVBoxLayout;
96 layout->setContentsMargins( 0, 0, 0, 0 );
97 layout->addWidget( generalGroupBox );
98 layout->addWidget( mLabelLegendGroupBox );
99 layout->addWidget( mTextOnSymbolGroupBox );
104void QgsVectorLayerLegendWidget::labelLegendTreeWidgetItemDoubleClicked( QTreeWidgetItem *item,
int column )
106 const Qt::ItemFlags flags = item->flags();
109 item->setFlags( flags | Qt::ItemIsEditable );
113 item->setFlags( flags & ( ~Qt::ItemIsEditable ) );
120 mTextOnSymbolFormatButton->setMapCanvas( mCanvas );
133 populateLabelLegendTreeWidget();
137 mImageSourceLineEdit->setSource( mLayer->legendPlaceholderImage() );
140void QgsVectorLayerLegendWidget::populateLabelLegendTreeWidget()
142 mLabelLegendTreeWidget->clear();
143 mLabelLegendTreeWidget->setColumnCount( 2 );
144 QTreeWidgetItem *headerItem =
new QTreeWidgetItem( QStringList() << tr(
"Description" ) << tr(
"Legend Text" ) );
145 mLabelLegendTreeWidget->setHeaderItem( headerItem );
151 for (
int i = 0; i < pList.size(); ++i )
156 if ( ruleBasedLabeling && ruleBasedLabeling->
rootRule() )
165 QTreeWidgetItem *labelItem =
new QTreeWidgetItem( QStringList() << description << s.
legendString() );
166 labelItem->setData( 0, Qt::UserRole, pList.at( i ) );
167 mLabelLegendTreeWidget->addTopLevelItem( labelItem );
173void QgsVectorLayerLegendWidget::populateLegendTreeView(
const QHash<QString, QString> &content )
175 QStandardItemModel *model =
new QStandardItemModel(
this );
176 model->setColumnCount( 2 );
177 model->setHorizontalHeaderLabels( QStringList() << tr(
"Symbol" ) << tr(
"Text" ) );
180 for (
const QgsLegendSymbolItem &symbolItem : lst )
182 if ( !symbolItem.symbol() )
185 QgsRenderContext context;
189 QStandardItem *item1 =
new QStandardItem( icon, symbolItem.label() );
190 item1->setEditable(
false );
191 QStandardItem *item2 =
new QStandardItem;
192 if ( symbolItem.ruleKey().isEmpty() )
194 item1->setEnabled(
false );
195 item2->setEnabled(
false );
199 item1->setData( symbolItem.ruleKey() );
200 if ( content.contains( symbolItem.ruleKey() ) )
201 item2->setText( content.value( symbolItem.ruleKey() ) );
203 model->appendRow( QList<QStandardItem *>() << item1 << item2 );
205 mLegendTreeView->setModel( model );
206 mLegendTreeView->resizeColumnToContents( 0 );
216 QHash<QString, QString> content;
217 if ( QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mLegendTreeView->model() ) )
219 for (
int i = 0; i < model->rowCount(); ++i )
221 const QString ruleKey = model->item( i, 0 )->data().toString();
222 const QString label = model->item( i, 1 )->text();
223 if ( !label.isEmpty() )
224 content[ruleKey] = label;
229 const bool showLabelLegend = mLabelLegendGroupBox->isChecked();
231 if ( showLabelLegend )
238 mLayer->setLegendPlaceholderImage( mImageSourceLineEdit->source() );
240 mLayer->setLegend( legend );
243void QgsVectorLayerLegendWidget::labelsFromExpression()
245 QHash<QString, QString> content;
250 if ( !dlgExpression.exec() )
256 std::unique_ptr<QgsFeatureRenderer> r( mLayer->
renderer()->
clone() );
263 r->startRender( context, mLayer->
fields() );
267 const QSet<QString> keys = r->legendKeysForFeature( f, context );
268 for (
const QString &key : keys )
270 if ( content.contains( key ) )
274 if ( !label.isEmpty() )
275 content[key] = label;
278 r->stopRender( context );
280 populateLegendTreeView( content );
283void QgsVectorLayerLegendWidget::applyLabelLegend()
285 const QgsAbstractVectorLayerLabeling *layerLabeling = mLayer->labeling();
286 if ( !layerLabeling )
291 QgsAbstractVectorLayerLabeling *labeling = layerLabeling->
clone();
293 const int nIterations = std::min<int>( ids.size(), mLabelLegendTreeWidget->topLevelItemCount() );
295 for (
int i = 0; i < nIterations; ++i )
297 QTreeWidgetItem *item = mLabelLegendTreeWidget->topLevelItem( i );
300 const QString legendText = item->text( 1 );
302 QgsPalLayerSettings *s =
new QgsPalLayerSettings( labeling->
settings( ids.at( i ) ) );
308 mLayer->setLabeling( labeling );
@ ExcludeByDefault
If set, the layer should not be included in legends by default, and must be manually added by a user.
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
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 QgsAbstractVectorLayerLabeling * clone() const =0
Returns a new copy of the object.
void setCollapsed(bool collapse)
Collapse or uncollapse this groupbox.
A groupbox that collapses/expands when toggled and can save its collapsed and checked states.
Default legend implementation for vector layers.
void setTextOnSymbolEnabled(bool enabled)
Sets whether the "text on symbol" functionality is enabled.
void setTextOnSymbolContent(const QHash< QString, QString > &content)
Sets per-symbol content of labels for "text on symbol" functionality.
void setShowLabelLegend(bool enabled)
Sets if a legend for the labeling should be shown.
bool textOnSymbolEnabled() const
Returns whether the "text on symbol" functionality is enabled.
QgsTextFormat textOnSymbolTextFormat() const
Returns text format of symbol labels for "text on symbol" functionality.
bool showLabelLegend() const
Returns whether the legend for the labeling is shown.
void setTextOnSymbolTextFormat(const QgsTextFormat &format)
Sets text format of symbol labels for "text on symbol" functionality.
QHash< QString, QString > textOnSymbolContent() const
Returns per-symbol content of labels for "text on symbol" functionality.
A generic dialog for building expression strings.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Handles parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
A line edit widget with toolbutton for setting a raster image path.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
void setFlag(Qgis::MapLayerLegendFlag flag, bool on=true)
Enables or disables a particular flag (other flags are not affected).
Qgis::MapLayerLegendFlags flags() const
Returns flags associated with the legend.
QgsMapLayerLegend * legend() const
Can be nullptr.
Contains settings for how a map layer will be labeled.
QString legendString() const
legendString
void setLegendString(const QString &legendString)
setLegendString
Contains information about the context of a rendering operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
A child rule for QgsRuleBasedLabeling.
const QgsRuleBasedLabeling::Rule * findRuleByKey(const QString &key) const
Try to find a rule given its unique key.
QString description() const
A human readable description for this rule.
Rule based labeling for a vector layer.
QgsRuleBasedLabeling::Rule * rootRule()
static QPixmap symbolPreviewPixmap(const QgsSymbol *symbol, QSize size, int padding=0, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a color ramp.
Represents a vector layer which manages a vector based dataset.
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.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
QList< QgsLegendSymbolItem > QgsLegendSymbolList