17#include "moc_qgsfilecontentsourcelineedit.cpp"
25#include <QImageReader>
26#include <QInputDialog>
40 QHBoxLayout *layout =
new QHBoxLayout(
this );
41 layout->setContentsMargins( 0, 0, 0, 0 );
44 mFileToolButton =
new QToolButton(
this );
45 mFileToolButton->setText( QString( QChar( 0x2026 ) ) );
47 layout->addWidget( mFileLineEdit, 1 );
48 layout->addWidget( mFileToolButton );
49 layout->addWidget( mPropertyOverrideButton );
52 QMenu *sourceMenu =
new QMenu( mFileToolButton );
54 QAction *selectFileAction =
new QAction( tr(
"Select File…" ), sourceMenu );
55 connect( selectFileAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::selectFile );
56 sourceMenu->addAction( selectFileAction );
58 QAction *embedFileAction =
new QAction( tr(
"Embed File…" ), sourceMenu );
59 connect( embedFileAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::embedFile );
60 sourceMenu->addAction( embedFileAction );
62 QAction *extractFileAction =
new QAction( tr(
"Extract Embedded File…" ), sourceMenu );
63 connect( extractFileAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::extractFile );
64 sourceMenu->addAction( extractFileAction );
66 connect( sourceMenu, &QMenu::aboutToShow,
this, [
this, extractFileAction] {
67 extractFileAction->setEnabled( mMode == ModeBase64 );
70 QAction *enterUrlAction =
new QAction( tr(
"From URL…" ), sourceMenu );
71 connect( enterUrlAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::selectUrl );
72 sourceMenu->addAction( enterUrlAction );
74 mFileToolButton->setMenu( sourceMenu );
75 mFileToolButton->setPopupMode( QToolButton::MenuButtonPopup );
76 connect( mFileToolButton, &QToolButton::clicked,
this, &QgsAbstractFileContentSourceLineEdit::selectFile );
78 connect( mFileLineEdit, &QLineEdit::textEdited,
this, &QgsAbstractFileContentSourceLineEdit::mFileLineEdit_textEdited );
81 mFileLineEdit->setPlaceholderText( QString() );
86 mPropertyOverrideButton->setVisible( mPropertyOverrideButtonVisible );
94 return mFileLineEdit->text();
110 mPropertyOverrideButtonVisible = visible;
111 mPropertyOverrideButton->setVisible( visible );
116 const bool isBase64 =
source.startsWith( QLatin1String(
"base64:" ), Qt::CaseInsensitive );
118 if ( ( !isBase64 &&
source == mFileLineEdit->text() && mBase64.isEmpty() ) || ( isBase64 &&
source == mBase64 ) )
125 mFileLineEdit->clear();
126 mFileLineEdit->setPlaceholderText( tr(
"Embedded file" ) );
132 mFileLineEdit->setText(
source );
133 mFileLineEdit->setPlaceholderText( QString() );
139void QgsAbstractFileContentSourceLineEdit::selectFile()
142 const QString file = QFileDialog::getOpenFileName(
nullptr, selectFileTitle(), defaultPath(), fileFilter() );
143 const QFileInfo fi( file );
144 if ( file.isEmpty() || !fi.exists() || file ==
source() )
150 mFileLineEdit->setText( file );
151 mFileLineEdit->setPlaceholderText( QString() );
152 s.
setValue( settingsKey(), fi.absolutePath() );
156void QgsAbstractFileContentSourceLineEdit::selectUrl()
159 const QString path = QInputDialog::getText(
this, fileFromUrlTitle(), fileFromUrlText(), QLineEdit::Normal, mFileLineEdit->text(), &ok );
160 if ( ok && path !=
source() )
164 mFileLineEdit->setText( path );
165 mFileLineEdit->setPlaceholderText( QString() );
170void QgsAbstractFileContentSourceLineEdit::embedFile()
173 const QString file = QFileDialog::getOpenFileName(
nullptr, embedFileTitle(), defaultPath(), fileFilter() );
174 const QFileInfo fi( file );
175 if ( file.isEmpty() || !fi.exists() )
180 s.
setValue( settingsKey(), fi.absolutePath() );
183 QFile fileSource( file );
184 if ( !fileSource.open( QIODevice::ReadOnly ) )
189 const QByteArray blob = fileSource.readAll();
190 const QByteArray encoded = blob.toBase64();
192 QString path( encoded );
193 path.prepend( QLatin1String(
"base64:" ) );
200 mFileLineEdit->clear();
201 mFileLineEdit->setPlaceholderText( tr(
"Embedded file" ) );
206void QgsAbstractFileContentSourceLineEdit::extractFile()
209 const QString file = QFileDialog::getSaveFileName(
nullptr, extractFileTitle(), defaultPath(), fileFilter() );
213 if ( file.isEmpty() )
218 const QFileInfo fi( file );
219 s.
setValue( settingsKey(), fi.absolutePath() );
222 const QByteArray base64 = mBase64.mid( 7 ).toLocal8Bit();
223 const QByteArray decoded = QByteArray::fromBase64( base64, QByteArray::OmitTrailingEquals );
225 QFile fileOut( file );
226 fileOut.open( QIODevice::WriteOnly );
227 fileOut.write( decoded );
232 mMessageBar->
pushMessage( extractFileTitle(), tr(
"Successfully extracted file to <a href=\"%1\">%2</a>" ).arg( QUrl::fromLocalFile( file ).toString(), QDir::toNativeSeparators( file ) ),
Qgis::MessageLevel::Success, 0 );
236void QgsAbstractFileContentSourceLineEdit::mFileLineEdit_textEdited(
const QString &text )
238 mFileLineEdit->setPlaceholderText( QString() );
241 if ( !text.isEmpty() && !QFileInfo::exists( text ) )
243 const QUrl url( text );
244 if ( !url.isValid() )
252QString QgsAbstractFileContentSourceLineEdit::defaultPath()
const
254 if ( QFileInfo::exists(
source() ) )
260QString QgsAbstractFileContentSourceLineEdit::settingsKey()
const
262 return mLastPathKey.isEmpty() ? defaultSettingsKey() : mLastPathKey;
283QString QgsPictureSourceLineEditBase::fileFilter()
const
288 return tr(
"SVG files" ) +
" (*.svg)";
291 QStringList formatsFilter;
292 const QByteArrayList supportedFormats = QImageReader::supportedImageFormats();
293 for (
const auto &format : supportedFormats )
295 formatsFilter.append( QString( QStringLiteral(
"*.%1" ) ).arg( QString( format ) ) );
297 return QString(
"%1 (%2);;%3 (*.*)" ).arg( tr(
"Images" ), formatsFilter.join( QLatin1Char(
' ' ) ), tr(
"All files" ) );
302 QStringList formatsFilter;
303 const QByteArrayList supportedFormats = QMovie::supportedFormats();
304 for (
const auto &format : supportedFormats )
306 formatsFilter.append( QString( QStringLiteral(
"*.%1" ) ).arg( QString( format ) ) );
308 return QString(
"%1 (%2);;%3 (*.*)" ).arg( tr(
"Animated Images" ), formatsFilter.join( QLatin1Char(
' ' ) ), tr(
"All files" ) );
314QString QgsPictureSourceLineEditBase::selectFileTitle()
const
319 return tr(
"Select SVG File" );
321 return tr(
"Select Image File" );
323 return tr(
"Select Animated Image File" );
328QString QgsPictureSourceLineEditBase::fileFromUrlTitle()
const
333 return tr(
"SVG From URL" );
335 return tr(
"Image From URL" );
337 return tr(
"Animated Image From URL" );
342QString QgsPictureSourceLineEditBase::fileFromUrlText()
const
347 return tr(
"Enter SVG URL" );
349 return tr(
"Enter image URL" );
351 return tr(
"Enter animated image URL" );
356QString QgsPictureSourceLineEditBase::embedFileTitle()
const
361 return tr(
"Embed SVG File" );
363 return tr(
"Embed Image File" );
365 return tr(
"Embed Animated Image File" );
370QString QgsPictureSourceLineEditBase::extractFileTitle()
const
375 return tr(
"Extract SVG File" );
377 return tr(
"Extract Image File" );
379 return tr(
"Extract Animated Image File" );
384QString QgsPictureSourceLineEditBase::defaultSettingsKey()
const
389 return QStringLiteral(
"/UI/lastSVGDir" );
391 return QStringLiteral(
"/UI/lastImageDir" );
393 return QStringLiteral(
"/UI/lastAnimatedImageDir" );
@ Success
Used for reporting a successful operation.
void setLastPathSettingsKey(const QString &key)
Sets a specific settings key to use when storing the last used path for the file source.
void sourceChanged(const QString &source)
Emitted whenever the file source is changed in the widget.
void setMessageBar(QgsMessageBar *bar)
Sets the message bar associated with the widget.
void setPropertyOverrideToolButtonVisible(bool visible)
Sets the visibility of the property override tool button.
QgsMessageBar * messageBar() const
Returns the message bar associated with the widget.
void setSource(const QString &source)
Sets a new source to show in the widget.
QgsAbstractFileContentSourceLineEdit(QWidget *parent=nullptr)
Constructor for QgsAbstractFileContentSourceLineEdit, with the specified parent widget.
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
void setShowClearButton(bool visible)
Sets whether the widget's clear button is visible.
void cleared()
Emitted when the widget is cleared.
A bar for displaying non-blocking messages to the user.
void pushMessage(const QString &text, Qgis::MessageLevel level=Qgis::MessageLevel::Info, int duration=-1)
A convenience method for pushing a message with the specified text to the bar.
@ AnimatedImage
Animated image.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
#define BUILTIN_UNREACHABLE