diff --git a/src/veditarea.cpp b/src/veditarea.cpp index 5fd5e065..abaac1a0 100644 --- a/src/veditarea.cpp +++ b/src/veditarea.cpp @@ -813,6 +813,7 @@ bool VEditArea::handleKeyNavigation(int p_key, bool &p_succeed) int VEditArea::openFiles(const QVector &p_files) { + VFile *curFile = NULL; int nrOpened = 0; for (auto const & info : p_files) { QString filePath = VUtils::validFilePathToOpen(info.m_file); @@ -828,6 +829,10 @@ int VEditArea::openFiles(const QVector &p_files) VEditTab *tab = openFile(file, info.m_mode, true); ++nrOpened; + if (info.m_active) { + curFile = file; + } + VEditTabInfo tabInfo; tabInfo.m_editTab = tab; info.toEditTabInfo(&tabInfo); @@ -835,6 +840,10 @@ int VEditArea::openFiles(const QVector &p_files) tab->tryRestoreFromTabInfo(tabInfo); } + if (curFile) { + openFile(curFile, OpenFileMode::Read, false); + } + return nrOpened; } diff --git a/src/veditor.cpp b/src/veditor.cpp index f78f472e..c7cc5aff 100644 --- a/src/veditor.cpp +++ b/src/veditor.cpp @@ -1055,3 +1055,17 @@ VVim *VEditor::getVim() const return NULL; } + +bool VEditor::setCursorPosition(int p_blockNumber, int p_posInBlock) +{ + QTextDocument *doc = documentW(); + QTextBlock block = doc->findBlockByNumber(p_blockNumber); + if (!block.isValid() || block.length() <= p_posInBlock) { + return false; + } + + QTextCursor cursor = textCursorW(); + cursor.setPosition(block.position() + p_posInBlock); + setTextCursorW(cursor); + return true; +} diff --git a/src/veditor.h b/src/veditor.h index 8cb3a36d..37032c68 100644 --- a/src/veditor.h +++ b/src/veditor.h @@ -152,6 +152,8 @@ public: virtual VWordCountInfo fetchWordCountInfo() const = 0; + virtual bool setCursorPosition(int p_blockNumber, int p_posInBlock); + // Wrapper functions for QPlainTextEdit/QTextEdit. // Ends with W to distinguish it from the original interfaces. public: diff --git a/src/vfilesessioninfo.cpp b/src/vfilesessioninfo.cpp index bdffad1f..91c478c8 100644 --- a/src/vfilesessioninfo.cpp +++ b/src/vfilesessioninfo.cpp @@ -9,6 +9,7 @@ VFileSessionInfo::VFileSessionInfo() : m_mode(OpenFileMode::Read), + m_active(false), m_headerIndex(-1), m_cursorBlockNumber(-1), m_cursorPositionInBlock(-1) @@ -19,6 +20,7 @@ VFileSessionInfo::VFileSessionInfo(const QString &p_file, OpenFileMode p_mode) : m_file(p_file), m_mode(p_mode), + m_active(false), m_headerIndex(-1), m_cursorBlockNumber(-1), m_cursorPositionInBlock(-1) @@ -57,6 +59,7 @@ VFileSessionInfo VFileSessionInfo::fromSettings(const QSettings *p_settings) info.m_mode = OpenFileMode::Read; } + info.m_active = p_settings->value(FileSessionConfig::c_active).toBool(); info.m_headerIndex = p_settings->value(FileSessionConfig::c_headerIndex).toInt(); info.m_cursorBlockNumber = p_settings->value(FileSessionConfig::c_cursorBlockNumber).toInt(); info.m_cursorPositionInBlock = p_settings->value(FileSessionConfig::c_cursorPositionInBlock).toInt(); @@ -68,6 +71,7 @@ void VFileSessionInfo::toSettings(QSettings *p_settings) const { p_settings->setValue(FileSessionConfig::c_file, m_file); p_settings->setValue(FileSessionConfig::c_mode, (int)m_mode); + p_settings->setValue(FileSessionConfig::c_active, m_active); p_settings->setValue(FileSessionConfig::c_headerIndex, m_headerIndex); p_settings->setValue(FileSessionConfig::c_cursorBlockNumber, m_cursorBlockNumber); p_settings->setValue(FileSessionConfig::c_cursorPositionInBlock, m_cursorPositionInBlock); diff --git a/src/vfilesessioninfo.h b/src/vfilesessioninfo.h index f0fd8673..5edbd075 100644 --- a/src/vfilesessioninfo.h +++ b/src/vfilesessioninfo.h @@ -11,6 +11,9 @@ namespace FileSessionConfig static const QString c_file = "file"; static const QString c_mode = "mode"; + // Whether it is current file. + static const QString c_active = "active"; + // Index in outline of the anchor. static const QString c_headerIndex = "header_index"; @@ -38,12 +41,20 @@ public: void toSettings(QSettings *p_settings) const; + void setActive(bool p_active) + { + m_active = p_active; + } + // Absolute path of the file. QString m_file; // Mode of this file in this session. OpenFileMode m_mode; + // Whether this file is current file. + bool m_active; + // Index in outline of the header. int m_headerIndex; diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index f38d30b5..fdab226c 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -2229,6 +2229,10 @@ void VMainWindow::closeEvent(QCloseEvent *event) } VFileSessionInfo info = VFileSessionInfo::fromEditTabInfo(&tab); + if (tab.m_editTab == m_curTab) { + info.setActive(true); + } + fileInfos.push_back(info); qDebug() << "file session:" << info.m_file << (info.m_mode == OpenFileMode::Edit); diff --git a/src/vmdtab.cpp b/src/vmdtab.cpp index 9b73114c..25dffc05 100644 --- a/src/vmdtab.cpp +++ b/src/vmdtab.cpp @@ -874,9 +874,21 @@ bool VMdTab::restoreFromTabInfo(const VEditTabInfo &p_info) return false; } + bool ret = false; + // Restore cursor position. + if (m_isEditMode + && m_editor + && p_info.m_cursorBlockNumber > -1 + && p_info.m_cursorPositionInBlock > -1) { + ret = m_editor->setCursorPosition(p_info.m_cursorBlockNumber, p_info.m_cursorPositionInBlock); + } + // Restore header. - VHeaderPointer header(m_file, p_info.m_headerIndex); - bool ret = scrollToHeaderInternal(header); + if (!ret) { + VHeaderPointer header(m_file, p_info.m_headerIndex); + ret = scrollToHeaderInternal(header); + } + return ret; }