Warp all cursors at/after the insert point when inserting a code point

This commit is contained in:
Josh Holtrop 2016-12-26 08:56:36 -05:00
parent 59b8fc5e31
commit cadd5bac36
2 changed files with 12 additions and 1 deletions

View File

@ -169,6 +169,14 @@ void Buffer::insert_code_point(uint32_t code_point)
uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE]; uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE];
uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded); uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded);
m_gap_buffer->insert(m_insert_position, encoded, bytes); m_gap_buffer->insert(m_insert_position, encoded, bytes);
ssize_t lines = (code_point == '\n') ? 1 : 0;
for (auto iterator : m_iterators)
{
if (iterator->offset() >= m_insert_position)
{
iterator->warp(bytes, lines);
}
}
m_insert_position += bytes; m_insert_position += bytes;
} }
} }

View File

@ -93,7 +93,9 @@ public:
std::shared_ptr<Iterator> add_iterator() std::shared_ptr<Iterator> add_iterator()
{ {
return std::make_shared<Iterator>(this); std::shared_ptr<Iterator> iterator = std::make_shared<Iterator>(this);
m_iterators.push_back(iterator);
return iterator;
} }
auto get_string() { return m_gap_buffer->get_string(); } auto get_string() { return m_gap_buffer->get_string(); }
size_t size() const { return m_gap_buffer->size(); } size_t size() const { return m_gap_buffer->size(); }
@ -113,6 +115,7 @@ protected:
uint8_t m_tabstop; uint8_t m_tabstop;
bool m_insert_mode; bool m_insert_mode;
size_t m_insert_position; size_t m_insert_position;
std::list<std::shared_ptr<Iterator>> m_iterators;
void common_initialization(); void common_initialization();
bool load_from_file(const char * filename); bool load_from_file(const char * filename);