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:
Le Tan 2017-07-08 13:13:13 +08:00
parent 4374f2d8f1
commit 301879c50c
3 changed files with 83 additions and 39 deletions

View File

@ -307,8 +307,6 @@ void VMdEdit::generateEditOutline()
{
QTextDocument *doc = document();
m_headers.clear();
QVector<VHeader> headers;
// Assume that each block contains only one line
@ -332,6 +330,8 @@ void VMdEdit::generateEditOutline()
}
}
m_headers.clear();
int curLevel = baseLevel - 1;
for (auto & item : headers) {
while (item.level > curLevel + 1) {

View File

@ -44,34 +44,8 @@ void VMdTab::setupUI()
setupMarkdownViewer();
if (m_file->isModifiable()) {
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);
} else {
// Setup editor when we really need it.
m_editor = NULL;
}
setLayout(m_stacks);
}
@ -145,13 +119,26 @@ void VMdTab::showFileEditMode()
m_isEditMode = true;
VMdEdit *mdEdit = dynamic_cast<VMdEdit *>(m_editor);
VMdEdit *mdEdit = dynamic_cast<VMdEdit *>(getEditor());
V_ASSERT(mdEdit);
// beginEdit() may change m_curHeader.
int outlineIndex = m_curHeader.m_outlineIndex;
mdEdit->beginEdit();
m_stacks->setCurrentWidget(mdEdit);
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()) {
lineNumber = -1;
outlineIndex = -1;
@ -161,9 +148,6 @@ void VMdTab::showFileEditMode()
VAnchor anchor(m_file, "", lineNumber, outlineIndex);
mdEdit->beginEdit();
m_stacks->setCurrentWidget(mdEdit);
mdEdit->scrollToHeader(anchor);
mdEdit->setFocus();
@ -175,6 +159,7 @@ bool VMdTab::closeFile(bool p_forced)
{
if (p_forced && m_isEditMode) {
// Discard buffer content
Q_ASSERT(m_editor);
m_editor->reloadFile();
m_editor->endEdit();
@ -237,7 +222,13 @@ void VMdTab::readFile()
bool VMdTab::saveFile()
{
if (!m_isEditMode || !m_editor->isModified()) {
if (!m_isEditMode) {
return true;
}
Q_ASSERT(m_editor);
if (!m_editor->isModified()) {
return true;
}
@ -307,6 +298,36 @@ void VMdTab::setupMarkdownViewer()
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,
int p_level);
@ -442,7 +463,7 @@ void VMdTab::scrollToAnchor(const VAnchor &p_anchor)
m_curHeader = p_anchor;
if (m_isEditMode) {
dynamic_cast<VMdEdit *>(m_editor)->scrollToHeader(p_anchor);
dynamic_cast<VMdEdit *>(getEditor())->scrollToHeader(p_anchor);
} else {
if (!p_anchor.anchor.isEmpty()) {
m_document->scrollToAnchor(p_anchor.anchor.mid(1));
@ -494,13 +515,15 @@ void VMdTab::insertImage()
return;
}
Q_ASSERT(m_editor);
m_editor->insertImage();
}
void VMdTab::findText(const QString &p_text, uint p_options, bool p_peek,
bool p_forward)
{
if (m_isEditMode || !m_webViewer) {
if (m_isEditMode) {
Q_ASSERT(m_editor);
if (p_peek) {
m_editor->peekText(p_text, p_options);
} else {
@ -515,6 +538,7 @@ void VMdTab::replaceText(const QString &p_text, uint p_options,
const QString &p_replaceText, bool p_findNext)
{
if (m_isEditMode) {
Q_ASSERT(m_editor);
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)
{
if (m_isEditMode) {
Q_ASSERT(m_editor);
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
{
if (m_isEditMode || !m_webViewer) {
if (m_isEditMode) {
Q_ASSERT(m_editor);
QTextCursor cursor = m_editor->textCursor();
return cursor.selectedText();
} else {

View File

@ -102,6 +102,9 @@ private:
// Setup Markdown viewer.
void setupMarkdownViewer();
// Setup Markdown editor.
void setupMarkdownEditor();
// Use VMarkdownConverter (hoedown) to generate the Web view.
void viewWebByConverter();
@ -125,6 +128,9 @@ private:
// Create a filled VEditTabInfo.
VEditTabInfo createEditTabInfo() Q_DECL_OVERRIDE;
// Get the markdown editor. If not init yet, init and return it.
VEdit *getEditor();
VEdit *m_editor;
VWebView *m_webViewer;
VDocument *m_document;
@ -132,4 +138,16 @@ private:
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