From c255cd54edeb56f9ea5048d4468837bffda6835e Mon Sep 17 00:00:00 2001 From: chendapao Date: Fri, 3 Feb 2023 10:53:29 +0800 Subject: [PATCH] feature/support_insert_multiple_mimedata (#2339) * feature/support_insert_multiple_mimedata * format * reset * adj * adj isProcess * adj func name * adj logic and name --- src/widgets/editors/markdowneditor.cpp | 111 +++++++++++++++++++++---- src/widgets/editors/markdowneditor.h | 5 +- 2 files changed, 97 insertions(+), 19 deletions(-) diff --git a/src/widgets/editors/markdowneditor.cpp b/src/widgets/editors/markdowneditor.cpp index e443b534..0a39593c 100644 --- a/src/widgets/editors/markdowneditor.cpp +++ b/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(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()); + } } } } diff --git a/src/widgets/editors/markdowneditor.h b/src/widgets/editors/markdowneditor.h index 631d2bde..02b7ddfa 100644 --- a/src/widgets/editors/markdowneditor.h +++ b/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);