feature/support_insert_multiple_mimedata (#2339)

* feature/support_insert_multiple_mimedata

* format

* reset

* adj

* adj isProcess

* adj func name

* adj logic and name
This commit is contained in:
chendapao 2023-02-03 10:53:29 +08:00 committed by GitHub
parent 075380749c
commit c255cd54ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 97 additions and 19 deletions

View File

@ -529,6 +529,11 @@ void MarkdownEditor::handleInsertFromMimeData(const QMimeData *p_source, bool *p
*p_handled = true; *p_handled = true;
return; return;
} }
if (processMultipleUrlsFromMimeData(p_source)) {
*p_handled = true;
return;
}
} }
bool MarkdownEditor::processHtmlFromMimeData(const QMimeData *p_source) 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) bool MarkdownEditor::processUrlFromMimeData(const QMimeData *p_source)
{ {
const auto urls = p_source->urls();
if (urls.size() > 1) {
return false;
}
QUrl url; QUrl url;
if (p_source->hasUrls()) { if (p_source->hasUrls()) {
const auto urls = p_source->urls();
if (urls.size() == 1) { if (urls.size() == 1) {
url = urls[0]; url = urls[0];
} }
@ -781,6 +790,68 @@ bool MarkdownEditor::processUrlFromMimeData(const QMimeData *p_source)
return false; 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) void MarkdownEditor::insertImageFromMimeData(const QMimeData *p_source)
{ {
QImage image = qvariant_cast<QImage>(p_source->imageData()); 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); if (p_quiet) {
dialog.setImagePath(p_url); insertImageToBufferFromLocalFile("", "", p_url, 0);
if (dialog.exec() == QDialog::Accepted) { } else {
enterInsertModeIfApplicable(); ImageInsertDialog dialog(tr("Insert Image From URL"), "", "", "", false, this);
if (dialog.getImageSource() == ImageInsertDialog::Source::LocalFile) { dialog.setImagePath(p_url);
insertImageToBufferFromLocalFile(dialog.getImageTitle(), if (dialog.exec() == QDialog::Accepted) {
dialog.getImageAltText(), enterInsertModeIfApplicable();
dialog.getImagePath(), if (dialog.getImageSource() == ImageInsertDialog::Source::LocalFile) {
dialog.getScaledWidth()); insertImageToBufferFromLocalFile(dialog.getImageTitle(),
} else { dialog.getImageAltText(),
auto image = dialog.getImage(); dialog.getImagePath(),
if (!image.isNull()) { dialog.getScaledWidth());
insertImageToBufferFromData(dialog.getImageTitle(), } else {
dialog.getImageAltText(), auto image = dialog.getImage();
image, if (!image.isNull()) {
dialog.getScaledWidth()); insertImageToBufferFromData(dialog.getImageTitle(),
dialog.getImageAltText(),
image,
dialog.getScaledWidth());
}
} }
} }
} }

View File

@ -165,9 +165,12 @@ namespace vnotex
// Return true if it is processed. // Return true if it is processed.
bool processUrlFromMimeData(const QMimeData *p_source); 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 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); QString getRelativeLink(const QString &p_path);