MarkdownViewWindow: fix EditPreview

This commit is contained in:
Le Tan 2021-11-11 08:25:34 +08:00
parent 6b1f00880e
commit e2fda18dbd
7 changed files with 67 additions and 19 deletions

View File

@ -293,7 +293,7 @@ class MarkdownIt extends VxWorker {
} }
// Add 1x1 transparent GIF image at the end to monitor the load process. // Add 1x1 transparent GIF image at the end to monitor the load process.
return '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" onload="' return '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" onload="'
+ p_cbStr + ' this.parentNode.removeChild(this);">'; + p_cbStr + ' try { this.parentNode.removeChild(this); } catch(error) { console.log(error); }">';
} }
addLangsToSkipHighlight(p_langs) { addLangsToSkipHighlight(p_langs) {

View File

@ -201,6 +201,8 @@ class NodeLineMapper {
let lineNumber = -1; let lineNumber = -1;
if (idx > -1) { if (idx > -1) {
lineNumber = parseInt(this.nodesWithSourceLine[idx].getAttribute(this.sourceLineAttributeName)); lineNumber = parseInt(this.nodesWithSourceLine[idx].getAttribute(this.sourceLineAttributeName));
} else if (document.documentElement.scrollTop < 30) {
lineNumber = 0;
} }
this.adapter.setTopLineNumber(lineNumber); this.adapter.setTopLineNumber(lineNumber);

View File

@ -16,6 +16,7 @@
#include <core/configmgr.h> #include <core/configmgr.h>
#include <core/editorconfig.h> #include <core/editorconfig.h>
#include "../widgetsfactory.h" #include "../widgetsfactory.h"
#include "../viewwindow.h"
using namespace vnotex; using namespace vnotex;
@ -30,8 +31,18 @@ MarkdownViewer::MarkdownViewer(MarkdownViewerAdapter *p_adapter,
const QColor &p_background, const QColor &p_background,
qreal p_zoomFactor, qreal p_zoomFactor,
QWidget *p_parent) 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), : WebViewer(p_background, p_zoomFactor, p_parent),
m_adapter(p_adapter) m_adapter(p_adapter),
m_viewWindow(p_viewWindow)
{ {
m_adapter->setParent(this); m_adapter->setParent(this);
@ -115,7 +126,7 @@ void MarkdownViewer::contextMenuEvent(QContextMenuEvent *p_event)
} }
#endif #endif
if (!hasSelection()) { if (!hasSelection() && m_viewWindow && m_viewWindow->getMode() == ViewWindowMode::Read) {
auto firstAct = actions.isEmpty() ? nullptr : actions[0]; auto firstAct = actions.isEmpty() ? nullptr : actions[0];
auto editAct = new QAction(tr("&Edit"), menu.data()); auto editAct = new QAction(tr("&Edit"), menu.data());
WidgetUtils::addActionShortcutText(editAct, WidgetUtils::addActionShortcutText(editAct,

View File

@ -9,6 +9,7 @@ namespace vnotex
{ {
class MarkdownViewerAdapter; class MarkdownViewerAdapter;
class PreviewHelper; class PreviewHelper;
class ViewWindow;
class MarkdownViewer : public WebViewer class MarkdownViewer : public WebViewer
{ {
@ -20,6 +21,12 @@ namespace vnotex
qreal p_zoomFactor, qreal p_zoomFactor,
QWidget *p_parent = nullptr); 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; MarkdownViewerAdapter *adapter() const;
void setPreviewHelper(PreviewHelper *p_previewHelper); void setPreviewHelper(PreviewHelper *p_previewHelper);
@ -62,6 +69,9 @@ namespace vnotex
// Managed by QObject. // Managed by QObject.
MarkdownViewerAdapter *m_adapter = nullptr; MarkdownViewerAdapter *m_adapter = nullptr;
// Nullable.
const ViewWindow *m_viewWindow = nullptr;
// Whether this view has hooked the Copy Image Url action. // Whether this view has hooked the Copy Image Url action.
bool m_copyImageUrlActionHooked = false; bool m_copyImageUrlActionHooked = false;

View File

@ -11,6 +11,7 @@
#include <QProgressDialog> #include <QProgressDialog>
#include <QMenu> #include <QMenu>
#include <QActionGroup> #include <QActionGroup>
#include <QTimer>
#include <core/fileopenparameters.h> #include <core/fileopenparameters.h>
#include <core/editorconfig.h> #include <core/editorconfig.h>
@ -147,14 +148,16 @@ void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffe
if (p_syncBuffer) { if (p_syncBuffer) {
syncTextEditorFromBuffer(true); syncTextEditorFromBuffer(true);
} }
m_editor->show();
setEditViewMode(ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig().getEditViewMode());
} }
// Avoid focus glitch. // Avoid focus glitch.
m_editor->show(); m_editor->show();
m_editor->setFocus(); m_editor->setFocus();
setEditViewMode(m_editViewMode);
getMainStatusWidget()->setCurrentWidget(m_textEditorStatusWidget.get()); getMainStatusWidget()->setCurrentWidget(m_textEditorStatusWidget.get());
break; break;
} }
@ -320,7 +323,7 @@ void MarkdownViewWindow::setupToolBar()
auto act = addAction(toolBar, ViewWindowToolBarHelper::Debug); auto act = addAction(toolBar, ViewWindowToolBarHelper::Debug);
connect(this, &ViewWindow::modeChanged, connect(this, &ViewWindow::modeChanged,
this, [this, act]() { 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(); updateConfigRevision();
m_editViewMode = markdownEditorConfig.getEditViewMode();
m_editor = new MarkdownEditor(markdownEditorConfig, m_editor = new MarkdownEditor(markdownEditorConfig,
createMarkdownEditorConfig(editorConfig, markdownEditorConfig), createMarkdownEditorConfig(editorConfig, markdownEditorConfig),
createMarkdownEditorParameters(editorConfig, markdownEditorConfig), createMarkdownEditorParameters(editorConfig, markdownEditorConfig),
@ -432,6 +433,7 @@ void MarkdownViewWindow::setupViewer()
auto adapter = new EditorMarkdownViewerAdapter(nullptr, this); auto adapter = new EditorMarkdownViewerAdapter(nullptr, this);
m_viewer = new MarkdownViewer(adapter, m_viewer = new MarkdownViewer(adapter,
this,
VNoteX::getInst().getThemeMgr().getBaseBackground(), VNoteX::getInst().getThemeMgr().getBaseBackground(),
markdownEditorConfig.getZoomFactorInReadMode(), markdownEditorConfig.getZoomFactorInReadMode(),
this); this);
@ -1298,7 +1300,11 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo
{ {
Q_ASSERT(m_mode == ViewWindowMode::Edit); 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) { switch (p_mode) {
case MarkdownEditorConfig::EditViewMode::EditOnly: case MarkdownEditorConfig::EditViewMode::EditOnly:
@ -1307,10 +1313,12 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo
m_viewer->hide(); m_viewer->hide();
} }
disconnect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged, if (modeChanged) {
this, &MarkdownViewWindow::syncEditorContentsToPreview); disconnect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged,
disconnect(m_editor, &MarkdownEditor::topLineChanged, m_syncPreviewTimer, QOverload<>::of(&QTimer::start));
this, &MarkdownViewWindow::syncEditorPositionToPreview); disconnect(m_editor, &MarkdownEditor::topLineChanged,
this, &MarkdownViewWindow::syncEditorPositionToPreview);
}
break; break;
} }
@ -1319,17 +1327,25 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo
m_viewer->show(); m_viewer->show();
WidgetUtils::distributeWidgetsOfSplitter(m_splitter); 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, connect(m_editor->getTextEdit(), &vte::VTextEdit::contentsChanged,
this, &MarkdownViewWindow::syncEditorContentsToPreview, m_syncPreviewTimer, QOverload<>::of(&QTimer::start),
Qt::UniqueConnection); Qt::UniqueConnection);
connect(m_editor, &MarkdownEditor::topLineChanged, connect(m_editor, &MarkdownEditor::topLineChanged,
this, &MarkdownViewWindow::syncEditorPositionToPreview, this, &MarkdownViewWindow::syncEditorPositionToPreview,
Qt::UniqueConnection); Qt::UniqueConnection);
syncEditorContentsToPreview();
} }
syncEditorContentsToPreview();
break; break;
} }
@ -1341,7 +1357,7 @@ void MarkdownViewWindow::setEditViewMode(MarkdownEditorConfig::EditViewMode p_mo
void MarkdownViewWindow::syncEditorContentsToPreview() void MarkdownViewWindow::syncEditorContentsToPreview()
{ {
if (isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { if (!m_viewerReady || isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) {
return; return;
} }
@ -1350,7 +1366,7 @@ void MarkdownViewWindow::syncEditorContentsToPreview()
void MarkdownViewWindow::syncEditorPositionToPreview() void MarkdownViewWindow::syncEditorPositionToPreview()
{ {
if (isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) { if (!m_viewerReady || isReadMode() || m_editViewMode == MarkdownEditorConfig::EditViewMode::EditOnly) {
return; return;
} }

View File

@ -11,6 +11,7 @@ class QSplitter;
class QStackedWidget; class QStackedWidget;
class QWebEngineView; class QWebEngineView;
class QActionGroup; class QActionGroup;
class QTimer;
namespace vte namespace vte
{ {
@ -224,6 +225,8 @@ namespace vnotex
QActionGroup *m_viewModeActionGroup = nullptr; QActionGroup *m_viewModeActionGroup = nullptr;
MarkdownEditorConfig::EditViewMode m_editViewMode = MarkdownEditorConfig::EditViewMode::EditOnly; MarkdownEditorConfig::EditViewMode m_editViewMode = MarkdownEditorConfig::EditViewMode::EditOnly;
QTimer *m_syncPreviewTimer = nullptr;
}; };
} }

View File

@ -500,6 +500,12 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
updater.exec(); updater.exec();
}); });
menu->addAction(MainWindow::tr("Contributors"),
menu,
[]() {
WidgetUtils::openUrlByDesktop(QUrl("https://github.com/vnotex/vnote/graphs/contributors"));
});
menu->addAction(MainWindow::tr("About"), menu->addAction(MainWindow::tr("About"),
menu, menu,
[p_win]() { [p_win]() {