19 #include <QStandardItemModel>
21 #include <QTreeWidget>
37 mLegendTreeView =
new QTreeView;
38 mLegendTreeView->setRootIsDecorated(
false );
40 mTextOnSymbolFormatButton =
new QgsFontButton(
nullptr, tr(
"Legend Text Format" ) );
41 mTextOnSymbolFormatButton->setText( tr(
"Text Format" ) );
44 mTextOnSymbolFromExpressionButton =
new QPushButton( tr(
"Set Labels from Expression…" ) );
45 connect( mTextOnSymbolFromExpressionButton, &QPushButton::clicked,
this, &QgsVectorLayerLegendWidget::labelsFromExpression );
49 QHBoxLayout *buttonsLayout =
new QHBoxLayout;
50 buttonsLayout->addWidget( mTextOnSymbolFormatButton );
51 buttonsLayout->addWidget( mTextOnSymbolFromExpressionButton );
52 buttonsLayout->addStretch();
54 QVBoxLayout *groupLayout =
new QVBoxLayout;
55 groupLayout->addWidget( mLegendTreeView );
56 groupLayout->addLayout( buttonsLayout );
58 mTextOnSymbolGroupBox->setTitle( tr(
"Text on Symbols" ) );
59 mTextOnSymbolGroupBox->setCheckable(
true );
60 mTextOnSymbolGroupBox->setLayout( groupLayout );
64 mLabelLegendGroupBox->setCheckable(
true );
65 mLabelLegendGroupBox->setTitle( tr(
"Show Label Legend" ) );
67 mLabelLegendTreeWidget =
new QTreeWidget;
68 connect( mLabelLegendTreeWidget, &QTreeWidget::itemDoubleClicked,
this, &QgsVectorLayerLegendWidget::labelLegendTreeWidgetItemDoubleClicked );
69 QVBoxLayout *labelLegendLayout =
new QVBoxLayout;
70 labelLegendLayout->addWidget( mLabelLegendTreeWidget );
71 mLabelLegendGroupBox->setLayout( labelLegendLayout );
73 mPlaceholderImageLabel =
new QLabel( tr(
"Legend placeholder image" ) );
81 QHBoxLayout *placeholderLayout =
new QHBoxLayout;
82 placeholderLayout->addWidget( mPlaceholderImageLabel );
83 placeholderLayout->addWidget( mImageSourceLineEdit );
85 QVBoxLayout *layout =
new QVBoxLayout;
86 layout->setContentsMargins( 0, 0, 0, 0 );
87 layout->addLayout( placeholderLayout );
88 layout->addWidget( mLabelLegendGroupBox );
89 layout->addWidget( mTextOnSymbolGroupBox );
94 void QgsVectorLayerLegendWidget::labelLegendTreeWidgetItemDoubleClicked( QTreeWidgetItem *item,
int column )
96 const Qt::ItemFlags flags = item->flags();
99 item->setFlags( flags | Qt::ItemIsEditable );
103 item->setFlags( flags & ( ~Qt::ItemIsEditable ) );
122 populateLabelLegendTreeWidget();
132 void QgsVectorLayerLegendWidget::populateLabelLegendTreeWidget()
134 mLabelLegendTreeWidget->clear();
135 mLabelLegendTreeWidget->setColumnCount( 2 );
136 QTreeWidgetItem *headerItem =
new QTreeWidgetItem( QStringList() << tr(
"Description" ) << tr(
"Legend Text" ) );
137 mLabelLegendTreeWidget->setHeaderItem( headerItem );
143 for (
int i = 0; i < pList.size(); ++i )
148 if ( ruleBasedLabeling && ruleBasedLabeling->
rootRule() )
157 QTreeWidgetItem *labelItem =
new QTreeWidgetItem( QStringList() << description << s.
legendString() );
158 labelItem->setData( 0, Qt::UserRole, pList.at( i ) );
159 mLabelLegendTreeWidget->addTopLevelItem( labelItem );
165 void QgsVectorLayerLegendWidget::populateLegendTreeView(
const QHash<QString, QString> &content )
167 QStandardItemModel *model =
new QStandardItemModel(
this );
168 model->setColumnCount( 2 );
169 model->setHorizontalHeaderLabels( QStringList() << tr(
"Symbol" ) << tr(
"Text" ) );
174 if ( !symbolItem.symbol() )
181 QStandardItem *item1 =
new QStandardItem( icon, symbolItem.label() );
182 item1->setEditable(
false );
183 QStandardItem *item2 =
new QStandardItem;
184 if ( symbolItem.ruleKey().isEmpty() )
186 item1->setEnabled(
false );
187 item2->setEnabled(
false );
191 item1->setData( symbolItem.ruleKey() );
192 if ( content.contains( symbolItem.ruleKey() ) )
193 item2->setText( content.value( symbolItem.ruleKey() ) );
195 model->appendRow( QList<QStandardItem *>() << item1 << item2 );
197 mLegendTreeView->setModel( model );
198 mLegendTreeView->resizeColumnToContents( 0 );
208 QHash<QString, QString> content;
209 if ( QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mLegendTreeView->model() ) )
211 for (
int i = 0; i < model->rowCount(); ++i )
213 const QString ruleKey = model->item( i, 0 )->data().toString();
214 const QString label = model->item( i, 1 )->text();
215 if ( !label.isEmpty() )
216 content[ruleKey] = label;
221 const bool showLabelLegend = mLabelLegendGroupBox->isChecked();
223 if ( showLabelLegend )
233 void QgsVectorLayerLegendWidget::labelsFromExpression()
235 QHash<QString, QString> content;
240 if ( !dlgExpression.exec() )
246 std::unique_ptr< QgsFeatureRenderer > r( mLayer->
renderer()->
clone() );
253 r->startRender( context, mLayer->
fields() );
257 const QSet<QString> keys = r->legendKeysForFeature( f, context );
258 for (
const QString &key : keys )
260 if ( content.contains( key ) )
264 if ( !label.isEmpty() )
265 content[key] = label;
268 r->stopRender( context );
270 populateLegendTreeView( content );
273 void QgsVectorLayerLegendWidget::applyLabelLegend()
276 if ( !layerLabeling )
283 const int nIterations = std::min< int >( ids.size(), mLabelLegendTreeWidget->topLevelItemCount() );
285 for (
int i = 0; i < nIterations; ++i )
287 QTreeWidgetItem *item = mLabelLegendTreeWidget->topLevelItem( i );
290 const QString legendText = item->text( 1 );