فهرست منبع

feature/support_insert_multiple_mimedata (#2339)

* feature/support_insert_multiple_mimedata

* format

* reset

* adj

* adj isProcess

* adj func name

* adj logic and name
chendapao 2 سال پیش
والد
کامیت
c255cd54ed
2فایلهای تغییر یافته به همراه97 افزوده شده و 19 حذف شده
  1. 93 18
      src/widgets/editors/markdowneditor.cpp
  2. 4 1
      src/widgets/editors/markdowneditor.h

+ 93 - 18
src/widgets/editors/markdowneditor.cpp

@@ -529,6 +529,11 @@ void MarkdownEditor::handleInsertFromMimeData(const QMimeData *p_source, bool *p
         *p_handled = true;
         return;
     }
+
+    if (processMultipleUrlsFromMimeData(p_source)) {
+        *p_handled = true;
+        return;
+    }
 }
 
 bool MarkdownEditor::processHtmlFromMimeData(const QMimeData *p_source)
@@ -610,9 +615,13 @@ bool MarkdownEditor::processImageFromMimeData(const QMimeData *p_source)
 
 bool MarkdownEditor::processUrlFromMimeData(const QMimeData *p_source)
 {
+    const auto urls = p_source->urls();
+    if (urls.size() > 1) {
+        return false;
+    }
+
     QUrl url;
     if (p_source->hasUrls()) {
-        const auto urls = p_source->urls();
         if (urls.size() == 1) {
             url = urls[0];
         }
@@ -781,6 +790,68 @@ bool MarkdownEditor::processUrlFromMimeData(const QMimeData *p_source)
     return false;
 }
 
+bool MarkdownEditor::processMultipleUrlsFromMimeData(const QMimeData *p_source) {
+    const auto urls = p_source->urls();
+    if (urls.size() <= 1) {
+        return false;
+    }
+
+    bool isProcessed = false;
+    // Judgment if all QMimeData are images.
+    bool isAllImage = true;
+    for (const QUrl &url : urls) {
+        if (!PathUtils::isImageUrl(PathUtils::urlToPath(url))) {
+            isAllImage = false;
+            break;
+        }
+    }
+
+    SelectDialog dialog(tr("Insert From Clipboard (%n items)", "", urls.size()), this);
+    if (isAllImage) {
+        dialog.addSelection(tr("Insert As Image"), 0);
+    }
+    if (m_buffer->isAttachmentSupported()) {
+        dialog.addSelection(tr("Attach And Insert Link"), 1);
+    }
+    dialog.setMinimumWidth(400);
+
+    if (dialog.exec() == QDialog::Accepted) {
+        switch (dialog.getSelection()) {
+        case 0:
+        {
+            // Insert As Image.
+            for (const QUrl &url : urls) {
+                insertImageFromUrl(PathUtils::urlToPath(url), true);
+                m_textEdit->insertPlainText("\n\n");
+            }
+            isProcessed = true;
+            break;
+        }
+        case 1:
+        {
+            // Attach And Insert Link.
+            QStringList fileList;
+            for (const QUrl &url : urls) {
+                fileList << url.toLocalFile();
+            }
+            fileList = m_buffer->addAttachment(QString(), fileList);
+            enterInsertModeIfApplicable();
+            for (int i = 0; i < fileList.length(); ++i) {
+                vte::MarkdownUtils::typeLink(
+                            m_textEdit, QFileInfo(fileList[i]).fileName(),
+                            getRelativeLink(fileList[i]));
+
+                m_textEdit->insertPlainText("\n\n");
+            }
+            isProcessed = true;
+            break;
+        }
+        }
+    }
+
+    return isProcessed;
+}
+
 void MarkdownEditor::insertImageFromMimeData(const QMimeData *p_source)
 {
     QImage image = qvariant_cast<QImage>(p_source->imageData());
@@ -799,24 +870,28 @@ void MarkdownEditor::insertImageFromMimeData(const QMimeData *p_source)
     }
 }
 
-void MarkdownEditor::insertImageFromUrl(const QString &p_url)
+void MarkdownEditor::insertImageFromUrl(const QString &p_url, bool p_quiet)
 {
-    ImageInsertDialog dialog(tr("Insert Image From URL"), "", "", "", false, this);
-    dialog.setImagePath(p_url);
-    if (dialog.exec() == QDialog::Accepted) {
-        enterInsertModeIfApplicable();
-        if (dialog.getImageSource() == ImageInsertDialog::Source::LocalFile) {
-            insertImageToBufferFromLocalFile(dialog.getImageTitle(),
-                                             dialog.getImageAltText(),
-                                             dialog.getImagePath(),
-                                             dialog.getScaledWidth());
-        } else {
-            auto image = dialog.getImage();
-            if (!image.isNull()) {
-                insertImageToBufferFromData(dialog.getImageTitle(),
-                                            dialog.getImageAltText(),
-                                            image,
-                                            dialog.getScaledWidth());
+    if (p_quiet) {
+        insertImageToBufferFromLocalFile("", "", p_url, 0);
+    } else {
+        ImageInsertDialog dialog(tr("Insert Image From URL"), "", "", "", false, this);
+        dialog.setImagePath(p_url);
+        if (dialog.exec() == QDialog::Accepted) {
+            enterInsertModeIfApplicable();
+            if (dialog.getImageSource() == ImageInsertDialog::Source::LocalFile) {
+                insertImageToBufferFromLocalFile(dialog.getImageTitle(),
+                                                 dialog.getImageAltText(),
+                                                 dialog.getImagePath(),
+                                                 dialog.getScaledWidth());
+            } else {
+                auto image = dialog.getImage();
+                if (!image.isNull()) {
+                    insertImageToBufferFromData(dialog.getImageTitle(),
+                                                dialog.getImageAltText(),
+                                                image,
+                                                dialog.getScaledWidth());
+                }
             }
         }
     }

+ 4 - 1
src/widgets/editors/markdowneditor.h

@@ -165,9 +165,12 @@ namespace vnotex
         // Return true if it is processed.
         bool processUrlFromMimeData(const QMimeData *p_source);
 
+        // Return true if it is processed.
+        bool processMultipleUrlsFromMimeData(const QMimeData *p_source);
+
         void insertImageFromMimeData(const QMimeData *p_source);
 
-        void insertImageFromUrl(const QString &p_url);
+        void insertImageFromUrl(const QString &p_url, bool p_quiet = false);
 
         QString getRelativeLink(const QString &p_path);