35#include <QApplication>
37#include <QDesktopServices>
39#include <QImageReader>
43#include "moc_qgsimagedroptextedit.cpp"
46QgsImageDropTextEdit::QgsImageDropTextEdit( QWidget *parent )
49 setTextInteractionFlags( Qt::TextEditorInteraction | Qt::LinksAccessibleByMouse );
52QgsImageDropTextEdit::~QgsImageDropTextEdit() =
default;
54bool QgsImageDropTextEdit::canInsertFromMimeData(
const QMimeData *source )
const
56 if ( source->hasImage() || QTextEdit::canInsertFromMimeData( source ) )
59 const QList<QUrl> urls = source->urls();
61 files.reserve( urls.size() );
62 for (
const QUrl &url : urls )
64 QString fileName = url.toLocalFile();
67 if ( !fileName.isEmpty() )
74 for (
const QString &file : std::as_const( files ) )
77 const QList<QByteArray> formats = QImageReader::supportedImageFormats();
78 for (
const QByteArray &format : formats )
80 if ( fi.suffix().compare( format, Qt::CaseInsensitive ) == 0 )
91void QgsImageDropTextEdit::insertFromMimeData(
const QMimeData *source )
93 if ( source->hasImage() )
95 const QStringList formats = source->formats();
97 for (
const QString &
string : formats )
99 if (
string == QLatin1String(
"image/bmp" ) )
101 format = QStringLiteral(
"BMP" );
104 if (
string == QLatin1String(
"image/jpeg" ) )
106 format = QStringLiteral(
"JPG" );
109 if (
string == QLatin1String(
"image/jpg" ) )
111 format = QStringLiteral(
"JPG" );
114 if (
string == QLatin1String(
"image/gif" ) )
116 format = QStringLiteral(
"GIF" );
119 if (
string == QLatin1String(
"image/png" ) )
121 format = QStringLiteral(
"PNG" );
124 if (
string == QLatin1String(
"image/pbm" ) )
126 format = QStringLiteral(
"PBM" );
129 if (
string == QLatin1String(
"image/pgm" ) )
131 format = QStringLiteral(
"PGM" );
134 if (
string == QLatin1String(
"image/ppm" ) )
136 format = QStringLiteral(
"PPM" );
139 if (
string == QLatin1String(
"image/tiff" ) )
141 format = QStringLiteral(
"TIFF" );
144 if (
string == QLatin1String(
"image/xbm" ) )
146 format = QStringLiteral(
"XBM" );
149 if (
string == QLatin1String(
"image/xpm" ) )
151 format = QStringLiteral(
"XPM" );
155 if ( !format.isEmpty() )
157 dropImage( qvariant_cast<QImage>( source->imageData() ), format );
163 const QList<QUrl> urls = source->urls();
165 files.reserve( urls.size() );
166 for (
const QUrl &url : urls )
168 if ( url.isLocalFile() )
170 QString fileName = url.toLocalFile();
173 if ( !fileName.isEmpty() )
184 for (
const QString &file : std::as_const( files ) )
186 const QFileInfo fi( file );
187 const QList<QByteArray> formats = QImageReader::supportedImageFormats();
188 bool isImage =
false;
189 for (
const QByteArray &format : formats )
191 if ( fi.suffix().compare( format, Qt::CaseInsensitive ) == 0 )
193 const QImage image( file );
194 dropImage( image, format );
201 dropLink( QUrl::fromLocalFile( file ) );
204 if ( !files.empty() )
208 QTextEdit::insertFromMimeData( source );
211void QgsImageDropTextEdit::mouseMoveEvent( QMouseEvent *e )
213 QTextEdit::mouseMoveEvent( e );
214 mActiveAnchor = anchorAt( e->pos() );
215 if ( !mActiveAnchor.isEmpty() && !mCursorOverride )
216 mCursorOverride = std::make_unique<QgsTemporaryCursorOverride>( Qt::PointingHandCursor );
217 else if ( mActiveAnchor.isEmpty() && mCursorOverride )
218 mCursorOverride.reset();
221void QgsImageDropTextEdit::mouseReleaseEvent( QMouseEvent *e )
223 if ( e->button() == Qt::LeftButton && !mActiveAnchor.isEmpty() )
225 QDesktopServices::openUrl( QUrl( mActiveAnchor ) );
226 if ( mCursorOverride )
227 mCursorOverride.reset();
228 mActiveAnchor.clear();
232 QTextEdit::mouseReleaseEvent( e );
236void QgsImageDropTextEdit::dropImage(
const QImage &image,
const QString &format )
239 QBuffer buffer( &bytes );
240 buffer.open( QIODevice::WriteOnly );
241 image.save( &buffer, format.toLocal8Bit().data() );
243 QByteArray base64 = bytes.toBase64();
245 for (
int i = 0; i < base64.size(); i++ )
247 base64l.append( base64[i] );
250 base64l.append(
"\n" );
254 QTextCursor cursor = textCursor();
255 QTextImageFormat imageFormat;
256 imageFormat.setWidth( image.width() );
257 imageFormat.setHeight( image.height() );
258 imageFormat.setName( QStringLiteral(
"data:image/%1;base64,%2" )
259 .arg( QStringLiteral(
"%1.%2" ).arg( rand() ).arg( format ), base64l.data() )
261 cursor.insertImage( imageFormat );
264void QgsImageDropTextEdit::dropLink(
const QUrl &url )
266 QTextCursor cursor = textCursor();
267 cursor.insertHtml( QStringLiteral(
"<a href=\"%1\">%1</a>" ).arg( url.toString() ) );