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;
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,8 +870,11 @@ void MarkdownEditor::insertImageFromMimeData(const QMimeData *p_source)
}
}
void MarkdownEditor::insertImageFromUrl(const QString &p_url)
void MarkdownEditor::insertImageFromUrl(const QString &p_url, bool p_quiet)
{
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) {
@ -821,6 +895,7 @@ void MarkdownEditor::insertImageFromUrl(const QString &p_url)
}
}
}
}
QString MarkdownEditor::getRelativeLink(const QString &p_path)
{

View File

@ -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);