Browse Source

support downloading image from URL

Signed-off-by: Le Tan <[email protected]>
Le Tan 9 years ago
parent
commit
435d47bb74

+ 12 - 0
src/dialog/vinsertimagedialog.cpp

@@ -118,3 +118,15 @@ void VInsertImageDialog::setBrowseable(bool browseable)
     pathEdit->setVisible(browseable);
     browseBtn->setVisible(browseable);
 }
+
+void VInsertImageDialog::imageDownloaded(const QByteArray &data)
+{
+    setImage(QImage::fromData(data));
+}
+
+QImage VInsertImageDialog::getImage() const
+{
+    if (!image) {
+        return QImage();
+    } else return *image;
+}

+ 5 - 0
src/dialog/vinsertimagedialog.h

@@ -4,6 +4,7 @@
 #include <QDialog>
 #include <QImage>
 #include <QString>
+#include <QByteArray>
 
 class QLabel;
 class QLineEdit;
@@ -21,8 +22,12 @@ public:
     QString getPathInput() const;
 
     void setImage(const QImage &image);
+    QImage getImage() const;
     void setBrowseable(bool browseable);
 
+public slots:
+    void imageDownloaded(const QByteArray &data);
+
 private slots:
     void enableOkButton();
     void handleBrowseBtnClicked();

+ 5 - 3
src/src.pro

@@ -4,7 +4,7 @@
 #
 #-------------------------------------------------
 
-QT       += core gui webenginewidgets webchannel
+QT       += core gui webenginewidgets webchannel network
 
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
@@ -39,7 +39,8 @@ SOURCES += main.cpp\
     dialog/vfileinfodialog.cpp \
     veditoperations.cpp \
     vmdeditoperations.cpp \
-    dialog/vinsertimagedialog.cpp
+    dialog/vinsertimagedialog.cpp \
+    vdownloader.cpp
 
 HEADERS  += vmainwindow.h \
     vdirectorytree.h \
@@ -69,7 +70,8 @@ HEADERS  += vmainwindow.h \
     dialog/vfileinfodialog.h \
     veditoperations.h \
     vmdeditoperations.h \
-    dialog/vinsertimagedialog.h
+    dialog/vinsertimagedialog.h \
+    vdownloader.h
 
 RESOURCES += \
     vnote.qrc

+ 23 - 0
src/vdownloader.cpp

@@ -0,0 +1,23 @@
+#include "vdownloader.h"
+
+VDownloader::VDownloader(QObject *parent)
+    : QObject(parent)
+{
+    connect(&webCtrl, &QNetworkAccessManager::finished,
+            this, &VDownloader::handleDownloadFinished);
+}
+
+void VDownloader::handleDownloadFinished(QNetworkReply *reply)
+{
+    data = reply->readAll();
+    reply->deleteLater();
+    emit downloadFinished(data);
+}
+
+void VDownloader::download(QUrl url)
+{
+    Q_ASSERT(url.isValid());
+    QNetworkRequest request(url);
+    webCtrl.get(request);
+    qDebug() << "VDownloader get" << url.toString();
+}

+ 29 - 0
src/vdownloader.h

@@ -0,0 +1,29 @@
+#ifndef VDOWNLOADER_H
+#define VDOWNLOADER_H
+
+#include <QObject>
+#include <QUrl>
+#include <QByteArray>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
+class VDownloader : public QObject
+{
+    Q_OBJECT
+public:
+    explicit VDownloader(QObject *parent = 0);
+    void download(QUrl url);
+
+signals:
+    void downloadFinished(const QByteArray &data);
+
+private slots:
+    void handleDownloadFinished(QNetworkReply *reply);
+
+private:
+    QNetworkAccessManager webCtrl;
+    QByteArray data;
+};
+
+#endif // VDOWNLOADER_H

+ 91 - 49
src/vmdeditoperations.cpp

@@ -12,6 +12,7 @@
 #include "vnotefile.h"
 #include "utils/vutils.h"
 #include "vedit.h"
+#include "vdownloader.h"
 
 VMdEditOperations::VMdEditOperations(VEdit *editor, VNoteFile *noteFile)
     : VEditOperations(editor, noteFile)
