summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-09-24 12:39:40 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-09-24 12:39:40 +0000
commit1f0b06a85520faa7d8fdfa5a6a177261fe0fcaa9 (patch)
treed65c622e787744e796770c72b11a46a1661873ed /src
parent9b865cea39b51896ad1dffbd3b55352fd858e3c7 (diff)
Window: undo group cleanup and fix of append method
Diffstat (limited to 'src')
-rw-r--r--src/window.cc28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/window.cc b/src/window.cc
index d3cb630b..54d618f8 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -23,6 +23,16 @@ void Selection::offset(int offset)
m_last += offset;
}
+struct scoped_undo_group
+{
+ scoped_undo_group(Buffer& buffer)
+ : m_buffer(buffer) { m_buffer.begin_undo_group(); }
+
+ ~scoped_undo_group() { m_buffer.end_undo_group(); }
+private:
+ Buffer& m_buffer;
+};
+
Window::Window(Buffer& buffer)
: m_buffer(buffer),
m_position(0, 0),
@@ -34,7 +44,7 @@ Window::Window(Buffer& buffer)
void Window::erase()
{
- m_buffer.begin_undo_group();
+ scoped_undo_group undo_group(m_buffer);
if (m_selections.empty())
{
BufferIterator cursor = iterator_at(m_cursor);
@@ -48,7 +58,6 @@ void Window::erase()
}
if (not m_selections.empty())
m_cursor = line_and_column_at(m_selections.back().last());
- m_buffer.end_undo_group();
}
static WindowCoord measure_string(const Window::String& string)
@@ -69,7 +78,8 @@ static WindowCoord measure_string(const Window::String& string)
void Window::insert(const String& string)
{
- m_buffer.begin_undo_group();
+ scoped_undo_group undo_group(m_buffer);
+
if (m_selections.empty())
{
m_buffer.insert(iterator_at(m_cursor), string);
@@ -81,23 +91,23 @@ void Window::insert(const String& string)
m_buffer.insert(sel.begin(), string);
sel.offset(string.length());
}
- m_buffer.end_undo_group();
}
void Window::append(const String& string)
{
- m_buffer.begin_undo_group();
if (m_selections.empty())
{
move_cursor(WindowCoord(0 , 1));
insert(string);
}
-
- for (auto& sel : m_selections)
+ else
{
- m_buffer.insert(sel.end(), string);
+ scoped_undo_group undo_group(m_buffer);
+ for (auto& sel : m_selections)
+ {
+ m_buffer.insert(sel.end(), string);
+ }
}
- m_buffer.end_undo_group();
}
bool Window::undo()