diff --git a/src/dialog/vinsertlinkdialog.cpp b/src/dialog/vinsertlinkdialog.cpp index 47950481..19f01403 100644 --- a/src/dialog/vinsertlinkdialog.cpp +++ b/src/dialog/vinsertlinkdialog.cpp @@ -9,8 +9,10 @@ VInsertLinkDialog::VInsertLinkDialog(const QString &p_title, const QString &p_info, const QString &p_linkText, const QString &p_linkUrl, + bool p_linkTextEmptyAllowed, QWidget *p_parent) - : QDialog(p_parent) + : QDialog(p_parent), + m_linkTextEmptyAllowed(p_linkTextEmptyAllowed) { setupUI(p_title, p_text, p_info, p_linkText, p_linkUrl); @@ -80,7 +82,8 @@ void VInsertLinkDialog::setupUI(const QString &p_title, void VInsertLinkDialog::handleInputChanged() { bool textOk = true; - if (m_linkTextEdit->getEvaluatedText().isEmpty()) { + if (m_linkTextEdit->getEvaluatedText().isEmpty() + && !m_linkTextEmptyAllowed) { textOk = false; } diff --git a/src/dialog/vinsertlinkdialog.h b/src/dialog/vinsertlinkdialog.h index c9c8c7d1..633289e1 100644 --- a/src/dialog/vinsertlinkdialog.h +++ b/src/dialog/vinsertlinkdialog.h @@ -18,6 +18,7 @@ public: const QString &p_info, const QString &p_linkText, const QString &p_linkUrl, + bool p_linkTextEmptyAllowed, QWidget *p_parent = nullptr); QString getLinkText() const; @@ -45,6 +46,8 @@ private: VLineEdit *m_linkUrlEdit; QDialogButtonBox *m_btnBox; + + bool m_linkTextEmptyAllowed; }; #endif // VINSERTLINKDIALOG_H diff --git a/src/veditor.cpp b/src/veditor.cpp index 28b298b3..311dcb17 100644 --- a/src/veditor.cpp +++ b/src/veditor.cpp @@ -394,6 +394,7 @@ void VEditor::insertLink() "", linkText, linkUrl, + false, m_editor); if (dialog.exec() == QDialog::Accepted) { linkText = dialog.getLinkText(); diff --git a/src/vmdeditoperations.cpp b/src/vmdeditoperations.cpp index 2093f046..12b4c1c5 100644 --- a/src/vmdeditoperations.cpp +++ b/src/vmdeditoperations.cpp @@ -1050,3 +1050,16 @@ bool VMdEditOperations::insertLink(const QString &p_linkText, return true; } + +bool VMdEditOperations::insertImageLink(const QString &p_linkText, + const QString &p_linkUrl) +{ + QString link = QString("![%1](%2)").arg(p_linkText).arg(p_linkUrl); + QTextCursor cursor = m_editor->textCursorW(); + cursor.insertText(link); + m_editor->setTextCursorW(cursor); + + setVimMode(VimMode::Insert); + + return true; +} diff --git a/src/vmdeditoperations.h b/src/vmdeditoperations.h index dc53e03d..cb4f2c1b 100644 --- a/src/vmdeditoperations.h +++ b/src/vmdeditoperations.h @@ -32,6 +32,8 @@ public: // If it is Vim Normal mode, change to Insert mode first. void decorateText(TextDecoration p_decoration, int p_level = -1) Q_DECL_OVERRIDE; + bool insertImageLink(const QString &p_linkText, const QString &p_linkUrl); + private: // Insert image from @oriImagePath as @path. // @folderInLink: the folder part in the image link. diff --git a/src/vmdeditor.cpp b/src/vmdeditor.cpp index b589fa73..6f677b8d 100644 --- a/src/vmdeditor.cpp +++ b/src/vmdeditor.cpp @@ -21,6 +21,7 @@ #include "utils/viconutils.h" #include "dialog/vcopytextashtmldialog.h" #include "utils/vwebutils.h" +#include "dialog/vinsertlinkdialog.h" extern VWebUtils *g_webUtils; @@ -728,28 +729,57 @@ bool VMdEditor::canInsertFromMimeData(const QMimeData *p_source) const void VMdEditor::insertFromMimeData(const QMimeData *p_source) { - VSelectDialog dialog(tr("Insert From Clipboard"), this); - dialog.addSelection(tr("Insert As Image"), 0); - dialog.addSelection(tr("Insert As Text"), 1); - if (p_source->hasHtml()) { // Handle . QRegExp reg("]*)src=\"([^\"]+)\"([^>]*)>"); if (reg.indexIn(p_source->html()) != -1) { + if (p_source->hasImage()) { + // Both image data and URL are embedded. + VSelectDialog dialog(tr("Insert From Clipboard"), this); + dialog.addSelection(tr("Insert From URL"), 0); + dialog.addSelection(tr("Insert From Image Data"), 1); + dialog.addSelection(tr("Insert As Image Link"), 2); + + if (dialog.exec() == QDialog::Accepted) { + int selection = dialog.getSelection(); + if (selection == 1) { + // Insert from image data. + m_editOps->insertImageFromMimeData(p_source); + return; + } else if (selection == 2) { + // Insert as link. + insertImageLink("", reg.cap(2)); + return; + } + } else { + return; + } + } + m_editOps->insertImageFromURL(QUrl(reg.cap(2))); return; } } + VSelectDialog dialog(tr("Insert From Clipboard"), this); + dialog.addSelection(tr("Insert As Image"), 0); + dialog.addSelection(tr("Insert As Text"), 1); + dialog.addSelection(tr("Insert As Image Link"), 2); + if (p_source->hasImage()) { // Image data in the clipboard if (p_source->hasText()) { if (dialog.exec() == QDialog::Accepted) { - if (dialog.getSelection() == 1) { + int selection = dialog.getSelection(); + if (selection == 1) { // Insert as text. Q_ASSERT(p_source->hasText() && p_source->hasImage()); VTextEdit::insertFromMimeData(p_source); return; + } else if (selection == 2) { + // Insert as link. + insertImageLink("", p_source->text()); + return; } } else { return; @@ -765,10 +795,15 @@ void VMdEditor::insertFromMimeData(const QMimeData *p_source) if (urls.size() == 1 && VUtils::isImageURL(urls[0])) { if (dialog.exec() == QDialog::Accepted) { // FIXME: After calling dialog.exec(), p_source->hasUrl() returns false. - if (dialog.getSelection() == 0) { + int selection = dialog.getSelection(); + if (selection == 0) { // Insert as image. m_editOps->insertImageFromURL(urls[0]); return; + } else if (selection == 2) { + // Insert as link. + insertImageLink("", urls[0].toString(QUrl::FullyEncoded)); + return; } QMimeData newSource; @@ -786,12 +821,18 @@ void VMdEditor::insertFromMimeData(const QMimeData *p_source) if (VUtils::isImageURLText(text)) { // The text is a URL to an image. if (dialog.exec() == QDialog::Accepted) { - if (dialog.getSelection() == 0) { + int selection = dialog.getSelection(); + if (selection == 0) { // Insert as image. QUrl url(text); if (url.isValid()) { m_editOps->insertImageFromURL(QUrl(text)); } + + return; + } else if (selection == 2) { + // Insert as link. + insertImageLink("", text); return; } } else { @@ -1175,3 +1216,20 @@ void VMdEditor::initCopyAsMenu(QAction *p_before, QMenu *p_menu) p_menu->insertSeparator(menuAct); } } + +void VMdEditor::insertImageLink(const QString &p_text, const QString &p_url) +{ + VInsertLinkDialog dialog(tr("Insert Image Link"), + "", + "", + p_text, + p_url, + true, + this); + if (dialog.exec() == QDialog::Accepted) { + QString linkText = dialog.getLinkText(); + QString linkUrl = dialog.getLinkUrl(); + static_cast(m_editOps)->insertImageLink(linkText, linkUrl); + } +} + diff --git a/src/vmdeditor.h b/src/vmdeditor.h index fbac42d2..329c8ade 100644 --- a/src/vmdeditor.h +++ b/src/vmdeditor.h @@ -234,6 +234,8 @@ private: void initCopyAsMenu(QAction *p_before, QMenu *p_menu); + void insertImageLink(const QString &p_text, const QString &p_url); + HGMarkdownHighlighter *m_mdHighlighter; VCodeBlockHighlightHelper *m_cbHighlighter;