veditoperations.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include <QTextCursor>
  2. #include <QTextDocument>
  3. #include <QFontMetrics>
  4. #include "veditor.h"
  5. #include "veditoperations.h"
  6. #include "vconfigmanager.h"
  7. #include "utils/vutils.h"
  8. extern VConfigManager *g_config;
  9. VEditOperations::VEditOperations(VEditor *p_editor, VFile *p_file)
  10. : QObject(p_editor->getEditor()),
  11. m_editor(p_editor),
  12. m_file(p_file),
  13. m_editConfig(&p_editor->getConfig()),
  14. m_vim(NULL)
  15. {
  16. connect(m_editor->object(), &VEditorObject::configUpdated,
  17. this, &VEditOperations::handleEditConfigUpdated);
  18. if (m_editConfig->m_enableVimMode) {
  19. m_vim = new VVim(m_editor);
  20. connect(m_vim, &VVim::modeChanged,
  21. this, &VEditOperations::handleVimModeChanged);
  22. connect(m_vim, &VVim::vimMessage,
  23. this, &VEditOperations::statusMessage);
  24. connect(m_vim, &VVim::vimStatusUpdated,
  25. this, &VEditOperations::vimStatusUpdated);
  26. }
  27. }
  28. void VEditOperations::insertTextAtCurPos(const QString &p_text)
  29. {
  30. m_editor->insertPlainTextW(p_text);
  31. }
  32. VEditOperations::~VEditOperations()
  33. {
  34. }
  35. void VEditOperations::updateCursorLineBg()
  36. {
  37. if (m_editConfig->m_enableVimMode) {
  38. switch (m_vim->getMode()) {
  39. case VimMode::Normal:
  40. m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimNormalBg());
  41. break;
  42. case VimMode::Insert:
  43. m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimInsertBg());
  44. break;
  45. case VimMode::Visual:
  46. case VimMode::VisualLine:
  47. m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimVisualBg());
  48. break;
  49. case VimMode::Replace:
  50. m_editConfig->m_cursorLineBg = QColor(g_config->getEditorVimReplaceBg());
  51. break;
  52. default:
  53. V_ASSERT(false);
  54. break;
  55. }
  56. } else {
  57. m_editConfig->m_cursorLineBg = QColor(g_config->getEditorCurrentLineBg());
  58. }
  59. m_editor->highlightCurrentLine();
  60. }
  61. void VEditOperations::handleEditConfigUpdated()
  62. {
  63. // Reset to Normal mode.
  64. if (m_vim) {
  65. m_vim->setMode(VimMode::Normal);
  66. }
  67. updateCursorLineBg();
  68. }
  69. void VEditOperations::handleVimModeChanged(VimMode p_mode)
  70. {
  71. // Only highlight current visual line in Insert mode.
  72. m_editConfig->m_highlightWholeBlock = (p_mode != VimMode::Insert);
  73. updateCursorLineBg();
  74. }
  75. void VEditOperations::requestUpdateVimStatus()
  76. {
  77. emit vimStatusUpdated(m_vim);
  78. }
  79. void VEditOperations::setVimMode(VimMode p_mode)
  80. {
  81. if (m_vim && m_editConfig->m_enableVimMode) {
  82. m_vim->setMode(p_mode);
  83. }
  84. }
  85. VVim *VEditOperations::getVim() const
  86. {
  87. return m_vim;
  88. }