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.
 
Stores settings for use within QGIS.
 
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