diff --git a/src/vmdeditor.cpp b/src/vmdeditor.cpp index a1dabcd3..35708377 100644 --- a/src/vmdeditor.cpp +++ b/src/vmdeditor.cpp @@ -413,6 +413,8 @@ void VMdEditor::contextMenuEvent(QContextMenuEvent *p_event) if (firstAct) { menu->insertSeparator(firstAct); } + + initAttachmentMenu(menu.data()); } menu->exec(p_event->globalPos()); @@ -776,10 +778,10 @@ void VMdEditor::clearUnusedImages() for (auto const & item : unusedImages) { bool ret = false; if (m_file->getType() == FileType::Note) { - const VNoteFile *tmpFile = dynamic_cast((VFile *)m_file); + const VNoteFile *tmpFile = static_cast((VFile *)m_file); ret = VUtils::deleteFile(tmpFile->getNotebook(), item, false); } else if (m_file->getType() == FileType::Orphan) { - const VOrphanFile *tmpFile = dynamic_cast((VFile *)m_file); + const VOrphanFile *tmpFile = static_cast((VFile *)m_file); ret = VUtils::deleteFile(tmpFile, item, false); } else { Q_ASSERT(false); @@ -1915,9 +1917,9 @@ bool VMdEditor::processUrlFromMimeData(const QMimeData *p_source) case 2: { // Insert As Link. - QString linkText; + QString initLinkText; if (isLocalFile) { - linkText = QFileInfo(url.toLocalFile()).fileName(); + initLinkText = QFileInfo(url.toLocalFile()).fileName(); } QString ut; @@ -1933,7 +1935,7 @@ bool VMdEditor::processUrlFromMimeData(const QMimeData *p_source) VInsertLinkDialog ld(QObject::tr("Insert Link"), "", "", - linkText, + initLinkText, ut, false, this); @@ -2075,3 +2077,56 @@ void VMdEditor::replaceTextWithLocalImages(QString &p_text) proDlg.setValue(regs.size()); } + +void VMdEditor::initAttachmentMenu(QMenu *p_menu) +{ + if (m_file->getType() != FileType::Note) { + return; + } + + const VNoteFile *note = static_cast((VFile *)m_file); + const QVector &attas = note->getAttachments(); + if (attas.isEmpty()) { + return; + } + + QMenu *subMenu = new QMenu(tr("Link To Attachment"), p_menu); + for (auto const & att : attas) { + QAction *act = new QAction(att.m_name, subMenu); + act->setData(att.m_name); + subMenu->addAction(act); + } + + connect(subMenu, &QMenu::triggered, + this, &VMdEditor::handleLinkToAttachmentAction); + + p_menu->addSeparator(); + p_menu->addMenu(subMenu); +} + +void VMdEditor::handleLinkToAttachmentAction(QAction *p_act) +{ + Q_ASSERT(m_file->getType() == FileType::Note); + VNoteFile *note = static_cast((VFile *)m_file); + QString name = p_act->data().toString(); + QString folderPath = note->fetchAttachmentFolderPath(); + QString filePath = QDir(folderPath).filePath(name); + + QDir dir(note->fetchBasePath()); + QString ut = dir.relativeFilePath(filePath); + ut = QUrl(ut).toString(QUrl::EncodeSpaces); + + VInsertLinkDialog ld(QObject::tr("Insert Link"), + "", + "", + name, + ut, + false, + this); + if (ld.exec() == QDialog::Accepted) { + QString linkText = ld.getLinkText(); + QString linkUrl = ld.getLinkUrl(); + Q_ASSERT(!linkText.isEmpty() && !linkUrl.isEmpty()); + m_editOps->insertLink(linkText, linkUrl); + } +} diff --git a/src/vmdeditor.h b/src/vmdeditor.h index d1d4db05..df82d232 100644 --- a/src/vmdeditor.h +++ b/src/vmdeditor.h @@ -258,6 +258,8 @@ private slots: // Copy selected text as HTML. void handleCopyAsAction(QAction *p_act); + void handleLinkToAttachmentAction(QAction *p_act); + private: void updateHeadersHelper(const QVector &p_headerRegions, bool p_configChanged); @@ -297,6 +299,8 @@ private: const QTextBlock &p_block, int p_pos); + void initAttachmentMenu(QMenu *p_menu); + void insertImageLink(const QString &p_text, const QString &p_url); void setFontPointSizeByStyleSheet(int p_ptSize);