17#include "moc_qgsdatadefinedsizelegendwidget.cpp" 
   19#include <QInputDialog> 
   20#include <QStyledItemDelegate> 
   38  , mSizeProperty( ddSize )
 
   39  , mMapCanvas( canvas )
 
   46  std::unique_ptr< QgsMarkerSymbol > symbol;
 
   50    radDisabled->setChecked( 
true );
 
   55      radSeparated->setChecked( 
true );
 
   57      radCollapsed->setChecked( 
true );
 
   60      cboAlignSymbols->setCurrentIndex( 0 );
 
   62      cboAlignSymbols->setCurrentIndex( 1 );
 
   69  groupBoxOptions->setEnabled( radSeparated->isChecked() );
 
   73    symbol.reset( overrideSymbol ); 
 
   74    mOverrideSymbol = 
true;
 
   81  mSourceSymbol = std::move( symbol );
 
   83  btnChangeSymbol->setEnabled( !mOverrideSymbol );
 
   86  btnChangeSymbol->setIcon( icon );
 
   88  editTitle->setText( ddsLegend ? ddsLegend->
title() : QString() );
 
   90  mSizeClassesModel = 
new QStandardItemModel( viewSizeClasses );
 
   91  mSizeClassesModel->setHorizontalHeaderLabels( QStringList() << tr( 
"Value" ) << tr( 
"Label" ) );
 
   92  mSizeClassesModel->setSortRole( Qt::UserRole + 1 );
 
   95    groupManualSizeClasses->setChecked( !ddsLegend->
classes().isEmpty() );
 
   96    const auto constClasses = ddsLegend->
classes();
 
   99      QStandardItem *item = 
new QStandardItem( QLocale().toString( sc.size ) );
 
  100      item->setData( sc.size );
 
  101      QStandardItem *itemLabel = 
new QStandardItem( sc.label );
 
  102      mSizeClassesModel->appendRow( QList<QStandardItem *>() << item << itemLabel );
 
  104    mSizeClassesModel->sort( 0 );
 
  107  connect( btnAddClass, &QToolButton::clicked, 
this, &QgsDataDefinedSizeLegendWidget::addSizeClass );
 
  108  connect( btnRemoveClass, &QToolButton::clicked, 
this, &QgsDataDefinedSizeLegendWidget::removeSizeClass );
 
  110  viewSizeClasses->setItemDelegateForColumn( 0, 
new SizeClassDelegate( viewSizeClasses ) );
 
  111  viewSizeClasses->setModel( mSizeClassesModel );
 
  112  connect( mSizeClassesModel, &QStandardItemModel::dataChanged, 
this, &QgsDataDefinedSizeLegendWidget::onSizeClassesChanged );
 
  116  mPreviewLayer = 
new QgsVectorLayer( QStringLiteral( 
"Point?crs=EPSG:4326" ), QStringLiteral( 
"Preview" ), QStringLiteral( 
"memory" ), options );
 
  118  mPreviewLayerNode = mPreviewTree->
addLayer( mPreviewLayer ); 
 
  122  viewLayerTree->setModel( mPreviewModel );
 
  124  connect( cboAlignSymbols, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, [
this] { emit 
widgetChanged(); } );
 
  129  connect( btnChangeSymbol, &QPushButton::clicked, 
this, &QgsDataDefinedSizeLegendWidget::changeSymbol );
 
  133  connect( radCollapsed, &QRadioButton::toggled, 
this, [
this]( 
bool toggled ) { groupBoxOptions->setEnabled( toggled ); } );
 
 
  139  delete mPreviewModel;
 
  141  delete mPreviewLayer;
 
 
  146  if ( radDisabled->isChecked() )
 
  152  if ( !mOverrideSymbol )
 
  154    ddsLegend->
setSymbol( mSourceSymbol->clone() );
 
  157  ddsLegend->
setTitle( editTitle->text() );
 
  159  if ( groupManualSizeClasses->isChecked() )
 
  161    QList<QgsDataDefinedSizeLegend::SizeClass> classes;
 
  162    for ( 
int i = 0; i < mSizeClassesModel->rowCount(); ++i )
 
  164      const double value = mSizeClassesModel->item( i, 0 )->data().toDouble();
 
  165      const QString label = mSizeClassesModel->item( i, 1 )->text();
 
 
  175void QgsDataDefinedSizeLegendWidget::updatePreview()
 
  183  viewLayerTree->expandAll();
 
  186void QgsDataDefinedSizeLegendWidget::changeSymbol()
 
  188  std::unique_ptr<QgsMarkerSymbol> newSymbol( mSourceSymbol->clone() );
 
  209  const std::unique_ptr<QgsVectorLayer> layer = std::make_unique<QgsVectorLayer>( QStringLiteral( 
"Point?crs=%1" ).arg( crsAuthId ), QStringLiteral( 
"tmp" ), QStringLiteral( 
"memory" ), options );
 
  212  d.setContext( context );
 
  214  if ( d.exec() != QDialog::Accepted )
 
  217  mSourceSymbol = std::move( newSymbol );
 
  219  btnChangeSymbol->setIcon( icon );
 
  224void QgsDataDefinedSizeLegendWidget::addSizeClass()
 
  227  const double v = QInputDialog::getDouble( 
this, tr( 
"Add Size Class" ), tr( 
"Enter value for a new class" ), 0, -2147483647, 2147483647, 6, &ok );
 
  231  QStandardItem *item = 
