Skip to content

Commit 51b2ce4

Browse files
committed
[FEATURE] Raster image marker can have images set to remote URLS
or as embedded files Just like the SVG marker, raster markers can now be set to use HTTP(s) URLs or have files directly embedded inside the symbol itself.
1 parent e6bbcbb commit 51b2ce4

File tree

3 files changed

+230
-277
lines changed

3 files changed

+230
-277
lines changed

src/gui/symbology/qgssymbollayerwidget.cpp

+9-58
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "qgsnewauxiliarylayerdialog.h"
4242
#include "qgsnewauxiliaryfielddialog.h"
4343
#include "qgsauxiliarystorage.h"
44+
#include "qgsimagecache.h"
4445

4546
#include <QAbstractButton>
4647
#include <QButtonGroup>
@@ -3081,8 +3082,9 @@ QgsRasterMarkerSymbolLayerWidget::QgsRasterMarkerSymbolLayerWidget( QgsVectorLay
30813082

30823083
setupUi( this );
30833084

3084-
connect( mBrowseToolButton, &QToolButton::clicked, this, &QgsRasterMarkerSymbolLayerWidget::mBrowseToolButton_clicked );
3085-
connect( mImageLineEdit, &QLineEdit::editingFinished, this, &QgsRasterMarkerSymbolLayerWidget::mImageLineEdit_editingFinished );
3085+
mImageSourceLineEdit->setLastPathSettingsKey( QStringLiteral( "/UI/lastRasterMarkerImageDir" ) );
3086+
3087+
connect( mImageSourceLineEdit, &QgsImageSourceLineEdit::sourceChanged, this, &QgsRasterMarkerSymbolLayerWidget::imageSourceChanged );
30863088
connect( mOffsetUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsRasterMarkerSymbolLayerWidget::mOffsetUnitWidget_changed );
30873089
connect( mRotationSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsRasterMarkerSymbolLayerWidget::setAngle );
30883090
connect( mSizeUnitWidget, &QgsUnitSelectionWidget::changed, this, &QgsRasterMarkerSymbolLayerWidget::mSizeUnitWidget_changed );
@@ -3121,7 +3123,7 @@ void QgsRasterMarkerSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer *layer )
31213123
mLayer = static_cast<QgsRasterMarkerSymbolLayer *>( layer );
31223124

31233125
// set values
3124-
whileBlocking( mImageLineEdit )->setText( mLayer->path() );
3126+
whileBlocking( mImageSourceLineEdit )->setSource( mLayer->path() );
31253127

31263128
whileBlocking( mWidthSpinBox )->setValue( mLayer->size() );
31273129
bool preservedAspectRatio = mLayer->preservedAspectRatio();
@@ -3174,74 +3176,23 @@ QgsSymbolLayer *QgsRasterMarkerSymbolLayerWidget::symbolLayer()
31743176
return mLayer;
31753177
}
31763178

3177-
void QgsRasterMarkerSymbolLayerWidget::mBrowseToolButton_clicked()
3179+
void QgsRasterMarkerSymbolLayerWidget::imageSourceChanged( const QString &text )
31783180
{
3179-
QgsSettings s;
3180-
QString openDir;
3181-
QString lineEditText = mImageLineEdit->text();
3182-
if ( !lineEditText.isEmpty() )
3183-
{
3184-
QFileInfo openDirFileInfo( lineEditText );
3185-
openDir = openDirFileInfo.path();
3186-
}
3187-
3188-
if ( openDir.isEmpty() )
3189-
{
3190-
openDir = s.value( QStringLiteral( "/UI/lastRasterMarkerImageDir" ), QDir::homePath() ).toString();
3191-
}
3192-
3193-
//show file dialog
3194-
QString filePath = QFileDialog::getOpenFileName( nullptr, tr( "Select Image File" ), openDir );
3195-
if ( !filePath.isNull() )
3196-
{
3197-
//check if file exists
3198-
QFileInfo fileInfo( filePath );
3199-
if ( !fileInfo.exists() || !fileInfo.isReadable() )
3200-
{
3201-
QMessageBox::critical( nullptr, QStringLiteral( "Select Image File" ), QStringLiteral( "Error, file does not exist or is not readable." ) );
3202-
return;
3203-
}
3204-
3205-
s.setValue( QStringLiteral( "/UI/lastRasterMarkerImageDir" ), fileInfo.absolutePath() );
3206-
mImageLineEdit->setText( filePath );
3207-
mImageLineEdit_editingFinished();
3208-
}
3209-
}
3210-
3211-
void QgsRasterMarkerSymbolLayerWidget::mImageLineEdit_editingFinished()
3212-
{
3213-
QFileInfo fi( mImageLineEdit->text() );
3214-
if ( !fi.exists() )
3215-
{
3216-
QUrl url( mImageLineEdit->text() );
3217-
if ( !url.isValid() )
3218-
{
3219-
return;
3220-
}
3221-
}
3222-
3223-
QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
3224-
mLayer->setPath( mImageLineEdit->text() );
3181+
mLayer->setPath( text );
32253182
updatePreviewImage();
3226-
QApplication::restoreOverrideCursor();
3227-
32283183
emit changed();
32293184
}
32303185

32313186
void QgsRasterMarkerSymbolLayerWidget::updatePreviewImage()
32323187
{
3233-
QImage image( mLayer->path() );
3188+
bool fitsInCache = false;
3189+
QImage image = QgsApplication::imageCache()->pathAsImage( mLayer->path(), QSize( 150, 150 ), true, 1.0, fitsInCache );
32343190
if ( image.isNull() )
32353191
{
32363192
mLabelImagePreview->setPixmap( QPixmap() );
32373193
return;
32383194
}
32393195

3240-
if ( image.height() > 150 || image.width() > 150 )
3241-
{
3242-
image = image.scaled( 150, 150, Qt::KeepAspectRatio, Qt::SmoothTransformation );
3243-
}
3244-
32453196
QImage previewImage( 150, 150, QImage::Format_ARGB32 );
32463197
previewImage.fill( Qt::transparent );
32473198
QRect imageRect( ( 150 - image.width() ) / 2.0, ( 150 - image.height() ) / 2.0, image.width(), image.height() );

src/gui/symbology/qgssymbollayerwidget.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -609,8 +609,7 @@ class GUI_EXPORT QgsRasterMarkerSymbolLayerWidget : public QgsSymbolLayerWidget,
609609
QgsRasterMarkerSymbolLayer *mLayer = nullptr;
610610

611611
private slots:
612-
void mBrowseToolButton_clicked();
613-
void mImageLineEdit_editingFinished();
612+
void imageSourceChanged( const QString &text );
614613
void mSizeUnitWidget_changed();
615614
void mOffsetUnitWidget_changed();
616615
void mHorizontalAnchorComboBox_currentIndexChanged( int index );

0 commit comments

Comments
 (0)