Skip to content

Commit

Permalink
Further fixes to ensure geometry generator symbol icons are correctly
Browse files Browse the repository at this point in the history
generated
  • Loading branch information
nyalldawson committed Oct 12, 2021
1 parent ce49784 commit 57fda41
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 16 deletions.
Expand Up @@ -266,14 +266,15 @@ Draws a symbol layer preview to a QPicture
.. versionadded:: 2.9
%End

static QIcon symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale() );
static QIcon symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale(), Qgis::SymbolType parentSymbolType = Qgis::SymbolType::Hybrid );
%Docstring
Draws a symbol layer preview to an icon.

:param layer: symbol layer to draw
:param u: size units
:param size: target size of preview icon
:param scale: map unit scale for preview
:param parentSymbolType: since QGIS 3.22, can be used to specify the parent symbol type so that geometry generator preview icons are correctly calculated

:return: icon containing symbol layer preview

Expand Down
17 changes: 16 additions & 1 deletion src/core/symbology/qgssymbol.cpp
Expand Up @@ -577,7 +577,22 @@ void QgsSymbol::drawPreviewIcon( QPainter *painter, QSize size, QgsRenderContext

QgsSymbolRenderContext symbolContext( *context, QgsUnitTypes::RenderUnknownUnit, opacity, false, mRenderHints, nullptr );
symbolContext.setSelected( selected );
symbolContext.setOriginalGeometryType( mType == Qgis::SymbolType::Fill ? QgsWkbTypes::PolygonGeometry : QgsWkbTypes::UnknownGeometry );
switch ( mType )
{
case Qgis::SymbolType::Marker:
symbolContext.setOriginalGeometryType( QgsWkbTypes::PointGeometry );
break;
case Qgis::SymbolType::Line:
symbolContext.setOriginalGeometryType( QgsWkbTypes::LineGeometry );
break;
case Qgis::SymbolType::Fill:
symbolContext.setOriginalGeometryType( QgsWkbTypes::PolygonGeometry );
break;
case Qgis::SymbolType::Hybrid:
symbolContext.setOriginalGeometryType( QgsWkbTypes::UnknownGeometry );
break;
}

if ( patchShape )
symbolContext.setPatchShape( *patchShape );

Expand Down
18 changes: 17 additions & 1 deletion src/core/symbology/qgssymbollayerutils.cpp
Expand Up @@ -858,7 +858,7 @@ QPicture QgsSymbolLayerUtils::symbolLayerPreviewPicture( const QgsSymbolLayer *l
return picture;
}

QIcon QgsSymbolLayerUtils::symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale & )
QIcon QgsSymbolLayerUtils::symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &, Qgis::SymbolType parentSymbolType )
{
QPixmap pixmap( size );
pixmap.fill( Qt::transparent );
Expand All @@ -873,6 +873,22 @@ QIcon QgsSymbolLayerUtils::symbolLayerPreviewIcon( const QgsSymbolLayer *layer,
renderContext.setExpressionContext( expContext );

QgsSymbolRenderContext symbolContext( renderContext, u, 1.0, false, Qgis::SymbolRenderHints(), nullptr );

switch ( parentSymbolType )
{
case Qgis::SymbolType::Marker:
symbolContext.setOriginalGeometryType( QgsWkbTypes::PointGeometry );
break;
case Qgis::SymbolType::Line:
symbolContext.setOriginalGeometryType( QgsWkbTypes::LineGeometry );
break;
case Qgis::SymbolType::Fill:
symbolContext.setOriginalGeometryType( QgsWkbTypes::PolygonGeometry );
break;
case Qgis::SymbolType::Hybrid:
break;
}

std::unique_ptr< QgsSymbolLayer > layerClone( layer->clone() );
layerClone->drawPreviewIcon( symbolContext, size );
painter.end();
Expand Down
3 changes: 2 additions & 1 deletion src/core/symbology/qgssymbollayerutils.h
Expand Up @@ -260,10 +260,11 @@ class CORE_EXPORT QgsSymbolLayerUtils
* \param u size units
* \param size target size of preview icon
* \param scale map unit scale for preview
* \param parentSymbolType since QGIS 3.22, can be used to specify the parent symbol type so that geometry generator preview icons are correctly calculated
* \returns icon containing symbol layer preview
* \see symbolLayerPreviewPicture()
*/
static QIcon symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale() );
static QIcon symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale(), Qgis::SymbolType parentSymbolType = Qgis::SymbolType::Hybrid );

