From b5646a2b34e50f6d7bb596a9f4f708afe202e59a Mon Sep 17 00:00:00 2001 From: Le Tan Date: Fri, 11 Aug 2017 21:53:37 +0800 Subject: [PATCH] support links to internal notes --- src/vmainwindow.cpp | 18 ++++++++++++++++++ src/vmainwindow.h | 3 +++ src/vpreviewpage.cpp | 27 ++++++++++++++++++++------- src/vpreviewpage.h | 4 +++- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index a497799b..b1563f61 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -1907,6 +1907,24 @@ void VMainWindow::handleVimStatusUpdated(const VVim *p_vim) } } +bool VMainWindow::tryOpenInternalFile(const QString &p_filePath) +{ + if (p_filePath.isEmpty()) { + return false; + } + + if (QFileInfo::exists(p_filePath)) { + VFile *file = vnote->getInternalFile(p_filePath); + + if (file) { + editArea->openFile(file, OpenFileMode::Read); + return true; + } + } + + return false; +} + void VMainWindow::openExternalFiles(const QStringList &p_files, bool p_forceOrphan) { qDebug() << "open external files" << p_files; diff --git a/src/vmainwindow.h b/src/vmainwindow.h index e6ea49cc..3054bfc5 100644 --- a/src/vmainwindow.h +++ b/src/vmainwindow.h @@ -57,6 +57,9 @@ public: // it is a note inside VNote. If yes, VNote will open it as internal file. void openExternalFiles(const QStringList &p_files, bool p_forceOrphan = false); + // Try to open @p_filePath as internal note. + bool tryOpenInternalFile(const QString &p_filePath); + private slots: void importNoteFromFile(); void viewSettings(); diff --git a/src/vpreviewpage.cpp b/src/vpreviewpage.cpp index 69709f7b..524ae109 100644 --- a/src/vpreviewpage.cpp +++ b/src/vpreviewpage.cpp @@ -2,18 +2,31 @@ #include +#include "vnote.h" +#include "vmainwindow.h" + +extern VNote *g_vnote; + VPreviewPage::VPreviewPage(QWidget *parent) : QWebEnginePage(parent) { } -bool VPreviewPage::acceptNavigationRequest(const QUrl &url, - QWebEnginePage::NavigationType /*type*/, - bool /*isMainFrame*/) +bool VPreviewPage::acceptNavigationRequest(const QUrl &p_url, + QWebEnginePage::NavigationType p_type, + bool p_isMainFrame) { - // Only allow qrc:/index.html. - if (url.scheme() == QString("qrc")) - return true; - QDesktopServices::openUrl(url); + Q_UNUSED(p_type); + Q_UNUSED(p_isMainFrame); + + if (p_url.isLocalFile()) { + QString filePath = p_url.toLocalFile(); + if (g_vnote->getMainWindow()->tryOpenInternalFile(filePath)) { + qDebug() << "internal notes jump" << filePath; + return false; + } + } + + QDesktopServices::openUrl(p_url); return false; } diff --git a/src/vpreviewpage.h b/src/vpreviewpage.h index 38d352f5..eca8a25c 100644 --- a/src/vpreviewpage.h +++ b/src/vpreviewpage.h @@ -10,7 +10,9 @@ public: explicit VPreviewPage(QWidget *parent = 0); protected: - bool acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame); + bool acceptNavigationRequest(const QUrl &p_url, + NavigationType p_type, + bool p_isMainFrame); }; #endif // VPREVIEWPAGE_H