mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-06 06:19:52 +08:00
edit-tab: init editor at the first time entering edit mode
Do not init the editor if we just open a note in read mode to speed up.
This commit is contained in:
parent
4374f2d8f1
commit
301879c50c
@ -307,8 +307,6 @@ void VMdEdit::generateEditOutline()
|
|||||||
{
|
{
|
||||||
QTextDocument *doc = document();
|
QTextDocument *doc = document();
|
||||||
|
|
||||||
m_headers.clear();
|
|
||||||
|
|
||||||
QVector<VHeader> headers;
|
QVector<VHeader> headers;
|
||||||
|
|
||||||
// Assume that each block contains only one line
|
// Assume that each block contains only one line
|
||||||
@ -332,6 +330,8 @@ void VMdEdit::generateEditOutline()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_headers.clear();
|
||||||
|
|
||||||
int curLevel = baseLevel - 1;
|
int curLevel = baseLevel - 1;
|
||||||
for (auto & item : headers) {
|
for (auto & item : headers) {
|
||||||
while (item.level > curLevel + 1) {
|
while (item.level > curLevel + 1) {
|
||||||
|
100
src/vmdtab.cpp
100
src/vmdtab.cpp
@ -44,34 +44,8 @@ void VMdTab::setupUI()
|
|||||||
|
|
||||||
setupMarkdownViewer();
|
setupMarkdownViewer();
|
||||||
|
|
||||||
if (m_file->isModifiable()) {
|
// Setup editor when we really need it.
|
||||||
m_editor = new VMdEdit(m_file, m_document, m_mdConType, this);
|
m_editor = NULL;
|
||||||
connect(dynamic_cast<VMdEdit *>(m_editor), &VMdEdit::headersChanged,
|
|
||||||
this, &VMdTab::updateTocFromHeaders);
|
|
||||||
connect(dynamic_cast<VMdEdit *>(m_editor), &VMdEdit::statusChanged,
|
|
||||||
this, &VMdTab::updateStatus);
|
|
||||||
connect(m_editor, SIGNAL(curHeaderChanged(VAnchor)),
|
|
||||||
this, SLOT(updateCurHeader(VAnchor)));
|
|
||||||
connect(m_editor, &VEdit::textChanged,
|
|
||||||
this, &VMdTab::handleTextChanged);
|
|
||||||
connect(m_editor, &VEdit::cursorPositionChanged,
|
|
||||||
this, &VMdTab::updateStatus);
|
|
||||||
connect(m_editor, &VEdit::saveAndRead,
|
|
||||||
this, &VMdTab::saveAndRead);
|
|
||||||
connect(m_editor, &VEdit::discardAndRead,
|
|
||||||
this, &VMdTab::discardAndRead);
|
|
||||||
connect(m_editor, &VEdit::saveNote,
|
|
||||||
this, &VMdTab::saveFile);
|
|
||||||
connect(m_editor, &VEdit::statusMessage,
|
|
||||||
this, &VEditTab::statusMessage);
|
|
||||||
connect(m_editor, &VEdit::vimStatusUpdated,
|
|
||||||
this, &VEditTab::vimStatusUpdated);
|
|
||||||
|
|
||||||
m_editor->reloadFile();
|
|
||||||
m_stacks->addWidget(m_editor);
|
|
||||||
} else {
|
|
||||||
m_editor = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
setLayout(m_stacks);
|
setLayout(m_stacks);
|
||||||
}
|
}
|
||||||
@ -145,13 +119,26 @@ void VMdTab::showFileEditMode()
|
|||||||
|
|
||||||
m_isEditMode = true;
|
m_isEditMode = true;
|
||||||
|
|
||||||
VMdEdit *mdEdit = dynamic_cast<VMdEdit *>(m_editor);
|
VMdEdit *mdEdit = dynamic_cast<VMdEdit *>(getEditor());
|
||||||
V_ASSERT(mdEdit);
|
V_ASSERT(mdEdit);
|
||||||
|
|
||||||
// beginEdit() may change m_curHeader.
|
// beginEdit() may change m_curHeader.
|
||||||
int outlineIndex = m_curHeader.m_outlineIndex;
|
int outlineIndex = m_curHeader.m_outlineIndex;
|
||||||
|
|
||||||
|
mdEdit->beginEdit();
|
||||||
|
m_stacks->setCurrentWidget(mdEdit);
|
||||||
|
|
||||||
int lineNumber = -1;
|
int lineNumber = -1;
|
||||||
auto headers = mdEdit->getHeaders();
|
const QVector<VHeader> &headers = mdEdit->getHeaders();
|
||||||
|
// If editor is not init, we need to wait for it to init headers.
|
||||||
|
// Generally, beginEdit() will generate the headers. Wait is needed when
|
||||||
|
// highlight completion is going to re-generate the headers.
|
||||||
|
int nrRetry = 5;
|
||||||
|
while (outlineIndex > -1 && headers.isEmpty() && nrRetry-- > 0) {
|
||||||
|
qDebug() << "wait another 100 ms for editor's headers ready";
|
||||||
|
VUtils::sleepWait(100);
|
||||||
|
}
|
||||||
|
|
||||||
if (outlineIndex < 0 || outlineIndex >= headers.size()) {
|
if (outlineIndex < 0 || outlineIndex >= headers.size()) {
|
||||||
lineNumber = -1;
|
lineNumber = -1;
|
||||||
outlineIndex = -1;
|
outlineIndex = -1;
|
||||||
@ -161,9 +148,6 @@ void VMdTab::showFileEditMode()
|
|||||||
|
|
||||||
VAnchor anchor(m_file, "", lineNumber, outlineIndex);
|
VAnchor anchor(m_file, "", lineNumber, outlineIndex);
|
||||||
|
|
||||||
mdEdit->beginEdit();
|
|
||||||
m_stacks->setCurrentWidget(mdEdit);
|
|
||||||
|
|
||||||
mdEdit->scrollToHeader(anchor);
|
mdEdit->scrollToHeader(anchor);
|
||||||
|
|
||||||
mdEdit->setFocus();
|
mdEdit->setFocus();
|
||||||
@ -175,6 +159,7 @@ bool VMdTab::closeFile(bool p_forced)
|
|||||||
{
|
{
|
||||||
if (p_forced && m_isEditMode) {
|
if (p_forced && m_isEditMode) {
|
||||||
// Discard buffer content
|
// Discard buffer content
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
m_editor->reloadFile();
|
m_editor->reloadFile();
|
||||||
m_editor->endEdit();
|
m_editor->endEdit();
|
||||||
|
|
||||||
@ -237,7 +222,13 @@ void VMdTab::readFile()
|
|||||||
|
|
||||||
bool VMdTab::saveFile()
|
bool VMdTab::saveFile()
|
||||||
{
|
{
|
||||||
if (!m_isEditMode || !m_editor->isModified()) {
|
if (!m_isEditMode) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
|
|
||||||
|
if (!m_editor->isModified()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,6 +298,36 @@ void VMdTab::setupMarkdownViewer()
|
|||||||
m_stacks->addWidget(m_webViewer);
|
m_stacks->addWidget(m_webViewer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VMdTab::setupMarkdownEditor()
|
||||||
|
{
|
||||||
|
Q_ASSERT(m_file->isModifiable() && !m_editor);
|
||||||
|
qDebug() << "create Markdown editor";
|
||||||
|
m_editor = new VMdEdit(m_file, m_document, m_mdConType, this);
|
||||||
|
connect(dynamic_cast<VMdEdit *>(m_editor), &VMdEdit::headersChanged,
|
||||||
|
this, &VMdTab::updateTocFromHeaders);
|
||||||
|
connect(dynamic_cast<VMdEdit *>(m_editor), &VMdEdit::statusChanged,
|
||||||
|
this, &VMdTab::updateStatus);
|
||||||
|
connect(m_editor, SIGNAL(curHeaderChanged(VAnchor)),
|
||||||
|
this, SLOT(updateCurHeader(VAnchor)));
|
||||||
|
connect(m_editor, &VEdit::textChanged,
|
||||||
|
this, &VMdTab::handleTextChanged);
|
||||||
|
connect(m_editor, &VEdit::cursorPositionChanged,
|
||||||
|
this, &VMdTab::updateStatus);
|
||||||
|
connect(m_editor, &VEdit::saveAndRead,
|
||||||
|
this, &VMdTab::saveAndRead);
|
||||||
|
connect(m_editor, &VEdit::discardAndRead,
|
||||||
|
this, &VMdTab::discardAndRead);
|
||||||
|
connect(m_editor, &VEdit::saveNote,
|
||||||
|
this, &VMdTab::saveFile);
|
||||||
|
connect(m_editor, &VEdit::statusMessage,
|
||||||
|
this, &VEditTab::statusMessage);
|
||||||
|
connect(m_editor, &VEdit::vimStatusUpdated,
|
||||||
|
this, &VEditTab::vimStatusUpdated);
|
||||||
|
|
||||||
|
m_editor->reloadFile();
|
||||||
|
m_stacks->addWidget(m_editor);
|
||||||
|
}
|
||||||
|
|
||||||
static void parseTocUl(QXmlStreamReader &p_xml, QVector<VHeader> &p_headers,
|
static void parseTocUl(QXmlStreamReader &p_xml, QVector<VHeader> &p_headers,
|
||||||
int p_level);
|
int p_level);
|
||||||
|
|
||||||
@ -442,7 +463,7 @@ void VMdTab::scrollToAnchor(const VAnchor &p_anchor)
|
|||||||
m_curHeader = p_anchor;
|
m_curHeader = p_anchor;
|
||||||
|
|
||||||
if (m_isEditMode) {
|
if (m_isEditMode) {
|
||||||
dynamic_cast<VMdEdit *>(m_editor)->scrollToHeader(p_anchor);
|
dynamic_cast<VMdEdit *>(getEditor())->scrollToHeader(p_anchor);
|
||||||
} else {
|
} else {
|
||||||
if (!p_anchor.anchor.isEmpty()) {
|
if (!p_anchor.anchor.isEmpty()) {
|
||||||
m_document->scrollToAnchor(p_anchor.anchor.mid(1));
|
m_document->scrollToAnchor(p_anchor.anchor.mid(1));
|
||||||
@ -494,13 +515,15 @@ void VMdTab::insertImage()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
m_editor->insertImage();
|
m_editor->insertImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMdTab::findText(const QString &p_text, uint p_options, bool p_peek,
|
void VMdTab::findText(const QString &p_text, uint p_options, bool p_peek,
|
||||||
bool p_forward)
|
bool p_forward)
|
||||||
{
|
{
|
||||||
if (m_isEditMode || !m_webViewer) {
|
if (m_isEditMode) {
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
if (p_peek) {
|
if (p_peek) {
|
||||||
m_editor->peekText(p_text, p_options);
|
m_editor->peekText(p_text, p_options);
|
||||||
} else {
|
} else {
|
||||||
@ -515,6 +538,7 @@ void VMdTab::replaceText(const QString &p_text, uint p_options,
|
|||||||
const QString &p_replaceText, bool p_findNext)
|
const QString &p_replaceText, bool p_findNext)
|
||||||
{
|
{
|
||||||
if (m_isEditMode) {
|
if (m_isEditMode) {
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
m_editor->replaceText(p_text, p_options, p_replaceText, p_findNext);
|
m_editor->replaceText(p_text, p_options, p_replaceText, p_findNext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -523,6 +547,7 @@ void VMdTab::replaceTextAll(const QString &p_text, uint p_options,
|
|||||||
const QString &p_replaceText)
|
const QString &p_replaceText)
|
||||||
{
|
{
|
||||||
if (m_isEditMode) {
|
if (m_isEditMode) {
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
m_editor->replaceTextAll(p_text, p_options, p_replaceText);
|
m_editor->replaceTextAll(p_text, p_options, p_replaceText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -546,7 +571,8 @@ void VMdTab::findTextInWebView(const QString &p_text, uint p_options,
|
|||||||
|
|
||||||
QString VMdTab::getSelectedText() const
|
QString VMdTab::getSelectedText() const
|
||||||
{
|
{
|
||||||
if (m_isEditMode || !m_webViewer) {
|
if (m_isEditMode) {
|
||||||
|
Q_ASSERT(m_editor);
|
||||||
QTextCursor cursor = m_editor->textCursor();
|
QTextCursor cursor = m_editor->textCursor();
|
||||||
return cursor.selectedText();
|
return cursor.selectedText();
|
||||||
} else {
|
} else {
|
||||||
|
18
src/vmdtab.h
18
src/vmdtab.h
@ -102,6 +102,9 @@ private:
|
|||||||
// Setup Markdown viewer.
|
// Setup Markdown viewer.
|
||||||
void setupMarkdownViewer();
|
void setupMarkdownViewer();
|
||||||
|
|
||||||
|
// Setup Markdown editor.
|
||||||
|
void setupMarkdownEditor();
|
||||||
|
|
||||||
// Use VMarkdownConverter (hoedown) to generate the Web view.
|
// Use VMarkdownConverter (hoedown) to generate the Web view.
|
||||||
void viewWebByConverter();
|
void viewWebByConverter();
|
||||||
|
|
||||||
@ -125,6 +128,9 @@ private:
|
|||||||
// Create a filled VEditTabInfo.
|
// Create a filled VEditTabInfo.
|
||||||
VEditTabInfo createEditTabInfo() Q_DECL_OVERRIDE;
|
VEditTabInfo createEditTabInfo() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
// Get the markdown editor. If not init yet, init and return it.
|
||||||
|
VEdit *getEditor();
|
||||||
|
|
||||||
VEdit *m_editor;
|
VEdit *m_editor;
|
||||||
VWebView *m_webViewer;
|
VWebView *m_webViewer;
|
||||||
VDocument *m_document;
|
VDocument *m_document;
|
||||||
@ -132,4 +138,16 @@ private:
|
|||||||
|
|
||||||
QStackedLayout *m_stacks;
|
QStackedLayout *m_stacks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline VEdit *VMdTab::getEditor()
|
||||||
|
{
|
||||||
|
if (m_editor) {
|
||||||
|
return m_editor;
|
||||||
|
} else if (m_file->isModifiable()) {
|
||||||
|
setupMarkdownEditor();
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_editor;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // VMDTAB_H
|
#endif // VMDTAB_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user