23 #include <QToolButton>
24 #include <QHBoxLayout>
25 #include <QFileDialog>
26 #include <QInputDialog>
36 QHBoxLayout *layout =
new QHBoxLayout(
this );
37 layout->setContentsMargins( 0, 0, 0, 0 );
40 mFileToolButton =
new QToolButton(
this );
41 mFileToolButton->setText( QString( QChar( 0x2026 ) ) );
43 layout->addWidget( mFileLineEdit, 1 );
44 layout->addWidget( mFileToolButton );
45 layout->addWidget( mPropertyOverrideButton );
48 QMenu *sourceMenu =
new QMenu( mFileToolButton );
50 QAction *selectFileAction =
new QAction( tr(
"Select File…" ), sourceMenu );
51 connect( selectFileAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::selectFile );
52 sourceMenu->addAction( selectFileAction );
54 QAction *embedFileAction =
new QAction( tr(
"Embed File…" ), sourceMenu );
55 connect( embedFileAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::embedFile );
56 sourceMenu->addAction( embedFileAction );
58 QAction *extractFileAction =
new QAction( tr(
"Extract Embedded File…" ), sourceMenu );
59 connect( extractFileAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::extractFile );
60 sourceMenu->addAction( extractFileAction );
62 connect( sourceMenu, &QMenu::aboutToShow,
this, [
this, extractFileAction]
64 extractFileAction->setEnabled( mMode == ModeBase64 );
67 QAction *enterUrlAction =
new QAction( tr(
"From URL…" ), sourceMenu );
68 connect( enterUrlAction, &QAction::triggered,
this, &QgsAbstractFileContentSourceLineEdit::selectUrl );
69 sourceMenu->addAction( enterUrlAction );
71 mFileToolButton->setMenu( sourceMenu );
72 mFileToolButton->setPopupMode( QToolButton::MenuButtonPopup );
73 connect( mFileToolButton, &QToolButton::clicked,
this, &QgsAbstractFileContentSourceLineEdit::selectFile );
75 connect( mFileLineEdit, &QLineEdit::textEdited,
this, &QgsAbstractFileContentSourceLineEdit::mFileLineEdit_textEdited );
79 mFileLineEdit->setPlaceholderText( QString() );
84 mPropertyOverrideButton->setVisible( mPropertyOverrideButtonVisible );
93 return mFileLineEdit->text();
109 mPropertyOverrideButtonVisible = visible;
110 mPropertyOverrideButton->setVisible( visible );
115 const bool isBase64 =
source.startsWith( QLatin1String(
"base64:" ), Qt::CaseInsensitive );
117 if ( ( !isBase64 &&
source == mFileLineEdit->text() && mBase64.isEmpty() ) || ( isBase64 &&
source == mBase64 ) )
124 mFileLineEdit->clear();
125 mFileLineEdit->setPlaceholderText( tr(
"Embedded file" ) );
131 mFileLineEdit->setText(
source );
132 mFileLineEdit->setPlaceholderText( QString() );
138 void QgsAbstractFileContentSourceLineEdit::selectFile()
141 QString file = QFileDialog::getOpenFileName(
nullptr,
145 QFileInfo fi( file );
146 if ( file.isEmpty() || !fi.exists() || file ==
source() )
152 mFileLineEdit->setText( file );
153 mFileLineEdit->setPlaceholderText( QString() );
154 s.
setValue( settingsKey(), fi.absolutePath() );
158 void QgsAbstractFileContentSourceLineEdit::selectUrl()
161 const QString path = QInputDialog::getText(
this, fileFromUrlTitle(), fileFromUrlText(), QLineEdit::Normal, mFileLineEdit->text(), &ok );
162 if ( ok && path !=
source() )
166 mFileLineEdit->setText( path );
167 mFileLineEdit->setPlaceholderText( QString() );
172 void QgsAbstractFileContentSourceLineEdit::embedFile()
175 QString file = QFileDialog::getOpenFileName(
nullptr,
179 QFileInfo fi( file );
180 if ( file.isEmpty() || !fi.exists() )
185 s.
setValue( settingsKey(), fi.absolutePath() );
188 QFile fileSource( file );
189 if ( !fileSource.open( QIODevice::ReadOnly ) )
194 QByteArray blob = fileSource.readAll();
195 QByteArray encoded = blob.toBase64();
197 QString path( encoded );
198 path.prepend( QLatin1String(
"base64:" ) );
205 mFileLineEdit->clear();
206 mFileLineEdit->setPlaceholderText( tr(
"Embedded file" ) );
211 void QgsAbstractFileContentSourceLineEdit::extractFile()
214 QString file = QFileDialog::getSaveFileName(
nullptr,
218 if ( file.isEmpty() )
223 QFileInfo fi( file );
224 s.
setValue( settingsKey(), fi.absolutePath() );
227 QByteArray base64 = mBase64.mid( 7 ).toLocal8Bit();
228 QByteArray decoded = QByteArray::fromBase64( base64, QByteArray::OmitTrailingEquals );
230 QFile fileOut( file );
231 fileOut.open( QIODevice::WriteOnly );
232 fileOut.write( decoded );
238 tr(
"Successfully extracted file to <a href=\"%1\">%2</a>" ).arg( QUrl::fromLocalFile( file ).toString(), QDir::toNativeSeparators( file ) ),
243 void QgsAbstractFileContentSourceLineEdit::mFileLineEdit_textEdited(
const QString &text )
245 mFileLineEdit->setPlaceholderText( QString() );
248 if ( !text.isEmpty() && !QFileInfo::exists( text ) )
251 if ( !url.isValid() )
259 QString QgsAbstractFileContentSourceLineEdit::defaultPath()
const
261 if ( QFileInfo::exists(
source() ) )
267 QString QgsAbstractFileContentSourceLineEdit::settingsKey()
const
269 return mLastPathKey.isEmpty() ? defaultSettingsKey() : mLastPathKey;
278 QString QgsSvgSourceLineEdit::fileFilter()
const
280 return tr(
"SVG files" ) +
" (*.svg)";
283 QString QgsSvgSourceLineEdit::selectFileTitle()
const
285 return tr(
"Select SVG File" );
288 QString QgsSvgSourceLineEdit::fileFromUrlTitle()
const
290 return tr(
"SVG From URL" );
293 QString QgsSvgSourceLineEdit::fileFromUrlText()
const
295 return tr(
"Enter SVG URL" );
298 QString QgsSvgSourceLineEdit::embedFileTitle()
const
300 return tr(
"Embed SVG File" );
303 QString QgsSvgSourceLineEdit::extractFileTitle()
const
305 return tr(
"Extract SVG File" );
308 QString QgsSvgSourceLineEdit::defaultSettingsKey()
const
310 return QStringLiteral(
"/UI/lastSVGDir" );
320 QString QgsImageSourceLineEdit::fileFilter()
const
322 return tr(
"All files" ) +
" (*.*)";
325 QString QgsImageSourceLineEdit::selectFileTitle()
const
327 return tr(
"Select Image File" );
330 QString QgsImageSourceLineEdit::fileFromUrlTitle()
const
332 return tr(
"Image From URL" );
335 QString QgsImageSourceLineEdit::fileFromUrlText()
const
337 return tr(
"Enter image URL" );
340 QString QgsImageSourceLineEdit::embedFileTitle()
const
342 return tr(
"Embed Image File" );
345 QString QgsImageSourceLineEdit::extractFileTitle()
const
347 return tr(
"Extract Image File" );
350 QString QgsImageSourceLineEdit::defaultSettingsKey()
const
352 return QStringLiteral(
"/UI/lastImageDir" );
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::Info, int duration=-1)
A convenience method for pushing a message with the specified text to the bar.
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.