diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-12-15 19:51:09 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-12-15 20:23:02 +0000 |
| commit | 8047cc97d3c30b53f8b701cebad9e7b838264db7 (patch) | |
| tree | e9f101ee7047a74b2ea9e440b643680a1692c53a /src/editor.cc | |
| parent | cb9384f8a76d94d387278d679ece9a692316b547 (diff) | |
Move Editor::{undo,redo} to free functions in normal.cc
Diffstat (limited to 'src/editor.cc')
| -rw-r--r-- | src/editor.cc | 66 |
1 files changed, 0 insertions, 66 deletions
diff --git a/src/editor.cc b/src/editor.cc index 12c65096..3655c0b4 100644 --- a/src/editor.cc +++ b/src/editor.cc @@ -24,72 +24,6 @@ std::vector<String> Editor::selections_content() const return contents; } -class ModifiedRangesListener : public BufferChangeListener_AutoRegister -{ -public: - ModifiedRangesListener(Buffer& buffer) - : BufferChangeListener_AutoRegister(buffer) {} - - void on_insert(const Buffer& buffer, BufferCoord begin, BufferCoord end) - { - m_ranges.update_insert(buffer, begin, end); - auto it = std::upper_bound(m_ranges.begin(), m_ranges.end(), begin, - [](BufferCoord c, const Selection& sel) - { return c < sel.min(); }); - m_ranges.emplace(it, begin, buffer.char_prev(end)); - } - - void on_erase(const Buffer& buffer, BufferCoord begin, BufferCoord end) - { - m_ranges.update_erase(buffer, begin, end); - auto pos = std::min(begin, buffer.back_coord()); - auto it = std::upper_bound(m_ranges.begin(), m_ranges.end(), pos, - [](BufferCoord c, const Selection& sel) - { return c < sel.min(); }); - m_ranges.emplace(it, pos, pos); - } - SelectionList& ranges() { return m_ranges; } - -private: - SelectionList m_ranges; -}; - -inline bool touches(const Buffer& buffer, const Range& lhs, const Range& rhs) -{ - return lhs.min() <= rhs.min() ? buffer.char_next(lhs.max()) >= rhs.min() - : lhs.min() <= buffer.char_next(rhs.max()); -} - -bool Editor::undo() -{ - using namespace std::placeholders; - ModifiedRangesListener listener(buffer()); - bool res = m_buffer->undo(); - if (res and not listener.ranges().empty()) - { - m_selections = std::move(listener.ranges()); - m_selections.set_main_index(m_selections.size() - 1); - m_selections.merge_overlapping(std::bind(touches, std::ref(buffer()), _1, _2)); - } - check_invariant(); - return res; -} - -bool Editor::redo() -{ - using namespace std::placeholders; - ModifiedRangesListener listener(buffer()); - bool res = m_buffer->redo(); - if (res and not listener.ranges().empty()) - { - m_selections = std::move(listener.ranges()); - m_selections.set_main_index(m_selections.size() - 1); - m_selections.merge_overlapping(std::bind(touches, std::ref(buffer()), _1, _2)); - } - check_invariant(); - return res; -} - void Editor::check_invariant() const { #ifdef KAK_DEBUG |
