Editor: store a safe_ptr to buffer instead of reference
This commit is contained in:
parent
ea17525b2a
commit
42315c4b5c
|
@ -13,7 +13,7 @@ namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
Editor::Editor(Buffer& buffer)
|
Editor::Editor(Buffer& buffer)
|
||||||
: m_buffer(buffer),
|
: m_buffer(&buffer),
|
||||||
m_edition_level(0)
|
m_edition_level(0)
|
||||||
{
|
{
|
||||||
m_selections.push_back(Selection(buffer.begin(), buffer.begin()));
|
m_selections.push_back(Selection(buffer.begin(), buffer.begin()));
|
||||||
|
@ -24,7 +24,7 @@ void Editor::erase()
|
||||||
scoped_edition edition(*this);
|
scoped_edition edition(*this);
|
||||||
for (auto& sel : m_selections)
|
for (auto& sel : m_selections)
|
||||||
{
|
{
|
||||||
m_buffer.erase(sel.begin(), sel.end());
|
m_buffer->erase(sel.begin(), sel.end());
|
||||||
sel.selection.avoid_eol();
|
sel.selection.avoid_eol();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,8 +68,8 @@ void Editor::insert(const String& string, InsertMode mode)
|
||||||
|
|
||||||
for (auto& sel : m_selections)
|
for (auto& sel : m_selections)
|
||||||
{
|
{
|
||||||
BufferIterator pos = prepare_insert(m_buffer, sel.selection, mode);
|
BufferIterator pos = prepare_insert(*m_buffer, sel.selection, mode);
|
||||||
m_buffer.insert(pos, string);
|
m_buffer->insert(pos, string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,9 +84,9 @@ void Editor::insert(const memoryview<String>& strings, InsertMode mode)
|
||||||
|
|
||||||
for (size_t i = 0; i < selections().size(); ++i)
|
for (size_t i = 0; i < selections().size(); ++i)
|
||||||
{
|
{
|
||||||
BufferIterator pos = prepare_insert(m_buffer, m_selections[i].selection, mode);
|
BufferIterator pos = prepare_insert(*m_buffer, m_selections[i].selection, mode);
|
||||||
size_t index = std::min(i, strings.size()-1);
|
size_t index = std::min(i, strings.size()-1);
|
||||||
m_buffer.insert(pos, strings[index]);
|
m_buffer->insert(pos, strings[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ std::vector<String> Editor::selections_content() const
|
||||||
{
|
{
|
||||||
std::vector<String> contents;
|
std::vector<String> contents;
|
||||||
for (auto& sel : m_selections)
|
for (auto& sel : m_selections)
|
||||||
contents.push_back(m_buffer.string(sel.begin(),
|
contents.push_back(m_buffer->string(sel.begin(),
|
||||||
sel.end()));
|
sel.end()));
|
||||||
return contents;
|
return contents;
|
||||||
}
|
}
|
||||||
|
@ -142,9 +142,9 @@ void Editor::move_selections(LineCount offset, SelectMode mode)
|
||||||
assert(mode == SelectMode::Replace or mode == SelectMode::Extend);
|
assert(mode == SelectMode::Replace or mode == SelectMode::Extend);
|
||||||
for (auto& sel : m_selections)
|
for (auto& sel : m_selections)
|
||||||
{
|
{
|
||||||
BufferCoord pos = m_buffer.line_and_column_at(sel.last());
|
BufferCoord pos = m_buffer->line_and_column_at(sel.last());
|
||||||
pos.line += offset;
|
pos.line += offset;
|
||||||
BufferIterator last = utf8::finish(m_buffer.iterator_at(pos, true));
|
BufferIterator last = utf8::finish(m_buffer->iterator_at(pos, true));
|
||||||
sel.selection = Selection(mode == SelectMode::Extend ? sel.first() : last, last);
|
sel.selection = Selection(mode == SelectMode::Extend ? sel.first() : last, last);
|
||||||
}
|
}
|
||||||
merge_overlapping(m_selections);
|
merge_overlapping(m_selections);
|
||||||
|
@ -290,7 +290,7 @@ private:
|
||||||
bool Editor::undo()
|
bool Editor::undo()
|
||||||
{
|
{
|
||||||
LastModifiedRangeListener listener(buffer());
|
LastModifiedRangeListener listener(buffer());
|
||||||
bool res = m_buffer.undo();
|
bool res = m_buffer->undo();
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
m_selections.clear();
|
m_selections.clear();
|
||||||
|
@ -303,7 +303,7 @@ bool Editor::undo()
|
||||||
bool Editor::redo()
|
bool Editor::redo()
|
||||||
{
|
{
|
||||||
LastModifiedRangeListener listener(buffer());
|
LastModifiedRangeListener listener(buffer());
|
||||||
bool res = m_buffer.redo();
|
bool res = m_buffer->redo();
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
m_selections.clear();
|
m_selections.clear();
|
||||||
|
@ -323,14 +323,14 @@ void Editor::begin_edition()
|
||||||
++m_edition_level;
|
++m_edition_level;
|
||||||
|
|
||||||
if (m_edition_level == 1)
|
if (m_edition_level == 1)
|
||||||
m_buffer.begin_undo_group();
|
m_buffer->begin_undo_group();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::end_edition()
|
void Editor::end_edition()
|
||||||
{
|
{
|
||||||
assert(m_edition_level > 0);
|
assert(m_edition_level > 0);
|
||||||
if (m_edition_level == 1)
|
if (m_edition_level == 1)
|
||||||
m_buffer.end_undo_group();
|
m_buffer->end_undo_group();
|
||||||
|
|
||||||
--m_edition_level;
|
--m_edition_level;
|
||||||
}
|
}
|
||||||
|
@ -341,7 +341,7 @@ IncrementalInserter::IncrementalInserter(Editor& editor, InsertMode mode)
|
||||||
: m_editor(editor), m_edition(editor), m_mode(mode)
|
: m_editor(editor), m_edition(editor), m_mode(mode)
|
||||||
{
|
{
|
||||||
m_editor.on_incremental_insertion_begin();
|
m_editor.on_incremental_insertion_begin();
|
||||||
Buffer& buffer = editor.m_buffer;
|
Buffer& buffer = *editor.m_buffer;
|
||||||
|
|
||||||
if (mode == InsertMode::Replace)
|
if (mode == InsertMode::Replace)
|
||||||
{
|
{
|
||||||
|
@ -443,8 +443,8 @@ void IncrementalInserter::move_cursors(const BufferCoord& offset)
|
||||||
{
|
{
|
||||||
for (auto& sel : m_editor.m_selections)
|
for (auto& sel : m_editor.m_selections)
|
||||||
{
|
{
|
||||||
BufferCoord pos = m_editor.m_buffer.line_and_column_at(sel.last());
|
BufferCoord pos = m_editor.m_buffer->line_and_column_at(sel.last());
|
||||||
BufferIterator it = m_editor.m_buffer.iterator_at(pos + offset);
|
BufferIterator it = m_editor.m_buffer->iterator_at(pos + offset);
|
||||||
sel = Selection(it, it);
|
sel = Selection(it, it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ public:
|
||||||
Editor(Buffer& buffer);
|
Editor(Buffer& buffer);
|
||||||
virtual ~Editor() {}
|
virtual ~Editor() {}
|
||||||
|
|
||||||
Buffer& buffer() const { return m_buffer; }
|
Buffer& buffer() const { return *m_buffer; }
|
||||||
|
|
||||||
void erase();
|
void erase();
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ private:
|
||||||
virtual void on_incremental_insertion_begin() {}
|
virtual void on_incremental_insertion_begin() {}
|
||||||
virtual void on_incremental_insertion_end() {}
|
virtual void on_incremental_insertion_end() {}
|
||||||
|
|
||||||
Buffer& m_buffer;
|
safe_ptr<Buffer> m_buffer;
|
||||||
SelectionAndCapturesList m_selections;
|
SelectionAndCapturesList m_selections;
|
||||||
FilterGroup m_filters;
|
FilterGroup m_filters;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user