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 );