new QStandardItem( QLocale().toString( v ) );
 
  233  QStandardItem *itemLabel = 
new QStandardItem( QLocale().toString( v ) );
 
  234  mSizeClassesModel->appendRow( QList<QStandardItem *>() << item << itemLabel );
 
  235  mSizeClassesModel->sort( 0 );
 
  239void QgsDataDefinedSizeLegendWidget::removeSizeClass()
 
  241  const QModelIndex idx = viewSizeClasses->currentIndex();
 
  242  if ( !idx.isValid() )
 
  245  mSizeClassesModel->removeRow( idx.row() );
 
  249void QgsDataDefinedSizeLegendWidget::onSizeClassesChanged()
 
  251  for ( 
int row = 0; row < mSizeClassesModel->rowCount(); ++row )
 
  253    QStandardItem *item = mSizeClassesModel->item( row, 0 );
 
  257  mSizeClassesModel->sort( 0 );
 
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
 
void setTitle(const QString &title)
Sets title label for data-defined size legend.
 
QList< QgsDataDefinedSizeLegend::SizeClass > classes() const
Returns list of classes: each class is a pair of symbol size (in units used by the symbol) and label.
 
void setSymbol(QgsMarkerSymbol *symbol SIP_TRANSFER)
Sets marker symbol that will be used to draw markers in legend.
 
void setVerticalAlignment(VerticalAlignment vAlign)
Sets vertical alignment of symbols - only valid for collapsed legend.
 
void setLineSymbol(QgsLineSymbol *symbol SIP_TRANSFER)
Sets the line symbol that will be used to draw callout lines in legend.
 
LegendType legendType() const
Returns how the legend should be rendered.
 
QgsMarkerSymbol * symbol() const
Returns marker symbol that will be used to draw markers in legend.
 
@ AlignCenter
Symbols are aligned to the center.
 
@ AlignBottom
Symbols are aligned to the bottom.
 
void setClasses(const QList< QgsDataDefinedSizeLegend::SizeClass > &classes)
Sets list of classes: each class is a pair of symbol size (in units used by the symbol) and label.
 
void setLegendType(LegendType type)
Sets how the legend should be rendered.
 
QString title() const
Returns title label for data-defined size legend.
 
@ LegendSeparated
Each class (size value) has a separate legend node.
 
@ LegendCollapsed
All classes are rendered within one legend node.
 
QgsLineSymbol * lineSymbol() const
Returns the line symbol that will be used to draw callout lines in legend.
 
VerticalAlignment verticalAlignment() const
Returns vertical alignment of symbols - only valid for collapsed legend.
 
static double toDouble(const QString &input, bool *ok)
Converts input string to double value.
 
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
 
static QgsExpressionContextScope * atlasScope(const QgsLayoutAtlas *atlas)
Creates a new scope which contains variables and functions relating to a QgsLayoutAtlas.
 
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
 
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
QgsLayerTreeLayer * addLayer(QgsMapLayer *layer)
Append a new layer node for given map layer.
 
A model representing the layer tree, including layers and groups of layers.
 
void setLegendMapViewData(double mapUnitsPerPixel, int dpi, double scale)
Give the layer tree model hints about the currently associated map view so that legend nodes that use...
 
void refreshLayerLegend(QgsLayerTreeLayer *nodeLayer)
Force a refresh of legend nodes of a layer node.
 
Namespace with helper functions for layer tree operations.
 
A line symbol type, for rendering LineString and MultiLineString geometries.
 
QgsLineSymbol * clone() const override
Returns a deep copy of this symbol.
 
Map canvas is a class for displaying all GIS data types on a canvas.
 
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
 
double scale() const
Returns the last reported scale of the canvas.
 
double mapUnitsPerPixel() const
Returns the mapUnitsPerPixel (map units per pixel) for the canvas.
 
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
 
Contains configuration for rendering maps.
 
double outputDpi() const
Returns the DPI (dots per inch) used for conversion between real world units (e.g.
 
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
 
A marker symbol type, for rendering Point and MultiPoint geometries.
 
static std::unique_ptr< QgsMarkerSymbol > createSimple(const QVariantMap &properties)
Create a marker symbol with one symbol layer: SimpleMarker with specified properties.
 
void setDataDefinedSize(const QgsProperty &property) const
Set data defined size for whole symbol (including all symbol layers).
 
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
QgsCoordinateTransformContext transformContext
 
A store for object properties.
 
Stores properties relating to a screen.
 
A feature renderer which renders all features with the same symbol.
 
void setDataDefinedSizeLegend(QgsDataDefinedSizeLegend *settings)
Configures appearance of legend when renderer is configured to use data-defined size for marker symbo...
 
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
 
static QIcon symbolPreviewIcon(const QgsSymbol *symbol, QSize size, int padding=0, QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns an icon preview for a color ramp.
 
A dialog that can be used to select and build a symbol.
 
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
 
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
 
void setExpressionContext(QgsExpressionContext *context)
Sets the optional expression context used for the widget.
 
Represents a vector layer which manages a vector based dataset.
 
void setRenderer(QgsFeatureRenderer *r)
Sets the feature renderer which will be invoked to represent this layer in 2D map views.
 
Definition of one class for the legend.
 
Setting options for loading vector layers.