diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-10-18 00:55:45 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-10-18 00:55:45 +0000 |
| commit | 8cab34d57f7a6c77de40d955baadcf9ec18064a5 (patch) | |
| tree | 612e465e8b259b625778c1a5714aa7cbcf084a8a /src/buffer.cc | |
| parent | d48a2bd32584b3de815b691ac3adb0554281650c (diff) | |
Buffer: add support for modification listeners
Diffstat (limited to 'src/buffer.cc')
| -rw-r--r-- | src/buffer.cc | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/buffer.cc b/src/buffer.cc index 1ea5b571..324ecd66 100644 --- a/src/buffer.cc +++ b/src/buffer.cc @@ -5,8 +5,6 @@ #include "assert.hh" #include "utils.hh" -#include <algorithm> - namespace Kakoune { @@ -35,13 +33,11 @@ void Buffer::erase(const BufferIterator& begin, const BufferIterator& end) { append_modification(BufferModification(BufferModification::Erase, begin, string(begin, end))); - do_erase(begin, end); } void Buffer::insert(const BufferIterator& position, const BufferString& string) { append_modification(BufferModification(BufferModification::Insert, position, string)); - do_insert(position, string); } void Buffer::do_erase(const BufferIterator& begin, const BufferIterator& end) @@ -182,7 +178,7 @@ bool Buffer::undo() --m_history_cursor; for (const BufferModification& modification : reversed(*m_history_cursor)) - replay_modification(modification.inverse()); + apply_modification(modification.inverse()); } bool Buffer::redo() @@ -191,12 +187,12 @@ bool Buffer::redo() return false; for (const BufferModification& modification : *m_history_cursor) - replay_modification(modification); + apply_modification(modification); ++m_history_cursor; } -void Buffer::replay_modification(const BufferModification& modification) +void Buffer::apply_modification(const BufferModification& modification) { switch (modification.type) { @@ -214,10 +210,13 @@ void Buffer::replay_modification(const BufferModification& modification) default: assert(false); } + for (auto listener : m_modification_listeners) + listener->on_modification(modification); } void Buffer::append_modification(BufferModification&& modification) { + apply_modification(modification); m_current_undo_group.push_back(std::move(modification)); } @@ -248,4 +247,21 @@ void Buffer::notify_saved() m_last_save_undo_group = m_history_cursor; } +void Buffer::register_modification_listener(BufferModificationListener* listener) +{ + assert(listener); + assert(not contains(m_modification_listeners, listener)); + m_modification_listeners.push_back(listener); +} + +void Buffer::unregister_modification_listener(BufferModificationListener* listener) +{ + assert(listener); + auto it = std::find(m_modification_listeners.begin(), + m_modification_listeners.end(), + listener); + assert(it != m_modification_listeners.end()); + m_modification_listeners.erase(it); +} + } |
