diff --git a/src/dialog/vinsertimagedialog.cpp b/src/dialog/vinsertimagedialog.cpp index 1da7bbc6..1f6884a0 100644 --- a/src/dialog/vinsertimagedialog.cpp +++ b/src/dialog/vinsertimagedialog.cpp @@ -107,7 +107,11 @@ QString VInsertImageDialog::getImageTitleInput() const QString VInsertImageDialog::getPathInput() const { - return m_pathEdit->text(); + if (m_tempFile.isNull()) { + return m_pathEdit->text(); + } else { + return m_tempFile->fileName(); + } } void VInsertImageDialog::handleBrowseBtnClicked() @@ -163,8 +167,38 @@ void VInsertImageDialog::setImage(const QImage &image) void VInsertImageDialog::imageDownloaded(const QByteArray &data) { - m_imageType = ImageType::ImageData; setImage(QImage::fromData(data)); + + // Try to save it to a temp file. + { + if (data.isEmpty()) { + goto image_data; + } + + QString format = QFileInfo(getPathInput()).suffix(); + if (format.isEmpty()) { + goto image_data; + } + + m_tempFile.reset(new QTemporaryFile(QDir::tempPath() + + QDir::separator() + + "XXXXXX." + format)); + if (!m_tempFile->open()) { + goto image_data; + } + + if (m_tempFile->write(data) == -1) { + goto image_data; + } + + m_imageType = ImageType::LocalFile; + m_tempFile->close(); + return; + } + +image_data: + m_tempFile.clear(); + m_imageType = ImageType::ImageData; } QImage VInsertImageDialog::getImage() const diff --git a/src/dialog/vinsertimagedialog.h b/src/dialog/vinsertimagedialog.h index d3608aed..dc6e6977 100644 --- a/src/dialog/vinsertimagedialog.h +++ b/src/dialog/vinsertimagedialog.h @@ -5,6 +5,8 @@ #include #include #include +#include +#include class QLabel; class VLineEdit; @@ -71,6 +73,8 @@ private: bool m_browsable; ImageType m_imageType; + + QSharedPointer m_tempFile; }; inline VInsertImageDialog::ImageType VInsertImageDialog::getImageType() const diff --git a/src/utils/vutils.h b/src/utils/vutils.h index 51c957e5..27681a9a 100644 --- a/src/utils/vutils.h +++ b/src/utils/vutils.h @@ -97,7 +97,8 @@ public: static QJsonObject readJsonFromDisk(const QString &p_filePath); - static QString generateImageFileName(const QString &path, const QString &title, + static QString generateImageFileName(const QString &path, + const QString &title, const QString &format = "png"); // Given the file name @p_fileName and directory path @p_dirPath, generate diff --git a/src/vmdeditoperations.cpp b/src/vmdeditoperations.cpp index af56812d..1e427d56 100644 --- a/src/vmdeditoperations.cpp +++ b/src/vmdeditoperations.cpp @@ -58,8 +58,10 @@ bool VMdEditOperations::insertImageFromMimeData(const QMimeData *source) return true; } -void VMdEditOperations::insertImageFromQImage(const QString &title, const QString &path, - const QString &folderInLink, const QImage &image) +void VMdEditOperations::insertImageFromQImage(const QString &title, + const QString &path, + const QString &folderInLink, + const QImage &image) { QString fileName = VUtils::generateImageFileName(path, title); QString filePath = QDir(path).filePath(fileName); @@ -184,10 +186,17 @@ bool VMdEditOperations::insertImageFromURL(const QUrl &imageUrl) m_file->getImageFolderInLink(), imagePath); } else { - insertImageFromQImage(dialog.getImageTitleInput(), - m_file->fetchImageFolderPath(), - m_file->getImageFolderInLink(), - dialog.getImage()); + if (dialog.getImageType() == VInsertImageDialog::ImageType::LocalFile) { + insertImageFromPath(dialog.getImageTitleInput(), + m_file->fetchImageFolderPath(), + m_file->getImageFolderInLink(), + dialog.getPathInput()); + } else { + insertImageFromQImage(dialog.getImageTitleInput(), + m_file->fetchImageFolderPath(), + m_file->getImageFolderInLink(), + dialog.getImage()); + } } } return true; diff --git a/src/vmdeditor.cpp b/src/vmdeditor.cpp index 18269f55..5846f752 100644 --- a/src/vmdeditor.cpp +++ b/src/vmdeditor.cpp @@ -1822,5 +1822,4 @@ void VMdEditor::exportGraphAndCopy(const QString &p_lang, } m_exportTempFile->close(); - }