|
|
@@ -32,9 +32,8 @@
|
|
|
|
|
|
using namespace vnotex;
|
|
|
|
|
|
-MarkdownViewWindow::MarkdownViewWindow(const QSharedPointer<FileOpenParameters> &p_paras, QWidget *p_parent)
|
|
|
- : ViewWindow(p_parent),
|
|
|
- m_openParas(p_paras)
|
|
|
+MarkdownViewWindow::MarkdownViewWindow(QWidget *p_parent)
|
|
|
+ : ViewWindow(p_parent)
|
|
|
{
|
|
|
// Need to setup before setupUI() since the tool bar action will need the provider.
|
|
|
setupOutlineProvider();
|
|
|
@@ -42,10 +41,6 @@ MarkdownViewWindow::MarkdownViewWindow(const QSharedPointer<FileOpenParameters>
|
|
|
setupUI();
|
|
|
|
|
|
m_previewHelper = new PreviewHelper(nullptr, this);
|
|
|
-
|
|
|
- setModeInternal(modeFromOpenParameters(*p_paras));
|
|
|
-
|
|
|
- m_initialized = true;
|
|
|
}
|
|
|
|
|
|
MarkdownViewWindow::~MarkdownViewWindow()
|
|
|
@@ -86,16 +81,12 @@ void MarkdownViewWindow::setupUI()
|
|
|
setupToolBar();
|
|
|
}
|
|
|
|
|
|
-void MarkdownViewWindow::setMode(Mode p_mode)
|
|
|
+void MarkdownViewWindow::setMode(ViewWindowMode p_mode)
|
|
|
{
|
|
|
- setModeInternal(p_mode);
|
|
|
-
|
|
|
- if (m_findAndReplace && m_findAndReplace->isVisible()) {
|
|
|
- m_findAndReplace->setReplaceEnabled(m_mode != Mode::Read);
|
|
|
- }
|
|
|
+ setModeInternal(p_mode, true);
|
|
|
}
|
|
|
|
|
|
-void MarkdownViewWindow::setModeInternal(Mode p_mode)
|
|
|
+void MarkdownViewWindow::setModeInternal(ViewWindowMode p_mode, bool p_syncBuffer)
|
|
|
{
|
|
|
if (p_mode == m_mode) {
|
|
|
return;
|
|
|
@@ -105,11 +96,11 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode)
|
|
|
m_mode = p_mode;
|
|
|
|
|
|
switch (m_mode) {
|
|
|
- case Mode::Read:
|
|
|
+ case ViewWindowMode::Read:
|
|
|
{
|
|
|
if (!m_viewer) {
|
|
|
setupViewer();
|
|
|
- if (m_initialized) {
|
|
|
+ if (p_syncBuffer) {
|
|
|
syncViewerFromBuffer(true);
|
|
|
}
|
|
|
}
|
|
|
@@ -126,7 +117,7 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- case Mode::Edit:
|
|
|
+ case ViewWindowMode::Edit:
|
|
|
{
|
|
|
if (!m_editor) {
|
|
|
// We need viewer to preview.
|
|
|
@@ -136,7 +127,7 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode)
|
|
|
|
|
|
setupTextEditor();
|
|
|
|
|
|
- if (m_initialized) {
|
|
|
+ if (p_syncBuffer) {
|
|
|
syncTextEditorFromBuffer(true);
|
|
|
}
|
|
|
}
|
|
|
@@ -160,11 +151,15 @@ void MarkdownViewWindow::setModeInternal(Mode p_mode)
|
|
|
// Let editor to show or scrollToLine will not work correctly.
|
|
|
QCoreApplication::processEvents();
|
|
|
|
|
|
- if (m_initialized) {
|
|
|
+ if (p_syncBuffer) {
|
|
|
doSyncEditorFromBufferContent(true);
|
|
|
}
|
|
|
|
|
|
emit modeChanged();
|
|
|
+
|
|
|
+ if (m_findAndReplace && m_findAndReplace->isVisible()) {
|
|
|
+ m_findAndReplace->setReplaceEnabled(!isReadMode());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void MarkdownViewWindow::setModified(bool p_modified)
|
|
|
@@ -219,11 +214,11 @@ void MarkdownViewWindow::doSyncEditorFromBufferContent(bool p_syncPosition)
|
|
|
// case we will call editor or viewer to update its content.
|
|
|
m_bufferRevision = buffer->getRevision();
|
|
|
switch (m_mode) {
|
|
|
- case Mode::Read:
|
|
|
+ case ViewWindowMode::Read:
|
|
|
syncViewerFromBufferContent(p_syncPosition);
|
|
|
break;
|
|
|
|
|
|
- case Mode::Edit:
|
|
|
+ case ViewWindowMode::Edit:
|
|
|
syncTextEditorFromBufferContent(p_syncPosition);
|
|
|
break;
|
|
|
|
|
|
@@ -232,21 +227,16 @@ void MarkdownViewWindow::doSyncEditorFromBufferContent(bool p_syncPosition)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void MarkdownViewWindow::handleBufferChangedInternal()
|
|
|
+void MarkdownViewWindow::handleBufferChangedInternal(const QSharedPointer<FileOpenParameters> &p_paras)
|
|
|
{
|
|
|
- TextViewWindowHelper::handleBufferChanged(this);
|
|
|
-
|
|
|
- auto buffer = getBuffer();
|
|
|
- if (m_openParas && m_openParas->m_newFile) {
|
|
|
- Q_ASSERT(m_mode != Mode::Read);
|
|
|
- const auto &markdownEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig();
|
|
|
- if (markdownEditorConfig.getInsertFileNameAsTitle() && buffer->getContent().isEmpty()) {
|
|
|
- const auto title = QString("# %1\n").arg(QFileInfo(buffer->getName()).completeBaseName());
|
|
|
- m_editor->insertText(title);
|
|
|
- }
|
|
|
+ if (getBuffer()) {
|
|
|
+ // Will sync buffer right behind this.
|
|
|
+ setModeInternal(p_paras ? p_paras->m_mode : ViewWindowMode::Read, false);
|
|
|
}
|
|
|
|
|
|
- m_openParas.clear();
|
|
|
+ TextViewWindowHelper::handleBufferChanged(this);
|
|
|
+
|
|
|
+ handleFileOpenParameters(p_paras);
|
|
|
}
|
|
|
|
|
|
void MarkdownViewWindow::setupToolBar()
|
|
|
@@ -329,14 +319,14 @@ void MarkdownViewWindow::setupTextEditor()
|
|
|
// Connect outline pipeline.
|
|
|
connect(m_editor, &MarkdownEditor::headingsChanged,
|
|
|
this, [this]() {
|
|
|
- if (getMode() != Mode::Read) {
|
|
|
+ if (!isReadMode()) {
|
|
|
auto outline = headingsToOutline(m_editor->getHeadings());
|
|
|
m_outlineProvider->setOutline(outline);
|
|
|
}
|
|
|
});
|
|
|
connect(m_editor, &MarkdownEditor::currentHeadingChanged,
|
|
|
this, [this]() {
|
|
|
- if (getMode() != Mode::Read) {
|
|
|
+ if (!isReadMode()) {
|
|
|
m_outlineProvider->setCurrentHeadingIndex(m_editor->getCurrentHeadingIndex());
|
|
|
}
|
|
|
});
|
|
|
@@ -366,11 +356,11 @@ bool MarkdownViewWindow::eventFilter(QObject *p_obj, QEvent *p_event)
|
|
|
void MarkdownViewWindow::focusEditor()
|
|
|
{
|
|
|
switch (m_mode) {
|
|
|
- case Mode::Read:
|
|
|
+ case ViewWindowMode::Read:
|
|
|
m_viewer->setFocus();
|
|
|
break;
|
|
|
|
|
|
- case Mode::Edit:
|
|
|
+ case ViewWindowMode::Edit:
|
|
|
m_editor->setFocus();
|
|
|
break;
|
|
|
|
|
|
@@ -430,14 +420,14 @@ void MarkdownViewWindow::setupViewer()
|
|
|
// Connect outline pipeline.
|
|
|
connect(adapter, &MarkdownViewerAdapter::headingsChanged,
|
|
|
this, [this]() {
|
|
|
- if (getMode() == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
auto outline = headingsToOutline(this->adapter()->getHeadings());
|
|
|
m_outlineProvider->setOutline(outline);
|
|
|
}
|
|
|
});
|
|
|
connect(adapter, &MarkdownViewerAdapter::currentHeadingChanged,
|
|
|
this, [this]() {
|
|
|
- if (getMode() == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
m_outlineProvider->setCurrentHeadingIndex(this->adapter()->getCurrentHeadingIndex());
|
|
|
}
|
|
|
});
|
|
|
@@ -554,11 +544,11 @@ void MarkdownViewWindow::setBufferRevisionAfterInvalidation(int p_bufferRevision
|
|
|
{
|
|
|
m_bufferRevision = p_bufferRevision;
|
|
|
switch (m_mode) {
|
|
|
- case Mode::Edit:
|
|
|
+ case ViewWindowMode::Edit:
|
|
|
m_textEditorBufferRevision = p_bufferRevision;
|
|
|
break;
|
|
|
|
|
|
- case Mode::Read:
|
|
|
+ case ViewWindowMode::Read:
|
|
|
m_viewerBufferRevision = p_bufferRevision;
|
|
|
break;
|
|
|
|
|
|
@@ -578,7 +568,7 @@ EditorMarkdownViewerAdapter *MarkdownViewWindow::adapter() const
|
|
|
|
|
|
int MarkdownViewWindow::getEditLineNumber() const
|
|
|
{
|
|
|
- if (m_previousMode == Mode::Edit || m_previousMode == Mode::FocusPreview) {
|
|
|
+ if (m_previousMode == ViewWindowMode::Edit || m_previousMode == ViewWindowMode::FocusPreview) {
|
|
|
if (m_editor) {
|
|
|
return m_editor->getTopLine();
|
|
|
}
|
|
|
@@ -589,7 +579,7 @@ int MarkdownViewWindow::getEditLineNumber() const
|
|
|
|
|
|
int MarkdownViewWindow::getReadLineNumber() const
|
|
|
{
|
|
|
- if (m_previousMode == Mode::Read) {
|
|
|
+ if (m_previousMode == ViewWindowMode::Read) {
|
|
|
if (m_viewer) {
|
|
|
return adapter()->getTopLineNumber();
|
|
|
}
|
|
|
@@ -693,7 +683,7 @@ void MarkdownViewWindow::handleTypeAction(TypeAction p_action)
|
|
|
|
|
|
void MarkdownViewWindow::handleSectionNumberOverride(OverrideState p_state)
|
|
|
{
|
|
|
- if (m_mode != Mode::Read) {
|
|
|
+ if (!isReadMode()) {
|
|
|
m_editor->overrideSectionNumber(p_state);
|
|
|
}
|
|
|
}
|
|
|
@@ -772,7 +762,7 @@ void MarkdownViewWindow::setupOutlineProvider()
|
|
|
connect(m_outlineProvider.data(), &OutlineProvider::headingClicked,
|
|
|
this, [this](int p_idx) {
|
|
|
switch (getMode()) {
|
|
|
- case Mode::Read:
|
|
|
+ case ViewWindowMode::Read:
|
|
|
adapter()->scrollToHeading(p_idx);
|
|
|
break;
|
|
|
|
|
|
@@ -796,7 +786,7 @@ QSharedPointer<vte::MarkdownEditorConfig> MarkdownViewWindow::createMarkdownEdit
|
|
|
|
|
|
void MarkdownViewWindow::scrollUp()
|
|
|
{
|
|
|
- if (m_mode == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
adapter()->scroll(true);
|
|
|
} else {
|
|
|
QScrollBar *vbar = m_editor->getTextEdit()->verticalScrollBar();
|
|
|
@@ -808,7 +798,7 @@ void MarkdownViewWindow::scrollUp()
|
|
|
|
|
|
void MarkdownViewWindow::scrollDown()
|
|
|
{
|
|
|
- if (m_mode == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
adapter()->scroll(false);
|
|
|
} else {
|
|
|
QScrollBar *vbar = m_editor->getTextEdit()->verticalScrollBar();
|
|
|
@@ -830,7 +820,7 @@ void MarkdownViewWindow::updateWebViewerConfig(const MarkdownEditorConfig &p_con
|
|
|
void MarkdownViewWindow::zoom(bool p_zoomIn)
|
|
|
{
|
|
|
// Only editor will receive the wheel event.
|
|
|
- Q_ASSERT(m_mode != Mode::Read);
|
|
|
+ Q_ASSERT(!isReadMode());
|
|
|
m_editor->zoom(m_editor->zoomDelta() + (p_zoomIn ? 1 : -1));
|
|
|
auto &textEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig().getTextEditorConfig();
|
|
|
textEditorConfig.setZoomDelta(m_editor->zoomDelta());
|
|
|
@@ -839,7 +829,7 @@ void MarkdownViewWindow::zoom(bool p_zoomIn)
|
|
|
|
|
|
void MarkdownViewWindow::handleFindTextChanged(const QString &p_text, FindOptions p_options)
|
|
|
{
|
|
|
- if (m_mode == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
if (p_options & FindOption::IncrementalSearch) {
|
|
|
adapter()->findText(p_text, p_options);
|
|
|
}
|
|
|
@@ -850,7 +840,7 @@ void MarkdownViewWindow::handleFindTextChanged(const QString &p_text, FindOption
|
|
|
|
|
|
void MarkdownViewWindow::handleFindNext(const QString &p_text, FindOptions p_options)
|
|
|
{
|
|
|
- if (m_mode == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
adapter()->findText(p_text, p_options);
|
|
|
} else {
|
|
|
TextViewWindowHelper::handleFindNext(this, p_text, p_options);
|
|
|
@@ -859,7 +849,7 @@ void MarkdownViewWindow::handleFindNext(const QString &p_text, FindOptions p_opt
|
|
|
|
|
|
void MarkdownViewWindow::handleReplace(const QString &p_text, FindOptions p_options, const QString &p_replaceText)
|
|
|
{
|
|
|
- if (m_mode == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
VNoteX::getInst().showStatusMessageShort(tr("Replace is not supported in read mode"));
|
|
|
} else {
|
|
|
TextViewWindowHelper::handleReplace(this, p_text, p_options, p_replaceText);
|
|
|
@@ -868,7 +858,7 @@ void MarkdownViewWindow::handleReplace(const QString &p_text, FindOptions p_opti
|
|
|
|
|
|
void MarkdownViewWindow::handleReplaceAll(const QString &p_text, FindOptions p_options, const QString &p_replaceText)
|
|
|
{
|
|
|
- if (m_mode == Mode::Read) {
|
|
|
+ if (isReadMode()) {
|
|
|
VNoteX::getInst().showStatusMessageShort(tr("Replace is not supported in read mode"));
|
|
|
} else {
|
|
|
TextViewWindowHelper::handleReplaceAll(this, p_text, p_options, p_replaceText);
|
|
|
@@ -887,5 +877,44 @@ void MarkdownViewWindow::handleFindAndReplaceWidgetClosed()
|
|
|
void MarkdownViewWindow::handleFindAndReplaceWidgetOpened()
|
|
|
{
|
|
|
Q_ASSERT(m_findAndReplace);
|
|
|
- m_findAndReplace->setReplaceEnabled(m_mode != Mode::Read);
|
|
|
+ m_findAndReplace->setReplaceEnabled(!isReadMode());
|
|
|
+}
|
|
|
+
|
|
|
+void MarkdownViewWindow::handleFileOpenParameters(const QSharedPointer<FileOpenParameters> &p_paras)
|
|
|
+{
|
|
|
+ if (!p_paras) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ auto buffer = getBuffer();
|
|
|
+ if (p_paras->m_newFile) {
|
|
|
+ Q_ASSERT(!isReadMode());
|
|
|
+ const auto &markdownEditorConfig = ConfigMgr::getInst().getEditorConfig().getMarkdownEditorConfig();
|
|
|
+ if (markdownEditorConfig.getInsertFileNameAsTitle() && buffer->getContent().isEmpty()) {
|
|
|
+ const auto title = QString("# %1\n").arg(QFileInfo(buffer->getName()).completeBaseName());
|
|
|
+ m_editor->insertText(title);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ scrollToLine(p_paras->m_lineNumber);
|
|
|
+}
|
|
|
+
|
|
|
+void MarkdownViewWindow::scrollToLine(int p_lineNumber)
|
|
|
+{
|
|
|
+ if (p_lineNumber < 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isReadMode()) {
|
|
|
+ Q_ASSERT(m_viewer);
|
|
|
+ adapter()->scrollToPosition(MarkdownViewerAdapter::Position(p_lineNumber, QString()));
|
|
|
+ } else {
|
|
|
+ Q_ASSERT(m_editor);
|
|
|
+ m_editor->scrollToLine(p_lineNumber, true);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool MarkdownViewWindow::isReadMode() const
|
|
|
+{
|
|
|
+ return m_mode == ViewWindowMode::Read;
|
|
|
}
|