/**
* Returns an icon preview for a color ramp.
Expand Down
2 changes: 1 addition & 1 deletion src/gui/qgsmasksourceselectionwidget.cpp
Expand Up @@ -104,7 +104,7 @@ void QgsMaskSourceSelectionWidget::update()
indexPath.append( idx );

std::unique_ptr< QTreeWidgetItem > slItem = std::make_unique< QTreeWidgetItem >( rootItem );
const QIcon slIcon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( sl, QgsUnitTypes::RenderMillimeters, QSize( iconSize, iconSize ) );
const QIcon slIcon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( sl, QgsUnitTypes::RenderMillimeters, QSize( iconSize, iconSize ), QgsMapUnitScale(), symbol->type() );
slItem->setIcon( 0, slIcon );
if ( sl->layerType() == "MaskMarker" )
{
Expand Down
2 changes: 1 addition & 1 deletion src/gui/qgssymbollayerselectionwidget.cpp
Expand Up @@ -82,7 +82,7 @@ void QgsSymbolLayerSelectionWidget::setLayer( const QgsVectorLayer *layer )
indexPath.append( idx );

QTreeWidgetItem *slItem = new QTreeWidgetItem();
const QIcon slIcon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( sl, QgsUnitTypes::RenderMillimeters, QSize( iconSize, iconSize ) );
const QIcon slIcon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( sl, QgsUnitTypes::RenderMillimeters, QSize( iconSize, iconSize ), QgsMapUnitScale(), symbol->type() );
slItem->setData( 0, Qt::UserRole, idx );
slItem->setIcon( 0, slIcon );
auto flags = slItem->flags();
Expand Down
2 changes: 1 addition & 1 deletion src/gui/symbology/qgssymbollevelsdialog.cpp
Expand Up @@ -112,7 +112,7 @@ void QgsSymbolLevelsWidget::populateTable()
else
{
const QgsSymbolLayer *sl = sym->symbolLayer( layer );
const QIcon icon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( sl, QgsUnitTypes::RenderMillimeters, QSize( iconSize, iconSize ) );
const QIcon icon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( sl, QgsUnitTypes::RenderMillimeters, QSize( iconSize, iconSize ), QgsMapUnitScale(), sym->type() );
item = new QTableWidgetItem( icon, QString::number( sl->renderingPass() ) );
}
tableLevels->setItem( row, layer + 1, item );
Expand Down
21 changes: 12 additions & 9 deletions src/gui/symbology/qgssymbolselectordialog.cpp
Expand Up @@ -125,21 +125,22 @@ void DataDefinedRestorer::restore()
class SymbolLayerItem : public QStandardItem
{
public:
explicit SymbolLayerItem( QgsSymbolLayer *layer )
explicit SymbolLayerItem( QgsSymbolLayer *layer, Qgis::SymbolType symbolType )
{
setLayer( layer );
setLayer( layer, symbolType );
}

explicit SymbolLayerItem( QgsSymbol *symbol )
{
setSymbol( symbol );
}

void setLayer( QgsSymbolLayer *layer )
void setLayer( QgsSymbolLayer *layer, Qgis::SymbolType symbolType )
{
mLayer = layer;
mIsLayer = true;
mSymbol = nullptr;
mSymbolType = symbolType;
updatePreview();
}

Expand All @@ -160,7 +161,7 @@ class SymbolLayerItem : public QStandardItem
}
QIcon icon;
if ( mIsLayer )
icon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( mLayer, QgsUnitTypes::RenderMillimeters, mSize ); //todo: make unit a parameter
icon = QgsSymbolLayerUtils::symbolLayerPreviewIcon( mLayer, QgsUnitTypes::RenderMillimeters, mSize, QgsMapUnitScale(), mSymbol ? mSymbol->type() : mSymbolType ); //todo: make unit a parameter
else
icon = QgsSymbolLayerUtils::symbolPreviewIcon( mSymbol, mSize );
setIcon( icon );
Expand Down Expand Up @@ -226,6 +227,7 @@ class SymbolLayerItem : public QStandardItem
QgsSymbol *mSymbol = nullptr;
bool mIsLayer;
QSize mSize;
Qgis::SymbolType mSymbolType = Qgis::SymbolType::Hybrid;
};

///@endcond
Expand Down Expand Up @@ -388,7 +390,7 @@ void QgsSymbolSelectorWidget::loadSymbol( QgsSymbol *symbol, SymbolLayerItem *pa
const int count = symbol->symbolLayerCount();
for ( int i = count - 1; i >= 0; i-- )
{
SymbolLayerItem *layerItem = new SymbolLayerItem( symbol->symbolLayer( i ) );
SymbolLayerItem *layerItem = new SymbolLayerItem( symbol->symbolLayer( i ), symbol->type() );
layerItem->setEditable( false );
symbolItem->appendRow( layerItem );
if ( symbol->symbolLayer( i )->subSymbol() )
Expand Down Expand Up @@ -615,7 +617,7 @@ void QgsSymbolSelectorWidget::addLayer()
if ( ddWidth )
static_cast<QgsLineSymbol *>( parentSymbol )->setDataDefinedWidth( ddWidth );

SymbolLayerItem *newLayerItem = new SymbolLayerItem( newLayer );
SymbolLayerItem *newLayerItem = new SymbolLayerItem( newLayer, parentSymbol->type() );
item->insertRow( insertIdx == -1 ? 0 : insertIdx, newLayerItem );
item->updatePreview();

Expand Down Expand Up @@ -714,7 +716,7 @@ void QgsSymbolSelectorWidget::duplicateLayer()
else
parentSymbol->insertSymbolLayer( item->rowCount() - insertIdx, newLayer );

SymbolLayerItem *newLayerItem = new SymbolLayerItem( newLayer );
SymbolLayerItem *newLayerItem = new SymbolLayerItem( newLayer, parentSymbol->type() );
item->insertRow( insertIdx == -1 ? 0 : insertIdx, newLayerItem );
if ( newLayer->subSymbol() )
{
Expand All @@ -737,8 +739,10 @@ void QgsSymbolSelectorWidget::changeLayer( QgsSymbolLayer *newLayer )
{
item->removeRow( 0 );
}
QgsSymbol *symbol = static_cast<SymbolLayerItem *>( item->parent() )->symbol();

// update symbol layer item
item->setLayer( newLayer );
item->setLayer( newLayer, symbol->type() );
// When it is a marker symbol
if ( newLayer->subSymbol() )
{
Expand All @@ -747,7 +751,6 @@ void QgsSymbolSelectorWidget::changeLayer( QgsSymbolLayer *newLayer )
}

// Change the symbol at last to avoid deleting item's layer
QgsSymbol *symbol = static_cast<SymbolLayerItem *>( item->parent() )->symbol();
const int layerIdx = item->parent()->rowCount() - item->row() - 1;
symbol->changeSymbolLayer( layerIdx, newLayer );

Expand Down

0 comments on commit 57fda41

Please sign in to comment.