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.