Browse Source

MdEditor: add action to insert link to attachment

Le Tan 7 years ago
parent
commit
3779dd1b81
2 changed files with 64 additions and 5 deletions
  1. 60 5
      src/vmdeditor.cpp
  2. 4 0
      src/vmdeditor.h

+ 60 - 5
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<const VNoteFile *>((VFile *)m_file);
+                const VNoteFile *tmpFile = static_cast<const VNoteFile *>((VFile *)m_file);
                 ret = VUtils::deleteFile(tmpFile->getNotebook(), item, false);
             } else if (m_file->getType() == FileType::Orphan) {
-                const VOrphanFile *tmpFile = dynamic_cast<const VOrphanFile *>((VFile *)m_file);
+                const VOrphanFile *tmpFile = static_cast<const VOrphanFile *>((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<const VNoteFile *>((VFile *)m_file);
+    const QVector<VAttachment> &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<VNoteFile *>((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);
+    }
+}

+ 4 - 0
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<VElementRegion> &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);