diff --git a/src/data/extra/web/js/markdownit.js b/src/data/extra/web/js/markdownit.js index c24d3993..a323ea64 100644 --- a/src/data/extra/web/js/markdownit.js +++ b/src/data/extra/web/js/markdownit.js @@ -293,7 +293,7 @@ class MarkdownIt extends VxWorker { } // Add 1x1 transparent GIF image at the end to monitor the load process. return ''; + + p_cbStr + ' try { this.parentNode.removeChild(this); } catch(error) { console.log(error); }">'; } addLangsToSkipHighlight(p_langs) { diff --git a/src/data/extra/web/js/nodelinemapper.js b/src/data/extra/web/js/nodelinemapper.js index 026a6bae..abfb1334 100644 --- a/src/data/extra/web/js/nodelinemapper.js +++ b/src/data/extra/web/js/nodelinemapper.js @@ -201,6 +201,8 @@ class NodeLineMapper { let lineNumber = -1; if (idx > -1) { lineNumber = parseInt(this.nodesWithSourceLine[idx].getAttribute(this.sourceLineAttributeName)); + } else if (document.documentElement.scrollTop < 30) { + lineNumber = 0; } this.adapter.setTopLineNumber(lineNumber); diff --git a/src/widgets/editors/markdownviewer.cpp b/src/widgets/editors/markdownviewer.cpp index 2fdb0ff0..b6143abc 100644 --- a/src/widgets/editors/markdownviewer.cpp +++ b/src/widgets/editors/markdownviewer.cpp @@ -16,6 +16,7 @@ #include #include #include "../widgetsfactory.h" +#include "../viewwindow.h" using namespace vnotex; @@ -30,8 +31,18 @@ MarkdownViewer::MarkdownViewer(MarkdownViewerAdapter *p_adapter, const QColor &p_background, qreal p_zoomFactor, QWidget *p_parent) + : MarkdownViewer(p_adapter, nullptr, p_background, p_zoomFactor, p_parent) +{ +} + +MarkdownViewer::MarkdownViewer(MarkdownViewerAdapter *p_adapter, + const ViewWindow *p_viewWindow, + const QColor &p_background, + qreal p_zoomFactor, + QWidget *p_parent) : WebViewer(p_background, p_zoomFactor, p_parent), - m_adapter(p_adapter) + m_adapter(p_adapter), + m_viewWindow(p_viewWindow) { m_adapter->setParent(this); @@ -115,7 +126,7 @@ void MarkdownViewer::contextMenuEvent(QContextMenuEvent *p_event) } #endif - if (!hasSelection()) { + if (!hasSelection() && m_viewWindow && m_viewWindow->getMode() == ViewWindowMode::Read) { auto firstAct = actions.isEmpty() ? nullptr : actions[0]; auto editAct = new QAction(tr("&Edit"), menu.data()); WidgetUtils::addActionShortcutText(editAct, diff --git a/src/widgets/editors/markdownviewer.h b/src/widgets/editors/markdownviewer.h index 259507dd..ed7ca96f 100644 --- a/src/widgets/editors/markdownviewer.h +++ b/src/widgets/editors/markdownviewer.h @@ -9,6 +9,7 @@ namespace vnotex { class MarkdownViewerAdapter; class PreviewHelper; + class ViewWindow; class MarkdownViewer : public WebViewer { @@ -20,6 +21,12 @@ namespace vnotex qreal p_zoomFactor, QWidget *p_parent = nullptr); + MarkdownViewer(MarkdownViewerAdapter *p_adapter, + const ViewWindow *p_viewWindow, + const QColor &p_background, + qreal p_zoomFactor, + QWidget *p_parent = nullptr); + MarkdownViewerAdapter *adapter() const; void setPreviewHelper(PreviewHelper *p_previewHelper); @@ -62,6 +69,9 @@ namespace vnotex // Managed by QObject. MarkdownViewerAdapter *m_adapter = nullptr; + // Nullable. + const ViewWindow *m_viewWindow = nullptr; + // Whether this view has hooked the Copy Image Url action. bool m_copyImageUrlActionHooked = false; diff --git a/src/widgets/markdownviewwindow.cpp b/src/widgets/markdownviewwindow.cpp index a9287163..9564cc27 100644 --- a/src/widgets/markdownviewwindow.cpp +++ b/src/widgets/markdownviewwindow.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -147,14 +148,16 @@ void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffe if (p_syncBuffer) { syncTextEditorFromBuffer(true); } + + m_editor->show(); + + setEditViewMode(ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig().getEditViewMode()); } // Avoid focus glitch. m_editor->show(); m_editor->setFocus(); - setEditViewMode(m_editViewMode); - getMainStatusWidget()->setCurrentWidget(m_textEditorStatusWidget.get()); break; } @@ -320,7 +323,7 @@ void MarkdownViewWindow::setupToolBar() auto act = addAction(toolBar, ViewWindowToolBarHelper::Debug); connect(this, &ViewWindow::modeChanged, this, [this, act]() { - act->setEnabled(m_mode != ViewWindowMode::Edit); + act->setEnabled(m_mode == ViewWindowMode::Read || m_editViewMode != MarkdownEditorConfig::EditViewMode::EditOnly); }); } } @@ -334,8 +337,6 @@ void MarkdownViewWindow::setupTextEditor() updateConfigRevision(); - m_editViewMode = markdownEditorConfig.getEditViewMode(); - m_editor = new MarkdownEditor(markdownEditorConfig, createMarkdownEditorConfig(editorConfig, markdownEditorConfig), createMarkdownEditorParameters(editorConfig, markdownEditorConfig), @@ -432,6 +433,7 @@ void MarkdownViewWindow::setupViewer() auto adapter = new EditorMarkdownViewerAdapter(nullptr, this); m_viewer = new MarkdownViewer(adapter, + this, VNoteX::getInst().getThemeMgr().getBaseBackground(), markdownEditorConfig.getZoomFactorInReadMode(), this); @@ -1298,7 +1300,11 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo { Q_ASSERT(m_mode == ViewWindowMode::Edit); - m_editViewMode = p_mode; + bool modeChanged = false; + if (m_editViewMode != p_mode) { + m_editViewMode = p_mode; + modeChanged = true; + } switch (p_mode) { case MarkdownEditorConfig::EditViewMode::EditOnly: @@ -1307,10 +1313,12 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo m_viewer->hide(); } - disconnect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged, - this, &MarkdownViewWindow::syncEditorContentsToPreview); - disconnect(m_editor, &MarkdownEditor::topLineChanged, - this, &MarkdownViewWindow::syncEditorPositionToPreview); + if (modeChanged) { + disconnect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged, + m_syncPreviewTimer, QOverload<>::of(&QTimer::start)); + disconnect(m_editor, &MarkdownEditor::topLineChanged, + this, &MarkdownViewWindow::syncEditorPositionToPreview); + } break; } @@ -1319,17 +1327,25 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo m_viewer->show(); WidgetUtils::distributeWidgetsOfSplitter(m_splitter); - if (m_viewerReady) { + if (modeChanged) { + if (!m_syncPreviewTimer) { + m_syncPreviewTimer = new QTimer(this); + m_syncPreviewTimer->setSingleShot(true); + m_syncPreviewTimer->setInterval(300); + connect(m_syncPreviewTimer, &QTimer::timeout, + this, &MarkdownViewWindow::syncEditorContentsToPreview); + } + connect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged, - this, &MarkdownViewWindow::syncEditorContentsToPreview, + m_syncPreviewTimer, QOverload<>::of(&QTimer::start), Qt::UniqueConnection); connect(m_editor, &MarkdownEditor::topLineChanged, this, &MarkdownViewWindow::syncEditorPositionToPreview, Qt::UniqueConnection); - - syncEditorContentsToPreview(); } + syncEditorContentsToPreview(); + break; } @@ -1341,7 +1357,7 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo void MarkdownViewWindow::syncEditorContentsToPreview() { - if (isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { + if (!m_viewerReady || isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { return; } @@ -1350,7 +1366,7 @@ void MarkdownViewWindow::syncEditorContentsToPreview() void MarkdownViewWindow::syncEditorPositionToPreview() { - if (isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { + if (!m_viewerReady || isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { return; } diff --git a/src/widgets/markdownviewwindow.h b/src/widgets/markdownviewwindow.h index b832147f..830a522d 100644 --- a/src/widgets/markdownviewwindow.h +++ b/src/widgets/markdownviewwindow.h @@ -11,6 +11,7 @@ class QSplitter; class QStackedWidget; class QWebEngineView; class QActionGroup; +class QTimer; namespace vte { @@ -224,6 +225,8 @@ namespace vnotex QActionGroup *m_viewModeActionGroup = nullptr; MarkdownEditorConfig::EditViewMode m_editViewMode = MarkdownEditorConfig::EditViewMode::EditOnly; + + QTimer *m_syncPreviewTimer = nullptr; }; } diff --git a/src/widgets/toolbarhelper.cpp b/src/widgets/toolbarhelper.cpp index be3fa3e9..c84ebcfb 100644 --- a/src/widgets/toolbarhelper.cpp +++ b/src/widgets/toolbarhelper.cpp @@ -500,6 +500,12 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too updater.exec(); }); + menu->addAction(MainWindow::tr("Contributors"), + menu, + []() { + WidgetUtils::openUrlByDesktop(QUrl("https://github.com/vnotex/vnote/graphs/contributors")); + }); + menu->addAction(MainWindow::tr("About"), menu, [p_win]() {