mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
108 lines
2.6 KiB
C++
108 lines
2.6 KiB
C++
#include <QTextCursor>
|
|
#include <QTextDocument>
|
|
#include <QFontMetrics>
|
|
#include "veditor.h"
|
|
#include "veditoperations.h"
|
|
#include "vconfigmanager.h"
|
|
#include "utils/vutils.h"
|
|
|
|
extern VConfigManager *g_config;
|
|
|
|
VEditOperations::VEditOperations(VEditor *p_editor, VFile *p_file)
|
|
: QObject(p_editor->getEditor()),
|
|
m_editor(p_editor),
|
|
m_file(p_file),
|
|
m_editConfig(&p_editor->getConfig()),
|
|
m_vim(NULL)
|
|
{
|
|
connect(m_editor->object(), &VEditorObject::configUpdated,
|
|
this, &VEditOperations::handleEditConfigUpdated);
|
|
|
|
if (m_editConfig->m_enableVimMode) {
|
|
m_vim = new VVim(m_editor);
|
|
|
|
connect(m_vim, &VVim::modeChanged,
|
|
this, &VEditOperations::handleVimModeChanged);
|
|
connect(m_vim, &VVim::vimMessage,
|
|
this, &VEditOperations::statusMessage);
|
|
connect(m_vim, &VVim::vimStatusUpdated,
|
|
this, &VEditOperations::vimStatusUpdated);
|
|
}
|
|
}
|
|
|
|
void VEditOperations::insertTextAtCurPos(const QString &p_text)
|
|
{
|
|
m_editor->insertPlainTextW(p_text);
|
|
}
|
|
|
|
VEditOperations::~VEditOperations()
|
|
{
|
|
}
|
|
|
|
void VEditOperations::updateCursorLineBg()
|
|
{
|
|
if (m_editConfig->m_enableVimMode) {
|
|
switch (m_vim->getMode()) {
|
|
case VimMode::Normal:
|
|
m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimNormalBg());
|
|
break;
|
|
|
|
case VimMode::Insert:
|
|
m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimInsertBg());
|
|
break;
|
|
|
|
case VimMode::Visual:
|
|
case VimMode::VisualLine:
|
|
m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimVisualBg());
|
|
break;
|
|
|
|
case VimMode::Replace:
|
|
m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimReplaceBg());
|
|
break;
|
|
|
|
default:
|
|
V_ASSERT(false);
|
|
break;
|
|
}
|
|
} else {
|
|
m_editConfig->m_cursorLineBg = QColor(g_config->getEditorCurrentLineBg());
|
|
}
|
|
|
|
m_editor->highlightCurrentLine();
|
|
}
|
|
|
|
void VEditOperations::handleEditConfigUpdated()
|
|
{
|
|
// Reset to Normal mode.
|
|
if (m_vim) {
|
|
m_vim->setMode(VimMode::Normal);
|
|
}
|
|
|
|
updateCursorLineBg();
|
|
}
|
|
|
|
void VEditOperations::handleVimModeChanged(VimMode p_mode)
|
|
{
|
|
// Only highlight current visual line in Insert mode.
|
|
m_editConfig->m_highlightWholeBlock = (p_mode != VimMode::Insert);
|
|
|
|
updateCursorLineBg();
|
|
}
|
|
|
|
void VEditOperations::requestUpdateVimStatus()
|
|
{
|
|
emit vimStatusUpdated(m_vim);
|
|
}
|
|
|
|
void VEditOperations::setVimMode(VimMode p_mode)
|
|
{
|
|
if (m_vim && m_editConfig->m_enableVimMode) {
|
|
m_vim->setMode(p_mode);
|
|
}
|
|
}
|
|
|
|
VVim *VEditOperations::getVim() const
|
|
{
|
|
return m_vim;
|
|
}
|