@@ -29,55 +30,96 @@ bool VMdEditOperations::insertImageFromMimeData(const QMimeData *source)
     dialog.setBrowseable(false);
     dialog.setImage(image);
     if (dialog.exec() == QDialog::Accepted) {
-        QString title = dialog.getImageTitleInput();
-        QString path = QDir::cleanPath(QDir(noteFile->basePath).filePath("images"));
-        QString fileName = VUtils::generateImageFileName(path, title);
-        qDebug() << "insert image" << path << title << fileName;
-        QString filePath = QDir(path).filePath(fileName);
-        Q_ASSERT(!QFile(filePath).exists());
-        bool ret = image.save(filePath);
-        if (!ret) {
-            QMessageBox msgBox(QMessageBox::Warning, QObject::tr("Warning"), QString("Fail to save image %1").arg(filePath),
-                               QMessageBox::Ok, (QWidget *)editor);
-            msgBox.exec();
-            return true;
-        }
-
-        QString md = QString("![%1](images/%2)").arg(title).arg(fileName);
-        insertTextAtCurPos(md);
+        insertImageFromQImage(dialog.getImageTitleInput(),
+                              QDir::cleanPath(QDir(noteFile->basePath).filePath("images")),
+                              image);
     }
     return true;
 }
 
-bool VMdEditOperations::insertImageFromPath(const QString &imagePath)
+void VMdEditOperations::insertImageFromQImage(const QString &title, const QString &path,
+                                              const QImage &image)
 {
-    QImage image(imagePath);
-    if (image.isNull()) {
-        qWarning() << "error: image is null";
-        return false;
+    QString fileName = VUtils::generateImageFileName(path, title);
+    qDebug() << "insert image" << path << title << fileName;
+    QString filePath = QDir(path).filePath(fileName);
+    Q_ASSERT(!QFile(filePath).exists());
+    bool ret = image.save(filePath);
+    if (!ret) {
+        QMessageBox msgBox(QMessageBox::Warning, QObject::tr("Warning"), QString("Fail to save image %1").arg(filePath),
+                           QMessageBox::Ok, (QWidget *)editor);
+        msgBox.exec();
+        return;
     }
-    VInsertImageDialog dialog(QObject::tr("Insert image from file"), QObject::tr("image_title"),
-                              "", (QWidget *)editor);
-    dialog.setBrowseable(false);
-    dialog.setImage(image);
-    if (dialog.exec() == QDialog::Accepted) {
-        QString title = dialog.getImageTitleInput();
-        QString path = QDir::cleanPath(QDir(noteFile->basePath).filePath("images"));
-        QString fileName = VUtils::generateImageFileName(path, title, QFileInfo(imagePath).suffix());
-        qDebug() << "insert image" << path << title << fileName;
-        QString filePath = QDir(path).filePath(fileName);
-        Q_ASSERT(!QFile(filePath).exists());
-        bool ret = QFile::copy(imagePath, filePath);
-        if (!ret) {
-            qWarning() << "error: fail to copy" << imagePath << "to" << filePath;
-            QMessageBox msgBox(QMessageBox::Warning, QObject::tr("Warning"), QString("Fail to save image %1").arg(filePath),
-                               QMessageBox::Ok, (QWidget *)editor);
-            msgBox.exec();
+
+    QString md = QString("![%1](images/%2)").arg(title).arg(fileName);
+    insertTextAtCurPos(md);
+}
+
+void VMdEditOperations::insertImageFromPath(const QString &title,
+                                            const QString &path, const QString &oriImagePath)
+{
+    QString fileName = VUtils::generateImageFileName(path, title, QFileInfo(oriImagePath).suffix());
+    qDebug() << "insert image" << path << title << fileName << oriImagePath;
+    QString filePath = QDir(path).filePath(fileName);
+    Q_ASSERT(!QFile(filePath).exists());
+    bool ret = QFile::copy(oriImagePath, filePath);
+    if (!ret) {
+        qWarning() << "error: fail to copy" << oriImagePath << "to" << filePath;
+        QMessageBox msgBox(QMessageBox::Warning, QObject::tr("Warning"), QString("Fail to save image %1").arg(filePath),
+                           QMessageBox::Ok, (QWidget *)editor);
+        msgBox.exec();
+        return;
+    }
+
+    QString md = QString("![%1](images/%2)").arg(title).arg(fileName);
+    insertTextAtCurPos(md);
+}
+
+bool VMdEditOperations::insertImageFromURL(const QUrl &imageUrl)
+{
+    QString imagePath;
+    QImage image;
+    bool isLocal = imageUrl.isLocalFile();
+    QString title;
+
+    // Whether it is a local file or web URL
+    if (isLocal) {
+        imagePath = imageUrl.toLocalFile();
+        image = QImage(imagePath);
+
+        if (image.isNull()) {
+            qWarning() << "error: image is null";
             return false;
         }
+        title = "Insert image from file";
+    } else {
+        imagePath = imageUrl.toString();
+        title = "Insert image from network";
+    }
+
 
-        QString md = QString("![%1](images/%2)").arg(title).arg(fileName);
-        insertTextAtCurPos(md);
+    VInsertImageDialog dialog(title, QObject::tr("image_title"), imagePath, (QWidget *)editor);
+    dialog.setBrowseable(false);
+    if (isLocal) {
+        dialog.setImage(image);
+    } else {
+        // Download it to a QImage
+        VDownloader *downloader = new VDownloader(&dialog);
+        QObject::connect(downloader, &VDownloader::downloadFinished,
+                         &dialog, &VInsertImageDialog::imageDownloaded);
+        downloader->download(imageUrl.toString());
+    }
+    if (dialog.exec() == QDialog::Accepted) {
+        if (isLocal) {
+            insertImageFromPath(dialog.getImageTitleInput(),
+                                QDir::cleanPath(QDir(noteFile->basePath).filePath("images")),
+                                imagePath);
+        } else {
+            insertImageFromQImage(dialog.getImageTitleInput(),
+                                QDir::cleanPath(QDir(noteFile->basePath).filePath("images")),
+                                dialog.getImage());
+        }
     }
     return true;
 }
@@ -85,17 +127,17 @@ bool VMdEditOperations::insertImageFromPath(const QString &imagePath)
 bool VMdEditOperations::insertURLFromMimeData(const QMimeData *source)
 {
     foreach (QUrl url, source->urls()) {
+        QString urlStr;
         if (url.isLocalFile()) {
-            QFileInfo info(url.toLocalFile());
-            if (QImageReader::supportedImageFormats().contains(info.suffix().toLower().toLatin1())) {
-                insertImageFromPath(info.filePath());
-            } else {
-                insertTextAtCurPos(url.toLocalFile());
-            }
+            urlStr = url.toLocalFile();
+        } else {
+            urlStr = url.toString();
+        }
+        QFileInfo info(urlStr);
+        if (QImageReader::supportedImageFormats().contains(info.suffix().toLower().toLatin1())) {
+            insertImageFromURL(url);
         } else {
-            // TODO: download http image
-            // Just insert the URL for non-image
-            insertTextAtCurPos(url.toString());
+            insertTextAtCurPos(urlStr);
         }
     }
     return true;

+ 6 - 1
src/vmdeditoperations.h

@@ -2,6 +2,9 @@
 #define VMDEDITOPERATIONS_H
 
 #include <QObject>
+#include <QString>
+#include <QUrl>
+#include <QImage>
 #include "veditoperations.h"
 
 // Editor operations for Markdown
@@ -11,7 +14,9 @@ public:
     VMdEditOperations(VEdit *editor, VNoteFile *noteFile);
     bool insertImageFromMimeData(const QMimeData *source) Q_DECL_OVERRIDE;
     bool insertURLFromMimeData(const QMimeData *source) Q_DECL_OVERRIDE;
-    bool insertImageFromPath(const QString &imagePath);
+    bool insertImageFromURL(const QUrl &imageUrl);
+    void insertImageFromPath(const QString &title, const QString &path, const QString &oriImagePath);
+    void insertImageFromQImage(const QString &title, const QString &path, const QImage &image);
 };
 
 #endif // VMDEDITOPERATIONS_H